Hallo,
ich habe gerade arge Probleme einen Output Compare Match Interrupt zu erstellen:
volatile uintW T0;
uintW T1=0;
uintL T2;
void setup(){
irrecv.enableIRIn(); //Dieser Befehl initialisiert den Infrarotempfänger.
Wire.begin(2); // join i2c bus (address optional for master)
TWBR = ((16000000 / 100000) - 16) / 2;
noInterrupts();
TCCR3A = 0;
TCCR3B = 0;
TCNT3 = 0;
OCR3AL=250;
OCR3AH=0;
TCCR3B |= (1<<WGM32);
TCCR3B |= (1<<CS31)|(1<<CS30); // 64 als Prescale-Wert spezifizieren und CTC mode
TIMSK3 |= (1<<OCIE3A);
interrupts();
readData();
wait(250);
Power(0);
}
ISR (Timer3_COMPA_vect){
T0++; //Softwaretimer 0 eins hochzählen
}
Das sollte doch eigentlich eine Compare Match A für Timer 3 erzeugen und einen Interrupt dessen in die ISR leiten. Aber denkste.
Habe das auch schon mit Timer 1 und 0 probiert, dieser fu....g Compiler weigert sich offenbar das so zu bauen wie ich es mir vorstelle.
Es muss doch möglich sein ISRs von Hand ohne dem Attachgeraffel zu definieren, mit einer TWI-ISR für was anderes hats ja auch geklappt! Bin am Ausrasten.
MfG
Andi
Sollte eigentlich gehen
Der Interrupt Vektor sollte aber so heißen:
TIMER3_COMPA_vect
{
}
Weiß nicht ob Groß-/Kleinschreibung da relevant ist. Aber ist möglich dass deine ISR einfach nicht gefunden wird weil sie einen anderen Namen hat
Wie wertest du T0 aus? Vielleicht liegt der Fehler da. Das muss atomar bei abgeschalteten Interrupts erfolgen. Hier ist wie das millis() macht:
unsigned long millis()
{
unsigned long m;
uint8_t oldSREG = SREG;
// disable interrupts while we read timer0_millis or we might get an
// inconsistent value (e.g. in the middle of a write to timer0_millis)
cli();
m = timer0_millis;
SREG = oldSREG;
return m;
}
SREG enthält das globale Interrupt Enable Bit
Ansonsten kannst du sowas auch testen in dem du einen Ausgang des Timers auf Toggeln stellst und eine LED dran hängst oder mit einem Oszi misst. Bei der LED die Zeit so einstellen dass man das Blinken auch sieht.
Danke, das wars.
So ein Pfosten von Arduino Timer and Interrupt Tutorial - Oscar Liang.
Danke, Oscar, hast mich mit deiner fehlerhaften Kopie Stunden gekostet, könnte abkotzen.
Sorry, musste mal raus.
Wenn man schon ein Tut macht, dann bitte richtig sonst kann mans nicht.
Gehört natürlich Großgeschrieben, "TIMER3_COMPA".
Serenifly, wo gibts denn die besten Übersichten über alle ISR-Namen wie sie jetzt auch geschrieben werden und alle anderen Standardbezeichner?
Vielen Dank
MfG
Andi
Haribo68:
wo gibts denn die besten Übersichten über alle ISR-Namen wie sie jetzt auch geschrieben werden und alle anderen Standardbezeichner?
Etwas nach unten scrollen:
http://www.nongnu.org/avr-libc/user-manual/group__avr__interrupts.html
Der Fehler wird übrigens in einem der Kommentare auf der Seite angesprochen
OK, vielen Dank.
Das vom Oscar sowieso ist überigens eine Kopie von https://arduino-info.wikispaces.com/Timers-Arduino wo es offenbar richtig ist.
MfG
Andi
Hallo,
bei der Falschschreibung gibt dir der Compiler eine Fehlermeldung aus. Die sicherste Methode nachdem korrekten ISR Namen zu suchen ist laut meiner Meinung nach immer noch das Datenblatt. Weil sich die Namen dummerweise auch mal unterscheiden je nach µC.
Danke, Oscar, hast mich mit deiner fehlerhaften Kopie Stunden gekostet, könnte abkotzen.
Wer etwas im Internet findet, ist selber schuld. Wenn es dich "Stunden gekostet" hat, hält sich mein Mitleid in Grenzen.
Immerhin hast du, nachdem du den Fehler gefunden hast, innerhalb weniger Minuten (23:26 .. 23:41) noch eine korrekte Quelle gefunden.
Na ja, ein bisschen Mitfühlen kann ich schon.
Und was aus dem Datenblatt mit welchen Namen in die avr-gcc Bibliotheken gekommen ist, ist immer wieder erstaunlich. Gut, dass wir uns nur mit dem beschäftigen, was in www.arduino.cc/en/Reference/HomePage dokumentiert ist. 