Hi, ich hab ein kleines Problem, vielleicht könnt ihr mir helfen... Ich hab nen Zähler und gehe nach nem Compare Match ein Element im Array weiter, dessen Wert beim nächsten Durchlauf als Compare-Zahl dient. Resultat: Wenn ich gleichzeitig überprüfe, ob ein Element im Array erreicht wurde, wird ( werden ) LEDs gelöscht. Somit habe ich einen relativ effektiven Dimmer. Klappt auch alles soweit, bis auf eine Sache: Wenn ich alle LEDs dimmen möchte ( siehe Quellcode ), klappt es nicht. Nach Prüfen ist mir aufgefallen, dass es passiert, wenn ich den Schritt davor alle LEDs ausschalte und im erwähnten Schritt mehr als 3 einschalte. Das komische ist außerdem Folgendes: Wenn ich eine immer an lasse, kann ich die 7 restlichen im Port problemlos dimmen. Woran liegt das?
1 | #include <avr/io.h> |
2 | #include <avr/interrupt.h> |
3 | |
4 | int steps[] = { 1,4,6,9,11,13,16,19,21,23,26,28,31,33,36,38,41,43,45,48,51,52,56,58,60,63,65,68,70,72,75,78,80,82,85,87,90,93,94,97,100,102,105,107,109,112,115,117,119,122,124,127,129,132,134,136,139,142,144,146,149,151,154,156,159,161,164,166,168,171,174,176,178,181,183,186,188,191,193,196,198,201,203,205,208,210,213,215,218,220,223,225,228,230,232,235,238,240,242,245,247,250,252,255,257,260,262,264,267,270,271,275,277,279,282,284,287,289,291,294,297,299,301,304,306,309,311,314,316,319,321,324,326,328,331,334,335,339,341,343,346,348,350,353,356,358,360,363,366,368,370,373,375,378,380,382,386,387,390,393,395,397,400,402,405,407,410,412,414,418,419,422,425,426,430,432,434,437,439,442,444,446,449,452,454,456,459,462,463,467,468,472,473,476,479,481,484,486,488,491,493,496,498,501,503,506,508,511,513,515,518,520,523,526,527,531,532,536,537,540,543,545,547,550,553,555,557,560,562,565,567,569,573,574,577,580,581,585,587,589,592,594,597,599,602,604,606,609,612,614,616,619,621,624,626 }; |
5 | |
6 | int cstep = 0; |
7 | int tep = 0; |
8 | char plus = 1; |
9 | |
10 | int main (void) { |
11 | |
12 | DDRA = 0xff; |
13 | //TCCR1A = (1<<WGM11)|(1<<WGM10);
|
14 | |
15 | //no prescaler and reset on compare on match
|
16 | TCCR1B = (1<<CS10)|(1<<WGM12); |
17 | OCR1A = steps[cstep]; |
18 | TCNT1 = 0; |
19 | |
20 | //enable interrupt
|
21 | TIMSK = (1<<OCIE1A); |
22 | |
23 | sei(); |
24 | |
25 | while(1) { |
26 | if ( tep > 255 ) |
27 | plus = -1; |
28 | else if ( tep < 0 ) |
29 | plus = 1; |
30 | tep += plus; |
31 | int i,j,k; |
32 | for ( i = 0; i < 80; i++ ) |
33 | for ( j = 0; j < 100; j++ )i = i; |
34 | |
35 | }
|
36 | return 0; |
37 | }
|
38 | |
39 | ISR( TIMER1_COMPA_vect ){ |
40 | |
41 | OCR1A = steps[++cstep]; |
42 | |
43 | if ( cstep >= tep && PINA != 0 ) |
44 | PORTA = 0; |
45 | |
46 | //Schreib ich hier PORTA = 1; klappt es...
|
47 | if ( cstep == 1 ) |
48 | PORTA = 255; |
49 | |
50 | if ( cstep > 254 ) |
51 | cstep = 0; |
52 | |
53 | TCNT1 = 0; |
54 | return; |
55 | |
56 | }
|