Autor Tema: retlw  (Leído 3034 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado YF-21

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 185
retlw
« 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 ???  

Desconectado josemyzm

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 309
RE: retlw
« Respuesta #1 en: 12 de Julio de 2004, 14:07:00 »
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.
Saludos desde Logroño (España)

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2569
RE: retlw
« Respuesta #2 en: 13 de Julio de 2004, 03:54:00 »
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

Desconectado jaime_cr

  • PIC10
  • *
  • Mensajes: 11
RE: retlw
« Respuesta #3 en: 13 de Julio de 2004, 18:52:00 »
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.

Desconectado YF-21

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 185
RE: retlw
« Respuesta #4 en: 14 de Julio de 2004, 15:39:00 »
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

Desconectado YF-21

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 185
RE: retlw
« Respuesta #5 en: 23 de Julio de 2004, 02:00:00 »
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

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2569
RE: retlw
« Respuesta #6 en: 23 de Julio de 2004, 05:21:00 »
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


 

anything