mikrocontroller.net

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


Autor: Andreas Brunner (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
#include <avr/io.h>      
 
int main (void) {            
 
  DDRB  = 0xFF; //erstmal alles auf Ausgang
  DDRB &= ~(1<<DDB4); //dann einen auf Eingang

  PORTB &= (0<<PB0) & (0<<PB2) & (0<<PB3);
  PORTB &= ~(1<<PB4);
  
  while(1)
  {
    if(PINB & (1<<PINB4)) //wenn Taste gedrückt
    {
      PORTB |= (1<<PB1); //LED einschalten
    }
  }                        

  return 0;                 
}

Ist dieser Code fehlerhaft?

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

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

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

MfG Spess

Autor: Vlad Tepesch (vlad_tepesch)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Andreas Brunner (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hab das hier noch hinzugefügt:
if(PINB & (1<<PINB4))
{
  PORTB |= (1<<PB1);
} else {
  PORTB &= ~(1<<PB1);
}

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.

Autor: Andreas Brunner (Gast)
Datum:

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

Autor: Andreas Brunner (Gast)
Datum:

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

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

Autor: Klaus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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;

Autor: Vlad Tepesch (vlad_tepesch)
Datum:

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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.