Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Next revision
Previous revision
de:avr:interrupts [2010/07/22 15:49] – angelegt Wemberde:avr:interrupts [2020/07/20 09:00] (current) – external edit 127.0.0.1
Line 1: Line 1:
 ====== Interrupts ====== ====== Interrupts ======
  
-Interrupts im AVR können durch Zähler, Kommunikations-Interfaces, Analog-zu-Digital Konverter, Komparator,  spezielle Input-Output Pins und viele andere Funktionen, je nach Controller. Jeder Interrupt kann von der Einheit die ihn generiert, entweder erlaubt oder nicht erlaubt werdenEgal ob der Interrupt erlaubt oder nicht erlaubt ist, gibt es ein 1-Bit Feld (Interrupt Flag) in der dazugehörigen Einheit im Controller, welcher mit "truemarkiert wird, wenn die Interrupt-Bedingung erfüllt ist. Wenn die Interrupt-Flag auf "truegeändert wird und der Interrupt erlaubt ist, dann wird der Controller den Code ausführen, der für den Interrupt gedacht ist.+Interrupts können im AVR – je nach Controller - durch Zähler, Kommunikations-Interfaces, Analog-zu-Digital Konverter, Komparator, spezielle Input-Output Pins und verschiedene andere Funktionen hervorgerufen werden. Jeder Interrupt kann von der Einheit die ihn generiert, entweder zugelassen werden oder nicht. Unabhängig davon, ob der Interrupt zugelassen ist oder nicht, gibt es ein 1-Bit Feld (Interrupt Flag) in der dazugehörigen Einheit im Controller, welches mit true“ markiert wird, wenn die Interrupt-Bedingung erfüllt ist. Wurde die Interrupt-Flag auf true“ geändert wird und der Interrupt zugelassen, dann wird der Controller den für den Interrupt gedachten Code ausführen.
  
-Jeder Interrupt in dem AVR Microcontroller ist zu einem bestimmten Ereignis gebunden. Jedes Ereignis hat einen Flag-Bit im Status-Register, welcher das vorkommen des Ereignis markiert. +Jeder Interrupt des AVR Microcontrollers ist an ein bestimmtes Ereignis gebunden. Jedes Ereignis hat einen Flag-Bit im Status-Register, welcher den Eintritt des Ereignisses markiert. Ereignisse sind ebenfalls an die Register der Interrupt-Masken sowie die dazugehörigen Bits gebunden. Wenn das Interrupt-Bit des Ereignisses unmaskiert ist und ein Ereigniss stattfindetstoppt der Prozessor die Ausführung des laufenden Programms für einige Arbeitszyklen und führt das Interrupt-Programm aus. Nachdem das Interrupt-Programm ausgeführt wurde, fährt der Prozessor mit seinem pausierten Hauptprogramm fort.
-Ereignisse sind auch an die Interrupt-Masken Register und die dazugehörigen Bits gebunden. +
-If the event's interrupt bit is left unmasked and an event occursthe processor halts executing the current program for a few duty-cycles and begins executing the interrupt program. +
-Nachdem das Interrupt-Programm ausgeführt wurde, fährt der Prozessor mit seinem pausierten Hauptprogramm fort.+
  
 <box 100% round #EEEEEE|Example> <box 100% round #EEEEEE|Example>
  
-Um Interrupts mit der AVR LibC Bibliothek zu nutzen, ist es notwendig //interrupt.h// mit einzubinden. Der Code der ausgeführt wird, wenn der Interrupt stattfindet, wird nach einem "ISR"-Keyword geschrieben. Der Text zwischen den Klammern nach "ISR" ist der Name des Interrupts. Ein Beispiel in C-Sprache:+Um Interrupts mit der AVR LibC Bibliothek zu nutzen, ist es notwendig interrupt.h einzubinden. Der Code der ausgeführt wird, wenn der Interrupt stattfindet, wird nach einem ISR-Keyword geschrieben. Der Text innerhalb der Klammern nach ISR“ kennzeichnet den Namen des Interrupts. Ein Beispiel in C:
  
 <code c> <code c>
Line 17: Line 14:
 ISR(XXX_vect) ISR(XXX_vect)
 { {
- // Do something+ // Anweisungen
 } }
 </code> </code>
Line 23: Line 20:
 </box> </box>
  
