hallo,
ich habe in meinem projekt eine merkwürdige "entdeckung" gemacht.
wie vllt. schon einige gelesen habe, lasse ich einen sensor die
helligkeit einer led erfassen. die messwerte werden dann per can-stack
verschickt zu eine regelung
als test wollte ich timer0 initialisieren und die led alle sekunde oder
2ekunden tooglen lassen. das klappt soweit auch jedoch funktioniert dann
die can kommunikation nicht mehr. die adc daten werden versendet und die
regelung schickt werte zurück. jedoch wird die ISR des can-stacks
scheinbar nur noch 9-17mal aufgerufen und dann nie wieder. die 9-17 ist
eine ungefähre angabe da das ziemlich stochastisch zu seinen scheint
ich frage mich wie das kommen kann, can und timer0 haben doch nichts
miteinander zu tun, zumindest habe ich keine register gesehen die
abhängig sind oder sonst was. oder irre ich mich?
wäre für ein wenig hilfe dankbar
den timer0 des at90can habe ich wie folgt initialisiert:
1 | #define clock_factor F_CPU/(64*256) //interruptzähler
|
2 |
|
3 | volatile uint16_t clock = clock_factor, second;
|
4 | void timer0_init(){
|
5 | // Timer0
|
6 | TCCR0A |= (1<<CS00) | (1<<CS01); //prescaler 64
|
7 | TIMSK0 |= (1<<TOIE0); //overflow
|
8 | TCNT0 = 0; //counter = 0
|
9 | /* 16000000 / 64 = 250000
|
10 | 250000 / 256(8bit) = ca. 976
|
11 | */
|
12 | clock = clock_factor;
|
13 | second = 0;
|
14 | led==1;
|
15 |
|
16 | }
|
17 |
|
18 | ISR(TIMER0_OVF_vect){
|
19 | clock--;
|
20 | if (clock==0){ // nach 244 durchlaufen ist eine second vorgegangen
|
21 | clock = clock_factor;
|
22 | second++;
|
23 | if (second == 5){
|
24 | if(led == 1){
|
25 | setLedBrightness(100);
|
26 | led=0;
|
27 | }
|
28 | else{
|
29 | setLedBrightness(0);
|
30 | led=1;
|
31 | }
|
32 | second=0;
|
33 | }
|
34 | }
|
35 |
|
36 | }
|