hallo, ich habe ein kleines (Anfänger)Problem bei der Programmierung und zwar möcht ich eine LED blinken (an PC5 angeschlossen) blinken lassen. Das funktioniert auch. Danach hab ich einen Schalter eingelötet (Active High) an PB0. Die LED soll jetzt nur blinken wenn der Schalter gedrückt wird. Mein Code: /*enable PC5 as output*/ DDRC|= _BV(PC5); /* enable PB0 as input*/ DDRC &= ~_BV(PB0); /*while (PINB & (1<<0)) */ (hier leuchtet die LED IMMER) while (PINB0!=_BV(PB0)) (hier blinkt sie IMMER) { Blinkroutine (funktioniert) } Find mich in der Syntax noch nicht so ganz zu recht. Wo liegt denn da wohl der Fehler?!
Falschen Port erwischt: DDRC &= ~_BV(PB0); ist aber nur ein Problem, wenn woanders PB= als Output definiert wird. Und while (PINB0!=_BV(PB0)) ist nichts anderes als while (0 != 1) Während while (PINB & (1<<0)) durchaus ok aussieht. Kann man auch schöner als while (PINB & _BV(PB0)) schreiben, ändert aber nichts.
Der Fehler in deinem Code ist, dass du in der ersten Version die Hauptschleife verlässt, wenn der Schalter nicht gedrückt ist. In deiner zweiten Version vergleichst du den ganzen Port B mit einem Wert, was auch nicht richtig funktioniert.
1 | main() |
2 | {
|
3 | DDRC |= (1<<PC5); |
4 | unsigned int i; |
5 | while(1) |
6 | {
|
7 | if(PINB & (1<<PB0) |
8 | {
|
9 | if(i < 64000) |
10 | {
|
11 | i++; |
12 | }
|
13 | else
|
14 | {
|
15 | i = 0; |
16 | PORTC ^= (1<<PC5); //PC5 mit xor umschalten |
17 | }
|
18 | }
|
19 | else
|
20 | {
|
21 | PORTC &= ~(1<<PC5); |
22 | }
|
23 | }
|
24 | }
|
Der Code ist nicht getestet, müsste aber funktionieren.
@A.K.: Die Hauptschleife eines µC-Programmes muss immer eine Endlosschleife sein, also while(1), weil sonst der Programcounter immer weiter läuft, in andere Funktionen springt und der Controler deshalb nicht mehr das macht, was er eigentlich soll.
stimmt, hatte echt den falschen Port erwischt, aber habe jetzt immernoch das Verhalten das die Lampe dauerhaft leuchtet, egal ob ich Taster drücke oder nicht... Habe mal die Spannung an Pin 14 gemessen. Ist 0 V bzw 5,0 V wenn gedrückt, es scheint also an der software zu liegen. Code: /* INITIALIZE */ /* enable PC5 as output */ DDRC|= _BV(PC5); /* enable PB0 as input*/ DDRB &= ~_BV(PB0); /* BLINKEN */ while (PINB & _BV(PB0)) { "Blinken" } Hat zumindest jemand eine Idee wie ich weiter testen sollte? Ich weiß leider nichts...
oh, hatte den neuen Post noch nicht gesehn. Danke für den Tipp, das mit while(1) hört sich logisch an, test ich gleich mal...
@F01Qx: Klar muss da eine Schleife rein. Aber muss man die unbedingt als while (PINB0!=_BV(PB0)) formulieren? Zumal das eigentlich als while(1) { if (...) { ... }} gedacht war.
super, jetzt läuft es, lag wirklich nur an der Endloßschleife. Hab ich das eigentlich bei allen Faq überlesen, oder wird das höchstens nebenbei erwähnt?!
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.