Hi! Bin nach wie vor Anfänger und hab eine kurze Frage: Ich hab vor, die Blinker von meinem Motorrad mit Tastern ein- und auszuschalten (mit ATTiny 2313). Das Blinken hab ich noch nicht drin. Einschalten der Blinker über die jeweiligen Richtungstasten (hier Eingang PB0 und PB1). Ausschalten über einen Tastendruck einer beliebigen Taste (von den 2). Ich hab 4 Zustände abgefragt (Blinker ein: Taste drücken, Taste loslassen, Blinker aus: Wieder Taste drücken, Taste loslassen) Problem: Einschalten geht mit beiden Tastern wie erwartet, aber ausschalten kann ich nur über den Eingang PB0. Warum? Danke!! #include <avr/io.h> volatile int i=0; int main (void){ DDRB=0x00; PORTB=0xfc; DDRD=0xff; PORTD=0x00; while(1){ if (i==0){ //BLINKER EIN if (PINB & (1<<PB0)){ PORTD |= (1<<DDD0); i=1; } if (PINB & (1<<PB1)){ PORTD |= (1<<DDD1); i=1; } } if ((i==1)&(!(PINB&0x03))){//Taster los1 i=2; } if ((i==2)&(PINB&0x03)){//BLINKER AUS PORTD &= ~((1<<PD0)|(1<<PD1)); i=3; } if ((i==3)&(!(PINB&0x03))){//Taster los2 i=0; } } }
Mach es doch mal hübsch, und ein paar Kommentare dazu. So z.B.:
1 | #include <avr/io.h> |
2 | |
3 | volatile int i=0; |
4 | |
5 | int main (void) |
6 | {
|
7 | DDRB=0x00; |
8 | PORTB=0xfc; // Keine Pullups an den beiden Eingängen |
9 | DDRD=0xff; |
10 | PORTD=0x00; // Blinker anfangs aus |
11 | while(1) |
12 | {
|
13 | if (i==0) // Blinker ist aus |
14 | { // Prüfe auf BLINKER EIN |
15 | if (PINB & (1<<PB0)) // Taste links gedrückt |
16 | {
|
17 | PORTD |= (1<<DDD0); // Linken Blinker an |
18 | i=1; // An-Flag setzen |
19 | }
|
20 | |
21 | if (PINB & (1<<PB1)) // Taste rechts gedrückt |
22 | {
|
23 | PORTD |= (1<<DDD1); // Rechten blinker (auch!) an |
24 | i=1; |
25 | }
|
26 | }
|
27 | |
28 | // Wenn Ein Blinker an ist, und keine Blinker-Taste gedrückt ist,
|
29 | // setze i = 2
|
30 | // if ((i==1) & (!(PINB&0x03))) // Resultat abhängig von Compiler
|
31 | // (TRUE immer gleicher Zahlenwert?)
|
32 | // Besser:
|
33 | if ((i==1) && (!(PINB&0x03))) |
34 | { //Taster los1 |
35 | i=2; |
36 | }
|
37 | |
38 | // Wenn i == 2 ist (Blinker ist an, und alle Tasten wurden schon
|
39 | // wieder losgelassen) und wenn keine Taste mehr gedrückt ist,
|
40 | // dann Schalte Blinker wieder aus und setze i = 3.
|
41 | // if ((i==2) & (PINB&0x03)) // Siehe oben
|
42 | if ((i==2) && (PINB&0x03)) |
43 | {//BLINKER AUS |
44 | PORTD &= ~((1<<PD0)|(1<<PD1)); |
45 | i=3; |
46 | }
|
47 | |
48 | // Wenn i == 3 ist, und keine Taste gedrückt ist,
|
49 | // wurde der Blinker ausgeschaltet, und es geht wieder von vorne los
|
50 | // if ((i==3) & (!(PINB&0x03))) // Siehe oben
|
51 | if ((i==3) && (!(PINB&0x03))) |
52 | {//Taster los2 |
53 | i=0; |
54 | }
|
55 | }
|
56 | }
|
Was passiert, wenn Du die Änderungen bezüglich & und && übernimmst?
DANKE DANKE, jetzt gehts. Das && wars wirklich! Ich hab mich nach der AVR-GCC Anleitung gehalten, aber da hab ich über && nichts gelesen (ansonsten toll verständlich).
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.