Hallo! Hier der Coder der Probleme macht (Debugger von AVR Studio 4.18SP2):
1 | #include <avr/io.h> |
2 | #include <util/delay.h> |
3 | #include <avr/interrupt.h> |
4 | |
5 | #ifndef F_CPU
|
6 | #define F_CPU 4000000UL
|
7 | #endif
|
8 | |
9 | volatile short status = 0; |
10 | |
11 | ISR(TIMER0_OVF_vect) |
12 | {
|
13 | status = 0; |
14 | //PORTB |= (1 << PB2);
|
15 | }
|
16 | |
17 | int main (void) |
18 | {
|
19 | DDRB = (1 << PB0) | (1 << PB1) | (1 << PB2); |
20 | //PORTB |= (1 << PB2); // Q1
|
21 | sei(); |
22 | |
23 | // Q2: better usse interrupt?
|
24 | while(1) |
25 | {
|
26 | while((PINB && (1 << PB3)) || (PINB && (1 << PB4))) |
27 | {
|
28 | if(PINB && (1 << PB3)) |
29 | {
|
30 | if(status == 0) |
31 | {
|
32 | status = 1; |
33 | //PORTB |= (0 << PB2);
|
34 | PORTB = PINB ^ (1 << PB0); |
35 | _delay_ms(2); |
36 | PORTB = PINB ^ (1 << PB0); |
37 | }
|
38 | else
|
39 | {
|
40 | status = 0; |
41 | //PORTB |= (1 << PB2);
|
42 | PORTB = PINB ^ (1 << PB1); |
43 | _delay_ms(2); |
44 | PORTB = PINB ^ (1 << PB1); |
45 | }
|
46 | }
|
47 | else // Q3: never reached |
48 | {
|
49 | status = 0; |
50 | //PORTB |= (1 << PB2);
|
51 | }
|
52 | }
|
53 | }
|
54 | |
55 | cil(); |
56 | return 0; |
57 | }
|
Frage 1: Mehrere Stellen (z.B. Stelle mit Q1) im Code mit "PORTB |= ..." sind auskommentiert. Das Programm macht mit diesen Kommentaren fast (vgl. Frage 3) was es soll. Sobald ich diese Kommentare entferne um mir den Wert von status auf PB2 anzeigen zu lassen wird das so itnerpretiert als ob PB3 die ganze Zeit high wäre. a) Wieso kommt es zu diesem sonderbaren Verhalten? b) Kann ich die Variable status nicht irgendwie ganz in PB2 auslagern und wie kann ich dann PB2 abfragen? Frage 2: Die Abfrage von PB3 und PB4 befinden sich in der main-Loop innerhalb einer while-Schleife (vgl. Stelle mit Q2). Wäre es besser die Abfrage dieser Taster mit Interrupts zu lösen? Frage 3: An der Stelle Q3 sollte durch Drücken des Tasters an PB4 die Variable status zurückgesetzt werden, nur wird diese Stelle nie erreicht. Wenn PB4 high ist, verhält sich das Programm genauso wie wenn PB3 high ist. Warum ist das so und was mache ich da falsch? Das ist mein erstes AVR-GCC-Projekt und vielleicht kann mir der eine oder andere hier helfen um klarer zu sehen. Peter