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


von Stephan (Gast)


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;
    }




}

von Peter D. (peda)


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

von Stephan (Gast)


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

von Peter D. (peda)


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.

von Peter D. (peda)


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

von Dobi (Gast)


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:

von ...HanneS... (Gast)


Lesenswert?

Nunja, das Eine ist C, das Andere BASCOM.

...

von Dobi (Gast)


Lesenswert?

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

von miru (Gast)


Lesenswert?

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

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.