Forum: Compiler & IDEs LEDs per Taster auf STK500 anschalten (ATmega16)


von Eric W. (frederic-w)


Angehängte Dateien:

Lesenswert?

Hallo Gemeinde,

folgende Frage hat mich heute Nacht nicht schlafen lassen.

Den Code in der Test.c habe ich gestern Abend geschrieben, damit ging 
auch mein Ziel für gestern auf. Bei drücken einer Taste auf dem STK500 
leuchtet die dazugehörige LED auf. Schön. Danach wollte ich das bei 
drücken des Tasters SW0 erst die LED 0 beim nächsten drücken des Tasters 
SW0 die LED 1 usw. angeht.

Ich hab jetzt mehrere Stunden probiert leider ohne Erfolg. Meine 3 
Bücher habe ich auch befragt aber irgendwie habe ich eine Blockade.

Kann mir jemand bei dem Problem helfen?

Bestimmt simpel aber Ihr wisst ja wie das am Anfang ist.

Danke und Beste Grüße

Eric

von Peter D. (peda)


Lesenswert?

Eric W. schrieb:
> Ich hab jetzt mehrere Stunden probiert leider ohne Erfolg

Ja, probieren ist natürlich der falsche Ansatz, man muß überlegen. Und 
zwar erstmal abseits jeglicher Programmiersprache, d.h. wie muß 
überhaupt der Ablauf sein.

Verschiedene Zustände kann man z.B. durch eine Variable erreichen, die 
man hochzählt. Und die Variable wertet ein switch/case aus.
Damit ist man dann bei der allseits bekannten Statemaschine.


Peter

von Taster (Gast)


Lesenswert?

Schau mal nach wie man Taster entprellt.
Sobald dir das gelingt, sollte die Ansteuerung einfach sein.

von Wilhelm49 (Gast)


Lesenswert?

Du fängst gerade erst an zu programmieren, oder?

Das was Du jetzt in deinem Programm mit festen Werten machst(PORTA= 
0b111....), muss variabel werden.
Dazu deklarierst Du eine Variable. Wie das geht, findest Du in Deinen 
Büchern.
Da diese Variable in ihrem Wert veränderbar ist, kann man ihr mit jedem 
Tastendruck einen anderen Wert geben. Und am Ende bekommt der PORTA den 
Wert der Variablen, mit

PORTA= variable;

Und schon blinkts:)

von Eric W. (frederic-w)


Angehängte Dateien:

Lesenswert?

Hallo und danke für die Denkanstöße!

Ja ich bin ziemlicher Anfänger was programmieren angeht.

Ich habe jetzt versucht eine variable Namens a einzubringen und diese 
mittels Linksverschiebung immer um ein Bit zu verschieben.

Leider funktioniert es nicht. Seht ihr den Fehler?

von Wilhelm49 (Gast)


Lesenswert?

Das ist schon gut gedacht mit dem Schieben(a<<1).

Aber a braucht einen StartWert. Z.B. 0x01 oder 0xfe.
Und wenn Du a auf Null setzt,

"
else
 a= 0;
"

dann schiebst Du danach auch nur Nullen durch die Gegend!


Veilleicht versuchts Du es erst mal ohne Tastenabfrage, nur einen 
festgelegten Wert,

a= 0x55 oder a= 0xaa

a auf PORTA(den LED´s) auszugeben.

von STK500-Besitzer (Gast)


Lesenswert?

Was soll da passiern?
1
a<<1;

von Eric W. (frederic-w)


Angehängte Dateien:

Lesenswert?

Letzte Nacht ist so einiges passiert.

Alle Probleme lösten sich in Luft auf und alles funktioniert so wie ich 
es will.

Problem 1:
Autor: STK500-Besitzer (Gast)
Datum: 05.08.2012 07:41

Was soll da passiern?

a<<1;

Richtig da kann ja gar nix passieren ->

Lösung: variable = Operand << n(Stellen);
           a     =    a    << 1;

Problem 2:

"
else
 a= 0;   <-- hier liegt der Fehler!
"

Wenn a = 0 ist dann werden ja auch nur 0en geschoben, also -->

Lösung: a = 1;   <-- und zack es funktioniert

Dann habe ich noch wie empfohlen ein paar #define eingefügt <-- geht 
sehr gut!

Dann das Problem das die Ausgabe noch invertiert werden muss.

Lösung: XOR vor die übergebene Variable in der Ausgabefunktion.


Ende vom Lied: Vielen Dank für alle Denkanstöße!!! Manchmal sieht man 
die 1 vor lauter 0en nicht... ;-)

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.