Wie funktioniert das Programm?

#include <avr/io.h>    
#define F_CPU 1200000UL  // 1,2 MHz (für delay.h)
                         // Standard-Takt 9,6 MHz / 8

#include <util/delay.h>  // Befehlsbibliothek, die uns den
                         // delay-Befehl bereitstellt

int main(void)
{
  DDRB = 16;             // im Datenrichtungsregister PB4
                         // als Ausgang setzen
       
   while (1) {
       PORTB = 0;        // alle Bits des PORTB = GND -> LED an
       _delay_ms(255);   //warte 255 Millisekunden

       PORTB = 16;       //PB4 = 5V -> LED aus
       _delay_ms(255);
   }
  
   return(0);
}




Ich könnte mir denken, daß Dir folgende Befehle auch wie Zauberei vorkommen:

DDRB = 16;
PORTB = 0;
PORTB = 16;


Betrachten wir einmal die Pinbelegung eines Attiny13:

pinout


Vcc ist die Betriebsspannung (Plus) und GND (engl. Ground) ist Masse (Minus).

Als digitale Ausgänge können wir die Anschlußpins benutzen, die da heißen: PB0, PB1, PB2, PB3, PB4 und PB5.
Es handelt hierbei um sechs digitale Ein-/Ausgänge eines Ports mit Namen PORTB.

Vielleicht erinnert Dich das Wort "Port" an einen Hafen, wo die Schiffe ein- und ausfahren - das ist gar nicht mal so falsch.
Unser Attiny hat nur einen Port mit Namen B. Andere Mikrocontroller mit mehr Anschlußpins, wie z. B. Atmega8, haben mehrere Ports.

Diese Anschlüsse kann man als digitale Ausgänge oder als digitale Eingänge benutzen.
(Mann kann auch noch mehr damit machen, doch dazu später.)

Zu diesem PORT B gehört außerdem das Datenrichtungsregister DDR B (data direction register B):

DDRB:
5. bit 4. bit 3. bit 2. bit 1. bit 0. bit

Das Datenrichtungsregister legt fest, ob’s rein (Eingang) oder raus (Ausgang) gehen soll.

Wenn PB0 (also Anschlußbeinchen 5 des Attiny13) ein Ausgang sein soll, dann muß im Datenrichtungsregister DDRB das 0. bit gesetzt sein, so wie hier:

DDRB:
0 0
0
0
0
1

 In der Programmiersprache C geht das z. B. so: DDRB = 1;

Soll PB4 Ausgang sein, geht es mit: DDRB = 16;
Warum 16? Eine 16 in Binärschreibweise sieht so aus: 010000


Soll nun der Ausgang PB4 auf HIGH gesetzt werden, geht das mit: PORTB = 16;
Soll der Ausgang PB4 auf LOW gesetzt werden, geht das mit: PORTB = 0;

Eine am PB4 angeschlossene LED würde nun aus und an gehen - allerdings so schnell, dass man es nicht mehr sehen könnte.
Darum enthält das Programm zwei Wartezeiten (engl. delay).

Und damit es das Ganze nicht nur einmal tut, passiert das Setzen und Löschen von PB4 in einer Endlosschleife.

Du erinnerst Dich:
    
  while(1){
    // --- diese Schleife endet nie ---    
  }



Wenn Dir der Sinn der obigen Zeilen noch nicht so ganz einleuchtet, solltest Du erst einmal diesen C-Kurs durcharbeiten.








<----- Falls Du hier links KEIN Menü siehst: KLICK HIER