Forum: Mikrocontroller und Digitale Elektronik uC liest Taster nicht richtig ein - warum?


von Daniel B. (scheinleistung)


Lesenswert?

Hallo zusammen,

Ich teste ein kleines Programm gerade das erste mal auf einer kleinen, 
selbstgelöteten Schaltung (ATMEGA16). Vorher habe ich das STK500 
benutzt.

Die Bedienung eines Tasters hat super funktioniert vorher, jetzt auf dem 
neuen Target funtioniert gar nichts mehr, das Programm verhält sich als 
wäre der Taster IMMER PERMANENT betätigt. Nur warum. Ich habe den 
internen Pull Up aktiviert und ziehe mit dem Taster nach Masse, genau 
wie beim STK500. Ich messe am Port Pin auch High Pegel wenn ich nicht 
betätige und Low Pegel wenn ich betätige. Also alles wie es sein soll. 
Trotzdem funktioniert das identische Programm zum Abfragen des Tasters 
nicht mehr!


Hier die Konfiguration:
1
// Aktiviere Pull-Up für Taster (PC3) und aktiviere LED1 (PC0), LED2 (PC1) und LED3 (PC2)
2
PORTC     |= (1<<PC3);    //aktiviere Pull Up  
3
DDRC      = (1 << DDC0) | (1 << DDC1) | (1 << DDC2);  //Ausgang für LEDs
4
DDRC      &= ~( 1 << DDC3 );  //Eingang für Taster


Hier die Inetrrupt Routine die in 10ms Schritten den Taster abfrägt
1
ISR(TIMER0_OVF_vect)
2
{  
3
    if (!(KEY_PIN & (1<<KEY_PINNO)) ) 
4
    {
5
          antiBounceCounter++;
6
    }
7
    else 
8
    {
9
      antiBounceCounter = 0;
10
    }
11
}


Hier die Abarbeitung des Tasters:
1
void antiBounce(void)
2
{
3
   // Taste ist mind. CNTMIN * 10 ms "prellfrei" 
4
  if(antiBounceCounter > CNTMIN)
5
  {  
6
  
7
    //Taste wurde gedrückt und losgelassen BEVOR 2Sekunden Limit erreicht
8
    if ((antiBounceCounter < CNT_2S) && (KEY_PIN & (1<<KEY_PINNO))) 
9
    {   
10
      PORTC |= (1<<PC1); //zur Signalisierung
11
      wait100();
12
      wait100();
13
      PORTC &= ~(1<<PC1);
14
    }
15
16
                if ((antiBounceCounter > CNT_2S)) //länger als 2sekunden betätigt
17
    { 
18
      
19
        PORTC |= (1<<PC1); //zur Signalisierung
20
        wait100();
21
        wait100();
22
        PORTC &= ~(1<<PC1);
23
    }
24
       }
25
}

Definitionen:
1
#define CNTMIN      7      // Min. Zeit um Tastendruck zu erkennen
2
#define CNT_2S      200     // "lange gedrueckt:"
3
#define KEY_PIN      PINC   // Quelle für Taster
4
#define KEY_PINNO   PC3


Hat jemand eine Idee warumd as hier nicht funktioniert, also warum der 
uC meint der Taster sei permanent betötigt, obwohl es vorher am STK500 
so funtioniert hat? Finde keinen Fehler, Ich beiss gleich in Keyboard 
:-(

von H.j.Seifert (Gast)


Lesenswert?

Wahrscheinlich wie so oft - JTAG-Fuse.
Bastel mir bald mal ein Makro auf die Tastatur.

von Daniel B. (scheinleistung)


Lesenswert?

JTAG war vorher auf STK500 und auch jetzt aktiviert... Richtig? Falsch?

von Daniel B. (scheinleistung)


Lesenswert?

Aber jetzt gehts... Da muss am STK500 etwas anders eingestellt gewesen 
sein. Danke Du hast mir den Abend gerettet endlich kann ich schlafen 
gehen ;-)

von H.j.Seifert (Gast)


Lesenswert?

Falsch würde ich sagen. Mit JTAG geht PINC3 nicht.

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.