TODOPIC
Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: mestanza en 08 de Marzo de 2013, 14:41:55
-
Poseo un problema con lo expresado en el tema.. Poseo un Pic16f887 estoy realizando una comunicacion serial usart (pic-pic), en el pic "esclavo" tengo un lcd conectado y en el pic "maestro" tengo un teclado matricial, toda la programacion esta es assembler.. Logre establecer la comunicacion, me muestra el numero en el lcd cada vez que presiono un boton en teclado matricial, perfecto!! pero poseo un detalle en la programacion del mismo:
Si presiono un boton en el pic-maestro (ejemplo el 1), en la pantalla lcd del pic-exclavo me mostrara el numero 1
Si presiono cualquier otro boton en el pic-maestro (ejemplo el 7), en la pantalla lcd del pic-exclavo me mostrara el numero 7, borrando el numero 1 mostrado anteriormente
Mi pregunta es, como puedo acumular los numeros sucesivamente? es decir, en lugar que me borre la pantalla me acumule los numeros presionados, para mi caso de ejemplo se muestre:
17
y siga sucesivamente.. Gracias por la ayuda
-
Para poder ayudarte es necesario ver el código ASM.
El programa que actulmente tienes puede haberse hecho de miles de formas, por tanto para poder entenderlo y ayudarte, cualquiera de nosotros debe ver primero el código fuente.
Ideal, si además del código anexaras el diagrama de conexionado. Sin un poco más de información es como dar "palos a ciegas".
Saludos.-
-
Creo que lo que tienes que hacer es apuntar hacia la nueva posición donde deseas hacer la escritura, recuerda que la posición 0 de la fila 1 para la LCD es b'10000000', a partir, de esta dirección puedes recorre todo el arreglo de columnas que posea el modulo LCD que estes utilizando.
-
Para poder ayudarte es necesario ver el código ASM.
El programa que actulmente tienes puede haberse hecho de miles de formas, por tanto para poder entenderlo y ayudarte, cualquiera de nosotros debe ver primero el código fuente.
Ideal, si además del código anexaras el diagrama de conexionado. Sin un poco más de información es como dar "palos a ciegas".
Saludos.-
Mi Codigo es el siguiente:
INCLUDE <P16F887.INC>
LIST p=16F887
__CONFIG _CONFIG1, _LVP_OFF & _FCMEN_OFF & _DEBUG_OFF & _IESO_OFF & _BOR_ON & _CPD_OFF & _CP_OFF & _MCLRE_ON & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT
__CONFIG _CONFIG2, _WRT_OFF & _BOR40V
CBLOCK 0X40
val1
val2
ETE
ENDC
;<<<<<<---------------------- VECTOR DE RESET ------------------------>>>>>>>
ORG 0x00 ;Inicio en el Vector de Reset
GOTO INICIO ;Va a la primera instruccion del programa
;<<<<<<------------------- VECTOR DE INTERRUPCION -------------------->>>>>>>
ORG 0x04 ;Vector de interrupcion
goto INTER ;salta a la linea INTER
;<<<<<<----------------- CONFIGURACION DE LOS REGISTROS GENERALES ------------------->>>>>>>
INICIO
BANKSEL ANSEL;;---Se definen PORTA y PORTB como digitales
CLRF ANSEL
CLRF ANSELH
BANKSEL TRISA
CLRF TRISD
CLRF TRISE
MOVLW .25 ;--valor para seleccionar 9600 baudios
MOVWF SPBRG
MOVLW b'00100100' ;Configuracion USART modo alta velocidad 9600 baud y activacion de transmision
MOVWF TXSTA ;carga valor anterior en registro asociado al generador del baud rate
BANKSEL RCSTA
MOVLW b'10010000' ;Configuracion de la usart
MOVWF RCSTA ;para recepcion continua y habilitacion del USART
bsf PIE1,RCIE ;Habilitacion interrupcion RX
BANKSEL INTCON ;Cambio al banco 0
movlw b'11000000' ;Habilitacion para las
movwf INTCON ;interrupciones generales
BANKSEL PORTA
CLRF PORTA
CLRF PORTB
CLRF PORTC
CLRF PORTD
CLRF PORTE
START_LCD:
call INICIA_LCD ;Configura el LCD
;<<<<<<<<-------------------------VISUALIZACION DE DATO RECIBIDO------------>>>>>>>>>>>>>>
leer_teclado
NOP ;--Se comporta como un tiempo de asentamiento
MOVF RCREG,W;;---Leer el buffer de recepción
MOVWF PORTD ;Visualiza dato recibido
call ENVIA
CALL DELAY
CALL DELAY
call INTER
CLRF RCREG
GOTO leer_teclado
ENVIA:
bsf PORTE,0 ; RS=1 MODO DATO
call COMANDO ; Se da de alta el comando
RETURN
;<<<<<<<<-------------------COMPROVACION DE TIPO DE INTERRUPCION------------>>>>>>>>>>>>>>
INTER
BCF STATUS,RP0
BCF STATUS,RP1
btfss PIR1,RCIF ;comprueba si el shift register(RSR)esta lleno.y si es asi salta
retfie ;retorno de interrupcion si no se ha dado la circunstancia anterior
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
INICIA_LCD:
bcf PORTE,0 ; RS=0 MODO INSTRUCCION
movlw 0x01 ; El comando 0x01 limpia la pantalla en el LCD
movwf PORTD
call COMANDO ; Se da de alta el comando
movlw 0x0C ; Selecciona la primera línea
movwf PORTD
call COMANDO ; Se da de alta el comando
movlw 0x3C ; Se configura el cursor
movwf PORTD
call COMANDO ; Se da de alta el comando
bsf PORTE, 0 ; Rs=1 MODO DATO
return
;Subrutina para enviar comandos
COMANDO:
bsf PORTE,1 ; Pone ENABLE en 1
call DELAY ; Tiempo de espera
bcf PORTE,1 ; ENABLE=0
call DELAY
return
; Subrutina de retardo
DELAY:
movlw 0xFF
movwf val2
ciclo:
movlw 0xFF
movwf val1
ciclo2:
decfsz val1,1
goto ciclo2
decfsz val2,1
goto ciclo
return
END
Si pueden corregirlo con la ayuda que les pido seria genial, gracias!!
-
Creo que lo que tienes que hacer es apuntar hacia la nueva posición donde deseas hacer la escritura, recuerda que la posición 0 de la fila 1 para la LCD es b'10000000', a partir, de esta dirección puedes recorre todo el arreglo de columnas que posea el modulo LCD que estes utilizando.
Para ser sinceros, estoy empezando a trabajr con el LCD y aun estoy en fase se "descubrimiento", si me ayudas a como debo configurar el movimiento de posiciones en filas y columnas, estare agradecido
-
mestanza observa el siguiente código
;********************* Rutina de envio de datos ****************
recibe movf rcreg,0
pregunta btfss pir1,5
goto pregunta
addlw 30h ; ASCII
movf rcreg,0
incf posicion,1
;********************* Rutina de control de la LCD *********************
lcd bcf portc,0 ; Inicializar transmisión
goto vaya
lcd_esc bsf portc,0
vaya bsf portc,1 ; activo el modo escritura
movwf portb ; paso al puerto b
call retardo ; pequeño retardo
bcf portc,1 ; para inicializar la lcd
call retardo
return
inicio bcf status,6
bsf status,5 ; banco 1
movlw b'11111111'
movwf porta
movwf portd
movwf porte ; configuro los puerto A,D,E como salida
movlw b'11111100'
movwf portc
movlw b'00000000'
movwf portb ; Puerto B como salida digítales
movlw b'00100100'
movwf txsta ; configuro la transmisión
movlw d'103'
movwf spbrg ; configuro a 4MHz y 2400 bps
bcf status,5 ; banco 0
movlw b'11011000'
movwf rcsta ; Habilitar lqa recepción y el módulo serial
clrf portb ; limpio el puerto
movlw b'10000000' ; Ubica el puntero en la primera posición
call lcd
clrf posicion
movlw b'10000000'
movwf arriba
vuelve clrf vector
call recibe ; Recibe el dato en registro RECREG
movf rcreg,0 ; Paso el respectivo caracter a W
call lcd_esc ; si no es ningun valor
incf posicion,1
decf posicion,1
movf posicion,0
addwf arriba,1
clrf posicion
goto vuelve ; escribe el valor en la LCD
end
La rutina de tiempo simplemente espera a que la lcd de estabilice eso es todo, además, en este código se enseña todo lo que necesitas para tu aplicación, cualquier cosa estaré atento.
-
mestanza observa el siguiente código
;********************* Rutina de envio de datos ****************
recibe movf rcreg,0
pregunta btfss pir1,5
goto pregunta
addlw 30h ; ASCII
movf rcreg,0
incf posicion,1
;********************* Rutina de control de la LCD *********************
lcd bcf portc,0 ; Inicializar transmisión
goto vaya
lcd_esc bsf portc,0
vaya bsf portc,1 ; activo el modo escritura
movwf portb ; paso al puerto b
call retardo ; pequeño retardo
bcf portc,1 ; para inicializar la lcd
call retardo
return
inicio bcf status,6
bsf status,5 ; banco 1
movlw b'11111111'
movwf porta
movwf portd
movwf porte ; configuro los puerto A,D,E como salida
movlw b'11111100'
movwf portc
movlw b'00000000'
movwf portb ; Puerto B como salida digítales
movlw b'00100100'
movwf txsta ; configuro la transmisión
movlw d'103'
movwf spbrg ; configuro a 4MHz y 2400 bps
bcf status,5 ; banco 0
movlw b'11011000'
movwf rcsta ; Habilitar lqa recepción y el módulo serial
clrf portb ; limpio el puerto
movlw b'10000000' ; Ubica el puntero en la primera posición
call lcd
clrf posicion
movlw b'10000000'
movwf arriba
vuelve clrf vector
call recibe ; Recibe el dato en registro RECREG
movf rcreg,0 ; Paso el respectivo caracter a W
call lcd_esc ; si no es ningun valor
incf posicion,1
decf posicion,1
movf posicion,0
addwf arriba,1
clrf posicion
goto vuelve ; escribe el valor en la LCD
end
La rutina de tiempo simplemente espera a que la lcd de estabilice eso es todo, además, en este código se enseña todo lo que necesitas para tu aplicación, cualquier cosa estaré atento.
Muchas Gracias Hombre, estoy en proceso de chequearlas, pero antes puedes sacarme de unas dudas de tus codigos?
que hace ?
addlw 30h ; ASCII
movf rcreg,0
incf posicion,1
valor de las variable posicion?
puedo cambiar el siguiente dato por d'25' para que se mueva en 9600baudios?
movlw d'103'
movwf spbrg ; configuro a 4MHz y 2400 bps
Gracias!!!!
-
Muchas Gracias Hombre, estoy en proceso de chequearlas, pero antes puedes sacarme de unas dudas de tus codigos?
que hace ?
addlw 30h ; ASCII
movf rcreg,0
incf posicion,1
Valor que recibe por la comunicación serial lo pasa a ascii (esto se logra sumándole 30h al dato recibido ver hoja de datos de la LCD)
puedo cambiar el siguiente dato por d'25' para que se mueva en 9600baudios?
movlw d'103'
movwf spbrg ; configuro a 4MHz y 2400 bps
Claro la velocidad de la comunicación es independiente del manejo del modulo LCD. Seria bueno que estudiaras el respectivo datasheet de la LCD, en ese documento esta todo lo que necesitas.
-
Muchas Gracias Hombre, estoy en proceso de chequearlas, pero antes puedes sacarme de unas dudas de tus codigos?
que hace ?
addlw 30h ; ASCII
movf rcreg,0
incf posicion,1
Valor que recibe por la comunicación serial lo pasa a ascii (esto se logra sumándole 30h al dato recibido ver hoja de datos de la LCD)
puedo cambiar el siguiente dato por d'25' para que se mueva en 9600baudios?
movlw d'103'
movwf spbrg ; configuro a 4MHz y 2400 bps
Claro la velocidad de la comunicación es independiente del manejo del modulo LCD. Seria bueno que estudiaras el respectivo datasheet de la LCD, en ese documento esta todo lo que necesitas.
Perfecto, muchas Gracias!!! Lo tendre presente... dejame adaptar todo esto a mi programa y te dire que tal me fue, vale? Mil gracias nuevamente
-
Muchas Gracias Hombre, estoy en proceso de chequearlas, pero antes puedes sacarme de unas dudas de tus codigos?
que hace ?
addlw 30h ; ASCII
movf rcreg,0
incf posicion,1
Valor que recibe por la comunicación serial lo pasa a ascii (esto se logra sumándole 30h al dato recibido ver hoja de datos de la LCD)
puedo cambiar el siguiente dato por d'25' para que se mueva en 9600baudios?
movlw d'103'
movwf spbrg ; configuro a 4MHz y 2400 bps
Claro la velocidad de la comunicación es independiente del manejo del modulo LCD. Seria bueno que estudiaras el respectivo datasheet de la LCD, en ese documento esta todo lo que necesitas.
Perfecto, muchas Gracias!!! Lo tendre presente... dejame adaptar todo esto a mi programa y te dire que tal me fue, vale? Mil gracias nuevamente
Hombre una pregunta, cuando hace el "call recibe", en donde habilitas el return? despues de "movf rcreg,0" no? creo entender tu codigo, pero no me anexaste tu configuracion de pines, asumo que las patas de D0-D7 estan conectadas al PORTB, y las patas de RS y E estan conectadas a PORTC pero dudo en cual pata de dicho puerto van.. te agredeceria esa info para terminar de comprender el programa. Gracias
-
Hombre una pregunta, cuando hace el "call recibe", en donde habilitas el return? despues de "movf rcreg,0" no? creo entender tu codigo, pero no me anexaste tu configuracion de pines, asumo que las patas de D0-D7 estan conectadas al PORTB, y las patas de RS y E estan conectadas a PORTC pero dudo en cual pata de dicho puerto van.. te agredeceria esa info para terminar de comprender el programa. Gracias
RS -----> RC1
E -----> RC2
D0 -----> RB0
.
.
D7 -----> RB7
La rutina "recibe" tiene como objetivo recibir un dato por medio del usart del microcontrolador y pasarlo al respectivo ASCII para posteriormente visualizar el dato en la LCD.