Reset nach Interruptaufruf von Timer0 µC:Atmega32

Gast #947483
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
}
#947491
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.
Moderator (Firma: Titel) Persönliche Seite #947494
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?

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren