Bitte aktiviere Stylesheets (CSS, von Website angebotener Stil)!
Home » Projekte » Microprozessoren » bsp-02-led-merken.c  

bsp-02-led-merken.c

Wenn Taster 1 gedrückt wird, geht LED1 an, wenn Taster 2 gedrückt wird, geht LED2 an.

#include <avr/io.h>
#ifndef F_CPU
  /*
   * Definiere F_CPU, wenn F_CPU nicht bereits vorher definiert
   * (z.B. durch Übergabe als Parameter zum Compiler innerhalb
   * des Makefiles). Zusätzlich Ausgabe einer Warnung, die auf die
   * „nachträgliche” Definition hinweist
   */
  #warning "F_CPU war noch nicht definiert, wird nun mit 3686400 definiert"
  #define F_CPU 800UL /* Quarz mit 8.00 Mhz */
#endif
#include <util/delay.h> /* in älteren avr-libc Versionen <avr/delay.h> */
  
/*
 lange, variable Verzögerungszeit, Einheit in Millisekunden
  
Die maximale Zeit pro Funktionsaufruf ist begrenzt auf
262.14 ms / F_CPU in MHz (im Beispiel:
262.1 / 3.6864 = max. 71 ms)
  
Daher wird die kleine Warteschleife mehrfach aufgerufen,
um auf eine längere Wartezeit zu kommen. Die zusätzliche
Prüfung der Schleifenbedingung lässt die Wartezeit geringfügig
ungenau werden (macht hier vielleicht 2-3ms aus).
*/
  
void long_delay(uint16_t ms) {
  while(ms) {
    _delay_ms(1);
    ms--;
  }
}
  
int main(void) {
  DDRD = (1 << PD5) | (1 << PD6); // Ports als Ausgang setzen
  
  while(1) {
    if((PIND & 0x04) || (PIND & 0x08)) {
      if(PIND & 0x04) {
        PORTD ^= 0x20; // Toggle PD5 (LED1)
      }
      if(PIND & 0x08) {
        PORTD ^= 0x40; // Toggle PD6 (LED2)
      }
      long_delay(300); // Warte 300 Millisekunden
      /* Wenn man hier eine kleinere Zahl einsetzt, wird es ein Blinker, der nur läuft, solange man den bzw. die Taster gedrückt hält */
    }
  }
}

Bookmarken / Weitersagen | RSS-Feed abonnieren