Hallo,
ich versuche gerade, LED's so zu Programmieren, dass diese auf
Knopfdruck an bzw aus gehen mit Hilfe von Atmel Studio.
Da ich ein totaler Anfänger bin, weiß ich bei folgenden Sachen nicht
weiter:
Die Belegung ist wie Folgt:
Atmega8
#define BIT_1 (1 << PC1) LED 1
#define BIT_2 (1 << PB2) LED 2
#define BIT_3 (1 << PB1) LED 3
#define BIT_4 (1 << PC3) LED 4
#define BIT_5 (1 << PC2) LED 5
#define BIT_6 (1 << PC4) LED 6
#define BIT_7 (1 << PC5) LED 7
#define BIT_SWITCH (1<<PB0) Taster
Zu jeder LED soll also ein Taster gehören ( ich habe es erstmal mit
einem versucht und bin gescheitert).
Beim Versuch alle LED's auszuschalten, fiel mir auf, dass LED 2+5, und
1+3
immer gleichzeitig angehen, obwohl ich nur eine anschalte. Das liegt
vermutlich an den PINs ( B2 zbd C2, C1 und B1).
Hat jemand eine Lösung hierfür?
Könntet ihr mir ein Beispiel geben, wie ich mit dem Taster zum Beispiel
"BIT_1" anschalte, wenn der Taster gedrückt wird? Ich habe schon
gegoogelt, aber leider nichts passendes gefunden.
Hallo Dieter,
wo ist den Dein Code ?
Taster werden i.A. mit einem Pullup nach Vcc-Pin von Pin nach GND
geschaltet und müssen entprellt werden.
Daraus wird dann eine Zustandsänderung a) oder b) abgeleitet.
Also a) OFFEN --> GESCHLOSSEN und b) GESCHLOSSEN --> OFFEN
Damit kann man dann einfach arbeiten.
Hallo Dieter,
hast Du die Sätze nach der Frage "wo dein Code sei" gelesen ?
Und verstehst die meine Absichten ?
Sie sind zielführend Zu Deiner Fragestellung.
Insbesondere nach der Beschaltung des Taster ?
Was auch zielführend ist, ist sich erst mal EINEM Taster und EINER Led
zu wiedmen. Nicht gleich alle 8 auf einmal.
Und nein, beim Mega8 gibt es da keine Querverbindung zwischen den Pins.
Mach dein Programm nicht so kompliziert fürs erste. Ein simples
1
intmain()
2
{
3
DDRDRegisterrichtigsetzen
4
PullupfürdieTastereinschalten(fallsnowendig)
5
6
while(1){
7
8
if(Tastergedrückt)
9
Ledeinschalten
10
else
11
Ledausschatlen
12
13
}
14
}
reicht völlig aus. Du muss da aus dieser Aufgabe erst mal nicht mehr
machen.
Für die Operationen 'Taster gedrückt' bzw. 'Led einschalten' bzw- 'Led
ausschalten' musst du auch nicht künsteln, sondern du benutzt ganz
einfach erst mal direkt die Bitoperationen.
Wenn du einen Umschalter programmieren willst, als das die LED mit jedem
Tastendruck zwischen an und aus wechselt - heb dir das noch für später
auf. Denn diese Aufgabenstellung ist nicht so simpel, wie es zunächst
scheint. Da spielt nämlich noch eine Zutat mit, die dir den Tag versauen
kann: Taster prellen.
Danke Karl Heinz.
Was mucss ich für "Schalter gedrückt etc" einsetzen?
wenn ich LED 1 einschalte:
turnLedOn(BIT_1,1);
turnLedOn(BIT_2,0);
turnLedOn(BIT_3,0);
turnLedOn(BIT_4,0);
turnLedOn(BIT_5,0);
turnLedOn(BIT_6,0);
turnLedOn(BIT_7,0);
Schaltet sich LED 3 automatisch mit an, nachdem ich "return"
rausgenommen habe, ansonsten lässt sich LED 3 ja nicht anschalten
Dieter schrieb:> Danke Karl Heinz.> Was mucss ich für "Schalter gedrückt etc" einsetzen?
Dazu brauchst du die
Bitoperationen
Ehrlich und wirklich. Die sind wichtig! Die sind sozusagen das kleine
Einmaleins in der µC Programmierung, die du im Schlaf beherrschen musst.
> wenn ich LED 1 einschalte:> turnLedOn(BIT_1,1);
BItte vergiss diese Funktion. Das bringt dich alles nicht weiter,
solange du die Bitoperationen nicht im kleinen Finger hast.
Bit auf 1 setzen
1
register|=(1<<Bitnummer);
Bit auf 0 setzen (löschen)
1
register&=~(1<<Bitnummer);
Bit an einem Eingang testen, ob es 1 ist
1
if(register&(1<<Bitnummer))
Bit an einem Eingang testen, ob es 0 ist
1
if(!(register&(1<<Bitnummer)))
und damit baust du dein Programm neu auf. Wirf diese turnOnLed Funktion
weg. Ganz weit weg. Speziell dann, wenn du Anfänger bist. Es gibt
Grundlagen, die müssen sitzen, sonst ist alles andere sinnlos. Der
sichere Umgang mit den Bitoperationen gehört dazu. Für die 3
Codezeilen in der Hauptschleife brauchst du wirklich keine eignene
Funktionen. Das geht locker alles noch so. Und - ganz wichtig - du
kriegst Übung.