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