Forum: Mikrocontroller und Digitale Elektronik Flankenauswertung ohne Interrupt


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Neuling1 (Gast)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


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

von Lothar M. (lkmiller) (Moderator) Benutzerseite


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.