Guten Abend,
Ich bin dabei mir eine Software PWM zu bauen.
Beim herumprobieren bin ich auf einen (mir unerklärlichen) Fehler
gestoßen.
Und zwar wird _delay_ms(1000); in der main Funtkion nicht ausgeführt.
Bzw bleibt der µC hier hängen!?
Hier der Code:
1 | #define F_CPU 16000000UL
|
2 | #define PWMPORT PORTB
|
3 | #define PWMDDR DDRB
|
4 |
|
5 | #include <avr/io.h>
|
6 | #include <util/delay.h>
|
7 | #include <avr/interrupt.h>
|
8 |
|
9 | unsigned volatile int pwmMaxWert = 100;
|
10 | unsigned int aktuellerStand = 0;
|
11 | unsigned volatile int sollWert[] = {0, 0, 0, 0};
|
12 |
|
13 | void init()
|
14 | {
|
15 | PWMDDR = 0xFF;
|
16 | }
|
17 |
|
18 | void timerInit()
|
19 | {
|
20 | TCCR0 |= (1<<CS00); /*Prescaler 0*/
|
21 | TIMSK |= (1<<TOIE0); /*Gibt das Timer0 Overflow Interrupt frei (inkl. Routine)*/
|
22 | sei(); /*enabled allgemeine Interrupts*/
|
23 | }
|
24 |
|
25 | ISR(TIMER0_OVF_vect)
|
26 | {
|
27 | for (int i = 0; i < 4; i++)
|
28 | {
|
29 | if (aktuellerStand < sollWert[i])
|
30 | PWMPORT |= (1<<i);
|
31 | if (aktuellerStand > sollWert[i])
|
32 | PWMPORT &= ~(1<<i);
|
33 | if (aktuellerStand > pwmMaxWert)
|
34 | aktuellerStand = 0;
|
35 | }
|
36 | aktuellerStand++;
|
37 | }
|
38 |
|
39 | int main(void)
|
40 | {
|
41 | init();
|
42 | timerInit();
|
43 |
|
44 | while(1)
|
45 | {
|
46 | _delay_ms(1000);
|
47 | sollWert[0] = 100;
|
48 | sollWert[1] = 0;
|
49 | sollWert[2] = 100;
|
50 | sollWert[3] = 0;
|
51 | }
|
52 | }
|
Die Hardware passt, wenn ich ein einfaches Programm schreib welches mir
nacheinander die Ports setzt, dann funktioniert alles.