Forum: Compiler & IDEs Reset nach Interruptaufruf von Timer0 µC:Atmega32


von Stefan (Gast)


Lesenswert?

Hallo Leute,

bin noch totaller C-Anfänger, bräucht ma Hilfe, hab leider nix passendes 
im Forum gefunden was mir geholfen hatt.

Ich möcht den Timer0 als Software PWM für die LCD-Beleuchtung benutzen.

Folgendes Problem liegt vor:

ISR von Timer0 wird ausgeführt, aba beim Rücksprung wird jedesmal zu 
"int main" zurückgesprungen.

Muss ich ich in der ISR noch irgendwas sichern?

Wär echt dankbar, wenn mir jemmand helfen könnt, komm leider allein 
garnet weiter.
1
#include <avr/io.h>
2
#include "lcd-routines.h"
3
#include <util/delay.h>
4
#include <avr/interrupt.h>
5
6
7
8
volatile uint8_t LCD_PWM;
9
10
11
int main(void){
12
13
//Timer0 Prescaler einstellen, Interrupt ein
14
TCCR0 |= (1<<CS00)|(1<<CS02);
15
TIMSK |= (1<<TOIE0 | 1<<OCIE0);
16
17
//Interrupt allgemein ein
18
sei();
19
//LCD initialisieren
20
lcd_init();
21
22
//LCD-Hintergrundbeleuchtung auf ausgang
23
DDRA |= (1<<6);
24
25
26
27
while(1){
28
29
lcd_clear();
30
31
set_cursor(0,0);
32
 
33
lcd_string("Hello World");
34
35
_delay_ms(200);
36
37
38
}
39
40
}
41
42
43
44
ISR(TIMER0_OVF_vect)
45
{
46
  uint8_t tmp_sreg;
47
  tmp_sreg = SREG;
48
  LCD_PWM++;
49
  if(LCD_PWM =0){PORTA |= (1<<PORTA6);}
50
  if(LCD_PWM =20){PORTA &= ~(1<<PORTA6);}
51
  SREG = tmp_sreg;  
52
}

von Stefan E. (sternst)


Lesenswert?

Du schaltest sowohl den Overflow- als auch den Compare-Interrupt frei, 
hast aber nur Code für den Overflow-Interrupt. Wenn ein Interrupt 
ausgelöst wird, für den du keinen Handler hast, wird ein Reset 
ausgeführt.

PS: Lass das rumgespiele mit dem SREG. Das Sichern macht schon der 
Compiler selber.

von Peter D. (peda)


Lesenswert?

Stefan wrote:

>
1
> TIMSK |= (1<<TOIE0 | 1<<OCIE0);
2
...
3
> ISR(TIMER0_OVF_vect)
4
> {
5
> }
6
>

Und wo ist der Compare-Handler?


Peter

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Der Code läuft wirklich?
:
  if(LCD_PWM =0  ){PORTA |= (1<<PORTA6);}
  if(LCD_PWM =20 ){PORTA &= ~(1<<PORTA6);}
:
Das (LCD_PWM=0 und LCD_PWM=20) sind keine Vergleiche, sondern 
Zuweisungen...
Ich würde sagen, die erste Zeile wird nie, die zweite immer 
ausgeführt.
Verglichen wird in C mit ==, >=, <= >, <, !=


Und das hier
:
  uint8_t tmp_sreg;
  tmp_sreg = SREG;
:
:
  SREG = tmp_sreg;
:
ist unnötig, das macht der Interuptfunktionsaufruf schon von alleine...


Wie kommst du auf die Idee, dass zu "int main" gesprungen wird?

von Stefan (Gast)


Lesenswert?

Ach mist. Des hab ich wahrscheinlich total übersehen.

Jetzt funktionierts einwandfrei!

Danke Leute!!!!!!

von Stefan (Gast)


Lesenswert?

@Lothar:

Danke das du meinen nächsten Fehler gefunden hast, mensch wenn ich wüsst 
was heut los is

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.