mikrocontroller.net

Forum: Compiler & IDEs TIMER0_OVF_vect wird nicht angesprungen


Autor: Frank Link (franklink)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Zusammen,

ich bin am Verzweifeln. Meine Routine für TIMER0_OVF_vect wird nicht 
angesprungen. Warum keine Ahnung. Aus meiner Sicht sind alle IRs 
freigeschaltet und korrekt initialisiert.

Könnte sich mal jemand den entsprechenden Code ansehen.

Im Anhang der gesamte Code als ZIP-Archiv.

Die Initialisierung befindet sich initTimer() im File main.c

Danke für jeden Tipp.

Gruß
Frank

Autor: Frank Link (franklink)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
und hier nochmal der Code.

Autor: MWS (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das hier schaut komisch aus:

TIMSK  = 1<<TOIE0^1<<TOIE1^1<<TOIE2;

Dachte man würde so schreiben:

TIMSK = (1 << TOIE0) | (1 << TOIE1) | (1 << TOIE2)

Schau doch mal im Disassembler, was da der Compiler so erzeugt.
Aber ich schreib in Bascom, könnte hier also die Lizenz haben falsch zu 
liegen.

Autor: Frank Link (franklink)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ich habe gestern Abend noch ein wenig experimentiert.

Das Ergebnis ist folgendes:

Mit dieser Initialisierung ist die Anwendung letzte Woche noch gelaufen. 
Seit Montag nicht mehr. Auch wenn ich alle Änderungen die ich seit dem 
gemacht habe, zurücknehmen, wird der TIMER0_OVF_vect nicht angesprungen.
void initTimer( void )
{
  TCCR0  = 0;
  TCCR0  = 1<<CS02;                 

  TCCR1A = 1<<CS10;                 
  TCCR1B = 1<<CS10;                 

  TCCR2  = 0;
  TCCR2  = 1<<CS11;                 

   TIMSK  = 1<<TOIE0^1<<TOIE1^1<<TOIE2;  // enable timer interrupt
}

Ändere ich die Parameter auf:
void initTimer( void )
{
  TCCR0  = 0;
  TCCR0  = 1<<CS02;                 

  TCCR1A = 0;
  TCCR1B = 1<<CS10;                 

  TCCR2  = 0;
  TCCR2  = 1<<CS11;                 

   TIMSK  = 1<<TOIE0^1<<TOIE1^1<<TOIE2;  // enable timer interrupt
}

wird der TIMER0_OVF_vect angesprungen. Allerdings ist dann der Aufruf 
des Vektors für TIMER1_OFV_vect zu langsam und damit läuft meine gesamte 
PWM nicht mehr vernüftig.

Genauso wird der Vektor angesprungen, wenn ich TOIE1 vollständig 
entferne.

Für mich stellt sich jetzt die Frage, was genau ist falsch...

Gruß
Frank

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> TCCR1A = 1<<CS10;
> TCCR1B = 1<<CS10;
Was das soll, weißt wohl sowieso nur Du selbst...

Abgesehen davon: MWS hat im Prinzip Recht: EXOR (^) ist da unsinnig. 
Mach es mit OR (|) und klammere die Teilausdrücke (v.a. wegen der 
Übersicht).

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Und noch ein kleiner Tip am Rande:
Bei Funktionsprototypen ist extern flüssiger als Wasser...

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Johannes M. wrote:

> Abgesehen davon: MWS hat im Prinzip Recht: EXOR (^) ist da unsinnig.

Ungewohnt, ja.
Aber da die Konstanten alle andere Werte haben, ist das auch nicht 
unbedingt falsch. Das kann es also nicht sein.

Autor: Lutz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
TCCR0  = 0;
TCCR0  = 1<<CS02;

TCCR2  = 0;
TCCR2  = 1<<CS11;

Und da Du mit "=" arbeitest, kannst Du Dir das vorherige "=0" auch 
sparen.

Autor: Frank Link (franklink)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
erstmal Danke für die Antworten.

Ich habe das Konstrukt auch schon in der üblichen Schreibweise 
verwendet.
void initTimer( void )
{
  TCCR0  = 0;
  TCCR0  = 1<<CS02;                 

  TCCR1A = 0;
  TCCR1B = 1<<CS10;                 

  TCCR2  = 0;
  TCCR2  = 1<<CS11;                 

   TIMSK  = (1<<TOIE0)|(1<<TOIE1)|(1<<TOIE2);  // enable timer interrupt
}

bringt keinen Unterschied!

Fakt ist, setzte ich TCCR1A = 0 funktionierts! Setzte ich TCCR1A = 
1<<CS10 laufen alle anderen Interuptaufrufe mit Ausnahme von 
TIMER0_OVF_vect  korrekt und in der von mir erwarteten Geschwindigkeit.

Setzte ich TCCR1A = 0 laufen alle Interupts nur Timer1 zu langsam.

Da ich nicht wirklich der Krack in Mikrocontroller und C bin, bin ich 
mit meinem Latein am Ende.

TCCR0 = 0 und TCCR2 = 0 sind mit Sicherheit überflüssige Angaben, da sie 
aber auch nicht wehtun, habe ich sie noch gelassen. Werden allerdings 
irgendwann wenn der Code sauber funktioniert entfernt. Wobei ich auch 
hier sehr merkwürde Effekte hatte. Die aber damit zusammen hängen 
können, dass irgendetwas anderes falsch ist.

@Johannes
Setzte ich TCCR1A und TCCR1B nicht funktioniert der Timer1 überhaupt 
nicht. Mir ist im Augenblick keine andere Alternative bekannt, den 
Timer1 korrekt zu initialisieren.

Gruß
Frank

Autor: Werner B. (werner-b)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Da niemand (außer dir) weiss welcher Prozessor, kann auch niemand prüfen 
in welchem Modus du den Timer betreibst, respektive warum es mit
  TCCR1A = 0;
  TCCR1B = 1<<CS10;                 
funtioniert, und mit
  TCCR1A = 1<<CS10;
  TCCR1B = 1<<CS10;                 
nicht.
Abgesehe davon kann es nur in einem der beiden Register ein Bit mit dem 
Namen CS10 geben.
Alles etwas Konfus.

Werner

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Werner B. wrote:
> Abgesehe davon kann es nur in einem der beiden Register ein Bit mit dem
> Namen CS10 geben.
Das war das, was ich oben meinte...

Autor: Frank Link (franklink)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Werner,
da hast Du verdammt Recht. Sorry, mein Controller ist ein ATMEGA8.

Ich denke, ich habe den Fehler nach dem Studium der Unterlagen auch 
gefunden.

CS10 für TCCR1A ist schlicht weg falsch. Hier ist TCCR1A = 0 korrekt.

Zusätzlich setzte ich im TIMER0_OVF_vect den TCNT0 und nicht den TCNT1. 
Copy und Paste ohne nachdenken :-((, deshalb hat es letzte Woche auch 
noch alles korrekt funktioniert.

Gruß
Frank

Autor: Lowtzow .... (lowtzow)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>   TCCR1A = 1<<CS10;
>   TCCR1B = 1<<CS10;
> 

hallo

was hier passiert kann ich dir sagen (hatte selber mal das problem)

1. variante
>   TCCR1A = 1<<0;
>   TCCR1B = 1<<0;
> 

2.variante
>   TCCR1A = 1<<WGM10;
>   TCCR1B = 1<<CS10;
> 

beide varianten sind gleichwertig mit deiner variante!
wieso? die bitbezeichnung (CS10)steht für die bitnummer(0).
wenn du CS10 woanders verwendest wird es als 0 interpretiert was aber 
jenach register eine andere funktion auslöst.

mfg

Autor: Frank Link (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Alex Alex,
dank für die Zusammenfassung, ich hatte das als Abschluss für den Thread 
komplett vergessen zu schreiben.

Gruß
Frank

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.