Sida 1 av 1

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

Postat: 19 januari 2025, 14:52:36
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++;
}

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

Postat: 19 januari 2025, 15:03:35
av EBD
Testa att deklarera FastLoopCounter som "volatile int", annars kan den bli bortoptimerad eftersom den endast ökas utanför mainloopen.

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

Postat: 19 januari 2025, 15:23:18
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

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

Postat: 19 januari 2025, 15:38:23
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!

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

Postat: 19 januari 2025, 20:24:59
av Icecap
Använd volatile ändå!

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

Postat: 19 januari 2025, 20:57:11
av Glattnos
Såklart ska man använda det ändå :) Jag visste ju inte om problemet förrän jag plockade bort biblioteket :D