Das heißt also, es gibt für jeden Interrupt (Timer0, INT0, etc.) sozusagen einen 1-Bit-Speicher (ganz doof ausgedrückt)?
Das heißt also, es gibt für jeden Interrupt (Timer0, INT0, etc.) sozusagen einen 1-Bit-Speicher (ganz doof ausgedrückt)?
Grüße
Thomas
Für alle Interrupts gibt es je einen solchen Speicher (Flag Bit in den entsprechenden Registern). Nur wenn der Externe Interrupt auf Level angestellt ist, wird das Bit auch ggf. wieder gelöscht, wenn kein externes Signal mehr anliegt - da fehlt dann der Zwischenspeicher.
z.B. Datenblatt ATMega8:
also für alle Interrupts gibts Sprungmarken, die man setzen muss wenn man den interrupt verwenden will.A flexible interrupt module has its control registers in the I/O space with an additional global
interrupt enable bit in the Status Register. All interrupts have a separate Interrupt Vector in the
Interrupt Vector table. The interrupts have priority in accordance with their Interrupt Vector position.
The lower the Interrupt Vector address, the higher the priority.
In Bascom schaut das dann z.B. so aus: On Urxc1 Zeichenempfang:
Das ist dann das SEI bzw. Enable Interrupts, also die generelle Aktivierung der Interrupts.The AVR Status Register – SREG – is defined as:
Bit 7 – I: Global Interrupt Enable
Es kann in bestimmten Fällen sinnvoll sein einen Programmabschnitt unterbrechungslos zu programmieren, dann kann man einfach
vor diesem Programmabschnitt ein "Disable Interrupts" oder CLI setzen und dahinter wieder "Enable Interrupts" oder SEI.
wichtig in dem Zusammenhang:
wenn also ein Interrupt ausgeführt wird werden die anderen Interrupts generell abgeschaltet bis dieser abgearbeitet wurde. Dann werden die Interrupts wieder aktiviert. Man kann aber in einer Interruptroutine wiederum die Interrupts per SEI oder Enable Interrupts aktivieren, dann kann ein Interrupt in einem Interrupt erfolgen, was zu "interessanten" Ergebnissen führen kann. Kann aber in Ausnahmefällen sinnvoll sein.When an interrupt occurs, the Global Interrupt Enable I-bit is cleared and all interrupts are disabled.
The user software can write logic one to the I-bit to enable nested interrupts. All enabled
interrupts can then interrupt the current interrupt routine. The I-bit is automatically set when a
Return from Interrupt instruction – RETI – is executed.
Das bedeutet, wenn z.B. der URXC Interrupt für Zeichenempfang aktiviert wurde, aber global die Interruptverarbeitung deaktiviert ist, so wird der Interrupt bei Zeichenempfang zwar ausgelöst, aber erst abgearbeitet wenn global die Interrupts aktiviert wurden.if one or more interrupt conditions occur while the global interrupt
enable bit is cleared, the corresponding Interrupt Flag(s) will be set and remembered until the
global interrupt enable bit is set, and will then be executed by order of priority.
Einen Interrupt kann man je nach dem auch löschen, z.B. um bei der UART zu bleiben, da steht im UCSRA Register als Bit7
Du kannst nun dieses Interruptflag auf zwei Arten löschen ... einmal indem Du einfach in das Bit eine 0 hinein schreibst UCSRA.7=0This flag bit is set when there are unread data in the receive buffer and cleared when the receive
buffer is empty (that is, does not contain any unread data). If the Receiver is disabled, the
receive buffer will be flushed and consequently the RXC bit will become zero. The RXC Flag can
be used to generate a Receive Complete interrupt
oder indem Du das empfangene Zeichen auf dem zugehörigen Datenregister UDR ausliest: Dummmybyte=UDR
Generell gilt, die Interrupts immer knackig kurz halten, nur das was unbedingt hinen muss dort auch rein packen.
Resourcenfressende Routinen wie LCD-Ausgaben oder Print oder Input / Waitkey oder Kalkulationen mit Single-Variablen, die Rechenzeit fressen, haben da wenig drinnen verloren.
Man sollte also die Aufgaben dann teilen, z.B. den Zeichenempfang für ein UART-Protokoll. Die Daten empfangen und im Ringspeicher ablegen in den Interrupt, dort dann auch ein Flag setzen und die Verarbeitung dann von der Mainloop aus anspringen.
Geändert von Vitis (06.10.2012 um 21:54 Uhr)
Vor den Erfolg haben die Götter den Schweiß gesetzt
Versuch macht kluch, hab ich mal so gemacht, war in dem Fall aber Käse, ist unterm Strich genau so schnell wenn man einfach das Register liest und ggf. Inhalt verwirft.
Vor den Erfolg haben die Götter den Schweiß gesetzt
Lesezeichen