myavr Programmierung in C Stefan Goebel Februar 2017 Stefan Goebel myavr Programmierung in C Februar 2017 1 / 12
Grundgerüst... braucht man immer! #include <avr/io.h>// Register- und Konstantendefinitionen #define F CPU 3686400 // Taktfrequenz des Prozessors #include <util/delay.h>// Zeitverzögerung int main( void ) // Hauptprogramm {... Programmbefehle; return 0; } Stefan Goebel myavr Programmierung in C Februar 2017 2 / 12
LED einschalten... aber wie? // im DatenRichtungsRegister des Ports die Ausgänge markieren DDRD = 0b00100000; //Port D Pin 5 ist Ausgang Stefan Goebel myavr Programmierung in C Februar 2017 3 / 12
LED einschalten... aber wie? // im DatenRichtungsRegister des Ports die Ausgänge markieren DDRD = 0b00100000; //Port D Pin 5 ist Ausgang // einschalten PORTD = 0b00100000; Stefan Goebel myavr Programmierung in C Februar 2017 3 / 12
LED einschalten... aber wie? // im DatenRichtungsRegister des Ports die Ausgänge markieren DDRD = 0b00100000; //Port D Pin 5 ist Ausgang // einschalten PORTD = 0b00100000; // und wieder aus PORTD = 0b00000000; Stefan Goebel myavr Programmierung in C Februar 2017 3 / 12
LED einschalten... aber wie? // im DatenRichtungsRegister des Ports die Ausgänge markieren DDRD = 0b00100000; //Port D Pin 5 ist Ausgang // einschalten PORTD = 0b00100000; // und wieder aus PORTD = 0b00000000; Nachteil: alle anderen Ausgänge werden immer ausgeschaltet Stefan Goebel myavr Programmierung in C Februar 2017 3 / 12
Bitmaske zum Einschalten nutzen... weil es cleverer ist mit der ODER 1 -Verknüpfung D7 D6 D5 D4 D3 D2 D1 D0 DatenByte 0 0 1 0 0 0 0 0 Maske D7 D6 1 D4 D3 D2 D1 D0 Ergebnis 1 https://de.wikipedia.org/wiki/oder-gatter Stefan Goebel myavr Programmierung in C Februar 2017 4 / 12
Bitmaske zum Einschalten nutzen... weil es cleverer ist mit der ODER 1 -Verknüpfung D7 D6 D5 D4 D3 D2 D1 D0 DatenByte 0 0 1 0 0 0 0 0 Maske D7 D6 1 D4 D3 D2 D1 D0 Ergebnis Programmiervarianten: PORTD = PORTD 0b00100000; PORTD = 0b00100000; PORTD = ( 1 << 5 ); 1 https://de.wikipedia.org/wiki/oder-gatter Stefan Goebel myavr Programmierung in C Februar 2017 4 / 12
Bitmaske zum Ausschalten nutzen... weil es cleverer ist mit der UND 2 -Verknüpfung D7 D6 D5 D4 D3 D2 D1 D0 DatenByte 1 1 0 1 1 1 1 1 Maske D7 D6 0 D4 D3 D2 D1 D0 Ergebnis 2 https://de.wikipedia.org/wiki/und-gatter Stefan Goebel myavr Programmierung in C Februar 2017 5 / 12
Bitmaske zum Ausschalten nutzen... weil es cleverer ist mit der UND 2 -Verknüpfung D7 D6 D5 D4 D3 D2 D1 D0 DatenByte 1 1 0 1 1 1 1 1 Maske D7 D6 0 D4 D3 D2 D1 D0 Ergebnis Programmiervarianten: PORTD = PORTD & 0b11011111; PORTD = PORTD & (0b00100000); PORTD &= (0b00100000); PORTD &= ( 1 << 5 ); 2 https://de.wikipedia.org/wiki/und-gatter Stefan Goebel myavr Programmierung in C Februar 2017 5 / 12
Verzögerung... damit es etwas länger dauert Konstante mit der Taktfrequenz des Prozessors muss deklariert sein. Header-Datei muss eingebunden sein. // eine Sekunde warten delay ms( 1000 ); Stefan Goebel myavr Programmierung in C Februar 2017 6 / 12
Schleifen... und nochmal... while( Schleifenbedingung ) {... Befehle, die wiederholt werden; } Stefan Goebel myavr Programmierung in C Februar 2017 7 / 12
Verzweigung... ent oder weder if( Bedingung ) {... wird ausgeführt, wenn Bedingung erfüllt ist } else {... wird ausgeführt, wenn Bedingung nicht erfüllt ist } Stefan Goebel myavr Programmierung in C Februar 2017 8 / 12
Verzweigung... ent oder weder if( Bedingung ) {... wird ausgeführt, wenn Bedingung erfüllt ist } else {... wird ausgeführt, wenn Bedingung nicht erfüllt ist } if( Bedingung1 && Bedingung2 ) // UND if( Bedingung1 Bedingung2 ) // ODER Stefan Goebel myavr Programmierung in C Februar 2017 8 / 12
Taster abfragen... Druck machen // internen Pull-Up-Widerstand an Port D Pin 2 einschalten PORTD = 0b00000100; Datenbyte mit der Maske vergleichen. D7 D6 D5 D4 D3 D2 D1 D0 DatenByte 0 0 0 0 0 1 0 0 Maske Stefan Goebel myavr Programmierung in C Februar 2017 9 / 12
if(!( PIND & ( 1 << 2 ) ) ) // invertieren, da Taster gegen Masse { PORTD = ( 1 << 5 ); } else { PORTD &= ( 1 << 5 ); } Stefan Goebel myavr Programmierung in C Februar 2017 9 / 12 Taster abfragen... Druck machen // internen Pull-Up-Widerstand an Port D Pin 2 einschalten PORTD = 0b00000100; Datenbyte mit der Maske vergleichen. D7 D6 D5 D4 D3 D2 D1 D0 DatenByte 0 0 0 0 0 1 0 0 Maske
Entprellen... keine Hektik! Mehrere Impulse beim Betätigen eines Tasters Gegenmaßnahmen: aufwändige Schalter zusätzliche Elektronik Softwaretechnische Maßnahmen Stefan Goebel myavr Programmierung in C Februar 2017 10 / 12
Softwaretechnisches Entprellen... keine Hektik! verschiedene Verfahren Flankenerkennung Warteschleifen-Verfahren ungünstig bei zeitkritischen Anwendungen Zählergesteuerte Schleifen nur kurze Wartezeiten Timer-Verfahren universell und zuverlässig Nachbildung elektronischer Filter Stefan Goebel myavr Programmierung in C Februar 2017 11 / 12
Interruptsteuerung... Moment mal! Unterbrechung des Hauptprogramms und Verzweigung in ISR bei bestimmten Ereignissen z.b. Reset, Extern, Timer oder UART Include Datei einbinden Für jede aktivierte IR-Quelle eine Funktion (ISR) programmieren Interrupt über Aktivierungs-Bit einschalten Interrupts müssen global aktiviert sein Innerhalb einer Interrupt-Routine keine umfangreichen Berechnungen Variable, die von main() und ISR benutzt werden, volatile deklarieren Stefan Goebel myavr Programmierung in C Februar 2017 12 / 12