Embedded Systems I Themen am 18.10.2016 (ES1_16_V3): Timer / Counter Programmierung (Musterlösungen mit und ohne Interrupt), Application Note AVR130 / Atmega8535 Interrupts Unterbrechungsanforderungen und ihre Verarbeitung. Was steht in so einem Datenblatt / einer Application Note drin? Beachten Sie bitte die zusätzlichen Infos auf Proki und Tafel! Ulrich Schaarschmidt FH Düsseldorf, WS 2016/17 Literaturhinweise (unbewertete Reihenfolge!) Datenblätter der Fa. Atmel, ATmega16 (.pdf) Application Notes der Fa. Atmel (s.a. Web) Gadre, Dhananjay V.: Programming and Customizing the AVR Microcontroller McGraw-Hill, 2001 (bestes Buch zum AVR!) Schmidt, Gerhard: Anfängerkurs zum Erlernen der Assemblersprache von Atmel-AVR- Mikroprozessoren http://www.avr-asm-tutorial.net AVR-GCC-Tutorial: http://www.mikrocontroller.net/articles/avr-gcc-tutorial http://www.mikrocontroller.net/articles/avr-gcc- Tutorial/Die_Timer_und_Zähler_des_AVR Schmitt, Günter: Mikrocomputertechnik mit Controllern der Atmel AVR-RISC-Familie Oldenbourg Verlag München Wien, 2007 18.10.2016 Prof. Dr. U.G. Schaarschmidt 2 HS Düsseldorf (c) U.Schaarschmidt 1
2.Übung zum 17./18.10. Praktikum 2 vorbereiten Im Praktikum Nr. 2 wird eine Strassenkreuzung (Bild nächste Folie) an das STK500 angeschlossen (weitere Details Praktikumszettel). Überlegen Sie Timerstrategien hierzu und bereiten Sie die Programmierung der Timer- /Counter-Register vor! Zuerst nur die Kreuzung, dann der Fussgängerüberweg mit Anforderungstaster (mit der Hauptkreuzung synchronisieren). 18.10.2016 Prof. Dr. U.G. Schaarschmidt 3 Übungsaufgabe 2 18.10.2016 4 Prof. Dr. U.G. Schaarschmidt HS Düsseldorf (c) U.Schaarschmidt 2
Zur Erinnerung an Aufgabe 2 Zeichnen Sie hierzu ein Ablaufdiagramm bzw. Nassi-Schneider-Diagramm! Zuerst nur die Kreuzung, dann den Fussgängerüberweg mit Anforderungstaster (mit der Hauptkreuzung synchronisieren). Welche Funktionen / Definitionen der io.h und der Stdint.h nutzen Sie für die Ampelsteuerung? 18.10.2016 Prof. Dr. U.G. Schaarschmidt 5 Zuordnung Ampel I/O-Ports 18.10.2016 Prof. Dr. U.G. Schaarschmidt 6 HS Düsseldorf (c) U.Schaarschmidt 3
Zuordnung Farben der Fussgängerampel - Ports 18.10.2016 Prof. Dr. U.G. Schaarschmidt 7 Grundsätzlicher Programmaufbau #include<avr/io.h> //Bibliotheken und Headerdateien einbinden, Deklarationen und Definitionen der Variablen / Konstanten vornehmen, #ifndef F_CPU #define F_CPU 8000000UL #endif #define TASTER 7 void init(void){ // Initialisierung der Baugruppen, DDRB = 0xFF; //Datenrichtungsregister auf Ausgang PORTB = 0xFF; //Alle Bits von Port B auf High int main(void){ //Hauptprogramm while (1) { //(Endlos-)Schleife bei MCU-Programmen, //Platzhalter z.b. für interruptgesteuerte Programme, } //Schleifenende, return 0; //Rückgabewert (immer) 0 } // Programmende 18.10.2016 Prof. Dr. U.G. Schaarschmidt 8 HS Düsseldorf (c) U.Schaarschmidt 4
I / O Ports aus der Nähe betrachtet DDRxn Data Direction Register (eine 1 in diese Adresse geschrieben, bedeutet, dass der zugehörige Pin als Output fungiert, 0 lässt ihn als Input arbeiten) PINxn - Adresse zum Einlesen des Zustandes am Portpin (Port x, Pin n), POUTxn - Adresse zum Ausgeben von Bit (-kombinationen) an den Portpins. 18.10.2016 Prof. Dr. U.G. Schaarschmidt 9 I / O Ports aus der Nähe betrachtet 18.10.2016 Prof. Dr. U.G. Schaarschmidt 10 HS Düsseldorf (c) U.Schaarschmidt 5
Avr/io.h & Co Siehe extra Dateien (aus AVRStudio- Ordner) Io.h Stdio.h!Nicht irritieren lassen: Die diversen header-files sind wie eine Baumstruktur auch untereinander angeordnet! 18.10.2016 Prof. Dr. U.G. Schaarschmidt 11 Timer statt Zeitschleife Überlegen Sie, wie die Timer / Counter der AVR-Familie initialisiert und benutzt werden können (um nicht mehr die Delay- Schleifen aus P1 / P2 zu nutzen)! Schreiben Sie Initialisierungsroutinen! Hierzu nutzen Sie (sinnvollerweise) Datenblätter und Application Notes (oder Literatur, natürlich). 18.10.2016 Prof. Dr. U.G. Schaarschmidt 12 HS Düsseldorf (c) U.Schaarschmidt 6
AN (Application Notes) zum Thema Time / long Time / AVR130: Setup and Use the AVR Timers AVR133: Long Delay Generation Using the AVR Microcontroller AVR108: Setup and Use of the LPM Instruction Die Register und alle Möglichkeiten der Programmierung sind in den Datenblättern zu finden 18.10.2016 Prof. Dr. U.G. Schaarschmidt 13 Timer / Counter - Control Register TCCR0: Timer/Counter Control Register 0 TCNT0: Timer/Counter Register 0 TCCR1A: Timer/Counter1 Control Register A TCCR1B: Timer/Counter1 Control Register B TCNT1H, TCNT1L: Timer/Counter1 (16 bit) OCR1AH, OCR1AL: T/C1 Output Compare Registers OCR1BH, OCR1BL: T/C1 Output Compare Registers ICR1H, ICR1L: T/C1 Input Capture Registers 18.10.2016 Prof. Dr. U.G. Schaarschmidt 14 HS Düsseldorf (c) U.Schaarschmidt 7
Timer / Counter Prescaler AN: AVR133 18.10.2016 Prof. Dr. U.G. Schaarschmidt 15 Programmierung Timer / Counter Die Konfiguration und Programmierung der Timer-Register geht ähnlich vor sich, wie wir es von den anderen I/O-Ports her kennen und im Praktikum ausprobiert haben. Ein Timer ist vom Prinzip her ein (einfacher) Zähler. Vorteil: Er läuft unabhängig vom Programm (wenn er erst einmal initialisiert ist). Die AT90 und Atmega haben grundsätzlich 2 * 8-Bit-Timer und 1 * 16-Bit-Timer. 18.10.2016 Prof. Dr. U.G. Schaarschmidt 16 HS Düsseldorf (c) U.Schaarschmidt 8
Programmierung Timer / Counter 2 - Überwachung In den AVR-MCUs kann jeder der Timer bis zu 3 verschiedene Ereignisse überwachen. Die Status-Flags im TIFR geben über die Ereignisse Auskunft. Timer Overflow, Compare Match, Input Capture. 18.10.2016 Prof. Dr. U.G. Schaarschmidt 17 Programmierung Timer / Counter 3 Timer Overflow A timer overflow means that the counter has counted up to its maximum value and is reset to zero in the next timer clock cycle. The resolution of the timer determines the maximum value of that timer. There are two timers with 8-bit resolution and one timer with 16-bit resolution on the ATMEGA16. The maximum value a timer can count to can be calculated by this Equation. MaxVal = 2 Res 1 Res is here the resolution in bits. The timer overflow event causes the Timer Overflow Flag (TOVx) to be set in the Timer Interrupt Flag Register (TIFR). 18.10.2016 Prof. Dr. U.G. Schaarschmidt 18 HS Düsseldorf (c) U.Schaarschmidt 9
Programmierung Timer / Counter (in Assembler) RESET: ;initialize the machine ;set up Timer0 ldi r16,0x02 ;(CLK/8 src) out TCCR0,r16 ldi r16,0x02 ;enable Timer0 Overflow int out TIMSK,r16 ;done with all setup sei ;enable all interrupts now ldi r16,0xfe ;start off closer to FF, to out TCNT0,r16 ; make it easier to see. 18.10.2016 Prof. Dr. U.G. Schaarschmidt 19 Programmierung in C // k4p2.c Bild 4-18c: Timer0 ungenauer Sekundenzähler mit Interrupt; 8 MHz : 256 : 256 = 122.07 gerundet 122 Hz // Port B: Ausgabe Sekundenzähler; Port D: - #include <avr/io.h> // Deklarationen #include <avr/signal.h> // für Interrupt #include <avr/interrupt.h> // für Interrupt #define TAKT 8000000ul // Systemtakt 8 MHz #define ZAEHL TAKT / (256ul * 256ul) // Interruptzähler #define TEILER 0x4 // 0b100 Taktteiler durch 256 volatile unsigned char takt=zaehl, seku=0; // globale Variablen SIGNAL (SIG_OVERFLOW0) // bei Timer0 Überlauf { takt--; // Interruptzähler - 1 if(takt == 0) // nach 122 Durchläufen { takt = ZAEHL; seku++; // wieder Anfangswert Zähler erhöhen if (seku == 60) seku = 0; // Sekunde mod 60 PORTB = ((seku/10) << 4) (seku % 10); // BCD ausgeben } // Ende if takt } // Ende SIGNAL 18.10.2016 Prof. Dr. U.G. Schaarschmidt 20 HS Düsseldorf (c) U.Schaarschmidt 10
Programmierung in C (2.Teil) void main(void) // Hauptfunktion { DDRB = 0xff; // Port B Richtung Ausgabe TCCR0 = TEILER; // Teiler 100 Systemtakt :256 TIMSK = (1 << TOIE0); // Timer0 Interrupt frei PORTB = seku; // auf Port B ausgeben sei(); // alle Interrupts frei while(1) // schlafende Schleife durch Interrupt unterbrochen { } // Ende while } // Ende main 18.10.2016 Prof. Dr. U.G. Schaarschmidt 21 Timer / Counter0 Blockdiagramm AN: AVR133 18.10.2016 Prof. Dr. U.G. Schaarschmidt 22 HS Düsseldorf (c) U.Schaarschmidt 11
T/C1 Blockdiagramm AN: AVR133 18.10.2016 Prof. Dr. U.G. Schaarschmidt 23 Long Delay Timing AN: AVR133 18.10.2016 Prof. Dr. U.G. Schaarschmidt 24 HS Düsseldorf (c) U.Schaarschmidt 12
Zugriff auf 16-Bit-I/O-Register AN: AVR072: Access 16-bit I/O Registers 18.10.2016 Prof. Dr. U.G. Schaarschmidt 25 Clock0 Prescale Selection [Gadre] 18.10.2016 Prof. Dr. U.G. Schaarschmidt 26 HS Düsseldorf (c) U.Schaarschmidt 13
Compare1 Mode Select PWM Mode Select [Gadre] 18.10.2016 Prof. Dr. U.G. Schaarschmidt 27 Interrupt - Kontrolle GIFR: General Interrupt Flag Register MCUCR: MCU General Control Register MCUSR: MCU Status Register 18.10.2016 Prof. Dr. U.G. Schaarschmidt 28 HS Düsseldorf (c) U.Schaarschmidt 14
Interrupt Sense Control [Gadre] 18.10.2016 Prof. Dr. U.G. Schaarschmidt 29 Berechnung der Zeiten für die Timerregister (AVR130) 18.10.2016 Prof. Dr. U.G. Schaarschmidt 30 HS Düsseldorf (c) U.Schaarschmidt 15
Weitere Berechnungen (AVR130) 18.10.2016 Prof. Dr. U.G. Schaarschmidt 31 3. Übungsaufgabe zur Vorbereitung auf P3 Bereiten Sie die Ansteuerung der A-D-Wandler- Programmierung vor. Suchen Sie die Konfigurationsbits für das AD-Wandlerpraktikum heraus und packen diese in entsprechende (C-) Konstante, die Sie dann in Ihrem Programm einsetzen können! Datenblatt / Application Notes 18.10.2016 Prof. Dr. U.G. Schaarschmidt 32 HS Düsseldorf (c) U.Schaarschmidt 16