TODOPIC
Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: irobertunam 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
-
Cosas a tener en cuenta:
1-
Estas habilitando una interrupcion (TMR0) y no estas haciendo uso de la misma.
deberias tener algo asi:
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:
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í:
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