timer0 at90can stört can-stack

OP #2289134
Lesenswert?

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
}
OP #2289190
Lesenswert?

hups korrekt, das sollte eigentlich in den anhang gehören

ich habe jetzt meinen can-stack angehängt. den habe ich mir aus einem 
beitrag hier aus dem forum abgeleitet.
die main beinhaltet funktionen wie wait und inits für ADC und PWMs. 
diese funktionen habe ich mal weggelassen sonst wird es vllt etwas viel 
bzw. sind die denke ich mal uninteressant. kann ich aber trotzdem gern 
nachreichen

wa smeinst du genau mit fehlerbild?

ich hoffe nun kann mir evtl geholfen werden

liebe grüße
Angehängte Dateien:
#2289232
Lesenswert?

Natürlich macht die Einschaltung des Timer0-Ints erstmal nichts aus.
Den CAN-Kram habe ich mir nicht angeschaut, das einzige, was ich mir 
vorstellen könnte, ist die Funktion setLedBrightness().
Mach doch mal so:

ISR(TIMER0_OVF_vect)
{
  clock--;

}

Dann siehst du, ob es der Interrupt selbst (was ich mir nicht vorstellen 
kann) oder der Rest der ISR ist.
clock ist eine lokale Variable? Evtl. Stackprobleme?
OP #2289249
Lesenswert?

danke für die antwort

setLedBrightness stellt nur die PWM für die LED ein, sprich ich setze 
dazu das entsprechende OCRnA bzw OCRnB Reg.

ich habe das problem gerade folgendermaßen gelöst(vorzeitig zumindest)
im can-stack, empäfnger ISR: ich hatte am ende den empfänger interrupt 
nicht geresetet (BXOK). das könnte durchaus mein problem behoben haben 
aber mal in nächster zeit schauen wie das system reagiert.

clock wird in der init mit dem vorteiler quasi als factor definiert.
und in der isr habe ich doch clock--; geschrieben ?

aber ich werde mal näher auf die ISR eingehen vllt liegt da wirklich 
noch ein kleines problem

danke erstmal

liebe grüße

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren