Forum: Mikrocontroller und Digitale Elektronik AVR Anfänger Tasten und LEDs


von Tobias K. (tobik91)


Lesenswert?

Hallo!
Mein Problem ist folgendes:
ein Mikrocontroller (STK 500) hat 5 Taster-Eingänge (für das Problem 
sind die ersten 4 relevant) und 6 LED Ausgänge (Hier sind die ersten 5 
relevant)

Bei druck auf Taster 0 (am PORTD, also PIND auf 0x01) soll erst led 0 
(Am PORTB) angehen und kurze zeit später die led 1. Beim druck auf 
taster 1 erst led 0, kurze zeit später led 2 und so weiter. Anschließend 
soll sie wieder ausgehen.

Doch irgendwie tut sich garnix.
Dieses kleine Testprogramm soll einfach nur die LEDs anmachen, wenn 
irgendein taster gedrückt ist und alle aus, wenn keiner gedrückt ist.
kann mir jemand helfen?
1
#include <avr/interrupt.h>
2
#include <avr/io.h>
3
#include <stdint.h>
4
#include <util/delay.h>
5
6
volatile uint8_t outb = 0xFF;
7
volatile uint8_t ind  = 0x00;
8
9
int main(void)
10
{
11
  // PORTB Ausgänge
12
    DDRB  = 0xFF;
13
    PORTB = 0x3F;
14
    // PORTD Eingänge
15
    DDRD  = 0x00;
16
    PORTD = 0x3F;
17
 
18
  ind = PIND;
19
  while(1)
20
  {
21
    if(ind>0) {
22
    outb = 0xFF;  
23
  } else {
24
    outb = 0x00;  
25
  }      
26
  ind = PIND;
27
  PORTB = outb;
28
  }  
29
}

von Oliver R. (rollinator)


Lesenswert?

Tobias Keller schrieb:
> if(ind>0) {
>     outb = 0xFF;
>   } else {
>     outb = 0x00;
>   }
>   ind = PIND;
>   PORTB = outb;
>   }
> }

Ich bin mir zwar nicht ganz sicher aber ivh glaube es wird "negative 
Logik" verwendet. D.h. ein gedrückter Taster zeichnet sich dadurch aus, 
dass das entsprechende Bit 0 ist.
Bei den LED ist es genauso, wenn du ne 0 an den Port schicktst ist die 
entsprechende LED an!

Ich hoffe ich liege jetzt nicht ganz danenben!

von Peter D. (peda)


Lesenswert?

Tastenabfrage ist keine so triviale Sache, wie es sich Anfänger gerne 
vorstellen. Man braucht dazu schon recht ausgefeilte Routinen. Diese 
machen dann Entprellung, Störunterdrückung, Flankenerkennung, Speichern 
und Auswertung.

Zeitverzögerungen sind auch nicht trivial. Der Anfänger wartet gerne, 
aber dann kann die CPU nichts anderes machen. Das ist also ne Sackgasse.

Es gibt gute Lösungen, die allerdings nicht ganz einfach zu verstehen 
sind:

Beitrag "Wartezeiten effektiv (Scheduler)"

Es ist jetzt die Frage, ob man mühsam Schritt für Schritt alles nochmal 
selber neu erfinden will oder die Erfahrungen anderer nachnutzt.

Ein PC-Programmierer entwickelt ja auch nicht die Funktionen der 
Grafikkarte selber, sondern installiert die Treiber-DLL und ruft deren 
Funktionen auf.


Peter

von Joachim (Gast)


Lesenswert?

Oliver R. schrieb:
> Ich bin mir zwar nicht ganz sicher aber ivh glaube es wird "negative
> Logik" verwendet. D.h. ein gedrückter Taster zeichnet sich dadurch aus,
> dass das entsprechende Bit 0 ist.
> Bei den LED ist es genauso, wenn du ne 0 an den Port schicktst ist die
> entsprechende LED an!
>
> Ich hoffe ich liege jetzt nicht ganz danenben!

