Forum: Mikrocontroller und Digitale Elektronik [ATtiny13] Tastereingabe funktioniert nicht


von Andreas Brunner (Gast)


Lesenswert?

Hallo zusammen!

Hab mir das STK500 zugelegt und will damit einen ATtiny13 programmieren. 
Ein paar Lämpchen leuchten lassen funktioniert schon wunderbar nach den 
ersten "Gehversuchen". Wenn ich aber eine LED auf einen Tastendruck hin 
einschalten will funktioniert es nicht, weil der Tastendruck gar nicht 
erkannt wird. Hab das DDR richtig gesetzt, hab die internen pull-ups 
ausgeschaltet, da diese bei diesen Tastern nicht notwendig sind (sofern 
ich das richig aus dem Manual laut Taster-Schaltung gelesen habe) und 
frag auch nicht das Port sonder direkt den Pin ab.

Hier der Code:
1
#include <avr/io.h>      
2
 
3
int main (void) {            
4
 
5
  DDRB  = 0xFF; //erstmal alles auf Ausgang
6
  DDRB &= ~(1<<DDB4); //dann einen auf Eingang
7
8
  PORTB &= (0<<PB0) & (0<<PB2) & (0<<PB3);
9
  PORTB &= ~(1<<PB4);
10
  
11
  while(1)
12
  {
13
    if(PINB & (1<<PINB4)) //wenn Taste gedrückt
14
    {
15
      PORTB |= (1<<PB1); //LED einschalten
16
    }
17
  }                        
18
19
  return 0;                 
20
}

Ist dieser Code fehlerhaft?

Danke schon mal für eure Antworten...
Lg Andi

von spess53 (Gast)


Lesenswert?

Hi

Wenn du einen Taster drückst, wird das Eingangssignal L. Deine Routine 
reagiert nur auf H.

MfG Spess

von Vlad T. (vlad_tepesch)


Lesenswert?

die Frage ist, wie dein Taster angebunden ist.
schaltet er gegen Masse, oder gegen Plus?
hat er einen PullUp/Down?

Den internen hast du auf jeden Fall deaktiviert:
>   PORTB &= ~(1<<PB4);   // wenn ddr=0, dann ist Port füt Pullup

Das günstigste wär du schaltest den taster direkt an den Pin und an 
Minus.
Aktivierst im Code den Pullup und testest, ob der Pin 0 ist, dann ist er 
gedrückt.
ALlerdings musst du dann noch mit dem Prellen des Schaltkontaktes 
fertigwerden.

von Gast (Gast)


Lesenswert?

- die Taster auf dem STK500 sind gegen Masse geschaltet
- die LEDs sind invertiert (0=leuchten)
- du schaltest PB1 einmal auf 1 und dort bleibt er

Erweiter dein Progamm ein wenig, dass wenn die if-Abfrage nicht erfüllt 
wird, PB1 auf 0 gesetzt wird. Dann solltest du beim Tasterdruck schon 
etwas erkennen können.

von Andreas Brunner (Gast)


Lesenswert?

Hab das hier noch hinzugefügt:
1
if(PINB & (1<<PINB4))
2
{
3
  PORTB |= (1<<PB1);
4
} else {
5
  PORTB &= ~(1<<PB1);
6
}

Jetzt leuchten alle Leds, die an Port B angeschlossen sind, und wenn ich 
den Taster drücke, gehen alle aus. Wenn ich ihn loslasse, gehen wieder 
alle an.

von Andreas Brunner (Gast)


Lesenswert?

Warum wird der Status aller LEDs geändert, obwohl ich nur den einen Pin 
ändere?

von Andreas Brunner (Gast)


Lesenswert?

Hab den Fehler gefunden:
Die Abfrage auf den Tastendruck war falsch, so ist sie richtig (für 
active Low):
1
if( !(PINB & (1<<PINB4)) )
2
{
3
   PORTB |= (1<<PB1);
4
} else {
5
   PORTB &= ~(1<<PB1);
6
}

Das sollte dann vorerst reichen :)
Danke trotzdem, Lg Andi

von Klaus (Gast)


Lesenswert?

> PORTB &= (0<<PB0) & (0<<PB2) & (0<<PB3);

Diele Zeile ist übrigens auch falsch.  Wenn man eine 0 um x Stellen 
verschiebt bleibt es eine 0. Damit Steht in der Zeile, so wie du sie 
geschrieben hast, eigentlich PORTB = 0;

von Vlad T. (vlad_tepesch)


Lesenswert?

richtig wär:
PORTB &= ~ ((1<<PB0) | (1<<PB2) | (1<<PB3));

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.