Guten Abend, nachdem mir mein AT90S8535 jetzt nur noch murks serviert und ich den ganzen Tag dafür in den Sand gesetzt habe hier die Frage an euch: steckt da irgendwo der Fehler (code im anhang ?) Ziel: ich verwende einen 2.048MHz Quarz... mit dem CK/1024 prescaler und der compare value 2000 (0x0D70) würde ich auf 1 Interrupt/sec kommen... nur irgendwo ist hier derb was faul.... Danke schonmal ! PS: symptome sind derzeit: ein viel zu schnell laufender counter, eigenartiges Verhalten beim Einsetzen eines größeren Vergleichswerts... sind vielleicht irgendwo falsche Registerinhalte ?
http://www.mikrocontroller.net/forum/read-1-233282.html#234357 http://www.mikrocontroller.net/forum/read-1-250485.html#253713 http://www.mikrocontroller.net/forum/read-1-178318.html#178381 ...
ich habe jetzt mal ne warteschleife gebaut.. so funktionierts.. meine Frage wäre nun: was ändert der Interrupt an Register ? kann es Überlappungen geben ? ( nebenher findet noch lesen vom EEPROM und Ausgabe an die Ports statt )
Wenn im Interrupt Operstionen stattfinden, die die Flags (Statusbits in SERG) verändern, dann kann es passieren,dass das Hauptproggramm "falsch verzweigt", weil zwischen Setzen der Flags (z.B. dec r16) und Auswerten der Flags (brne label) der Interrupt "zuschlagen" kann und dem Hauptprogramm die Flags unterm Hintern ändern kann... Deshalb wird in der ISR grundsätzlich das SREG gesichert und anschließend wiederhergestellt. Mit SEI und CLI braucht man in der ISR nix zu machen, während der ISR sind weitere Interrupts sowiso gesperrt bis die ISR mittels reti beendet wird. Danach wird erst zur nächsten ISR gesprungen, deren Interrupt während der ISR auftrat. ...
"Mit SEI und CLI braucht man in der ISR nix zu machen, während der ISR sind weitere Interrupts sowiso gesperrt bis die ISR mittels reti beendet wird." Knapp daneben. RETI ist nichts anderes als SEI + RET. Man kann also noch in der ISR den globalen interrupt enablen um interrupts in interrupts zuzulassen (z.B UART-ISR waehrend Timer-ISR ausfuehren). Dies macht im AVR-GCC den Unterschied zwischen einer SIGNAL und einer INTERRUPT Routine aus.
"Knapp daneben. RETI ist nichts anderes als SEI + RET. Man kann also noch in der ISR den globalen interrupt enablen um interrupts in interrupts zuzulassen (z.B UART-ISR waehrend Timer-ISR ausfuehren). Dies macht im AVR-GCC den Unterschied zwischen einer SIGNAL und einer INTERRUPT Routine aus." Sicher kann man in der ISR den Interrupt für andere ISRs freigeben. Dann sollte man aber schon sehr genau wissen was man tut. Sowas ist aber nur in Ausnahmefällen nötig. Wenn man sich an die Regel hält, die ISR (zeitlich) so kurz wie möglich zu halten, dann kann man meist darauf verzichten. Die Rede war übrigens von ASM und nicht von C. ...
"Wenn man sich an die Regel hält, die ISR (zeitlich) so kurz wie möglich zu halten, dann kann man meist darauf verzichten." Full ack. "Die Rede war übrigens von ASM und nicht von C". Die INTERRUPT/SIGNAL Geschichte war nur als Ergaenzung/Beispiel gedacht. Soll ja vorkommen, dass auch C-Progger dieses Forum kennen :)
Also... habs jetzt geknackt, auch wenn eure Hinweise nicht alle sachdienlich waren trotzdem Danke. Stein der Weißen ist wohl die richtige Reihenfolge beim initialisieren des Interrupts ( der sonst schon vorher ausgelöst wird.. also SEI ganz zum schluss ) PS: hatte schon nen Wutausbruch weil alles von diesem gottverdammten C-Code verseucht ist. Programmiere nebenher auch mit Delpi, ich kann mein lied von msdn singen...
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.