www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Fehlersuche Tastenentprellung


Autor: Stephan Mustermann (johnwurst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

ich versuche mich gerade an einem größeren Projekt (eine Art 
Bordcomputer fürs Auto), bei dem ich es mir nicht erlauben kann Zeit in 
einem delay zu vertrödeln. Deshalb habe ich mich am Pollen von Tasten 
versucht. Leider nur mit mäßigem Erfolg. Das Entprellen funktioniert 
nicht so richtig, wie es soll. Erst mal der Code:

//Prozessor ist in AVR Studio auf mega8 festgelegt
//Clock intern 8 MHZ
 
// Ein- und Ausgaberegister laden
#include <avr/io.h>
#include <avr/interrupt.h>





/////////////
//globale Variablen
////////////


volatile uint8_t flag;     //Flag für TimerInterrupt0

uint8_t drueck = 0;     //Zähler für Zustand "Taste gedrückt"


int main() {
 

// IO konfigurieren
//0xFF = Ausgang, 0x00 = Eingang 
 
  DDRC = 0xFF;
  DDRD = 0X00;
  PORTD |= (1<<PD3); //Pin3 Pullup aktivieren -> Taster zieht auf 0
     
 
// Timer0 konfigurieren
    TCCR0 |= (1<<CS02);        // Vorteiler 256
    TIMSK |= (1<<TOIE0);       // Timer Overflow Interrupt freischalten 
                             // Überlauf alle 8,19ms
 
// Interrupts freigeben
     sei();
 
// Endlose Hauptschleife
   while(1) {
            
    if (flag == 1) { // Timer Interrupt0; 8ms vergangen
            flag=0;
           
        //Tasterabfrage mit Entprellung
        //wenn 4x gleicher Zustand -> entprellt
            
        if(!(PIND & (1<<PD3))) {     //PD3 auf 0 gezogen 
                drueck ++;
        }
        else { //Taste nicht mehr gedrückt
            drueck = 0;
        }

        if(drueck >= 8){  //Taste bei 4 aufeinander folgenden Interrupts gedrückt
               drueck = 0;
               PORTC ^= (1<<PC1);
              }

      
        }
  
  }
}


//Timer0 Overflow, tritt alle 8ms auf
 
ISR( TIMER0_OVF_vect ) {
    flag = 1;
}

Das Programm soll also bei jedem Interrupt Overflow testen ob die Taste 
gedrückt ist und das auch für weitere 8Interrupts bleibt, also 64ms 
lang. Zum Loslassen müsste man nach meinem Verständnis wieder genauso 
lange Zeit haben. Leider funktioniert das ganze mehr als schäbig :( 
Woran liegts?

Gruß
Stephan

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.