TODOPIC
Microcontroladores PIC => Primeros pasos - Iniciación a los microcontroladores => Mensaje iniciado por: mihjailovic en 17 de Julio de 2010, 18:04:18
-
un saludo a todos
estoy iniciándome en la programación de pic, y he comenzado siguiendo un tutorial, pero me he encontrado con este programa y tengo la duda de como funciona la instruccion retlw, para hacer tablas, no se que funcion cumplen los NOP entre las instrucciones retlw (lo que se de ellos solo retardan un ciclo de maquina), porque he visto otros programas donde no los colocan, pero si los quito en este el programa no funciona. ademas que tendria que cambiar para leer un teclado 4x3
si alguien por favor me puede explicar se lo agradezco. el programa es el siguiente:
;este programa lee un tecaldo matricial 4x4 y muestra el valor en un display 7 segmentos
LIST P=16F84A
INCLUDE P16F84.INC
TECLA EQU D'12'
ROTA EQU D'13'
FILAS EQU D'14'
RESET ORG 0
GOTO INICIO
ORG 5
TABLA ADDWF PCL
NOP
RETLW 0;PRIMERA COLUMNA
RETLW 1;SEGUNDA COLUMNA
NOP
RETLW 2;TERCERA COLUMNA
NOP
NOP
NOP
RETLW 3;CUARTA COLUMNA
INICIO BSF STATUS,5
CLRF TRISA
MOVLW D'15'
MOVWF TRISB
BCF STATUS,5
CLRF PORTB
CLRF PORTA
MOVLW D'0'
MOVWF TECLA
CICLO SWAPF TECLA,W
MOVWF PORTB
SCAN CLRF FILAS
MOVLW B'1110'
PROBAR MOVFW ROTA
MOVWF PORTA
NOP;TIEMPO PARA ESTABILIDAD DE LAS LINEAS
LEER MOVFW PORTB
ANDLW D'15' ;ELIMINA LA PARTE ALTA DEL BYTE LEIDO
XORLW D'15' ;INVIERTE EL DATO LEIDO A VER SI HAY UN CERO
BTFSS STATUS,Z
GOTO SALIR
BTFSS ROTA,3 ;PREGUNTA SI VAN 4 ROTACIONES
GOTO SCAN
BSF STATUS,C ;COLOCA BIT CARRY EN 1
RLF ROTA
MOVLW 4 ;CARGA W CON 4 PARA SUMARLO AL VALOR DE LAS FILAS
ADDWF FILAS,1
GOTO PROBAR
SALIR CALL TABLA
ADDWF FILAS,W ;SUMA FILAS Y COLUMNAS PARA OBTENER DATO REAL
MOVWF TECLA ; MUESTRA DATO LEIDO EN DISPLAY
GOTO CICLO
END
-
Que tal mihjailovic? la instrucción RETLW no solo se utiliza para hacer tablas, esta instrucción lo que hace es retornar de una subrutina o llamada con un valor en el registro W.
Según el ejemplo que pusiste, los NOP están debido a la forma en que se decodifica la columna en la que se encuentra la tecla pulsada. por ejemplo:
Si se pulsa la tecla en la columna 1 el valor del Puerto B seria 1110, luego de negar 0001 por lo tanto tendría que retornar con el valor en la 2da posición en la tabla
Si se pulsa la tecla en la columna 2 el valor del Puerto B seria 1101, luego de negar 0010 por lo tanto tendría que retornar con el valor en la 3ra posición en la tabla
Si se pulsa la tecla en la columna 3 el valor del Puerto B seria 1011, luego de negar 0100 por lo tanto tendría que retornar con el valor en la 5ta posición en la tabla
Si se pulsa la tecla en la columna 4 el valor del Puerto B seria 0111, luego de negar 1000 por lo tanto tendria que retornar con el valor en la 9na posición en la tabla
Espero que te sirva la explicación.!
EDITO: los nop están para "rellenar" los valores no usados en la tabla. En otros programas capaz no sean necesarios porque utilizan otros métodos para detectar y decodificar la tecla pulsada.
-
hola gary, agradezco mucho tu ayuda, la verdad fue muy clara y me ayudo a entender la instruccion retwl.
ahora lo que puedo entender es que el registro pcl siempre tiene el valor de 1, corrigeme si no es asi, ademas en el programa se suma filas que lo analizo asi:
si rota=1110 entonces fila=0
si rota=1101 entonces fila=4
si rota=1011 entonces fila=8
si rota=0111 entonces fila=12
ahi me surge otra duda, cuando presiono una tecla, en ese instante w es diferente de 0 luego de la instruccion xorlw, por lo tanto la proxima rotacion no se realiza (ya que hay un goto a salir) y filas queda con el valor que tenia antes de la pulsacion, entonces no deberia existir un error en la instruccion ADDWF FILAS,W, (luego del retorno), si por ejemplo la tecla pulsada este en la primera fila y la rotacion haya quedado en una fila diferente
gracias
-
no, el registro pcl puede tener cualquier valor, ya que en este registro esta el byte bajo del contador de programa. cuando llamas a la subrutina TABLA, el PCL tiene el valor en el que se encuentra esa subrutina en la memoria de programa, pero como las siguientes instrucciones (nop,retlw 0,retlw 1,nop,nop, etc) estan en las siguientes direcciones de memoria, al sumarle un valor al PCL, "salto" w-direcciones de memoria, siendo w el ultimo valor en el registro W.
si rota=1110 entonces fila=0
si rota=1101 entonces fila=4
si rota=1011 entonces fila=8
si rota=0111 entonces fila=12
exactamente, lo que hace ahí es sumarle 4 para poder tener el primer valor de cada fila al analizarla.
ahi me surge otra duda, cuando presiono una tecla, en ese instante w es diferente de 0 luego de la instruccion xorlw, por lo tanto la proxima rotacion no se realiza (ya que hay un goto a salir) y filas queda con el valor que tenia antes de la pulsacion, entonces no deberia existir un error en la instruccion ADDWF FILAS,W, (luego del retorno), si por ejemplo la tecla pulsada este en la primera fila y la rotacion haya quedado en una fila diferente
A ver si me explico, realmente nunca se da la situación que dices, ya que el programa hace constantemente un chequeo de las filas, osea, si se presiona una tecla de cualquier fila, solamente cuando el programa analice esa fila (y si hay una tecla pulsada) decodificara en cual columna esta la tecla. en el ejemplo que das, si se pulsa una tecla en la primera columna pero rota=1011 no detectara ninguna tecla pulsada, ya que la fila 0 esta en 1, y la lectura de todas las columnas también sera 1 debido a la conexión en forma de matriz del teclado!
Espero te haya sido de ayuda! cualquier cosa pregunta nomas! :)
-
hola gary mil gracias de nuevo.
en el ejemplo que me das, es decir, si yo presiona la tecla correspondiente a la fila 1 columna 2 (que es el 1), pero rota=1011, en ese momento no me detecta la tecla porque el cero no esta en la primera fila. ahora cuando el cero llegue a la primera fila ya abre soltado la tecla, entonces como se dara cuenta cual tecla se presiono para poder mostrar el 1, o simplemente por la velocidad del microcontrolador el cero llegara antes de que yo la suelte y por esa razon la detecta. porque de lo que entiendo el programa no sigue con la rotacion hasta que no suelto la tecla.
gracias
-
o simplemente por la velocidad del microcontrolador el cero llegara antes de que yo la suelte y por esa razon la detecta.
exactamente, calcula que cada instrucción en assembler tarda un ciclo de maquina en ejecutarse, con un cristal de 4 MHz, esto seria 1 micro segundo por cada instrucción normal y 2 para instrucciones goto o call. normalmente cuando presionas un pulsador, lo presionas por 500 mili segundos o mas, y debido a la velocidad de ejecución, el micro podrá detectar la tecla. Otra opción para realizar la detección de la tecla por medio de interrupciones, seguro buscando en el foro encontraras mas información. Espero haber ayudado! Saludos!
-
hola gary, esta vez solo quiero agradecerte por tu ayuda, la verdad cada participacion fue muy aclarativa y me ayudo a enterder el tema, ademas fuiste muy paciente a la hora de resolver mis dudas, ahora ya puedo continuar mi aprendizaje. cuidate saludos
-
Alguno micros traen interrupciones por cambio de estado en los pines RB4 al RB7.
Con estas 4 lineas/ columnas ya puedes utilizar tu teclado por interrupciones.
-
hola gary, esta vez solo quiero agradecerte por tu ayuda, la verdad cada participacion fue muy aclarativa y me ayudo a enterder el tema, ademas fuiste muy paciente a la hora de resolver mis dudas, ahora ya puedo continuar mi aprendizaje. cuidate saludos
No hay problemas mihjailovic, fue un placer haber podido ser de ayuda! :mrgreen:
Alguno micros traen interrupciones por cambio de estado en los pines RB4 al RB7.
Con estas 4 lineas/ columnas ya puedes utilizar tu teclado por interrupciones.
Si, justamente a eso me refería en el post anterior, ya que cuando lo hice fue de esa manera! jajaja ;-)
-
gracias pibe, tienes mucha razon el lo que dices y quizas sea mas sencillo, solo que como mencionaba antes apenas me inicio en la programacion y estoy siguiendo un pequeño tutorial donde encuentro ejemplos y trato de entenderlos para ir adquiriendo la logica ademas de ir conociendo los registros y como manejarlos.
aun no he llegado a la parte de interrupciones, cuando lo haga entendere lo que me tratan de explicar gary y tu y podre usar ese metodo.
agradezco mucho tu aporte
-
De manera somera y callejera (que es como yo mejor entiendo las cosas :mrgreen:) las interrupciones hacen que el micro deje de hacer lo que estaba haciendo en el programa principal y salte a una rutina especial. Al acabar la rutina especial vuelve exactamente desde donde salió del programa principal y continúa lo que estaba haciendo.
Hay distinto tipos de interrupciones, y hay micros que tienen mas o menos tipos y cantidades de interrupciones.
Una interrupción puede ser causada por un factor externo o interno.
Un factor externo podría ser que un pin especial del micro cambie de estado.
Un factor interno podría ser que un contador haya llegado a su fin.
Eso es, a grosso modo lo que son las interrupciones.
Y son muy pero que muy útiles, ya que si por ejemplo tienes un programa que deba estar mostrando por display, rastreando el teclado, activando salidas etc etc.-. pues.... imagina cuanta tarea tiene de rastrear toooooooodo y volver a empezar .
Con las interrupciones, por ejemplo en el teclado, pues el micro se ocuparía de activar salidas y mostrar el display, despreocupándose de rastrear el teclado. Cuando se active una tecla del teclado pues saltará a esa rutina que tienes para leer el teclado, guardas el dato y vuelves al programa principal.
Guay, no? :D
-
entiendo lo que me tratas de decir, de esa manera es mucho mas sencillo y el pic no estaria todo el tiempo ocupado y podria hacer muchas otras labores. pero aun con interrupciones no tendria que detectar la tecla pulsada (recordando que hay 4 teclas que van hacia un mismo pin)
buen aporte pibe. una vez mas agradezco tu participacion y ayuda en mi aprendizaje
-
Por supuesto que debería detectar la tecla pulsada, y toda la rutina que usas para detectar cual tecla fué pulsada iría en este "espacio especial" de interrupciones. La ventaja es que el micro haría lo suyo en el programa principal, cuando pulses una tecla saltaría inmediatemente a esta subrutina , detectaría la tecla, la guardaría en una variable y volvería al programa principal para seguir con lo que estaba haciendo y cuando llegase el momento mostrar (por ejemplo) la variable que contiene tu tecla pulsada.
-
entendido. gracias por tomarte el tiempo para explicarme. saludos