Reset nach Interruptaufruf von Timer0 µC:Atmega32

Gast #947483
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
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
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

Eine eigene Frage? Dieser Thread ist über 18 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.