Si además quieres enviarnos un Artículo para el Blog y redes sociales, pulsa el siguiente botón:
configuro el timer0 para 16bits, y el solo, una vez está inicializado, TMR0 register se incrementa cada ciclo de instrucción, hasta ahí bien, se va incrementando poco a poco el TMR0L que es la parte baja de TMR0, pero cuando llega a FF y le toca el paso a TMR0H éste no se incrementa, es decir, TMR0 pasa de por ejemplo:
TMR0 EEFF
EN EL SIGUIENTE CICLO DE INSTRUCCIÓN A:
TMR0 EE00
y debería ser:
TMR0 EF00
lo que viene a ser que TMR0H no se incrementa y TMR0L si, y ya no se como hacerlo, porque así nunca me llega a desbordar TMR0IF, ¿alguna idea de porque puede ser?
The Timer0 module has the following features:
Software selectable as an 8-bit or
16-bit timer/counter
Chequea que no lo tengas configurado como 8 bits, que es lo más probable que te puede estar pasando.
T0CON = 000x1xxx
SET bit TMR0ON del T0CON para activar.
lo tengo así configurado, pero no se que puede ser, hay que configurar algun registro mas para que salte el bit de INTCON TMR0IF?? hay que habilitar interrupciones o algo? me debe faltar algo y no se que, porque no me funciona
Si el T0CON lo tines configurado para 16 bits (como espedifica el datasheet), entonces tu problema es de las interrupciones seguro.
Para las interrupciones debes configurar los siguentes bits del INTCON
SET el bit TMR0IE del INTCON ; interrupción del TMR0
SET el bit GIE del INTCON ; interrupción general.
Dos niveles para habilitar la interrupción (timer y general)
He estado viendo el diagrama y para el TMR0 hay una AND con los bits TMR0IF, TMR0IE, TMR0IP. Creo que puede ser por esto, tiene tres entradas, debe ser el TMR0IP, voy a ver para que es. los dos primeros son interrupción y flag.
El TMR0IP pertenece al INTCON2, según lo que pone es para definir la prioridad, pero por lo que yo veo en el diagrama es una AND y si está a "0" no funcionará. Pon este bit a "1" también y comentame el resultado.
bit 2 TMR0IP: TMR0 Overflow Interrupt Priority bit
1 = High priority
0 = Low priority
Este es tu problema:
The PIC18F2331/2431/4331/4431 devices have
multiple interrupt sources and an interrupt priority
feature that allows each interrupt source to be assigned
a high-priority level or a low-priority level. The highpriority
interrupt vector is at 000008h and the low-priority
interrupt vector is at 000018h. High-priority interrupt
events will interrupt any low-priority interrupts that may
be in progress.
Por defecto está a nivel bajo por lo tanto intentará ir a la posición de memoria 0x18h donde no está tu subrutina de interrupción.
Saludos.
Si os sirve, yo así lo inicialicé hace años:
INITTMR0:
BSF STATUS,RP0
MOVLW b'0000111'
MOVWF OPTION_REG&7F
BCF STATUS,RP0
BSF INTCON,T0IE
RETURN
Por cierto, que después de inicializar el TIMER0 también levantaba el bit de GIE como mencionas... aunque ya no me acuerdo por qué lo hice:
BSF INTCON,GIE
Sólo sé que mi programa era la leche 🙄 y que me han llegado a pagar 120euros por él :D, la gente, lo vaga que puede ser por no hacerlo ellos.