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.
1 | #define F_CPU 8000000UL |
2 | #include <avr/io.h> |
3 | #include <util/delay.h> |
4 | #include <inttypes.h> |
5 | |
6 | #define BIT_1 (1 << PC1) |
7 | #define BIT_2 (1 << PB2) |
8 | #define BIT_3 (1 << PB1) |
9 | #define BIT_4 (1 << PC3) |
10 | #define BIT_5 (1 << PC2) |
11 | #define BIT_6 (1 << PC4) |
12 | #define BIT_7 (1 << PC5) |
13 | #define BIT_SWITCH (1<<PB0) |
14 | |
15 | void turnLedOn(uint8_t led,uint8_t on); |
16 | uint8_t switchPressed(uint8_t Switch); |
17 | |
18 | int main(void){ |
19 | |
20 | DDRB = BIT_3 | BIT_2; |
21 | DDRC = BIT_1 | BIT_4 | BIT_5 | BIT_6 | BIT_7; |
22 | |
23 | |
24 | |
25 | while(1){ |
26 | |
27 | |
28 | |
29 | |
30 | |
31 | |
32 | |
33 | |
34 | if(switchPressed(BIT_SWITCH)==1){ |
35 | if (PINB&(1<<PINB0)){ |
36 | turnLedOn(BIT_6,1); |
37 | } |
38 | else { |
39 | turnLedOn(BIT_7,1); |
40 | |
41 | } |
42 | } |
43 | |
44 | |
45 | |
46 | |
47 | |
48 | turnLedOn(BIT_1,0); |
49 | turnLedOn(BIT_2,0); |
50 | turnLedOn(BIT_3,0); |
51 | turnLedOn(BIT_4,0); |
52 | turnLedOn(BIT_5,0); |
53 | turnLedOn(BIT_6,0); |
54 | turnLedOn(BIT_7,0); |
55 | |
56 | |
57 | } |
58 | } |
59 | |
60 | void turnLedOn(uint8_t led,uint8_t on){ |
61 | |
62 | if(led==BIT_1 || led==BIT_4 || led==BIT_5 || led==BIT_6 || led==BIT_7){ |
63 | if(on==1){ |
64 | PORTC &= ~led; |
65 | }else{ |
66 | PORTC |= led; |
67 | |
68 | } |
69 | return; |
70 | } |
71 | |
72 | if(led==BIT_2 || led==BIT_3){ |
73 | if(on==1){ |
74 | PORTB &= ~led; |
75 | }else{ |
76 | PORTB |= led; |
77 | } |
78 | } |
79 | } |
80 | |
81 | uint8_t switchPressed(uint8_t Switch){ |
82 | |
83 | if(PINB & Switch){ |
84 | return 0; |
85 | }else{ |
86 | return 1; |
87 | } |
88 | } |
Der Taster funktioniert nicht, das LED Problem besteht noch
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 | int main() |
2 | {
|
3 | DDRD Register richtig setzen |
4 | Pullup für die Taster einschalten (falls nowendig) |
5 | |
6 | while( 1 ) { |
7 | |
8 | if( Taster gedrückt ) |
9 | Led einschalten |
10 | else
|
11 | Led ausschatlen |
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.
:
Bearbeitet durch User
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.
:
Bearbeitet durch User
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.