Nu er jeg jo så kommet til en ny milesten.
Da jeg nu har koden med læsning af 4x4 keypaden til at virke, har jeg fået problemer med Timer0, der i den omtalte kode benyttes til at give SW-interrupt, når en tast påvirkes. Jeg har dog brug for timerfunktionen andre steder, hvor Timer0 anvendes til at teste, om 2 knapper holdes nede i 5 sek. Denne funktion vil jeg så have over på Timer1 i stedet. Til at teste Timer1, tager jeg udgangspunkt i dette lille kodeeksempel:
#include
//Timer 0 overflow ISR interrupt [TIM0_OVF] void timer0_ovf_isr(void) { static unsigned int timecount = 0; //global time counter TCNT0 = 0x06; // start med at tælle fra 6; Tæl til 250 if(++timecount == 1000) { PORTA = PORTA ^ 0x80; // Toggle bit 7 på PortA timecount = 0; // Clear for de næste
500 us } }void main(void) { // Timer 0 interrupt initialisering TIMSK = 0x02; // Afmask Timer 0 overflow interrupt DDRA = 0x80; // Port A bit 7 er output TCCR0 = 0x02; // Sæt Timer0 til clock/8 som clock input // Global aktivering af interrupts #asm("sei") while(1) ; }
Denne blinker fint med bit7 på PortA med 1 Hz. Dette forsøger jeg så at ændre til Timer1, således:
#include
//Timer 1 overflow ISR interrupt [TIM1_OVF] void timer1_ovf_isr(void) { static unsigned int timecount = 0; //global time counter TCNT1 = 0xFF05; // start med at tælle fra 65285; Tæl til 250 if(++timecount == 1000) { PORTA = PORTA ^ 0x80; // Toggle bit 7 på PortA timecount = 0; // Clear for de næste
500 us } }void main(void) { // Timer 0 interrupt initialisering TIMSK = 0x02; // Afmask Timer 0 overflow interrupt DDRA = 0x80; // Port A bit 7 er output TCCR1B = 0x02; // Sæt Timer1 til clock/8 som clock input // Global aktivering af interrupts #asm("sei") while(1) ; }
Hvilket desværre blot får bit 7 til at lyse konstant - Har ikke lige en scop, så jeg kan teste, om det blot er en høj frekvens. Hvad gør jeg galt?