TODOPIC
Microcontroladores PIC => Almacén del Assembler => Mensaje iniciado por: akira_ve en 05 de Julio de 2016, 19:50:01
-
Buenas tarde amigos por curiocidad escribi un programa para manejo de LCD a 20Mhz usando el TMR0 como temporizador pues lor programas que he visto solo generan temporizacion por una rutina y quise probar otra opcion.
Lo logre pero no se por que no puedo cambiar a la segunda linea pues cuando elimino el TMR0 y uso una rutina que haga el trabajo de temporizacion funciona de maravilla.............ahora les muestro el codigo espero me ayuden y les doy las gracias de antemano.
; ------------------------------------------------------------
; Programa para uso de LCD con PIC 16F876A a 20 Mhz
; utilizando el TMR0 como temporizacion
; ------------------------------------------------------------
processor 16F876A
include <P16F876A.INC>
errorlevel -302
; -----------------------------------------
; Variables para DELAY
; -----------------------------------------
cblock 0x20
TMP_LCD ; Variable para Dato temporal del LCD
VECTOR ; Vector para manejo de Temporizacion
VEC_TMP ; Registro de almacenamiento del Vector
COMAN_T ; Variable para Registar comandos internor
endc
; -----------------------------------------
; Definiciones
; -----------------------------------------
#define RS 4 ; RESET de la LCD
#define E 5 ; ENABLE de la LCD
Org 0 ; Vector de RESET
goto INICIO
Org 4 ; Vector de INTERRUPCIONES
goto Inter
; -----------------------------------------
; configuracion de puertos
; -----------------------------------------
INICIO:
clrf PORTA ; Limpia PORTA
clrf PORTB ; Limpia PORTB
bsf STATUS, RP0
movlw b'11000000'
movwf TRISA ; Configura PORTA
clrf TRISB ; Configura PORTB como salida
movlw b'00000100' ; presscaler TMR0 1:32
movwf OPTION_REG
bcf STATUS, RP0 ; Regresa al banco 0
movlw D'200
movwf TMR0
bsf INTCON, T0IE ; Habilitacion de Interrupcion por TMR0
bsf INTCON, GIE ; Habilitacion general de Interrupciones
movlw D'30'
movwf TMP_LCD ; Valor de Temporizacion del LCD para 20 ms
movlw B'00000010'
movwf VEC_TMP
movwf VECTOR
; -----------------------------------------
; configuracion de puertos
; -----------------------------------------
call INICIO_LCD ; Configura el LCD
call M1 ; Muestra Mensaje
call LINEA2 ; Configura linea 2
call M2 ; Muestra Mensaje
Seguir:
nop
goto $-1
; -----------------------------------------
; Mensajes a Mostrar
; -----------------------------------------
M1:
movlw 'H' ; Mueve 'H' a W
movwf PORTB ; Mueve lo que hay en W a PORTB
call ENVIA ; Imprime en LCD
movlw 'o'
movwf PORTB
call ENVIA
movlw 'l'
movwf PORTB
call ENVIA
movlw 'a'
movwf PORTB
call ENVIA
movlw ' '
movwf PORTB
call ENVIA
movlw 'L'
movwf PORTB
call ENVIA
movlw 'i'
movwf PORTB
call ENVIA
movlw 'n'
movwf PORTB
call ENVIA
movlw '1'
movwf PORTB
call ENVIA
return
; -----------------------------------------
M2:
movlw 'H' ; Mueve 'I' a W
movwf PORTB ; Mueve lo que hay en W a PORTB
call ENVIA ; Imprime en LCD
movlw 'o'
movwf PORTB
call ENVIA
movlw 'l'
movwf PORTB
call ENVIA
movlw 'a'
movwf PORTB
call ENVIA
movlw ' '
movwf PORTB
call ENVIA
movlw 'L'
movwf PORTB
call ENVIA
movlw 'i'
movwf PORTB
call ENVIA
movlw 'n'
movwf PORTB
call ENVIA
movlw '2'
movwf PORTB
call ENVIA
return
; -----------------------------------------
; Subrutina para inicializar el lcd
; -----------------------------------------
INICIO_LCD:
bcf PORTA, RS ; RS=0 MODO INSTRUCCION
movlw 0x01 ; El comando 0x01 limpia la pantalla en el LCD
movwf PORTB
call COMANDO ; Se da de alta el comando
movlw 0x0C ; Selecciona la primera línea
movwf PORTB
goto COMANDO ; Se da de alta el comando
movlw 0x3C ; Se configura el cursor
movwf PORTB
goto COMANDO ; Se da de alta el comando
bsf PORTA, RS ; Rs=1 MODO DATO
return
; -----------------------------------------
; Rutina para enviar comandos al LCD
; -----------------------------------------
COMANDO:
bsf PORTA, E ; Pone la E=1
bsf COMAN_T,0 ; Activa la Temporizacion
Retardo:
btfsc VECTOR, 1 ; Vector de Retardo 1 de Comando
goto Retardo_1
btfsc VECTOR, 2 ; Vector de Retardo 2 de Comando
goto Retardo_2
btfsc VECTOR, 3 ; Vector de Retardo 2 de Comando
goto Retardo_3
goto Retardo
; -----------------------------------------
; Rutina para enviar Datos a vizualizar en el LCD
; -----------------------------------------
ENVIA:
bsf PORTA, RS ; RS=1 MODO DATO
nop
nop
nop
call COMANDO ; Se da de alta el comando
Return
; -----------------------------------------
; Rutina para cambiar a la Lineal 2 del LCD
; -----------------------------------------
LINEA2:
nop
nop
nop
nop
bcf PORTA, RS ; RS=0 MODO INSTRUCCION
nop
nop
nop
movlw 0xC0 ; Selecciona linea 2 pantalla en el LCD
movwf PORTB
call COMANDO ; Se da de alta el comando
Return
Retardo_1:
;call DELAY
btfss VECTOR, 1 ; Vector de Temporizacion 1
goto Retardo
clrf VECTOR
Retardo_2:
;call DELAY
btfss VECTOR, 2 ; Vector de Temporizacion 2
goto Retardo
clrf VECTOR
bcf PORTA, E ; Pone la E=0
Retardo_3:
;call DELAY
btfss VECTOR, 3 ; Vector de Temporizacion 3
goto Retardo
clrf VECTOR
movlw B'00000010' ; Preparacion de Reinicio de Vectores
movwf VEC_TMP ; necesarios para la Rutina COMANDO
movwf VECTOR
bcf COMAN_T,0 ; Rompe la Temporizacion
Return
; -----------------------------------------
; Rutina de atencion de Interrupciones
; -----------------------------------------
Inter:
btfss INTCON, T0IF; Pregunta si el TMR0 se Reboso
Retfie
bcf INTCON, T0IF
movlw D'200'
movwf TMR0
btfss COMAN_T,0 ; Pregunta si el TMR0 se Reboso
goto Salir_T
decfsz TMP_LCD,F
goto Salir_T
movlw D'30' ; Valor de Tempozacion del LCD
movwf TMP_LCD
rlf VEC_TMP,F
movf VEC_TMP,W
movwf VECTOR
Salir_T
Retfie
END
-
No se si es correcto ni me fije demasiado acerca de que queres realizar en la linea 2, pero apenas vi la rutina de interrupciones note un error.
Te sugiero que leas el datasheet en esta seccion:
12.11 Context Saving During Interrupts
Pagina 154
Y veas el codigo que te da , para que lo uses.
-
Intento pasar de la linea 1 a la linea 2, esto lo tome de la explicacion de como hacerlo, enviando como comando 0XC0 indicando al LCD que quiero mostrar mensajes en la linea 2.............amigo no entendi. que quiso decir.................que cosa debo leer??
-
Que la rutina de interrupcion esta mal, le falta codigo, a eso me referia. Por eso te decia que leas el manual del integrado, el datasheet.
En la cual te doy la el nombre de la seccion a la cual me refiero y la pagina, aunque esta ultima puede variar por que me fije en el pdf que tengo guardado en casa.
Alli tenes un codigo y explica el por que debe estar ese codigo en la rutina de interrupcion.
-
amigo encontre por internet un documento de una sola hoja............
-
http://ww1.microchip.com/downloads/en/DeviceDoc/39582C.pdf
-
Gracias amigo.................por cierto he cambiado la lineas de la rutina Para la linea 2.......y pareciera que no reconociera la LCD ese comando C0.........pues los mensajes posteriores a ese comando no aparecen en la LCD
-
Buenos dias, amigo creo que te referias a que no se guardaba la informacion del registro W y la direccion de memoria donde estaba antes de la interrupcion???............si vez el codigo no es del todo necesario, pero lo inclui pero seguia igual,,,,,,,,,,
hice unos cambios para averiguar que pasaba y me di cuenta que simplemente el PIC obviaba la segunda linea de la LCD, eso me indicaba que solo se configuro para una linea..........revisando ,e di cuenta de algo....
El codigo wque use en la configuracion es este:
INICIO_LCD:
bcf LCD_RS ; RS=0 MODO INSTRUCCION
bcf LCD_E
movlw b'00111100' ; El comando Configura la LCD
movwf PORTB
call COMANDO ; Se da de alta el comando
movlw b'00000001' ; Selecciona la primera línea
movwf PORTB
goto COMANDO ; Se da de alta el comando
movlw b'00111100' ; Se configura Configura la LCD
movwf PORTB
goto COMANDO ; Se da de alta el comando
bsf LCD_RS ; Rs=1 MODO DATO
return
Lo configure malr regi .......
INICIO_LCD:
bcf LCD_RS ; RS=0 MODO INSTRUCCION
bcf LCD_E
movlw b'00111100' ; El comando Configura la LCD
movwf PORTB
call COMANDO ; Se da de alta el comando
movlw b'00111100' ; Selecciona la primera línea
movwf PORTB
goto COMANDO ; Se da de alta el comando
movlw b'00111100' ; Se configura Configura la LCD
movwf PORTB
goto COMANDO ; Se da de alta el comando
bsf LCD_RS ; Rs=1 MODO DATO
return
y no funciono......................probando funciono as.
; -----------------------------------------
; Subrutina para inicializar el lcd
; -----------------------------------------
INICIO_LCD:
bcf LCD_RS ; RS=0 MODO INSTRUCCION
bcf LCD_E
movlw b'00111100' ; El comando Configura la LCD
movwf PORTB
call COMANDO ; Se da de alta el comando
movlw b'00001100' ; Selecciona la primera línea
movwf PORTB
goto COMANDO ; Se da de alta el comando
movlw b'00111100' ; Se configura Configura la LCD
movwf PORTB
goto COMANDO ; Se da de alta el comando
bsf LCD_RS ; Rs=1 MODO DATO
return
lo probe a 4 Mhz y 20Mhz y funciono......................gracias de todas maneras
-
.si vez el codigo no es del todo necesario
En realidad ES necesario el codigo de guardar W y STATUS al entrar y reestablecerlo al salir.
Te sugiero lo que agregues, si es que no lo hiciste, y me alegro que pudiste solucionar el problema.
-
Eso lo se ...........pero escribi ese programa solo para ver esos mensajes en las 2 lineas, por eso no eran necesarios pero si voy a intergrar mas funciones al programas tengo que colocarlas..........gracias de todas maneras por la acotacion y el apoyo