Forum: Mikrocontroller und Digitale Elektronik ATMega 32 - Problem mit Interruptroutine (Timer)


von Fabian Cordes (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

ich habe eine Problem mit dem angehängten Code. Das ganze soll auf einen 
ATMega32. An Port C/D hängen zwei R-2R-Netzwerke als Digital-Analog 
Wandler, auf denen die Software zwei Werte X und Y ausgibt, die auf 
einem Oszi im XY-Modus dann schöne Bilder machen. Für das aktualisieren 
der Werte ist die Timer-Interruptroutine ganz am Ende zuständig.

Nun zu dem Problem. Wenn ich den Code simuliere, dann wird diese Routine 
aufgerufen, springt nachdem sie ausgeführt wurde aber nicht zurück, 
sondern startet neu. Ansonsten macht sie das, was sie soll, doch das ist 
mehr oder weniger zufall. Auf meinem Testboard passiert gar nichts, was 
mich aber auch nicht wundert, wegen des Problems in der Simulation.

Die Routine soll alle 256 Takte aufgerufen werden, ich habe mal 
durchgezählt, es sind über 100 Takte am Ende der Ausführung übrig. Das 
sollte doch reichen, um zurück zu springen?
Habe ich vielleicht vergessen, in der Routine irgendetwas zu setzen?

Viele Grüße,

Fabian

von Timmo H. (masterfx)


Lesenswert?

1
TCCR0 = (1<<CS00) || (1<<CS01);  // Prescaler = 1
Das stimmt doch nicht. CS00 und CS01 auf "1" ist doch ein Prescaler von 
64. Demnach wird die ISR alle 2^14 Takte aufgerufen.

Vielleicht hast ja auch nur hier falsch gepostet. Ansonsten kann es auch 
sein, dass der Mega einfach länger benötigt also diese 256 Takte. Auf 
den Simulator ist nicht immer 100% Verlass.

von Johannes M. (johnny-m)


Lesenswert?

Timmo H. wrote:
>
1
> TCCR0 = (1<<CS00) || (1<<CS01);  // Prescaler = 1
2
>
> Das stimmt doch nicht.
Richtig, das stimmt nicht, aber nicht (nur) aus den von Dir genannten 
Gründen, sondern (auch), weil hier anstelle des bitweisen ODER ein 
logisches ODER steht, und das geht definitiv in die Hose...

von Johannes M. (johnny-m)


Lesenswert?

Oh, ich sehe grad, dass (zufällig?) genau dieses (eigentlich falsche) 
logische ODER dafür sorgt, dass der Prescaler tatsächlich auf die im 
Kommentar genannte "1" (kein Prescaling) eingestellt sein dürfte... Dass 
das so in der Absicht des Programmierers lag, halte ich allerdings für 
unwahrscheilich...

von Timmo H. (masterfx)


Lesenswert?

Stimmt, das Bitweise OR habe ich ganz übersehen :-) Mit so einem Fehler 
rechnet man natürlich auch nicht

von Fabian Cordes (Gast)


Lesenswert?

Hi,

ja, das ist so nicht richtig, es war ein bischen spät gestern und ich 
habe über den Code vor dem Posten nicht richtig rübergeschaut.

Eigentlich sollte da auch nur CS00 gesetzt werden, denn ich will ja 
einen Prescaler = 1. Der Rest kam aus meiner letzten Debugsession, da 
ich mir schon dachte, dass die Interruptroutine etwas zu lang ist. Das 
werde ich gleich nochmal korrigieren und testen.

Übrigens funktioniert die Simulation doch, wie ich gerade gemerkt habe, 
wenn man in die endlosschleife in Main irgendeine Dummyoperation packt. 
Dann springt er auch wieder zurück.

Auf dem Testboard geht es leider immer noch nicht.
Noch einige Informationen die vielleicht nützlich sein könnten:

Ich habe zwei Statusleds, und mal versucht die erste (grün) am Anfang 
von Main() zu setzen und die zweite (rot) im ISR. Was passiert ist, dass 
die grüne nach einem Reset kurz aufblinkt und dann wieder ausgeht. Die 
Rote bleibt immer aus. Was aber eigentlich nicht sein dürfte, da ich 
wirklich nur an diesen beiden Stellen auf die LEDs zugreife, und ich sie 
auch niemals ausschalte, sondern immer nur auf logisch 1 ziehe.

Auch an den Pins messe ich komische Werte. Die sollten ja eigentlich 
0V/5V haben, ich messe aber eher sowas wie 2.2 V. Aber eine saubere 
Gleichspannung, also nix was durch eine zufällige PWM entstanden sein 
könnte.

Vielleicht noch Ideen, wie ich den Fehler genauer eingrenzen könnte?

Viele Grüße,
Fabian

von Ale (Gast)


Lesenswert?

vBuffPtr nicht initilisiert ist ;-)

von Timmo H. (masterfx)


Lesenswert?

vBuffPtr bekommt ja wirklich nirgends eine Zuweisung. Nur einmal bei
1
if (vbufPtr == VECBUFSIZE)
2
{
3
  vbufPtr = 0;
4
}
Aber auch nur dann wenn vbufPtr zufällig mal 5 ist.

von Fabian Cordes (Gast)


Lesenswert?

stimmt. :)

Wars aber nicht, sondern es war einfach eine falsches target für den 
Compiler...ATMega8 eingestellt, ATMega32 benutzt, ich nappo :)


Viele Grüße und besten dank an alle,

Fabian

von Fabian Cordes (Gast)


Lesenswert?

Wollte nochmal allen Menschen danken, die mir hier geholfen haben.

Ohne euch wäre ich heute nicht dort, wo ich jetzt bin. Ist zwar immer 
noch nicht ganz oben, aber ich habe viel gelernt. Danke dafür.

von Timmo H. (masterfx)


Lesenswert?

Oha, zu was bist du denn jetzt in den letzten 9 Jahren geworden?

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.