Forum: Mikrocontroller und Digitale Elektronik timer0 at90can stört can-stack


von Tim R. (herrvorragend)


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
}

von Peter D. (peda)


Lesenswert?

Und nun sollen wir raten, wie Dein CAN-Code aussieht?

Mach ein Minimalprojekt mit dem Fehlerbild und hänge es als ZIP an.

Mit Kodefitzelchen kann keiner was anfangen.


Peter

von Tim R. (herrvorragend)


Angehängte Dateien:

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

von H.Joachim S. (crazyhorse)


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?

von Tim R. (herrvorragend)


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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.