Problem beim entprellen von Tastern AVR 90S8535

Gast #154479
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;
    }




}
#154480
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
Gast #154481
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
Gast #154484
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:

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren