AVR Anfänger Tasten und LEDs

OP #2388302
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
}
#2388311
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!
#2388470
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
Gast #2388498
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ß
OP #2388688
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.
Gast #2388938
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ß
Gast #2389074
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... ;)

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