Ich habe ein Problem mit einer Software PWM für bisher eine LED ich weiß allerdings nicht woher der Fehler kommt. Der fehler ist die LED sollte ein und aus faden, was im groben auch geht allerdings leuchtet sie nicht wirklich regelmäßig sondern es mischen sich immer mal wieder Fehler ein. D.h die LED wir dunkler und plötzlich ist sie nochmal kurz wieder heller und dann wird sie wieder normal dunkler Der Code ist leider kaum ausdokumentiert da ich noch am testen bin. Ziel sollen später mal 6 variable Fade in und Fade out Kanäle für LED´s werden. Dafür müsste aber erst mal ein simpler Kanal gehen =) Hardware ist STK 500 LED´s an PORTB momentan nur eine. Code ist hier die timer2.h
1 | volatile uint16_t PWM_timer = 0; |
2 | volatile uint16_t msec8 = 0; |
3 | volatile uint8_t Prescale = 0; |
4 | void Timer_Init(void); |
5 | |
6 | void Timer_Init(void) |
7 | {
|
8 | TCCR0 |= (1<<CS00); |
9 | TIMSK |= (1<<TOIE0); |
10 | DDRB = 0xff; |
11 | }
|
12 | |
13 | ISR(TIMER0_OVF_vect) |
14 | {
|
15 | cli(); |
16 | PWM_timer++; //Timer für PWM-Frequenz |
17 | Prescale++; |
18 | if(Prescale==250) //Bei 8Mhz:256 :250 = 8ms rest |
19 | {
|
20 | Prescale=0; |
21 | msec8++; //Alle 8ms +1 maximalwert = 8,738 min |
22 | }
|
23 | if(PWM_timer==401) PWM_timer=0; |
24 | sei(); |
25 | }
|
Der Hauptcode ist der hier :
1 | #include <avr/io.h> |
2 | #include <stdint.h> |
3 | #include <avr/interrupt.h> |
4 | #include "timer2.h" |
5 | #define FOSC 8000000// Clock Speed
|
6 | |
7 | void fade(void); |
8 | |
9 | volatile uint16_t wert =0; |
10 | volatile uint8_t wert1 =0; |
11 | volatile uint8_t temp =0; |
12 | |
13 | int main(void) |
14 | {
|
15 | |
16 | Timer_Init(); |
17 | sei(); |
18 | while(1) |
19 | {
|
20 | |
21 | if(msec8==1) |
22 | {
|
23 | fade(); |
24 | msec8=0; |
25 | }
|
26 | |
27 | |
28 | if((PWM_timer==0)&(wert!=0)) |
29 | {
|
30 | PORTB= 0b11111110; |
31 | }
|
32 | else if(PWM_timer == wert) |
33 | {
|
34 | PORTB= 0b11111111; |
35 | }
|
36 | }
|
37 | }
|
38 | |
39 | |
40 | void fade(void) |
41 | {
|
42 | if(temp==0) |
43 | {
|
44 | wert1++; |
45 | wert=(wert1 * wert1); |
46 | if(wert==400) |
47 | {
|
48 | temp++; |
49 | }
|
50 | }
|
51 | else
|
52 | {
|
53 | wert1--; |
54 | wert=(wert1 * wert1); |
55 | if(wert==0) |
56 | {
|
57 | temp--; |
58 | }
|
59 | }
|
60 | }
|
Ich hoffe mir kann einer sagen was ich da für nen Fehler hab muss ja irgendwas dummes sein oder aber ich bin blind und bilde mir das komische Blinken nur ein. Ach der Atmega läuft mit internem Takt auf 8Mhz und ist ein normaler also keine "light" version. Gruß Andreas