Hallo,
Ich habe folgendes Problem Bei dem Folgenden Programm wird die Schleife
in der Main-Funktion nicht ausgeführt bzw. er mach einfach "gar
nichts"(zumindest in der Simulation mit AVR-Studio) bis der Timer
-Interrupt wieder Ausgeführt wird.
Das Programm soll eigentlich PWM für eine RGB-LED machen( was auch
funktioniert ) nur er arbeitet den Inhalt der Schleife im main einfach
nicht ab. Diese wird anscheinen irgendwie "wegoptimiert" o.Ä. obwohl sie
etwas tut.
Ich benutze AVR-Studio 4.18 und WinAVR-20100110
Hier das gesamte Programm:
1 |
|
2 |
|
3 | #define F_CPU 8000000
|
4 |
|
5 | #include <avr/io.h>
|
6 | #include <stdint.h>
|
7 | #include <util/delay.h>
|
8 | #include <avr/interrupt.h>
|
9 |
|
10 | int red= 30;
|
11 | int green=0;
|
12 | int blue=0;
|
13 |
|
14 | int counter=0;
|
15 |
|
16 |
|
17 |
|
18 | void init(void){
|
19 | TCCR0= (1<<CS01) |(1<<CS00);
|
20 | TIMSK |= (1<<TOIE0);
|
21 | DDRC=0b00000111;
|
22 | sei();
|
23 | }
|
24 |
|
25 | void pwm_func(void){
|
26 | int pattern;
|
27 | counter ++;
|
28 | pattern = 0b00000111;
|
29 |
|
30 | if(counter>red){
|
31 | pattern&=~ (1<<0);
|
32 | }
|
33 | if(counter>green){
|
34 | pattern&=~ (1<<1);
|
35 | }
|
36 | if(counter>blue){
|
37 | pattern&=~ (1<<2);
|
38 | }
|
39 | if(counter==255){
|
40 | counter=0;
|
41 | }
|
42 | PORTC= pattern;
|
43 |
|
44 | }
|
45 |
|
46 |
|
47 |
|
48 | int main(void){
|
49 |
|
50 | /* PC0 rot PC1 gruen PC2 blau */
|
51 | init();
|
52 | red=202;
|
53 | while(1){
|
54 | green=200; // wird nicht ausgefuehrt
|
55 | DDRC=0XFF; //wir nur ein mal ausgefuehrt
|
56 | red=200; // wird nicht ausgefuehrt
|
57 | }
|
58 | }
|
59 |
|
60 |
|
61 | ISR (TIMER0_OVF_vect){
|
62 | pwm_func();
|
63 | }
|
Als Anhang noch der Inhalt des Disassemblers
Wäre dankbar wenn jemand weiß woher dieses Verhalten stammt.
MfG