while (1)
Transcription
while (1)
MCT 16.06.2016 Mikrocontroller-Programmierung in C Hintergrund: C ist die am weitesten verbreitete Hochsprache für Mikrocontroller Standard-C (ANSI-C) wurde um spezielle Befehle erweitert (Bit-Verarbeitung, Speicherverwaltung etc.) Vorteile: Controller-spezifische Assemblersprache muß nicht gelernt werden Komplexe Programme werden übersichtlicher (besser wartbar) Rückgriff auf Funktionsbibliotheken (z.B. mathematische Operationen) Echtzeitprogramme sind weiterhin möglich Einbindung von Assemblercode kann erfolgen Vorraussetzung: C-Compiler für den spezifischen Mikrocontroller (z.B.: "C-51") Linker, zum Binden von selbst geschriebenem Programm und fertigen Modulen aus den mitgelieferten Bibliotheken (Libraries) (z.B.: Programmpaket der Fa. Keil für die 8051-Familie) 1/8 MCT_Vorlesung_08_SS2016 MCT 16.06.2016 Beispiel: Tasten-Abfrage /* Definition der symbolischen Namen des AT89C5131 einbinden */ #include <reg5131.h> /* Variablen-Deklaration (sbit = Bit im "special function register") */ sbit sbit LED1 Taste1 = = P1^0; P0^0; /* Bit 0 von Port P1 */ /* Bit 0 von Port P0 */ /* Hauptprogramm */ void main(void) { while (1) /* Endlosschleife */ { LED1 = Taste1; /* LED1 = 0, wenn Taste1 = 0 */ } } 2/8 MCT_Vorlesung_08_SS2016 MCT 16.06.2016 Auszug aus der Header-Datei reg5131.h /*-------------------------------------------------------------REG5131.H ---------------------------------------------------------------*/ ... /* BYTE Register */ sfr P0 = 0x80; sfr P1 = 0x90; Bekanntgabe der Adressen der sfr P2 = 0xA0; Special Function Register sfr P3 = 0xB0; sfr P4 = 0xE8; ... /* BIT Register */ ... sbit TF1 = 0x8F; Bekanntgabe der Adressen der sbit TR1 = 0x8E; bitadressierbaren Bits sbit TF0 = 0x8D; in den Special Function Registern sbit TR0 = 0x8C; ... damit stehen diese Variablen für die C-Programmierung zur Verfügung 3/8 MCT_Vorlesung_08_SS2016 MCT 16.06.2016 Datentypen des C-51-Compilers Datentyp Größe Verwendung bit sbit 1 Bit 1 Bit für Bit-Variablen für Bits in "special function registers", z.B. Port-Bits (signed) char unsigned char 8 Bit 8 Bit mit Vorzeichen (Wertebereich -128 bis +127) ohne Vorzeichen (Wertebereich 0 bis 255) sfr 8 Bit 1-Byte-Variable in einem "special function register" (signed) int unsigned int sfr 16 16 Bit 16 Bit 16 Bit mit Vorzeichen (ca. -32000 bis ca. +32000) ohne Vorzeichen (0 bis ca. 64000) 2-Byte-Variable im "special function register"-Bereich (signed) long unsigned long 32 Bit 32 Bit mit Vorzeichen (ca. –2 · 10+9 bis 2 · 10+9) ohne Vorzeichen (0 bis ca. 4 10+9) float pointer 32 Bit 8 - 24 Bit ca. 1,2 · 10-38 bis 3,4 · 10+38 für Addressen von Variablen 4/8 MCT_Vorlesung_08_SS2016 MCT 16.06.2016 Beispiel: Zeichen von der seriellen Schnittstelle empfangen Aufgabe: Zeichen empfangen, auswerten und LEDs ansteuern #include <reg5131.h> sbit sbit LED1 LED2 = = P1^0; P1^1; /* Bit 0 von Port P1 */ /* Bit 1 von Port P1 */ void schnittstelle_initialisieren(void) { BRL = 230; /* Baudrate 9600 Baud, siehe */ BDRCON = 0x1E; /* Vorlesung serielle Schnittstelle */ SCON = 0x52; /* Asynchrone Datenübertragung im */ /* Format 8Bit, 0 Parität, 1 Stopp */ Definition einer Funktion } 5/8 MCT_Vorlesung_08_SS2016 MCT 16.06.2016 void main(void) /* Hauptprogramm */ { char zeichen; schnittstelle_initialisieren(); while (1) { if (RI == 1) { RI = 0; zeichen = SBUF; /* Endlosschleife */ /* Zeichen empfangen ? */ /* Empfangspuffer lesen */ switch (zeichen) { case '1': LED1 = !LED1; break; case '2': LED2 = !LED2; break; default: P1 = 0xff; } Aufgabe des Programms: Zeichen an der seriellen Schnittstelle empfangen und auswerten. Zeichencode 1 schaltet die LED 1 um, Zeichencode 2 schaltet die LED 2 um, alle anderen Zeichencodes schalten alle LEDs aus. } } } 6/8 MCT_Vorlesung_08_SS2016 MCT 16.06.2016 Alternative Lösung mit Standard Ein-/Ausgabefunktionen #include <stdio.h> /* Standard Input Output ... void main(void) { char zeichen; serielle_schnittstelle_initialisieren(); while (1) { zeichen = getchar(); Funktionen */ Die serielle Schnittstelle ist in der 8051-Mikrocontrollerfamilie als Standard Ein-/Ausgabeschnittstelle vordefiniert. Die Schnittstelle muss nur mit der benötigten Baudrate initialisiert werden. switch (zeichen) { case '1': LED1 = !LED1; break; case '2': LED2 = !LED2; break; default: printf(Alle LEDs aus\n); P1 = 0xff; } } } 7/8 Nachteil: diese Lösung benötigt viel mehr Programmspeicher ! MCT_Vorlesung_08_SS2016 MCT 16.06.2016 Ein Lauflicht in C while (1) { if (P1 == 0xFF) alle LEDs aus { P1 = 0xFE; eine LED an } else falls eine LED an, dann schieben... { P1 = ~(~P1 << 1); } nach links schieben - eine Bitposition } Operatoren: Negation (logisch) ! Negation (bitweise) ~ Schieben (nach links) << 8/8 Port P1 1 1 1 1 1 1 1 0 1 ...eine 1 nachschieben... Der << Operator schiebt eine 0 nach. Daher wird das Port P1 vor und nach dem Schieben mit Hilfe des ~ Operators negiert. und (logisch) und (bitweise) oder (logisch) oder (bitweise) && & || | MCT_Vorlesung_08_SS2016