Moin,
mein Display funktioniert jetzt wunderbar, ich hab aber jetz noch ein
Problem mit den Interrupts, wo ich auch nicht mehr weiter weiss.
Und zwar soll mein Programm (Phasenabschnittsteuerung mit wählbaren Ein-
und Auschaltwinkel) bei jedem Nulldurchgang einen Interrupt starten
(ext. Zero Point Detector), der wiederum einen Timer Interrupt einstellt
und aktiviert. Beide Interrupts funktionieren auch tadellos jedoch
werden bei den Rücksprungen aus den Interrupts die jeweiligen If- und
While Schleifen an dem das Programm unterbrochen wurde bei dem
Rücksprung übersprungen
Z.B:
Ursache: Wenn ich beim Debuggen vor dem Sprung die Adresse im Programm
Counter ansehe lautet sie 0x72. Bei dem Sprung in den Interrupt wird sie
auf 0x74 erhöht. Daher wird die Schleife übersprungen. Ändere ich den
Rücksprungwert auf 0x72 spring das Programm wieder dahin wo es soll und
die If-Bedingung wird wieder korrekt abgefragt.
Gibt es eine Einstellung mit der man die Rücksprungadresse ohne eine
Erhöhung im Stack speichern kann?
hier mal ein Auszug aus meinem Programm:
1 | int main()
|
2 | {
|
3 | ...
|
4 | TCCR1B=0x02;
|
5 | TIMSK=0x04;
|
6 | //HW-Interrupt einstellen und aktivieren
|
7 | MCUCR=0x0A; //Int. Bedingungen einstellen
|
8 | GIMSK=0x40; //Int0 aktivieren
|
9 | sei(); //HW-Int aktivieren
|
10 |
|
11 | //Hauptprogrammschleife
|
12 | while(1)
|
13 | {
|
14 | if(TASTE_M)
|
15 | {
|
16 | merker=0;
|
17 | zeile = Zeichne_Pfeil(zeile);
|
18 |
|
19 | do{
|
20 | }while(TASTE_M);
|
21 | ...
|
22 | }
|
23 | return(0);
|
24 | }
|
1 | void INT0_vect(void)
|
2 | {
|
3 | alpha=0x01;
|
4 | ...
|
5 | TCNT1H=0xFF; //Timerwert für Timer1
|
6 | TCNT1L=0x38; //Timerwert für Timer1
|
7 | sei();
|
8 | }
|
1 | void TIMER1_OVF_vect(void)
|
2 | {
|
3 | alpha++;
|
4 | TCNT1H=0xFF;
|
5 | TCNT1L=0x38;
|
6 | ...
|
7 | sei();
|
8 | }
|
MfG
Matthias