Gast
#1996450
Nabend ! Da die Benutzung von Interrupts beim programmieren vom avr in assembler (von c mal abgesehen, darin programmier ich nicht) einige Fallstricke bereit hält hab ich mal das Internet durchforstet um sicherzugehen das bei meinem programm auch alles klappt ! Und nicht solche blöden Fehler wie "tritt hin und wieder auf" vorkommenen. Also meine Frage: zu beginn der ISR schiebe ich die in der ISR benutzten register auf den stack ! das sind bei mir z.B. r16,r17 das statusregister und das Doppelregister zl und zh. am ende der ISR hole ich sie wieder vom stapel. ich dachte damit wäre alles safe ! doch dann hab ich das gefunden: ---Quote anfang http://www.avr-asm-tutorial.net/avr_de/interrupts/int_ressourcen.html Die oben beschriebene Zugriffssteuerung über eine Interrupt-Blockage mit CLI/SEI ist auf jeden Fall dann zwingend, wenn ein Doppelregister außerhalb von Interrupt-Service-Routinen auf einen neuen Wert gesetzt werden muss und innerhalb von Service-Routinen verwendet wird. Zwischen dem Setzen des einen Bytes des Doppelregisters und des zweiten könnte ein Interrupt zuschlagen und einen völlig verqueren Wert vorfinden. Solche Fehler sind teuflisch, weil es in der Regel korrekt funktioniert und nur alle paar Stunden ein Mal dieser Fall eintritt. So einen eingebauten Bug findet man garantiert nicht, weil er sich so selten in freier Wildbahn in der Schaltung zeigt. Daher sollten folgende Regeln gelten: * Register möglichst klar der alleinigen Verwendung innerhalb und außerhalb von Interrupt-Service-Routinen zuordnen. * Jede gemeinsame Nutzung von Registern intensiv auf mögliche Konflikte hin durchdenken. Vorher denken vermeidet die Fehlersuche hinterher. * Vorsicht bei der gemeinsamen Nutzung von Doppelregistern. Interrupts blockieren! Und hinterher nicht vergessen, sie wieder zuzulassen. ---Quote ende Heißt das ich muß die Interrupts beim Benutzen von Doppelregistern trotzdem deaktivieren ? obwohl ich sie am anfang der ISR auf den stack packe? Hauptprogramm: ldi zl,LOW(UART_RX_STRING) ldi zh,HIGH(UART_RX_STRING) wo ist das problem wenn nach dem laden von zl der Interrupt ausgelöst wird, Z sichert, dann verändert, wiederherstellt und dann im hauptprogramm zh geladen wird ?