Hi,
mittlerweile bin ich am verzweifeln da nicht einmal mehr das einfachste
Funktioniert.
Was soll es werden ? Ansteuerung einer RGB Led mit ATTINY, 3 Taster zur
Steuerung.
Es gibt sicher bessere Wege eine PWM zu bauen aber nach 5 Stunden
kopfzerbrechen und Umbauen ist nun das untenstehende bei herausgekommen.
Das Problem:
nachdem ich die meldung "Location not Valid" beim debuggen bekam bei der
Variable "pwmchan0" wurde ich hier im Forum fündig das es wohl an der
optimierung liegt. Nun gut ich verwende die Variable zwar aber eine
deklaration als volatile hat so gesehen geholfen.
Der Vergleich
1 | if(global_pwm >= pwmchan0)
|
wird nicht ausgeführt obwohl im debug nun beide variablen angezeigt
werden und global_pwm nach dem 10. überlauf von Timer0 grösser ist. Die
Anweisung wird einfach ignoriert.
Versucht habe ich das ganze schon auf mehreren Optimierungsstufen und es
ist überall dasselbe problem.
1 | #include <avr/io.h>
|
2 | #include <util/delay.h>
|
3 | #include <stdint.h>
|
4 | #include <avr/interrupt.h>
|
5 | #include <inttypes.h>
|
6 |
|
7 | uint8_t global_pwm = 0;
|
8 |
|
9 | ISR(TIM0_OVF_vect)
|
10 | {
|
11 |
|
12 | global_pwm++;
|
13 | if(global_pwm >= 256)
|
14 | {
|
15 | global_pwm = 0;
|
16 | }
|
17 |
|
18 | }
|
19 |
|
20 | int main(void)
|
21 | {
|
22 | volatile uint8_t pwmchan0 = 10;
|
23 |
|
24 | DDRB = 0x00;
|
25 | DDRB = 0b00000111;
|
26 |
|
27 | //Timer setzten TCCR0B
|
28 | TCCR0B = 0b000001;
|
29 | TIMSK0 |= (1 << TOIE0);
|
30 |
|
31 | sei();
|
32 | while(1)
|
33 | {
|
34 | if(global_pwm >= pwmchan0)
|
35 | {
|
36 | PORTB &= (1 << PORTB0);
|
37 | }
|
38 | else
|
39 | {
|
40 | PORTB |= (1 << PORTB0);
|
41 | }
|
42 |
|
43 | }
|
44 | return 0;
|
45 | }
|
Wenn mir da jemand helfen kann wär ich echt dankbar !
Gruß