[ATtiny13] Tastereingabe funktioniert nicht

Gast #1507575
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
#1507582
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.
Gast #1507583
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.
Gast #1507601
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.
Gast #1509120
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
Gast #1509129
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;

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