Sida 1 av 1

AVR Timer interrupt

Postat: 3 april 2008, 20:01:25
av Johan.n
Hej! :)

Jag håller på att göra ett program till en varvräknare,
med en ATmega8, och har ett problem. Jag använder
en timer och när den har räknat tills den är "full"
så vill jag kalla på en funktion. Jag använder timerns
interrupt vektor för att kalla på funktionen.
Problemet är att programmet hoppar till main efter interrupten,
istället för att kalla på funktionen. Har ni några ideér?
Jag har inte någon tidigare erfarenhet av mikroprocessorer.
Har kollat i manualen men säkert missat en del.

Så här ser en del av koden ut:

Kod: Markera allt

void setup_interrupts(){
sei();                      //set global interrupt enable
GICR = 0x00;          //External interrupt0 and interrupt1 enable bits.     
//TIMER1 16 bit counter = ATmega8 timer/counter 1
TCNT1H = 0x00;      //set the counter1 Hregister 0
TCNT1L = 0x00;      //set the counter1 Lregister 0 
ICR1H = 0x00;        //empty the counting registers  counter1
ICR1L = 0x00;        //empty the counting registers  counter1
TCCR1A = 0x00;     //operation mode normal
TCCR1B = 0x41;     //internal clock source
                            //counting direction incrementing
                            //Input Capture Edge Select
//TIMER2 8 bit timer mode
TCNT2 = 0x00;       //set the timer2 0              timer2
OCR2 = 0xFF;        //output compare register       timer2
TCCR2 = 0x09;      //internal clock source         timer2
                           //Clear Timer on Compare Match (CTC) Mode
TIMSK = 0xC0;      //Interrupt enable
}
Så här hade jag tänkt använda funktionen:

void clk(int SIG_OVERFLOW2 ) //timer2 interrupt
{
funktionen........
}

Edit: code taggar

Postat: 3 april 2008, 20:11:58
av thepirateboy
Lägg gärna koden inom code-taggar så blir det lättare att läsa.

Undvik att anropa funktioner från interrupt, sätt istället en flagga till TRUE, som du tar hand om i main-rutinen. Kom ihåg att deklarera globala variabler som används i interrupt volatile.

Din ISR-rutin ser också helskum ut, borde vara nåt liknande så här istället:

Kod: Markera allt

ISR(TIMER2_OVF_vect )
{
  overflow = TRUE;
}
För att göra det enkelt kan man använda nåt verktyg för att generera init-koden, tex AVR IO Designer

http://www.forestmoon.com/Software/AvrIoDesigner/

Postat: 3 april 2008, 20:38:24
av Johan.n
OK! Tack jag skall testa programmet.

Om jag inte har förstått helt fel så går det att använda
både TIMER2_OVF_vect och SIG_OVERFLOW2, eftersom de
är definierade lika i iom8.h :?:

Postat: 3 april 2008, 20:41:57
av thepirateboy
Japp, TIMER2_OVF_vect är dock den nya definitionen och bör användas i "nykonstruktioner", men den gamla funkar fortfarande lika bra.

Postat: 3 april 2008, 22:10:30
av jesse
bah, varför använder alla C när det finns assembler.... Man får ju gissa vad programmet gör... Jag fattar ingenting... :(

När man programmerar med C microprocessorer blir ju språket nån slags hybrid mellan assembler och C ändå eftersom det är så mycket på maskinnivå - skillnaden är väl att man inte har full koll på alla register mm i C utan det sköts av kompilatorn?

Postat: 10 april 2008, 20:08:52
av jesse
Tänkte passa på att fråga ---- ni som håller på med att programmera AVR med C - hur kan jag lära mig C för AVR? Har ni nån bra dokumentation? Finns det flera varianter? Vilken kompilator ska man ha? Är det kompatibelt med AVRStudio och AVRISP-programmerare?

Postat: 10 april 2008, 22:13:27
av Korken
SmileyMicros bok för AVR Butterfly är bra.
Från den har jag lärt mig allt jag kan i C.

//Emil