Er zit inderdaad wel wat verschil tussen jouw code en die van het voorbeeld. Zo zetten ze ANSEL en ANSELH op 0 (weet niet of dat per sé nodig is) en idd moet de GIE-bit op 1 staan. Verder moet de PEIE (peripheral interrupt enable) ook 1 zijn.
Maar hij komt op deze manier toch nooit in de void interrupt()?
Normaliter niet nee, maar zodra er
een interrupt gegenereerd wordt, springt het programma naar die interrupt() functie. En met de nadruk op
een interrupt, want er wordt nu bij elk gegenereerde interrupt naar die functie gesprongen, dus bijvoorbeeld ook als timer2 afloopt, of als er een logic level change is op een pin (indien die interrupts toevallig enabled zijn). Met behulp van flags controleer je daar op:
code:
1
2
3
4
5
6
7
8
| void interrupt()
{
if(T0IF) // alleen uitvoeren indien interrupt afkomstig is van timer 0
{
PORTA = 255;
PORTB = 255;
}
} |
Verder moet je, nadat de interrupt uitgevoerd is (dus nog binnen de interruptfunctie zelf) de T0IF flag bit weer uitzetten, anders wordt die interrupt niet opnieuw uitgevoerd (zie voorbeeldcode).
Ik zie ook dat je TMR0 op T_TICK zet, ik zie die T_TICK verder nergens gedefinieerd staan.
Maar dit bedoel ik dus met goed kijken naar hoe je de registers in moet stellen, vaak is het net een lullig dingetje wat je misschien over het hoofd ziet. Ik weet ook dat je voor sommige dingen de interne comparators (CMCON register) uit moet zetten want die staan standaard aan.
Dat soort geintjes dus

Meestal is het een kwestie van de datasheet goed doorlezen. Bij de Microchip datasheets staat in ieder geval altijd welke registers te maken hebben met een bepaalde peripheral. Dan is het gewoon een voor een die registers nalopen en ze goed instellen, zodat je niks over het hoofd ziet.
[
Voor 19% gewijzigd door
JER00N op 25-11-2010 23:59
]