#include <avr/io.h> definiert DDRB usw.
#include <stdint.h> ganzzahlige Datentypen uint8_t (0 bis 255) , int8_t (vorzeichenbehaftet -128 bis 127) , int16_t , int32_t
#define F_CPU 3686400UL
#include <util/delay.h> definiert _delay_ms()
#include "lcd.h" lcd.c und lcd.h ins Verzeichnis legen und Anschlussports in lcd.h anpassen
#include <avr/interrupt.h> sei() schaltet Interrupts ein, cli() aus Pin als Ausgang → Softwareinterrupt
#define MOSI PB3
uint8_t globaleVariable; siehe auch Attribute für Datentypen
ISR( Vectorname ) Name aus Datenblatt_vect z.B. INT0_vect
{
// Interrupt Code möglichst kurz und schnell abarbeitbar
}
Unterprogramm muss vor erstem Aufruf stehen
char function(int a); // Prototyp
int main(void) wird nach Reset aufgerufen
{
while(1)
{
/* Endlosschleife */
}
return 0;
}
char function(int a) // Unterprogramm
{
...
return b; kann bei void weggelassen werden
}
I/O-Pins und Portregister
Eingang / Ausgang / Spezialfunktion (siehe Datenblatt) durch setzen von Flags
DDRx |
Datenrichtung 0 - Eingang 1 - Ausgang nach Reset
Bsp.: DDRC = 0xff; ganzer Port
oder DDRB = (1<<DDB0) | (1<<DDB1);
|
PORTx |
Ausgänge ansteuern, wenn Eingang: interne Pullup-Widerstände 0 - deaktiviert 1 - aktiviert
PORTB = (1<<PB2); setzt Bit 2 auf 1 und restliche Bits auf 0
Bit auf 1 setzen: PORTB |= (1<<PB0);
Bit auf 0 setzen: PORTB &= ~((1<<PB4)|(1<<PB5));
Bit toggeln: PORTx ^= (1<<Pxi);
|
PINx |
Zustand abfragen
Beispiele: Variable = PIND; nicht PORTD, wäre Status der Pullup-Widerstände
if ( !(PINB & (1<<PINB2)) ) ... wenn Bit gelöscht / Taster gedrückt
|
0xff |
|
hexadezimal |
0b10101111 |
|
binär |
Attribute für Datentypen
volatile |
|
Variable wird vor jedem Lesezugriff aus Speicher gelesen und nach jedem Schreibzugriff in Speicher geschrieben
Variablen, die in Interrupt-Routinen verwendet werden, müssen als volatile deklariert sein |
const |
|
Konstante, darf keine neuen Werte zugewiesen bekommen |
Tastenentprellung
// einfache Tastenentprellung
inline uint8_t debounce(volatile uint8_t *port, uint8_t pin)
{
if ( !( *port & (1<<pin) ) )
{
// pin wurde auf masse gezogen, 100ms warten
_delay_ms(100);
if ( !( *port & (1<<pin) ) )
{
// zum loslassen zeit geben
_delay_ms(100);
return 1;
}
}
return 0;
}
...
if ( debounce(&PINB,PB1) ) ...
Flash-Speicher
#include <avr/pgmspace.h>
const uint8_t x PROGMEM = 1; Variable im Programmspeicher
myByte = pgm_read_byte(&x); für 16-Bit breite Variablen pgm_read_word()
Bitfelder
8 Bits in einer Byte-Variable zusammenfassen
struct {
unsigned char a:1; // 1 Bit für a
unsigned char b:2; // 2 Bit, Rest ungenutzt
} x;
x.b = 3; Zugriff
ein paar C-Grundlagen
Semikolon ; kennzeichnet Ende eines C-Ausdrucks
Vergleichsoperatoren
== |
|
gleich |
!= |
|
nicht gleich |
< |
|
kleiner |
<= |
|
kleiner oder gleich |
> |
|
größer |
>= |
|
größer oder gleich |
logische Verknüpfungen
|
|
Bit-Operatoren
a & b |
|
bitweise und |
a | b |
|
bitweise oder |
a ^ b |
|
bitweise xor |
~a |
|
jedes Bit invertieren (Einerkomplement) |
<<, >> |
|
Links-, Rechtsschieben |
|
Zeiger und Adressen
&x |
|
Speicheradresse der Variablen x (Zeiger) |
*x |
|
Inhalts-Operator |
Modulo |
|
a % b |
Typumwandlung |
|
var = (int) 5.6; |
Variablen und Datentypen in C
Variablen nur im Block in dem sie deklariert wurde und darunter gültig
int |
|
ganze Zahlen
Bsp.: int Zahl1, Zahl2=3; |
float, double |
|
Gleitkommazahlen |
char |
|
Zeichen, bzw. Zahlen zwischen -127 und +128
char Zeichen1='A'; |
Boolean |
|
kein eigener Datentyp, int und char verwenden 0 - false , ≠ 0 - true |
Arrays |
|
mehrere Variablen gleichen Typs
int a[5][3]; 5 Elemente, 0 bis 4 mehrdimensional
int b[]={1,2,3};
b[1]=... zugreifen
Größe mit sizeof(b) |
Strings |
|
ist char-Array
char s[21]; max. 20 Zeichen + ASCII Nr. 0
#include <string.h>
strcpy(s,"hallo"); direkt zuweisen geht nicht, fügt automatisch 0-Zeichen ein
strlen(s) → liefert 5 zurück |
Strukturen |
|
unterschiedliche Datentypen |
Kontrollanweisungen
if-Anweisung
if (Zahl1==0)
{
...
}
else ... ;
while-Schleife
while ( Bedingung ) Anweisung ;
do-while-Schleife
do
{
Anweisungen ;
}
while ( Bedingung );
for-Schleife
int i;
for (i=1;i<=5;i++)
{
...
}
|