AVR- Programmierung: Taster einlesen

 

Nachdem du deinen ersten Aktor ( die LED ) angesteuert hast. Zeige ich dir jetzt, wie du Sensoren einlesen kannst. Dabei nimmst du in diesem Tutorial den einfachsten Sensor, den Taster.

 

 

 

Was benötigst du?

  • 1 x ATMEGA8 Mikrocontroller
  • 1 x AVRISP mkII (ISP- Programmiergerät)
  • 1 x Steckbrett
  • 1 x LED
  • 1 x Widerstand (200 Ohm)
  • 1 x Taster
  • 1 x Widerstand (10 kOhm)

 

Natürlich gehört noch die Spannungsversorgung dazu. In den beiden vorherigen Artikeln hast du Möglichkeiten kennengelernt deinen Mikrocontroller mit Energie zu versorgen. Deshalb liste ich diese Teile hier nicht mehr auf.

 

 

Vorab

 

 

Du wirst den Taster in diesen Tutorial an den Pin PD0 anschließen. Dafür musst du über das DDRB Register den Pin PB0 als Eingang definieren. Sobald der Pin PB0 als Eingang definiert wurde, wertet dein Mikrocontroller das Potenzial an dem Eingang aus. Dabei kann er zwei Zustände werten. Der Eingang befindet sich auf LOW ( ein Potenzial von 0 Volt ). Der Eingang befindet sich auf HIGH ( ein Potenzial von 5 Volt ).

Der Taster ist hier ein sogenannter Low- aktiver Taster, da der eingelesene Zustand ein Low- Pegel ist, sobald der Taster gedrückt wird. Der Widerstand am Taster ist ein sogenannter Pull- Up- Widerstand, da der Widerstand den eingelesenen Zustand auf ein High- Pegel hochzieht, solange der Taster nicht gedrückt wird. Wenn du mehr über Pull- Up und Pull- Down Widerstände erfahren möchtest, kannst du das hier nachlesen. Die LED wird eingeschalet, sobald auf die Taste gedrückt wird. Wird die Taste losgelassen bleibt die LED aus.

 

 

Wie sieht der Schaltplan aus?

 

 

 

Wie definiert man nun den Pin PB0 als Eingang?

 

 

Um den Pin PB0 als Eingang zu definieren muss man das zugehörige Bit im DDRB- Register auf "0" setzen. Du hast ja im letzten Tutorial schon gelernt,dass man ein Bit im DDRx- Register auf "1" setzt um es als Ausgang zu definieren. Der umgekehrte Zustand "0" ist die Definition eines Eingangs.

 

Am Pin PB0 können nun 2 Zustände ausgewertet werden:

  1. Der Taster ist gedrückt, also am Pin PB0 haben wir den Zustand "LOW = 0".
  2. Der Taster ist nicht gedrückt, also am Pin PB0 haben wir den Zustand "HIGH = 1".

Die Auswertung erfolgt mit den Register PINX.

 

Wenn am zugehörigen Bit PINB eine 1 anliegt, dann ist die Taste nicht gedrückt und die LED soll ausgehen.

Wenn am zugehörigen Bit PINB eine 0 anliegt, dann ist die Taste nicht gedrückt und die LED soll angehen.

 

Die zugehörigen if- Abfragen können dann so aussehen.

 

 

if (!(PINB & (1<<PB0))) // Wenn kein HIGH Signal an PB0 anliegt -> Taster gedrückt

{

    //Mach LED an

}

 

if (PINB & (1<<PB0))    // Wenn HIGH Signal an PB0 anliegt -> Taster nicht gedrückt

 

{

    //Mach LED aus

}

 

 

Du kannst ja erst selber versuchen den Code zum laufen zu kriegen. Unter "Der Code" findest du eine funktionierende Lösung.

 

 

Der Code

#include <avr/io.h>

 

 

int main(void)

{

    DDRD = 0xFF; // Setze Pin PD0 bis PD7 auf Ausgang

 

 

    DDRB = 0b00000000; // Setze Pin PB0 bis PB7 auf Eingang

 

 

    while (1) 

    {

if (!(PINB & (1<<PB0))) // Wenn kein HIGH Signal an PB0 anliegt -> Taster gedrückt

{

PORTD |= (1<<PD0);  // Mach LED an

}

 

if (PINB & (1<<PB0))    // Wenn HIGH Signal an PB0 anliegt -> Taster nicht gedrückt

{

PORTD &= ~(1<<PD0); // Mach LED aus

}

    }

}

 

 

Den Taster ohne externen Widerstand verwenden

 

 

Der Mikrocontroller hat intern einen Pull- Up Widerstand verbaut. Deshalb ist der externe 10kOhm Widerstand überflüssig. Um den internen Pull- Up Widerstand zu aktivieren muss der Ausgangsregister PORTX für das zugehörige Bit auf 1 gesetzt werden

 

 

Schaltung ohne externen Pull- Up Widerstand
Schaltung ohne externen Pull- Up Widerstand

 

 

#include <avr/io.h>

 

 

int main(void)

{

    DDRD = 0xFF; // Setze Pin PD0 bis PD7 auf Ausgang

 

 

    DDRB = 0b00000000; // Setze Pin PB0 bis PB7 auf Eingang

 

 

    PORTB = 0b00000001; // Internen Pull- Up Widerstand für Pin PB0 aktivieren

 

 

    while (1) 

    {

if (!(PINB & (1<<PB0))) // Wenn kein HIGH Signal an PB0 anliegt -> Taster gedrückt

{

PORTD |= (1<<PD0);  // Mach LED an

}

 

if (PINB & (1<<PB0))    // Wenn HIGH Signal an PB0 anliegt -> Taster nicht gedrückt

{

PORTD &= ~(1<<PD0); // Mach LED aus

}

    }

}

 

 

 

 

 

 

 

Wenn du hier irgendetwas vermisst, bessere Ansätze hast oder dir etwas nicht klar ist, zögere nicht einen Kommentar zu hinterlassen.

 

 

Kommentar schreiben

Kommentare: 0