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
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.
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...
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...
Stimmt, das Bitweise OR habe ich ganz übersehen :-) Mit so einem Fehler rechnet man natürlich auch nicht
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
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.
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
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.