TODOPIC
Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: YF-21 en 12 de Julio de 2004, 11:23:00
-
Ya me prestaron el libro del 16F84 de J.M. Angulo y me encontré con algunos programas que tenian varios retlw con valores diferentes ... aqui un ejemplo:
HEX_7SEG
andlw b"00001111"
andwf PCL,F ;Desplazamiento sobre la tabla
retlw b"00111111" ; 0
retlw b"00000110" ; 1
retlw b"01011011" ; 2
.....
Tambien existe otra subrutina del programa que hace lo mismo pero se llama KEY_TABLA (tiene varios retlw)
Entonces ... como funciona este arreglo de retlw ???
-
Todo eso se usa para tener tablas de datos en la memoria de programa del micro.
Digamos que es una subrutina a la que llamas indicandole la posición que quieres leer.
al inicio de esta rutina lo que se hace es modificar el registro PCL (que indica la posicion actual dentro de la memoria)
sumandole el valor que tú has pasado y que corresponde a la posición de la tabla a leer. Con esto lo que se consigue es
saltar xx posiciones (hasta la posición de la tabla deseada), donde tenemos RETLW xx que nos devuelve el valor deseado.
jo, que mal me explico, lo siento, sino veo nada mejor ya trataré de hacerlo graficamente.
-
Pués la verdad, tal como tienes puesto el programa yo tampoco lo entiendo.
¿No será, que el andwf es un addwf? Me parece que va a ser que sí.
Un saludo
-
Hola, la primera linea de ese codigo lo que hace es limitar el desplazamiento a F, que seria el valor maximo a desplegar. Eso esta pura vida, pero la segunda linea como dice "pocher" deberia ser un addwf en vez de andwf, pues sino quien sabe a donde ira a apuntar el PCL.
-
Aqui les va el programa completo, esto parece que tiene que ser parte de un arreglo con apuntadores o algo asi ...
;PROYECTO TÖPICO 3
;"ESCRITURA DE MENSAJES DE TECLADO SOBRE LCD"
;Se desea realizar un programa que visualice sobre el LCD las teclas
;que se vayan pulsando. Cada pulsaci¢n ir acompa¤ada de un "beep" de
;0,25 segundos sobre el zumbador piezoel‚ctrico conectado a RA3
;DIRECTIVAS DEL PROGRAMA
LIST P=16F84 ; Se emplea el PIC 16F84
RADIX HEX ; Sistema de numeraci¢n hexadecimal
;ETIQUETAS DEL PROGRAMA
INCLUDE "PIC16CXX.INC"
TEMP_1 EQU 0x0C
DELAY_1 EQU 0x0D
DELAY_2 EQU 0x0E
DELAY_3 EQU 0x0F
LCD_VAR EQU 0x10
KEY_VAR EQU 0x12
;POSICIONAMIENTO DE LA RUTINA DE INICIO
ORG 0 ; El programa comienza en la direcci¢n 0 y
goto INICIO ; salta a la direcci¢n 5 para sobrepasar el
ORG 5 ; vector de interrupci¢n
;RUTINA HEX_ASCII: Rutina que pasa el valor HEXADECIMAL que contiene
;W a valor ASCII, para ser mostrado por el LCD
HEX_ASCII addwf PCL,1
retlw "0"
retlw "1"
retlw "2"
retlw "3"
retlw "4"
retlw "5"
retlw "6"
retlw "7"
retlw "8"
retlw "9"
retlw "A"
retlw "B"
retlw "C"
retlw "D"
retlw "E"
retlw "F"
;PROGRAMA PRINCIPAL
INCLUDE "LCD_CXX.ASM"
INCLUDE "TECLADO.ASM"
INICIO call UP_LCD
call LCD_INI
call DISPLAY_ON_CUR_OFF
bsf STATUS,RP0 ; Selecci¢n del banco 1
clrf PORTA ; Puerta A como salida
movlw b"10000111"
movwf OPTION_REG
bcf STATUS,RP0
bsf PORTA,3 ; Desactivaci¢n del zumbador
NO_HAY call KEY_SCAN ; Se hace un chequeo del teclado
movlw 0x80
subwf TECLA,W ; Sobre TECLA quedar la tecla pulsada o 0x80
btfsc STATUS,Z
goto NO_HAY ; No se ha pulsado ninguna tecla
call KEY_OFF ; S¡ se ha pulsado. Se espera a que se suelte
bcf PORTA,3 ; Se genera un "beep"
movlw d"25"
movwf TEMP_1
call DELAY10 ; Se crea una temporizaci¢n de 25 ms
bsf PORTA,3 ; Se desactiva zumbador
call KEY_HEX ; Se pasa a valor hexadecimal
call HEX_ASCII ; Se pasa el valor hexadecimal a c¢digo ASCII
movwf TECLA ; Se guarda temporalmente en TECLA
call UP_LCD
call BORRA_Y_HOME
call DISPLAY_ON_CUR_OFF
movlw 0x81 ; Primer car cter de primera l¡nea
call LCD_REG
movf TECLA,W
call LCD_DATO ; Se saca por el LCD
goto NO_HAY ; Se vuelve a empezar
;RUTINA DE DELAY DE 10 MS: Esta rutina utiliza el TMR0.
;Es una temporizaci¢n de 10 ms que se repite tantas veces
;como indique la variable TEMPO1
DELAY10 bcf INTCON,2 ; Borra flag del TMR0
movlw 0xD8
movwf TMR0 ; Carga el TMR0 con valor 39
DELAY10_1 btfss INTCON,2 ; Espera rebosamiento del TMR0
goto DELAY10_1
decfsz TEMP_1,F
goto DELAY10
return
;RUTINA DE DELAY DE 1 SEGUNDO: Se basa en la rutina de 10ms, repiti‚ndola 100 veces
DELAY1S movlw 0x64
movwf TEMP_1
call DELAY10
return
;RUTINA KEY_OFF: Esta rutina espera que la tecla reci‚n pulsada sea soltada.
;Debe usarse justo despu‚s de llamar a la rutina KEY_SCAN
KEY_OFF movf TECLA,W
movwf TEMP_1 ; Guarda temporalmente la tecla
KEY_OFF_NO call KEY_SCAN ; Mira si se ha soltado
movlw 0x80
subwf TECLA,W
btfss STATUS,Z
goto KEY_OFF_NO ; Bucle mientras no se suelte
movf TEMP_1,W ; Ya se ha soltado
movwf TECLA ; Se repone la tecla
return
;RUTINA DE DELAY VARIABLE: Esta rutina realiza una temporizaci¢n que
;depende del valor del acumulador en el momento en que se le llama
DELAY_V movwf DELAY_1
clrf DELAY_3
clrf DELAY_2
DELAY_LOOP decfsz DELAY_3,F
goto DELAY_LOOP
decfsz DELAY_2,F
goto DELAY_LOOP
decfsz DELAY_1,F
goto DELAY_LOOP
return
END
saludos a todos
-
Pues asì es pocher-sama es un error en el asm del cd ya que si lo comparo con el del libro es addwf.
Ahora, a responder mi duda ... el arreglo de retlw nos sirve para tomar cierto valor dependiendo de un "contador de ciclo", ese contador se suma con el registro pclath me parece, y ese registro le indica al micro en què linea del codigo deberà situarse, asi, dependiendo del valor que se le sume a este registro, es a donde te manda
En conclusion es una especie de goto
GRACIAS POR LA RESPUESTA
-
Sí más o menos.
- El andlw b"00001111" se carga el nible alto del acumulador y deja solo el valor del acumulador que supongamos que era un 3. Esto lo hace porque en hexadecimal solo hacen falta 16 valores, del 0 al 15.
- El addwf PCL,F suma al contador de programa el valor del acumulador con lo que si era un 3 avanzará el PC 4 posiciones (una más) situándose en el retlw b"01100110" (símbolo del 4 en 7 segmentos). Entonces retornaría al programa principal con el acumulador cargado con el 4, lo único que ahora habría que hacer es coger este 4 del acumulador y lanzarlo hacia el PORTB (por ejemplo) para visualizarlo en el display.
Un saludo