avr ersterer schritt
  •AVR-GCC-Tutorial
 
#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
&&    und
||   oder
!   nicht
           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++)
{
   ...
}

 
  Heute waren schon 1 Besucher (17 Hits) hier!  
 
Diese Webseite wurde kostenlos mit Homepage-Baukasten.de erstellt. Willst du auch eine eigene Webseite?
Gratis anmelden