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
intmain(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
voidtimer_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!
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.
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
intmain(void)
2
{
3
uint8_tval[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_ti=0;i<10;i++)
12
{
13
val[i]=i+1;
14
}
15
}
16
17
voidtimer_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.
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
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??
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 ;)