www.mikrocontroller.net

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


Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.
#include <avr/io.h>
#include "lcd-routines.h"
#include <util/delay.h>
#include <avr/interrupt.h>



volatile uint8_t LCD_PWM;


int main(void){

//Timer0 Prescaler einstellen, Interrupt ein
TCCR0 |= (1<<CS00)|(1<<CS02);
TIMSK |= (1<<TOIE0 | 1<<OCIE0);

//Interrupt allgemein ein
sei();
//LCD initialisieren
lcd_init();

//LCD-Hintergrundbeleuchtung auf ausgang
DDRA |= (1<<6);



while(1){

lcd_clear();

set_cursor(0,0);
 
lcd_string("Hello World");

_delay_ms(200);


}

}



ISR(TIMER0_OVF_vect)
{
  uint8_t tmp_sreg;
  tmp_sreg = SREG;
  LCD_PWM++;
  if(LCD_PWM =0){PORTA |= (1<<PORTA6);}
  if(LCD_PWM =20){PORTA &= ~(1<<PORTA6);}
  SREG = tmp_sreg;  
}

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stefan wrote:

>
> TIMSK |= (1<<TOIE0 | 1<<OCIE0);
...
> ISR(TIMER0_OVF_vect)
> {
> }
> 

Und wo ist der Compare-Handler?


Peter

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ach mist. Des hab ich wahrscheinlich total übersehen.

Jetzt funktionierts einwandfrei!

Danke Leute!!!!!!

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Lothar:

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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.