Forum: Mikrocontroller und Digitale Elektronik Flankenauswertung ohne Interrupt


von Neuling1 (Gast)


Lesenswert?

Hallo, wie der Betreff bereits sagt suche ich eine einfache möglich die 
Flanke eines Tasters abzufragen. Da ich jedoch noch blutiger Anfänger 
bin am besten ohne Interrupt.

von Michael B. (laberkopp)


Lesenswert?

Man prüft wiederholt (z.B. im zeitlichen Abstand von 10ms)
ob der Tasteneingang von ungedrückt auf gedrückt gewechselt hat.
Dazu merkt man sich den Tastenzustand vom letzen Einlesen.
Der Taster ist so auch gleich entprellt (das dauert nämlich weniger 
lange als 10ms).
Man kann das in der Hauptschife das Programms machen oder einer 
Zeitgeber Interrupt-Routine.

 uint8_t tasten,gedrueckt;

 while(1)// die Programm-Hauptschleife
 {
   tasten=PIND; // 8 Taster auf ein mal, liefern 1 wenn gedrückt (sonst 
~PIND)
   gedrueckt=tasten&~gedrueckt;
   if(gedrueckt&1)
   {
     // Taster 1 wurde gerade runtergedrückt, mach was
   }
   if(gedrueckt&2)
   {
     // Taster 2 wurde gerade runtergedrückt, mach was
   }
   // mach was sonst in der Programm-Hauptschleife passieren muß
   gedrueckt=tasten;
    _delay_ms(10); // damit sie bestimmt länger dauert als eventuelles 
Prellen
 }

: Bearbeitet durch User
von Neuling1 (Gast)


Lesenswert?

Okay und wie genau verwende ich dieses Programm auf einem myAVR mk2 
board mit Atmega 8?

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Neuling1 schrieb:
> Okay und wie genau verwende ich dieses Programm auf einem myAVR mk2
> board mit Atmega 8?
Was hast du denn bisher schon programmiert? Nicht, dass noch jemand 
einen Vorschlag bringt und du nochmal fragen musst.

Zeig doch mal deinen Anfang und dann diskutieren wir gemeinsam, wie 
es weitergehen könnte...

von HildeK (Gast)


Lesenswert?

Wenn du bisher nur das Board gekauft hast und sonst noch nichts gemacht 
hast (sieht für mich fast so aus), dann arbeite einfach mal das Tutorial 
durch.
Welches? Für C z.B. AVR-GCC-Tutorial, für Assembler AVR-Tutorial
Da steht weit vorne, wie man Tasten abfragt und LEDs zum Leuchten 
bringt.

Was hast du überhaupt schon mal zum laufen gebracht, in welcher Sprache?

von Neuling1 (Gast)


Lesenswert?

// Unterprogramm zur Menüführung
int zaelen(void)
{
  if ((!(PINB & (1<<PB0))))    // Wenn Pin BO dann Zähler++
    {
      zaehler++;      // Zähler +1
      lcd_clear();    //löschen des Displays
      _delay_ms(300);    //entprellung

    }

    if ((!(PINB & (1<<PB1)))) // Wenn Pin B1 dann Zähler--
    {
      zaehler--;      //Zähler -1
      lcd_clear();    //löschend es Displays
      _delay_ms(300);    //entprellung

    }
}
so habe ich meine Menüführung bisher. Nur durch delay entprellt.
So springe ich allerdings bei gedrücktem schalter trotzdem alle 300ms in 
den nächsten punkt. das wollte ich beseitigen.

von HildeK (Gast)


Lesenswert?

Neuling1 schrieb:
> So springe ich allerdings bei gedrücktem schalter trotzdem alle 300ms in
> den nächsten punkt. das wollte ich beseitigen.

Dann musst du eben das Loslassen des Tasters auch abfragen und erst dann 
weitermachen ...

von Michael B. (laberkopp)


Lesenswert?

Neuling1 schrieb:
> so habe ich meine Menüführung bisher. Nur durch delay entprellt.
> So springe ich allerdings bei gedrücktem schalter trotzdem alle 300ms in
> den nächsten punkt. das wollte ich beseitigen.

Na dann machs doch wie oben.

Dein Programm vergleicht nicht den früheren Tastenzustand mit dem 
aktuellen, sondern prüft nur den aktuellen und kann daher Flanken nicht 
erkennnen.

Machs wie oben und es funktioniert, mit nur 1 kurzen Delay.

von HildeK (Gast)


Lesenswert?

Eigentlich wäre es jetzt an der Zeit, sich die schnelle und leider nicht 
so einfach verständliche Routine von Peter Dannegger anzuschauen. Da 
kannst du mehrere Tasten abfragen, entprellen und sogar unterscheiden, 
ob du bei langem Drücken ein Auto-Repeat haben willst.
Die verwendet zwar den Interrupt, aber daran kommst du letztlich bei der 
µC-Programmierung eh nicht vorbei.

Zu finden ist die im Unterforum "Projekt & Code".

Und für den Anfang reicht es auch, einfach das mal auszuprobieren, zu 
verstehen, was man damit wie machen kann, und zu nutzen.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.