Interrupts (http://nongnu

Slides:



Advertisements
Ähnliche Präsentationen
Wake on LAN.
Advertisements

Kapitel 5 5 Rechnerorganisation
4. Attiny-Veranstaltung
Befehlssatz und Struktur
LCDisplay Anschluss des LCDisplays Aufbau der LCDisplay-Platine
Funktionen.
C Tutorium – Fehlerbehandlung – Knut Stolze. 2 Grundsatz Also ist auch nach jedem Funktionsaufruf auf Fehler zu prüfen!! Jeder(!) Funktionsaufruf kann.
Interrupts Wozu Interrupts? Interruptmodell Einige Attiny-Interrupts
Institut MD Universität Rostock Real-Time Linux Szenario –Board, liest (sampled) analoge Daten –produziert 8 Bit Ergebnis und gibt dieses alle 100 ms aus.
Real - Time Java Seminar Asynchrone Ereignisse und Asynchroner Kontrolltransfer in Real - Time Java Sönke Eilers.
WHILE - Anweisung.
FOR Anweisung.
DO...WHILE Anweisung.
1 Vorlesung Informatik 2 Algorithmen und Datenstrukturen (02 – Funktionenklassen) Prof. Dr. Th. Ottmann.
Vorlesung Informatik 2 Algorithmen und Datenstrukturen (02 – Funktionenklassen) Tobias Lauer.
Vorlesung Informatik 2 Algorithmen und Datenstrukturen (02 – Funktionenklassen) Prof. Dr. Th. Ottmann.
1 Named Pipes alias FIFO Haben einen Eintrag im Dateisystem und sind somit durch Zugriffsrechte identifizierbar Ermöglichen die Kommunikation zwischen.
Mikrocomputertechnik-Labor WS04/05
Spielzeugsortierer Labor Mikrocomputertechnik Dozent: Prof. J. Walter
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Kapitel 7 Claudio Moraga, Gisbert Dittrich FBI Unido
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Vorlesung 2 SWS WS 99/00 Gisbert Dittrich FBI Unido
Vorl. 6: Single- und Multitasking Universität Bielefeld – Technische Fakultät AG Rechnernetze und verteilte Systeme Peter B. Ladkin
Open Source Prozessor Leon2 Peer Royla und Marco Siebert RST-Labor WS 04/05 Prof. Dr.-Ing. Thomas Risse.
Weiteres Programm Studium des Breitendurchlaufs Hierzu
Der VFP Debugger - Coverage und Profiling. © 1999 TMN-Systemberatung GmbH Der VFP Debugger n Neues Aussehen, eigene Task n Erweiterte Möglichkeiten n.
RS232 Register und ihre Bits
Medienverarbeitung I, WS 99/00 Simon Barkow, Gunnar Kiesel
Einfach verkettete Listen
Einführung in die Programmiersprache C 1
1 Welche Maßnahmen muss man treffen, um sowohl unter BORLAND als auch unter KEIL kompilieren zu können? Eliminieren der zusätzlichen Schlüsselwörter Programmieren.
Einführung in die Programmiersprache C 4
1 SR-Latch 3.3 Speicher Latches © Béat Hirsbrunner, University of Fribourg, Switzerland, 31. Oktober 2007 S Q Q R Q Q 1-bit Speicher.
Signal-Prozessoren DSV1, 2009, Hhrt, 1 Mikro-Prozessor Von Neumann-Architektur Daten und Programmcode im gleichen Speicher => Sequenzieller Zugriff auf.
Embedded Systems Prof. Dr. H. Kristl
Computerorientierte Physik VORLESUNG und Übungen Vorlesung Zeit: Di., 8.30 – Uhr Ort: Hörsaal 5.01, Institut für Experimentalphysik, Universitätsplatz.
Computerorientierte Physik VORLESUNG
Ganze Zahlen Die Typen int, unsigned int; Auswertung arithmetischer Aus-drücke, arithmetische Operatoren.
C-Einstieg. Agenda 1Vorbereitung 2Aufbau eines Programms 2.1Header 2.2 Methoden 2.3Main 3Datentypen & Variablen 4Operatoren(+, -, *, /) 5Logik 5.1IF 5.2Switch.
Arduino Kurs Abend 2.
Μ Version 1.0Seite 1µVision Start Debugger Set Breakpoint µVision Debugger.
Ultraschall Funktionsprinzip des Sensors (1)
Programmieren in Assembler
Befehle in der Kontaktplan-Programmierung
Parallelisierung für Multiprozessor-Maschinen Teil 2.
Torsteuerung Marco Korrmann Dominik Sommer.
Mikrocomputertechnik Jürgen Walter
Alois Schütte Advanced System Programming 2 Interprozeßkommunikation  2.1 JVM Ablaufumgebung  2.2 Java Native Interface (JNI)  Verwendung von.
Mikrocomputertechnik Jürgen Walter
Autor: Timo Pagel Nutzung: Diese Lernkarten sind für die Nutzung mit OpenCards gedacht Siehe dazu
Mikrocomputertechnik SERVO-Kalibrations-Quickie Prof. J. Walter Stand Dezember Mikrocomputertechnik Jürgen Walter Servo-Kalibrations-Quickie Kalibration.
Mikrocomputertechnik 1 Einführung Prof. J. Walter Stand Oktober Mikrocomputertechnik Jürgen Walter „PWM-Quickie“ Pulsweitenmodulation.
Mikrocomputertechnik Timer-2-3-Quickie Prof. J. Walter Stand Januar Mikrocomputertechnik Jürgen Walter „TIMER-2-3-Quickie“
Mikrocomputertechnik BLIN_INT-P-Quickie Prof. J. Walter Stand Januar Mikrocomputertechnik Jürgen Walter „BLIN_INT-P-Quickie“
Mikrocomputertechnik Timer-0-1-Quickie Prof. J. Walter Stand Januar Mikrocomputertechnik Jürgen Walter „TIMER-0-1-Quickie“
Funktionen. Aufgabe : Eingabe zweier Zahlen ---> Minimum bestimmen Dann nochmals Eingabe zweier Zahlen ---> Minimum bestimmen.
Pointer. * und &  Bei der Definition int var1; ○ // „normale“ Variable int *var2; ○ // Zeiger auf einen Integer int *var2 = NULL; ○ // … incl. Initialisierung.
C / C++ für das Internet der Dinge und Hausautomatisierung Arduino Uno / Nano / … Input, Interrupts, Timer, Sleepmode Hochschule Fulda – FB AI Sommersemester.
LCDisplay Anschluss des LCDisplays Aufbau der LCDisplay-Platine
ABB STOTZ-KONTAKT GmbH ABB i-bus® KNX Raum Master, Basic, RM/S 1.1
LCD-Display HD44780 kompatibles Display
Graphische Benutzeroberfläche mit libforms
Hello World! Javakurs 2013 Arne Kappen
1.Event Queue.
Arbeiten mit dem Terminal
Interrupts Wozu Interrupts? Interruptmodell Einige Attiny-Interrupts
Projektmodul DM Kurze Einführung Arduino und Arduino-Programmierung
Einführung in die Programmierung
Vom Prozessor zum System
Vom HW-Automaten zum Prozessor
Aufbau und Anwendungen von Mikrokontrollern
 Präsentation transkript:

Interrupts (http://nongnu Interrupts erlauben die Unterbrechung des laufenden Prozesses auf Grund einer Interruptbedingung Der laufende (Maschinen-)Befehl wird fertig ausgeführt Aus der Interruptvektortabelle wird die Interruptserviceroutine (ISR) ausgewählt und aktiviert Während der ISR sind die Interrupts gesperrt (automatisches cli) unterbrechbare ISR werden mit ISR(XXX_vect, ISR_NOBLOCK){} vereinbart, man soll nicht einfach sei() in der ISR verwenden sollen zwei ISR den selben Code benutzen, so dies, wie folgt möglich: ISR(INT0_vect) { // Code to handle the event. } ISR(INT1_vect, ISR_ALIASOF(INT0_vect));

Interruptgesteuerte Programme http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Programmieren_mit_Interrupts Interrupts erlauben Initialisierung externes Ereignis Interruptserviceroutine reti ISR(Vectorname) /* vormals: SIGNAL(siglabel) dabei Vectorname != siglabel ! */ { /* Interrupt Code */ } 3 Voraussetzungen: - globale Freigabe (sei: set enable interrupts) - Freigabe/Konfiguration des konkreten Interrupts/Interruptbedingung - Eintreten des externen Ereignisses 2

#include <avr/interrupt.h> //... /* vormals: SIGNAL(siglabel) dabei Vectorname != siglabel ! */ ISR(Vectorname) { /* Interrupt Code */ } Tabellen->PORTS sehr schöne Zusammenstellung Wichtige Programmierkonstrukte: #include <avr/interrupt.h> sei(); //set enable Interrupts cli(); //clear enable Interrupts Interruptserviceroutine Variablen, die von ISR und anderen Funktionen benutzt werden, als volatile kennzeichnen. ISR(__vector_default) als Standard Interrupt handler anstelle Reset Steuerregister je nach Interrupt setzen http://www.avr-asm-tutorial.net/avr_de/beginner/index.html Für INT0/INT1: MCUCR Bits 0..3 setzen (Bitangaben beziehen sich auf Atmega8! ) GICR INT0/INT1 erlauben (Bits 6,7) GIFR Interrupt Flag (Bits 6,7) 3

4

5

#include <avr/io.h> #include <avr/pgmspace.h> #include <util/delay.h> #include <avr/interrupt.h> #define keypress_dly 100 // delay in ms #define key_mask 0x0c // 00001100 - PIND2 (INT0) & PIND3 (INT1) typedef unsigned char BYTE; typedef unsigned short WORD; /* * delay in ms */ void delay_ms(WORD ms){ for(ms /= 10; ms > 0; ms--) _delay_ms(10); } /* External Interrupt 0 */ ISR(INT0_vect){ /* Global interrupts are disabled */ . . .

/* External Interrupt Request 1 */ ISR(INT1_vect){ . . . } int main(){ // DDRB fuer LEDs konfigurieren DDRB = 1 << PIN0 | 1 << PIN1 | 1 << PIN2 | 1 << PIN3; // 1 - for output; 0 - for input // Taste // DDRD2 & DDRD3 sollte 0 (also input) sein. // Init of external interrupts INT0 and INT1 MCUCR |=(1<<ISC01); // Fallende Flanke MCUCR |=(1<<ISC11); GICR = (1<<INT0) |(1<<INT1); // External Interrupt Request 0 and 1 Enable // Oder, GICR und GIMSK bezeichen das selbe Gräteregister GIMSK= (1<<INT0) |(1<<INT1); // External Interrupt Request 0 and 1 Enable sei(); // Global enable interrupts /* loop forever, the interrupts are doing the rest */ while(1); return 0;

main: ldi r16,0xff out DDRB,r16 ;//DDRB 0x17 ldi r16,0xf ; alle Leds ein out PORTB,r16 ; 11110011 0: Input, 1: Output ldi r16,0xf3 out DDRD,r16 ldi r16,(1<<INT0)|(1<<INT1) ; Interrupts erlauben Int0 und INT1 out GIMSK,r16 ldi r16,0xa ; 1010 Flanke a:fallende ; ldi r16,0xf ; 11 11 Flanke f: steigende ; fallend: Taste gedrückt, steigend: Taste los out MCUCR,r16 sei rcall waitabit rcall waitabit eor r1,r1 ; R1:=0 out PORTB,r1 ; Ausgabe auf Leds loop: rjmp loop ; leere mainloop /* configs for io.h */ #define __SFR_OFFSET 0 #define _VECTOR(N) __vector_ ## N #include <avr/io.h> //#define mp r16 // oder r16 #define outerwait r17 // r17 #define innerwait r18 // r18 .global main 9

// Interruptvectoren .global INT0_vect INT0_vect: .global INT1_vect INT1_vect: cli ; Taste gedrueckt inc r1 ; Zaehlen out PORTB,r1; Ausgabe auf Leds l2: rcall waitabit in r16,PIND andi r16,(1<<PIND2)|(1<<PIND3) cpi r16,(1<<PIND2)|(1<<PIND3) brne l2 ; Taste wieder los sei reti waitabit: ; 131841 Takte = 0.131841 sec ldi outerwait,0xff ; waitouterloop: ldi innerwait,0xFF ; waitinnerloop: subi innerwait,0x01 ; brne waitinnerloop ; subi outerwait,0x01 ; brne waitouterloop ; ret

Die Timer Timer sind sehr komplizierte Gebilde Die Timer 0,1 und 2 unterscheiden sich in der Verarbeitungsbreite und Funktionalität Für spezielle Anwendungen oder im Fehlerfall ist das manual zu konsultieren

Timer das Atmega8 Timer sind Zähler, die nebenläufig zur CPU arbeiten Timer beginnen bei 0 oder einem einstellbaren Wert (Bottom) Verarbeitungsbreite bestimmt den Wert Top, nach Erreichen von Top erfolgt der Überlauf 3 Arten von Interrupts können generiert werden Int bei Überlauf Int bei Capture Event (ext. an ICPn oder Analogcomp.) Int bei Compare Event

Timer 0 Aufwärszähler (8 bit) Anfangswert in TCNT0 einstellen Source einstellen in TCCR0: Aus Systemtakt Externer Impuls an T0 Interrupt bei Überlauf

Timer 0 (Register) http://www. avr-asm-tutorial Timer 0 (Register) http://www.avr-asm-tutorial.net/avr_de/beginner/index.html Nicht in allen Dingen ganz aktuell, aber sehr brauchbar

Timer 1 (16 bit) Aufwärtszähler/(Abwärtszähler) Int bei Überlauf, CaptureEvent an Pin ICP1(PB0) ICR Compare A, Compare B (OCR1AL/H, OCR1BL/H) Anfangswert in TCNT1 einstellen Mehrere Controllregister TCCR1A, TCCR1B, Quelle einstellen in TCCR1B Externer Eingang über T1-PD5 Systemtakt über Vorteiler 2 (PWM) Ausgänge

Port Funktion Port-Adresse RAM-Adresse TCCR1A Timer/Counter 1 Control Register A 0x2F 0x4F 7 6 5 4 3 2 1 COM1A1 COM1A0 COM1B1 COM1B0 FCO1A FCO1B WGM11 WGM10 Bit Name Bedeutung Möglichkeiten 7 COM1A1 Compare Ausgang A 00: OC1A/B nicht verbunden 01: OC1A/B wechselt Polarität 10: OC1A/B auf Null setzen 11: OC1A/B auf Eins setzen 6 COM1A0 5 COM1B1 Compare Ausgang B 4 COM1B0 3 FOC1A Force output compare match A Ausgang wird entspr. Konfiguration geschaltet, Interrupt wird nicht erzeugt 2 FOC1B Force output compare match B 1..0 WGM11 WGM10 (PWM10 PWM11) Pulsweitengenerator 00: PWM aus 01: 8-Bit PWM 10: 9-Bit PWM 11: 10-Bit PWM

Schreiben von 16bit Timer Registern in Assembler ist die Reihenfolge zu beachten ; Write :r16 into TCNT1 ldi r19,hi8(0x10000-976) ldi r18,lo8(0x10000-976) out TCNT1H,r19 out TCNT1L,r18 ; Read TCNT1 into r17:r16 in r16,TCNT1L in r17,TCNT1H

Für asynchrone Taktung Timer 2 (8 bit) Auf-/(Abwärts-)zähler (8 bit) Int bei Überlauf, Compare Steuerregister TCCR2 und ASSR Anfangswert in TCNT2 einstellen Vergleichswert in OCR2 1 PWM Ausgang Externer Clockeingang, für 32.768 kHz Uhrenquarz, Steuerung über ASSR, für sleep (Power save mode) von Bedeutung Für asynchrone Taktung Mit Uhrenquarz

Port Funktion Port-Adresse RAM-Adresse TCCR2 Timer/Counter 2 Control Register 0x25 0x45 7 6 5 4 3 2 1 FOC2 WGM20 COM21 COM20 WGM21 CS22 CS21 CS20 Bit Name Bedeutung Möglichkeiten 7 FOC2 1:→compare match, Int wird nicht erzeugt (PB1: 1) 0: default 6 WGM20 1: PWM / 0: Normal mode 5 COM21 Configure OC2 00: OC2 off 01: toggle OC2 bei compare match 4 COM20 10: clear OC2 bei compare match 11: set OC2 on compare match 3 WGM21 1: clear Timer on compare match 2..0 CS22..CS20 Taktauswahl 000: Zähler anhalten 001: Clock 010: Clock / 8 011: Clock / 32 100: Clock / 64 101: Clock / 128 110: Clock / 256 111: Clock / 1024

Port Funktion Port-Adresse RAM-Adresse TIMSK Timer Interrupt Maskenregister 0x39 0x59 Interruptsteuerung für alle 3 Timer immer komplett beschreiben 7 6 5 4 3 2 1 OCIE2 TOIC2 TICIE1 OCIE1A OCIE1B TOIE1 - TOIE0 Bit Name Bedeutung Möglichkeiten 7 OCIE2 Timer/Counter 2 Vergleichszahl A Interrupt 0: Kein Int bei Überlauf 1: Int bei Überlauf 6 TOIE2 Timer/Counter 2 Überlauf-Interrupt 5 TICIE1 Timer/Counter 1 Capture-Ereignis Interrupt 0: Kein Int bei Capture 1: Int bei Capture 4 OCIE1A Timer/Counter 1 Vergleichszahl A Interrupt 0: Kein Int bei Erreichen Stand A 1: Int bei Erreichen Stand in A 3 OCIE1B Timer/Counter 1 Vergleichszahl B Interrupt 0: Kein Int bei Erreichen Stand B 1: Int bei Erreichen Stand in B 2 TOIE1 Timer/Counter 1 Überlauf-Interrupt 1 - TOIE0 Timer/Counter 0 Überlauf-Interrupt

Enegiesparende Sleep-modi Bei Interruptgesteuerten Programmen, verbringt die CPU den größten Teil der Laufzeit in einer, oft leeren Schleife. Dabei verbraucht der Prozessor soviel Energie, wie bei jeder anderen Arbeit auch. Energie kann wirksam gespart werden, in dem die CPU in einen energiesparenden Modus geht, an Stelle in einer idle loop zu verharren. Durch einen Interrupt wird sie wieder geweckt.

/* loop forever, the interrupts are doing the rest */ { //set_sleep_mode(SLEEP_MODE_IDLE); // geht immer //nachfolgende Sleep-modes erwachen nur bei LevelInt //ISC01, ISC00 bzw ISC11, ISC10 zurücksetzen (0) //Interrupt bei Low-Pegel am Eingang //set_sleep_mode(SLEEP_MODE_PWR_DOWN); //set_sleep_mode(SLEEP_MODE_STANDBY); //set_sleep_mode(SLEEP_MODE_PWR_SAVE); // s.o. //set_sleep_mode(SLEEP_MODE_EXT_STANDBY); //s.o. sleep_enable(); sei(); sleep_cpu(); sleep_disable(); }

Sleepmodes – Überblick http://www. mikrocontroller

Timer1Off(); OCR2 = 0; // Dummyzugriff while((ASSR & (1<< OCR2UB))); // Warte auf das Ende des Zugriffs TIMSK=(1<<TOIE2); rf12_stoprx(); set_sleep_mode(SLEEP_MODE_PWR_SAVE); sleep_enable(); sei(); sleep_cpu(); sleep_disable(); // initTimer1(); in ISR(TIMER2_OVF_vect) // und TIMSK komplett neu beschreiben“ (AVR/Funk/rfm12ds18202012/TIMER2)

watchdogtimer Timer bis max. 2 Sekunden Zähldauer Bewirkt automatisch reset bei Nulldurchgang #include <avr/wdt.h> wdt_enable(WDTO_1S); wdt_disable(); wdt_reset(); Manual s. 43 http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/Der_Watchdog