Hallo,
ich hab ein Problem mit folgendem Programm, ich weiß nicht wirklich was
da falsch läuft. Schaltung ist diegleiche wie aus dem Thread
Beitrag "pnp schaltet nicht richtig ab?".
1 | #ifndef F_CPU
|
2 | #define F_CPU 3686400
|
3 | #endif
|
4 |
|
5 | #include <avr/io.h>
|
6 | #include <stdint.h>
|
7 | #include <avr/interrupt.h>
|
8 |
|
9 | uint8_t interrupt_flag = 0;
|
10 | uint8_t n_digit = 0;
|
11 |
|
12 |
|
13 |
|
14 | void ef_out(uint8_t digit)
|
15 | {
|
16 | switch (digit)
|
17 | {
|
18 | case 0:
|
19 | PORTD = 0xFF; // Alle digits aus
|
20 | PORTB = 0xC6; // "E" an Port B anlegen
|
21 | PORTD = 0xFE; // Digit 0 an
|
22 | break;
|
23 |
|
24 | case 1:
|
25 | PORTD = 0xFF; // Alle digits aus
|
26 | PORTB = 0xCE; // "F" an Port B anlegen
|
27 | PORTD = 0xFD; // Digit 1 an
|
28 | break;
|
29 |
|
30 | case 2:
|
31 | PORTD = 0xFF; // Alle digits aus
|
32 | PORTB = 0xFF; // Alle Segmente aus
|
33 | PORTD = 0xFB; // Digit 2 an
|
34 | break;
|
35 | }
|
36 | }
|
37 |
|
38 | int main(void)
|
39 | {
|
40 | DDRB = 0xFF; // Port B Ausgang
|
41 | DDRD = 0xFF; // Port D Ausgang
|
42 |
|
43 | TCCR0 = 0x03; // Timer 0 normal mode, prescaler 64
|
44 |
|
45 | TIMSK = (1<<TOIE0); // Overflow Interrupt aktivieren
|
46 |
|
47 |
|
48 | sei(); // Interrupts global aktivieren
|
49 |
|
50 | while (1)
|
51 | {
|
52 | if (interrupt_flag)
|
53 | {
|
54 | ef_out(n_digit);
|
55 |
|
56 | n_digit++;
|
57 | if (n_digit > 2)
|
58 | n_digit = 0;
|
59 |
|
60 | interrupt_flag = 0;
|
61 | }
|
62 | }
|
63 |
|
64 | return 0;
|
65 | }
|
66 |
|
67 | ISR(TIMER0_OVF_vect) // ISR für Timer0 Overflow
|
68 | {
|
69 | interrupt_flag = 1;
|
70 | }
|
In dem anderen Thread hatte ich ja schon ein lauffähiges Programm,
welches ne Variable hochzählt und ausgibt, deswegen versteh ich nicht,
warum diese einfachere Version auf einmal nicht funktioniert.
Ich will einfach nur auf der ersten Anzeige ein "E" ausgeben und auf der
zweiten ein "F", die dritte soll einfach "aus" sein.
Wenn ich das jetzt simuliere, springt das Programm nach der Abfrage des
interrupt_flags direkt in die ISR und kommt dort scheinbar nicht mehr
raus, d.h. sobald die ISR beendet wird springt das Programm sofort
wieder rein.
Ich kann mir das nicht erklären, weiß jemand von euch was da los ist?