Forum: Mikrocontroller und Digitale Elektronik 32,768 KHZ problem


von arash j. (arashjavan)


Lesenswert?

Hallo,

ich erlebe jetzt gerade irgendwie ein neuer weltwunder.
Atmega1281 uC,verusch den timer2 in Asynch.Modus zu schlaten und einen 
einfachen rtc zu erzeugen, dass ganze wird mit avr jtagice mk2, 
geflasht.

direkt nach der intialisierung von timer2 spielt das ganze ,nach 3-4 
richtige overflow interrupts (überwache das ganze mit mehrern 
breakpoints), verrückt. das programm fängt wieder von main() an!!! und 
dann werden jegliche overflow interrupt des timers ignoriert!!!
1
int main(void)
2
{  
3
  ck_prescale_set(clock_div_2); //interne 8 mhz osc. auf 4 mhz teilen.
4
   
5
  timer_init();
6
7
  sei;
8
}    
9
10
void timer_init(void)
11
{
12
  ACSR = 0x80;
13
  ASSR |= (1<<AS2);  //ext. 32,768 khz osz. freigeben.
14
  _delay_ms(100);
15
  TCCR2B|=(1<<CS22)|(1<<CS20);  //prescaler auf 256 setzten --> 1 sek
16
  _delay_ms(1);
17
  TIMSK2|=(1<<TOIE2);  // interrupt frei geben.
18
  TCNT2=0;             // timercounter auf null setzten, und los gehts
19
}
20
21
/* bei interrupt wird time hochgezählt und pin B5 getoggelt */
22
ISR(TIMER2_OVF_vect)
23
{
24
   time++;
25
   if (var == 0)
26
   {
27
     PORTB |=  _BV(PB5);
28
     var = 1;
29
   }   
30
  else
31
  {
32
    PORTB &= ~( _BV(PB5));
33
    var = 0;
34
}
35
}

wisst ihr vielleicht warum ich gerade dieses szenario erlebe???

danke voraus!
von Lutz (Gast)


Lesenswert?

Womöglich könnte nach sei; das Programm zu Ende sein???
von arash j. (arashjavan)


Lesenswert?

Lutz schrieb:
> Womöglich könnte nach sei; das Programm zu Ende sein???

danke erst mal für deine antwort!

ne das programm geht nach sei weiter und hab einfach paar dummy 
schleifen,
um euch nicht weiter zu verwirren, habe ich hier weggelassen.
von Lutz (Gast)


Lesenswert?

Wie soll denn jemand ohne den vollständigen Code etwas zum Code sagen 
können?
von arash j. (arashjavan)


Lesenswert?

Lutz schrieb:
> Wie soll denn jemand ohne den vollständigen Code etwas zum Code sagen
> können?

also, hier ist alles, aber wie gesagt, der rest ist nur einfach dummy
1
int main(void)
2
{  
3
  uint8_t val[10];
4
5
  ck_prescale_set(clock_div_2); //interne 8 mhz osc. auf 4 mhz teilen.
6
   
7
  timer_init();
8
9
  sei;
10
11
 for (uint8_t i = 0; i <10; i++)
12
 {
13
   val[i] = i + 1;
14
 }
15
}    
16
17
void timer_init(void)
18
{
19
  ACSR = 0x80;
20
  ASSR |= (1<<AS2);  //ext. 32,768 khz osz. freigeben.
21
  _delay_ms(100);
22
  TCCR2B|=(1<<CS22)|(1<<CS20);  //prescaler auf 256 setzten --> 1 sek
23
  _delay_ms(1);
24
  TIMSK2|=(1<<TOIE2);  // interrupt frei geben.
25
  TCNT2=0;             // timercounter auf null setzten, und los gehts
26
}
27
28
/* bei interrupt wird time hochgezählt und pin B5 getoggelt */
29
ISR(TIMER2_OVF_vect)
30
{
31
   time++;
32
   if (var == 0)
33
   {
34
     PORTB |=  _BV(PB5);
35
     var = 1;
36
   }   
37
  else
38
  {
39
    PORTB &= ~( _BV(PB5));
40
    var = 0;
41
}
42
}

hab paar breakpoints. ISR-routine wird 4-5 mal durchgeführt, dann fängt 
plötlich der JTAG Mk2, wieder von anfang der main()-Funktion!!
geht mit dem programm weiter und fängt wieder von vorne an, alle 
overflow interrupts werden dann ignoriert!!!

ich hab irgendwie das gefühl das warum auch immer das programm immer 
wieder zur boot-vektor geführt wird, quasi wie beim reset!!
watchdogtimer,und brwon-out sind ausgeschaltet per jtag.
von Klaus T. (gauchi)


Lesenswert?

und was soll passieren, wenn das programm am ende von main ankommt?
von Jens (Gast)


Lesenswert?

a_ javan schrieb:
> aber wie gesagt, der rest ist nur einfach dummy

Ja genau. Dein Programm beendet sich nach Durchlauf der Schleife. Dann 
ist Sense. Also nächstes mal lieber den kompletten Code posten ;-)

Gruß
Jens
von arash j. (arashjavan)


Lesenswert?

Klaus T. schrieb:
> und was soll passieren, wenn das programm am ende von main ankommt?

garnichts, es soll nur paar solche schleifen zum test ausfühlen, aber 
soweit kommts ja garnicht wie gesagt bis sei ist alles noch in ordnung, 
dann fangen die isr-interrupts an 4-5 mal, dann auf einmal fängt das 
programm wieder von ganz oben, main() auszuführen. ich weiss das hört 
sich alles verrückt an, ich seh sowas auch zum ersten mal.

Fragen:
1) stimmt vielleicht etwas mit meiner timer init nicht?
2) konnte es sein das die boot-vektor interrupt, was ja normalerweise 
nur beim reset des systems gesetzt ist, hier eine rolle spielt??
von Jens (Gast)


Lesenswert?

Sorge dafür, dass dein Programm sich nicht beendet! Ein einfaches
1
while (1);
wirkt da schon Wunder ;-)

Gruß
Jens
von arash j. (arashjavan)


Lesenswert?

Jens schrieb:
> Sorge dafür, dass dein Programm sich nicht beendet! Ein einfaches
>
1
> while (1);
2
>
> wirkt da schon Wunder ;-)
>
> Gruß
> Jens

passirt wenn man vor lauter bäumen den wald nicht sieht, DANKE es hat 
tatsächlich mit der while funktionert ;)
von Jens (Gast)


Lesenswert?

Naja, haben ja schon mehrere Leute vor mir gesagt, also einfach mal 
etwas gründlicher lesen ;-)
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.