Forum: Compiler & IDEs Timer 3 Interrupt funktioniert nicht


von Werner P. (Gast)


Lesenswert?

Hallo zusammen,

ich programmiere gerade an einer Timer Funktion mit einem Atmega 2560

Code:
1
volatile unsigned long newValue;
2
3
int main() {
4
  // TIMER 3 Initialisierung
5
  DDRE = (1<<DDE3);
6
  TCCR3B = (1<<CS31) | (1<<WGM32);
7
  TCCR3A = (1<<COM3A0);
8
  OCR3A = 500;
9
  TIMSK3 = (1<<OCIE3A);
10
11
  sei();
12
  while (1) {
13
    // Irgendwas
14
  }
15
}
16
17
ISR (TIMER3_COMPA_vect) {
18
  OCR3A = newValue;
19
}
Das ist jetzt nur der Code für den Timer. Das Rechtecksignal ist absolut 
sauber am Oszi zu sehen. Nur die Interrupt Routine des Timers wird nicht 
ausgeführt.

Komm einfach nicht drauf.

von Karl H. (kbuchegg)


Lesenswert?

Wie bestimmst du neue Werte für newValue?

(Laut Simulator wird die ISR aufgerufen)

von Werner P. (Gast)


Lesenswert?

der Wert kommt vom AD Wandler. Den gebe ich auch laufend über die 
serielle Schnittstelle aus. Nur die Frequenz ändert sich nicht. Am Oszi 
keine Veränderung feststellbar.

Schreibe ich dagegen das OCR3A Register ausserhalb der Interrupt Routine 
des Timers dann ändert sich die Frequenz. Aber halt sprungweise was ja 
auch klar ist.

von Karl H. (kbuchegg)


Lesenswert?

Das du newValue als unsigned long gemacht hast, macht mich stutzig.

Sicher das die Berechnung des neuen Wertes ein gültiges 16 Bit Ergebnis 
ist und sich die unteren 16 BIt auch tatsächlich ändern?

von Werner P. (Gast)


Lesenswert?

ich hab jetzt mal eine neue variable

volatile unsigned int counter = 0xFFFF;

generiert welche das OCR3A Register bei der Initialisierung des Timers 
setzt.

In der Interrupt Routine des Timer 3 decrementiere ich counter und setze 
OCR3A.

Ergebnis: Die Frequenz ändert sich nicht.

von Peter D. (peda)


Lesenswert?

Richtiges Target gesetzt?
Keine Warnings oder Errors?

Bei falschem Interrupthandler startet Dein AVR immer wieder neu.


Peter

von Werner P. (Gast)


Lesenswert?

Mit Target meinst Du ob der 2560 ausgewählt ist. Ja.
Keine Warnings und keine Errors.

Ich vermute dass irgendwie die Initialisierung des Timers falsch ist.
1
  // TIMER 3
2
  DDRE = (1<<DDE3);
3
  TCCR3B = (1<<WGM32) | (1<<CS31); // WGM32 = CTC Mode
4
  TCCR3A = (1<<COM3A0);
5
  OCR3A = counter;
6
  TIMSK3 = (1<<OCIE3A);;

und hier die Interrupt Routine
1
ISR(TIMER3_COMPA_vect) {
2
  PORT_LED |=  (1<<LED);     //Pin LED = 1
3
  counter++;
4
  OCR3A = counter;
5
}

Ich habe in der Funktion main am Anfang ein Toggeln der LED eingebaut. 
Wird beim Start einmal ausgeführt.

In der Interrupt Routine schalte ich die LED auf on. Damit ich sehe ob 
der Interrupt ausgelöst wird. Wird er aber nicht.

Ein Reset passiert auch nicht. Da müsste die LED ja blinken.

Ich habe das Datenblatt zig mal durchgelesen und komme nicht drauf.

von Werner P. (Gast)


Lesenswert?

zur Info.

das Problem war der ADC im "Free Running Mode".

Habe die AD Wandlung umgebaut und siehe da es geht.

Danke an alle

von Peter D. (peda)


Lesenswert?

Werner Pfundstein schrieb:
> das Problem war der ADC im "Free Running Mode".

Der Fehler ist bei einzelnen Codefetzen immer im nicht geposteten Code.
Ich komme mir dabei wie ein Hund vor, dem man nur ein paar Abfälle zum 
Fressen hinwirft.

Ist das denn wirklich so schwer, ein compilierbares Programm als Anhang 
zu posten, das auf den Fehler reduziert wurde?

Ist das Faulheit oder Geheimniskrämerei?


Peter

von Werner P. (Gast)


Lesenswert?

Hallo Peter,

ja, Du hast Recht. Wäre sinnvoll gewesen.

Allerdings ging es mir um die Initialisierung des Timers. Ob da schon 
Fehler sind oder etwas vergessen wurde.

Ich werde interessehalber den kompletten Code nachliefern. Ist eh nur 
Testcode.

Ich bin Faul und habe natürlich wie jeder Mensch Geheimnisse ;-)

Grüße

von Karl H. (kbuchegg)


Lesenswert?

Werner Pfundstein schrieb:

> Ich werde interessehalber den kompletten Code nachliefern. Ist eh nur
> Testcode.

Es geht nicht um den Testcode. Es geht auch nicht um 'interessehalber'.

Es geht darum, dass du Code gepostet hast, von dem du behauptest, dass 
er nicht funktioniert. Mit diesem Code als Grundlage habe ich mir eine 
halbe Stunde lang den Kopf darüber zerbrochen, was da an Problemen sein 
könnte, denn bei mir im Simulator hat sich nichts, aber auch gar nichts 
ergeben, was auf eine Fehlfunktion hätte hindeuten können.

Und jetzt setllt sich raus, dass du den Code, den du gepostet hast, noch 
nicht einmal dahingehend überprüft hast, ob der tatsächlich das 
behauptete Fehlerbild zeigt.

von Werner P. (Gast)


Lesenswert?

Karl Heinz Buchegger schrieb:
>
> Es geht nicht um den Testcode. Es geht auch nicht um 'interessehalber'.
>
> Es geht darum, dass du Code gepostet hast, von dem du behauptest, dass
> er nicht funktioniert. Mit diesem Code als Grundlage habe ich mir eine
> halbe Stunde lang den Kopf darüber zerbrochen, was da an Problemen sein
> könnte, denn bei mir im Simulator hat sich nichts, aber auch gar nichts
> ergeben, was auf eine Fehlfunktion hätte hindeuten können.
>
Sorry wenn ich dir damit deine zeit gestohlen habe.
>
> Und jetzt setllt sich raus, dass du den Code, den du gepostet hast, noch
> nicht einmal dahingehend überprüft hast, ob der tatsächlich das
> behauptete Fehlerbild zeigt.

ok, ich verspreche Besserung.

Also nochmals Danke an alle.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.