Du hast nicht verstanden, wie man Schleifen mit do und while
programmiert.
Die einzige Schleife in deinem Programm ist dies:
1 | do
|
2 | {
|
3 | PORTC = 0;
|
4 | }
|
5 | while(!(PINB & (0x01)));
|
Hier wird der ganze Port C auf Low geschaltet. Und wenn danach PB1=Low
ist, dann wird das solange wiederholt, bis PB1 nicht mehr Low ist.
Danach (also wenn PB1 nicht mehr Low ist) wir der nächste Block
ausgeführt:
1 | {
|
2 | PORTC = 0x01;
|
3 | _delay_ms(500);
|
4 | PORTC = 0x02;
|
5 | _delay_ms(500);
|
6 | PORTC = 0x04;
|
7 | _delay_ms(500);
|
8 | }
|
9 | return 0;
|
Das ist der Teil, wo die Klammern nichts Sinnvolles bewirken. Also
nachdem der Taster losgelassen wird, gehen deine drei LED's nacheinander
an. Zum Schluss bleibt PC2 an und das Programm ende mit return 0.
Prinzipiell dürfen Mikrocontroller Programme niemals enden, denn dies
würde Frage aufwerfen, was er denn danach machen soll. Beim AVR fügt der
Compiler automatisch eine leere Endlosschleife am Ende des Programmes
sein, damit es bei solchen Fehlern wenigstens nicht abstürzt.
In deinem Fall scheint es sinnvoll, dass das Programm sich nach dem LED
geblinke wiederholt, so dass es auf den nächsten Tastendruck wartet.
Also brauchst du zwei verschachtelte Schleifen. VIA hat es schon korrekt
geschrieben:
1 | int main()
|
2 | {
|
3 | initialisierung;
|
4 |
|
5 | while (1) // Wiederhole endlos oft
|
6 | {
|
7 |
|
8 | while (taste nicht gedrückt)
|
9 | {
|
10 | ; // tu nichts, leere Warteschleife
|
11 | }
|
12 |
|
13 | lasse die LED's blinken
|
14 |
|
15 | }
|
16 | }
|
Gewöhne Dir ganz schnell an, den Code richtig einzurücken und Leerzeilen
sinngemäß zu setzen. Dann ist der fehler nämlich offensichtich.
Hier nochmal dein ganzes fehlerhaftes Programm, jedoch mit korrekter
Formatierung:
1 | #define F_CPU 3686400
|
2 | #include <avr/io.h>
|
3 | #include <util/delay.h>
|
4 |
|
5 | int main()
|
6 | {
|
7 |
|
8 | DDRB=0x00; //PortB Eingänge
|
9 | DDRC=0xFF; //PortC Ausgänge
|
10 | PORTB=0xFF; //Pullup
|
11 |
|
12 | do
|
13 | {
|
14 | PORTC = 0;
|
15 | }
|
16 | while(!(PINB & (0x01))); // Wiederhole, solange TasterEin gedrückt
|
17 |
|
18 | // Wenn Taster nicht mehr gedrückt:
|
19 | {
|
20 | PORTC = 0x01;
|
21 | _delay_ms(500);
|
22 | PORTC = 0x02;
|
23 | _delay_ms(500);
|
24 | PORTC = 0x04;
|
25 | _delay_ms(500);
|
26 | }
|
27 |
|
28 | return 0;
|
29 | }
|
Ist der Fehler jetzt klar?