Autor Tema: Tabla en pic 16F84A  (Leído 1458 veces)

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

Desconectado irobertunam

  • PIC10
  • *
  • Mensajes: 1
Tabla en pic 16F84A
« en: 30 de Octubre de 2014, 14:37:19 »
Cuantas instrucciones o renglones puedo poner dentro de una tabla en este PIC
Este es el Programa, a la hora de cargar en programa, solo me despliega las primeras 13 instrucciones de la tabla y en total son 36
Porque hace esto.

;************************************ Dados usando Timer0.asm *********************

   __CONFIG   _CP_OFF &  _WDT_OFF & _PWRTE_ON & _XT_OSC
   LIST      P=16F84A
   INCLUDE  <P16F84A.INC>
   

; ZONA DE CÓDIGOS *********************************************************
   ORG    0

Inicio
   BANKSEL   PORTA
   CLRF    PORTA      ;limpia Puerto A
   BANKSEL   TRISA      
   MOVLW   B'00010000'
   MOVWF   TRISA
   BANKSEL   TRISB
   CLRF   TRISB
   CLRF   PORTB
   BANKSEL   PORTA

   bsf      STATUS,RP0   ; Acceso al Banco 1.
   movlw   b'00111000'   ; TMR0 como contador por flanco descendente de
   movwf   OPTION_REG   ; oscilador interno y prescaler máximo.
   movlw   b'10100000'   ; Se habilitan las interrupciones y en particular
   movwf   INTCON      ; la del desbordamiento del Timer0
   bcf      STATUS,RP0   ; Acceso al Banco 0.
   bcf      INTCON,T0IF   ; Repone flag del TMR0.
   clrf   TMR0      ; Inicializa el contador de Timer0.
   Clrf   PORTB
   
   
LOOP
   MOVF   TMR0,W
   ANDLW   B'00001111'      ; solo  el primer nibble.
   CALL   TABLA1         ; los datos de la tabla sirven para generar el
   MOVWF   PORTB         ; codigo BCD-7Seg
   GOTO    LOOP
TABLA1:
   addwf   PCL,F      
   retlw   b'00010001'   
   retlw   b'01110001'   
   retlw   b'00110001'   
   retlw   b'11101110'
   retlw   b'00110010'   
   retlw   b'00100110'
   retlw   b'00010111'
   retlw   b'01100010'
   retlw   b'01110111'
   retlw   b'00110011'
   retlw   b'11100111'
   retlw   b'00100010'
   retlw   b'01100110'
   retlw   b'00100011'
   retlw   b'01110011'
   retlw   b'01100111'
   retlw   b'01110010'
   retlw   b'00100111'
   retlw   b'00010011'
   retlw   b'00101110'
   retlw   b'00110110'
   retlw   b'00110111'
   retlw   b'00010110'
   retlw   b'01100001'
   retlw   b'11100011'   
   retlw   b'00011110'
   retlw   b'01100011'
   retlw   b'11100001'
   retlw   b'01101110'
   retlw   b'00010010'
   retlw   b'00100001'
   retlw   b'11100110'
   retlw   b'01110110'
   retlw   b'01111110'
   retlw   b'11100010'
   retlw   b'00111110'

   END

« Última modificación: 30 de Octubre de 2014, 14:41:07 por irobertunam »

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Tabla en pic 16F84A
« Respuesta #1 en: 30 de Octubre de 2014, 15:10:30 »
Cosas a tener en cuenta:
1-
Estas habilitando una interrupcion (TMR0) y no estas haciendo uso de la misma.
deberias tener algo asi:

Código: [Seleccionar]
ORG 0x04
GOTO INTERRUPCION ; es decir que cuando ocurra haga un salto  a esa bandera atienda la interrupcion y salga.
En tu caso estas volviendo a borrar el PORTA y B seteando todo de vuelta, ya que comenzaria un poco mas abajo que "Inicio" (4 instrucciones mas) para tu ejemplo como lo tenes escrito y para simular paso a paso no necesitas interrupcion.
Cuando ocurre una interrupcion en el PIC16F84A el vector de interrupcion esta en la posicion 0x04


2-
Estas haciendo:
Código: [Seleccionar]
ANDLW 0x0F ; o en binario 0000 1111
CALL TABLA1

Al hacer ese AND estas limitando a 2^4 = 16 posiciones tu tabla


3-
Estas usando un timer para mostrar los valores, y el timer sigue contando con lo que si pasan 2 ciclos de instrucción cualquiera sea sumaria 2... Generalmente para una tabla harías algo así:

Código: [Seleccionar]
INCF CONTADOR,F ; Incremento mi contador o "base" a donde quiero llegar de mi tabla ( Recaudo siempre al comienzo poner a 0 el registro CONTADOR )
;código extra
MOVF CONTADOR,W ; ese valor lo meto a mi tabla
CALL TABLA1 ; LLamo a la tabla

Como son 36 posiciones  y no es potencia de 2, no te va a servir el ANDLW, sino que que vas a tener que controlar que no supere el valor 35 (contando a 0 como valor), esto es cargandolo a W, restandole 35 y fijandose si se activaron la bandera de Cero (Z), asi reseteas tu registro CONTADOR. Eso iría en donde puse "Codigo Extra"

4-
En caso de ser MUY grande la tabla, hay que tomar consideraciones extras

Uno de los principales problemas es que el salto GOTO solo modifica el PCL y carga 2 bit de PCLATH en los bits mas significativos de PC

GOTO k
Operation:
k -> PC<10:0>
PCLATH<4:3> -> PC<12:11>

Entonces si una tabla comienza en 0x0AA y termina en 0x1AA y nadie carga el valor del PCLATH, cuando vos crees que te envia a la direccion 0x100 esta enviandote a 0x000 ( es decir al comienzo ).Algunas soluciones a esto es poner las tablas desde la otra pagina y cuando llames a la tabla cargas el valor del PCLATH


Resumiento:

Cualquiera de estos puede ser tu error, tanto que la interrupcion te "resetea" el micro al 13er valor, o como que estas limitando la tabla a 16 valores, o que estas usando el TIMER entonces puede que caiga siempre en los mismos valores por que depende de la cantidad de ciclos que pasaron, o la menos probable es que te pasaste en cantidad xD ( se necesitan 256 instrucciones para pasar de "pagina", asi que no lo veo probable en este caso). Es lo que se me ocurre viendo el codigo


« Última modificación: 30 de Octubre de 2014, 15:27:50 por KILLERJC »