-Das globale Erlauben aller Interrupts wird vom Control- und Statusregister SREG konfiguriert. +Die generelle Erlaubnis sämtlicher Interrupts wird vom Control- und Statusregister SREG konfiguriert. Die Optionalle Interrupts sofort zu erlauben oder zu verbieten existiert zum Schutz von Daten. Da Interrupts das Ausführen eines Programms unterbrechen, könnten einige Daten im Hauptprogramm dabei zerstört oder beschädigt werden. Solche Situationen können einfach vermieden werden, wenn man alle Interrupts verbietet, bevor man mit empfindlichen Daten arbeitet. Das generelle Verbot von Interrupts ist einfach, da hierzu lediglich ein Register (SREG) geändert werden muss. Nachdem der kritische Teil des Programms ausgeführt wurde, können Interrupts einfach wieder zugelassen werden wodurch dann sämtliche Interrupts die zurückgehalten wurden, ausgeführt werden.
-Die Option um alle Interrupts auf einmal zu erlauben oder zu verbieten existiert um Daten zu schützen. Da Interrupts das Ausführen eines Programms unterbrechen, könnten einige Daten im Hauptprogramm dabei gestört oder korrumpiert werden. Solche Situationen können einfach vermieden werden, wenn man alle Interrupts verbietet, bevor man mit heikeln Daten arbeitet. +
-Das generelle Verbieten von Interrupts ist einfach, da man einfach nur ein Register (SREG) ändern muss. Nachdem der kritische Teil des Programms ausgeführt wurde, können Interrupts einfach wieder erlaubt werden und alle Interrupts die ausgeführt worden wären, werden dann ausgeführt.+
  
-~~PB~~+<pagebreak>
  
 <box 100% round #EEEEEE|Example> <box 100% round #EEEEEE|Example>
  
-Angenommen es ist eine 16-Bit Variable in Gebrauch in diesem Programm, welche sowohl von dem Hauptprogramm, als auch vom Interrupt geändert wird und er Wert dieser Variable später einer anderen Variable gegeben wird.+Angenommen, in diesem Programm wird eine 16-Bit Variable verwendet, welche sowohl von dem Hauptprogramm, als auch vom Interrupt geändert wird und der Wert dieser Variable wird später einer anderen Variable gegeben.
  
 <code c> <code c>
Line 47: Line 42:
 int main() int main()
 { {
- // Gibt x einen Wert+ // x einen Wert geben
  x = 0x1111;  x = 0x1111;
  
- // Erlaubt Interrupts global+ // Interrupts generell erlauben
  sei();  sei();
  
- // Gibt den Wert von x+ // y erhält Wert von x
  y = x;   y = x;
 } }
Line 59: Line 54:
  
  
-Das Programm ist sehr einfach - zuerst bekommt die Variable x den Wert 0x1111 und später wird der Wert an y weitergegeben. Wenn ein Interrupt zwischen beiden Operationen vorkommt, bekommt x einen Wert von 0x3333. Logisch gesehen kann y somit zwei mögliche Werte am Ende des Programms haben, aber bei einem 8-Bit AVR gibt es noch eine dritte Möglichkeit. Diese enstehtweil die 8-Bit Architektur 2 Taktzyklen brauch um 16-Bit Daten zu verarbeiten, daher kann durch schlechtes Timing ein Interrupt die Integrität dieser Daten korrumpieren. Dadurch kann y am Ende des Programms 0x1111 oder 0x3333, aber auch 0x3311 als Wert haben  +Das Programm selbst ist sehr einfach - zuerst bekommt die Variable x den Wert 0x1111 und später wird dieser an y weitergegeben. Wenn ein Interrupt zwischen diesen beiden Operationen auftritt, bekommt x einen Wert von 0x3333. Logisch gesehen kann y somit zwei mögliche Werte am Ende des Programms haben, allerdings existiert bei einem 8-Bit AVR noch eine dritte Möglichkeit. Hierzu kommt esda die 8-Bit Architektur zur Verarbeitung von 16-Bit Daten 2 Taktzyklen braucht. Daher kann ein Interrupt durch schlechtes Timing die Integrität dieser Daten beschädigen. Dadurch kann y am Ende des Programms den Wert 0x1111 oder 0x3333, aber auch 0x3311 haben Um den dritten und ungewollten Wert zu verhindern, sollten alle Interrupts temporär verboten werden wenn eine Operation mehr als einen Taktzyklus umfasst.
-Um den dritten und ungewollten Wert zu verhindern, sollten alle Interrupts temporär verboten werden wenn eine Operation mehr als ein Taktzyklus braucht.+
  
 Im folgenden Beispiel wird eine sichere Methode benutzt um y den Wert von x zu geben: Im folgenden Beispiel wird eine sichere Methode benutzt um y den Wert von x zu geben:
Line 66: Line 60:
  
 <code c> <code c>
- // Verbietet global alle Interrupts+ // Interrupts generell verbieten
  cli();  cli();
  
- // Gibt den Wert von x+ // y erhält Wert von x
  y = x;  y = x;
  
- // Erlaubt alle Interrupts wieder+ // Sämtliche Interrupts wieder zulassen
  sei();  sei();
 </code> </code>
  
 </box> </box>
de/avr/interrupts.1279813743.txt.gz · Last modified: 2020/07/20 09:00 (external edit)
CC Attribution-Share Alike 4.0 International
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0