www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Problem beim entprellen von Tastern AVR 90S8535


Autor: Stephan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich habe ein Problem.
Ich habe schon lange gesucht aber ich finde nicht meinen Fehler.
Kann einer mal von euch drüber schauen und mir vielleicht sagen wo mein

Fehler ist. "Ich sehe den Wald vor lauter Bäumen nicht mehr."

Mit Taste S1 kann ich  meinen Zähler erhöhen , aber
die Tasten S2 und S3 funktionieren nicht.
Elektrisch habe ich alles schon  geprüft. Die Signale
liegen elektrisch korrekt an den Portpins an.

Anforderung:

Ich möchte mit meinen Tastern S1 .. S3 einen Zähler verändern.
Ich habe die Tasten auch entprellt und damit der Zähler nicht
durchläuft auch verriegelt das die Taste erst oben sein muß bevor
der nächste Tastendruck ausgewertet wird.
Ich benötige einen Millisekunden Takt später in meiner Software deshalb
habe ich ihn auch für die Entprellung der Tasten mit verwendet.




Vielen Dank

Hier der Programmcode:



// Taster an Pin PB0, PB1 und PB2  -> Taster gedrückt = 0 V, Taster
offen = 5 V
// Portpin mit Pull up Widerstand an 5 V
// LED an Pin PC0, PC1 und PC2 Anode an Port und Kathode an GND



#define TASTE1_GEDRUECKT (Port_B_entprellt & 0x01)
#define TASTE2_GEDRUECKT (Port_B_entprellt & 0x02)
#define TASTE3_GEDRUECKT (Port_B_entprellt & 0x04)
#define true 1
#define false 0
#define DebounceTime 50 // 50ms



char Taste_S1_oben = true;
char Taste_S2_oben = true;
char Taste_S3_oben = true;
char Taste_S1 = false;
char Taste_S2 = false;
char Taste_S3 = false;


char Debounce_Counter = DebounceTime;
char Test = 0;


SIGNAL (SIG_OUTPUT_COMPARE1A){     // interrupt jede 1/1000 sec

mSekunden++;                             // 8.000.000 MHz  8  1000 =
0,001 sec = 1 ms

Debounce_Counter++;
if (Debounce_Counter == DebounceTime){
    Debounce_Counter = 0;
    Port_B_entprellt = PINB;     // umkopieren


}

void Entprellen (void){

if  (TASTE1_GEDRUECKT == 0 ){   // entprellen Taster S1
    Taste_S1_oben = true;
    }
if ((TASTE1_GEDRUECKT == 1 ) && (Taste_S1_oben == true)){
    Taste_S1_oben = false;
    Taste_S1 = true;
    }

if  (TASTE2_GEDRUECKT == 0 ){   // entprellen Taster S2
    Taste_S2_oben = true;
    }
if ((TASTE2_GEDRUECKT == 1 ) && (Taste_S2_oben == true)){
    Taste_S2_oben = false;
    Taste_S2 = true;
    }

if  (TASTE3_GEDRUECKT == 0 ){   // entprellen Taster S2
    Taste_S3_oben = true;
    }
if ((TASTE3_GEDRUECKT == 1 ) && (Taste_S3_oben == true)){
    Taste_S3_oben = false;
    Taste_S3 = true;
    }



}


main{


DDRB = 0x00;    // Port B Pin 0..3 Input
DDRC = 0x0F;    // Port C Pin 0..3 Output

PORTB = 0x00;   //
PORTC = 0x0F;   //

TCCR1B |= (1<<CTC1) | (1<<CS11);  // divide by 8
OCR1A = 1000;
TCNT1 = 0;
TIMSK = 1<<OCIE1A;
sei();


   Entprellen ();

   if (Taste_S1  == true) {
       Taste_S1  = false;
       Test++;
    }

   if (Taste_S2 == true ) {
       Taste_S2  = false;
       Test--;
    }

   if (Taste_S3 == true ) {
       Taste_S3  = false;
       Test = 0;
    }




}

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hauptschleife fehlt !!!

Dein main läuft ins Nirwana !!!


Du hast bestimmt noch nicht die Codesammlung hier entdeckt.

Da gibt es ein rundum sorglos (bulletproof) Entprellen für bis zu 8
Tasten, der Scheduler zeigt ein Anwendungsbeispiel (Treppenhauslicht)
dazu.


Peter

Autor: Stephan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

vielen Dank für den Tipp.
Stimmt ich hatte das Code oben aus meinen gesamten Code heraus
kopiert.
In main ist natürlich noch eine dauerschleife.
Kann mir den einer sagen ob in meinem Code ein Fehler ist oder ich
einen Denkfehler gemacht habe.
Ich würde gerne die Routinen so nutzen aber es funktioniert nicht.
Leider habe ich noch nicht sehr viel Erfahrung mit dem AVR und komme
deshalb mit Assembler nicht klar.

Schon mal vielen Dank

Gruß

Stephan

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn Du nicht exakt den gesamten Code postest (als Dateianhang !), der
nicht funktioniert !!!

Das haben wir hier schon öfters durch, es bringt nichts !!!

Dann vergiß es !!!


Peter

P.S.:
Das Schedulerbeispiel ist in C.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
P.S.:

Man sollte natürlich den Code soweit reduzieren, daß der Fehler immer
noch da ist.

Und natürlich auch getestet haben, daß der Fehler immer noch da ist !

Und Kommentare und Beschreibungen wird hier keiner übel nehmen.


Peter

Autor: Dobi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
nur so als frage, aber fehlt beim entprellen nicht der ansatz????

weil da steht nur (soviel ich gesehen hab) debounceTime 50 !!!
nur wenn ich entprelle mach ich das zb so:

Config Debounce = 30               //30ms
Debounce Pind.0 , 0 , Taster1

und weiter unten bevor die "Taster" kommen schreib ich:

Taster1:

Autor: ...HanneS... (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nunja, das Eine ist C, das Andere BASCOM.

...

Autor: Dobi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
aso ..... das soll C sein?
gibt aber anscheinend keine großen unterschiede ??!!

Autor: miru (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,
die PULL-UP Widerstaende von PORTB sind aus. Soll das so?

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.