Das stimmt teilweise, und da ist glaube ich auch der Hund begraden. Weil 
AVRs interne Pullups haben werden Schalter/Taster oft so verschaltet, 
daß sie den Pin nach GND ziehen. Bei Ausgängen ist das aber nicht mehr 
üblich.

Das Problem ist doch: wenn du so abfragst:
if(ind>0)

Dann sind bei bei ungedrückten TAstern und aktivierten Pullups alle Bits 
1 (>0, z.B. 0xFF). Wenn du jetzt einen Taster drückst wird ein Bit 0, 
Dann steht da z.B. 0xFE. Und: das ist immer noch >0 !

Gruß

von Tobias K. (tobik91)


Lesenswert?

Ja, das war ja auch nur ein Test, ob der überhaupt die eingaben 
ausliest. Hab das problem auch gefunden, es war eben diese Negative 
Logik. Es geht bei dem Projekt darum, wenn eine taste gedrückt wird, auf 
einer USB-Tastatur eine Tastenkombination zu drücken (Via Optokoppler), 
da ist es sogar gut, dass der Controller nur eine Sache gleichzeitig 
machen kann.

von Martin (Gast)


Lesenswert?

Für solche Fälle ist es auch gut, wenn man das Programm in einem 
Debugger ausführt.

von Tobias K. (tobik91)


Lesenswert?

Ja, ist es xD ^^
Aber meine IDE bockt total rum. Ich werde demnächst irgendwie mal 
versuchen was für linux zu basteln. Mein Windows bockt einfach nur.

von Joachim (Gast)


Lesenswert?

Mann, hab ich einen "Bitte nicht lesen"-Vermerk vor meinen Beiträgen?!

Ob Test oder nicht, ist doch Wurst, wenns nicht geht! Und weil du dich 
nicht präziser ausdrückst als

Tobias Keller schrieb:
> Doch irgendwie tut sich garnix.

kann man auch nicht präzise helfen. Deine if-Abfrage scheint Kappes zu 
sein, mehr nicht. Siehe oben!

Ich hab aber keine Lust dir zu sagen, wie es richtig wäre. Schließlich 
steht oben ja schon, warum es nicht geht (ich vermute mal, daß alle 
deine LEDs immer an sind). Ob du abfragst, ob 255 > 0 ist, oder 150 > 0 
oder weißdergeierwas > 0 ist egal, du wirst immer JA als antwort 
kriegen...

Gruß

von Hannes L. (hannes)


Lesenswert?

Joachim schrieb:
> (ich vermute mal, daß alle
> deine LEDs immer an sind)

Naja, die LEDs sind beim STK500 auch L-aktiv...

...

von Joachim (Gast)


Lesenswert?

Naja ok, dann lag ich mit meiner Vermutung eben falsch. Ich kenne den 
Schaltplan vom STK500 nicht. Dennoch bleibt das Problem mit der fast 
immer wahren Abfrage bestehen. Außer er hat acht Taster und drückt alle 
gleichzeitig... ;)

von Tobias K. (tobik91)


Lesenswert?

also es geht jetzt, das Problem war eben, dass die Taster bei aktivität 
auf 0 stehen und bei inaktivität auf 1.

Da ich gedacht hatte, dass es garnicht auf die Taster reagiert, hatte 
ich mit dem beispiel halt IRGENDEINE tasterverändeurng abfragen wollen.

von Joachim (Gast)


Lesenswert?

Ich geh schaukeln...

von Tobias K. (tobik91)


Lesenswert?

sorry, ich hatte kein computer verfügbar und hatte die antwort nur vom 
handy getippt...

Thread kann geschlossen werden...

von Hannes L. (hannes)


Lesenswert?

Tobias Keller schrieb:
> Thread kann geschlossen werden...

Wie kommst Du darauf?

Noch hat niemand auf Peters sehr berechtigten Hinweis reagiert.

Deine Tasterspielerei ist zwar gut und schön, mag für Dich auch ein 
"Lernerfolg" sein, ist aber in der Praxis zu nichts und garnichts zu 
gebrauchen.

...

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.