Hur får man interrups att fungera på AVR?

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Glattnos
Inlägg: 3100
Blev medlem: 29 oktober 2009, 20:01:18

Hur får man interrups att fungera på AVR?

Inlägg av Glattnos »

Jag försöker att skriva ett program för en Arduino UNO i Arduino IDE utan att använda Arduinos inbyggda setup() och loop() funktioner. Men det verkar som att jag inte får några interrupts att inträffa, det känns som att jag glömt nått enkelt.
Jag har oscilloskop på PD4 och om jag lägger togglingen av pinnen direkt i while-loopen så togglas den, men om den ligger i "FastLoop" så togglas den inte. Att jag har två timers och två avbrott var för att felsöka ifall det var bara timer2(som jag tänkt använda) som inte fungerade.
Jag har även provat att inkludera <Arduino.h> men det hjälper inte.
Nån som ser nått uppenbart problem?

Kod: Markera allt

#include <avr/io.h>
#include <avr/interrupt.h>

#define fastloop 256
#define TestOut1 PD4  //D4
int FastLoopCounter = 0;

int main(void)
{
  DDRD = (1 << TestOut1); //Set output pins

  TCCR1B = (0 << CS12) | (1 << CS11) | (0 << CS10);  //Prescale 8
  TIMSK1 = (1 << TOIE1);

  TCCR2B = (0 << CS22) | (0 << CS21) | (1 << CS20);
  TIMSK2 = (1 << TOIE2);
  sei();
  while(1)
  {
    if(FastLoopCounter >= fastloop) //Timed loop 118Hz(236Hz)
    {
      PORTD = PORTD ^ (1 << TestOut1);  //Toggle StepPin
      FastLoopCounter = 0;
    }
  }
  return 0;
}

ISR(TIMER1_OVF_vect)
{
  FastLoopCounter++;
}
ISR(TIMER2_OVF_vect)
{
  FastLoopCounter++;
}
EBD
Inlägg: 136
Blev medlem: 10 maj 2006, 18:50:48
Ort: Sundsvall

Re: Hur får man interrups att fungera på AVR?

Inlägg av EBD »

Testa att deklarera FastLoopCounter som "volatile int", annars kan den bli bortoptimerad eftersom den endast ökas utanför mainloopen.
Användarvisningsbild
adent
Inlägg: 4242
Blev medlem: 27 november 2008, 22:56:23
Ort: Utanför Jönköping
Kontakt:

Re: Hur får man interrups att fungera på AVR?

Inlägg av adent »

Ja, prova det med volatile. Vid en snabbtitt på din kod ser det rätt ut. Du slår på timer-interrupten och globala interrupt. Borde räcka, bara timern räknar, men det tror jag den ska.
Lusläs datablad om timerns register om inte volatile hjälpte.

Mvh: Mikael
Glattnos
Inlägg: 3100
Blev medlem: 29 oktober 2009, 20:01:18

Re: Hur får man interrups att fungera på AVR?

Inlägg av Glattnos »

Tack så himla mycket! Det var volatile som behövdes :D
Detta var en större kod som jag gjorde om lite och då slutade den fungera så jag kokade ner den till just FastLoop-rutinen och förstod inte varför det slutade fungera när jag tog bort ett bibliotek för seriell anslutning, men troligtvis är det nått i det biblioteket som förhindrar nån typ av optimering vilket gjorde att det fungerade så länge det låg med. FastLoopCounter fungerade då utan att vara volatile :oops:
Jag har snubblat på detta förr men kunde inte komma ihåg vad felet var men helt rätt så var det nog nån optimering då också, himla förvirrande :) Tack!
Användarvisningsbild
Icecap
Inlägg: 26623
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: Hur får man interrups att fungera på AVR?

Inlägg av Icecap »

Använd volatile ändå!
Glattnos
Inlägg: 3100
Blev medlem: 29 oktober 2009, 20:01:18

Re: Hur får man interrups att fungera på AVR?

Inlägg av Glattnos »

Såklart ska man använda det ändå :) Jag visste ju inte om problemet förrän jag plockade bort biblioteket :D
Skriv svar