mikrocontroller.net

Forum: Compiler & IDEs Timer Overflow Interrupt


Autor: Daniel P. (dpointeck)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kann mir bitte einer weiter helfen!!!
ich bin am durchdrehn.
Will einfach nur mit dem Timer Überlauf Interrupt den PIN B0 auf high 
setzen. Ich bekomm aber keinen Interrupt.
Kann mal wer den Code kontrollieren ob ich eine Fehler drin hab?
#define     F_CPU   3686400UL
#include <avr/io.h>
#include <avr/interrupt.h>
 
// globale Variablen
 

 
int main(void) 
{
 
// IO konfigurieren
 
    DDRB = 0xFF;
 
// Timer0 konfigurieren
 
    TCCR0  = 0b00000011;            // 
    TIMSK  = 0b00000001;      // Timer Overflow Interrupt freischalten 
 
// Interrupts freigeben
 
    sei();
 
// Endlose Hauptschleife
    while(1) 
  
  {
     
    }

}
 
// Timer0 overflow Interrupt
 
ISR(TIMER0_OVF_vect) 
{
    PORTB = 0b00000001;
}

Autor: Johann L. (gjlayde) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schreib mal für welchen Controller.

Und schmeiss die magischen Zahlen aus dem Code. Du sollst das Handbuch 
wälzen und nicht die Leute, die dir helfen wollen...

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

Bewertung
0 lesenswert
nicht lesenswert
Wenn der Timer nicht läuft, dann kannst Du bis zum Sankt-Nimmerleinstag 
warten, dass ein Interrupt kommt.


Und das hier:
 TCCR0  = 0b00000011;            // 
 TIMSK  = 0b00000001;      // Timer Overflow Interrupt freischalten 
...ist bäääh. Bitte gewöhne Dir an, die Bitnamen zu benutzen. Oder 
willst Du, dass jeder, der helfen will, erstmal im Datenblatt 
nachschlagen muss, welche Bits da überhaupt gesetzt werden und ob Du die 
richtigen Bits gesetzt hast? Kein Wunder, dass Du da selbst die 
Übersicht verlierst...

AVR-GCC-Tutorial lesen!

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

Bewertung
0 lesenswert
nicht lesenswert
Johann L. wrote:
> Schreib mal für welchen Controller.
Naja, in dem Fall reicht es, zu wissen, dass es ein AVR ist und dass bei 
keinem AVR die Timer von selbst (Werkseinstellung) laufen...;-)

Autor: Daniel P. (dpointeck)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ist für nen Atmega8.
Ich ein Schulkollege hat gemeint dass es funktionieren müsste.
kann mir keiner ein Beispiel geben wies funktioniert.
Ich hab nämlich überhaupt keinen Plan mehr.

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

Bewertung
0 lesenswert
nicht lesenswert
Daniel P. wrote:
> Ist für nen Atmega8.
> Ich ein Schulkollege hat gemeint dass es funktionieren müsste.
Wie viele Jahre wartet Dein Schulkollege schon auf den ersten Interrupt?

> kann mir keiner ein Beispiel geben wies funktioniert.
Doch, im AVR-GCC-Tutorial stehen Beispiele drin...

> Ich hab nämlich überhaupt keinen Plan mehr.
Nicht mehr oder noch nicht?

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

Bewertung
0 lesenswert
nicht lesenswert
Oh, warte mal, RUDER ZURÜCK ich seh da doch grad die Initialisierung 
vom TCCR0...

ALSO: Zumindest der Timer müsste laufen...

Wie hast Du den programmiert?

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Johannes M. wrote:
> Johann L. wrote:
>> Schreib mal für welchen Controller.
> Naja, in dem Fall reicht es, zu wissen, dass es ein AVR ist und dass bei
> keinem AVR die Timer von selbst (Werkseinstellung) laufen...;-)

Sorry Jahannes, dass ich mal wieder nörgeln muss. ;-)
Der Timer wird gestartet.

EDIT: Oh, sehe gerade, dass du es schon selber gemerkt hast. ;-)

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

Bewertung
0 lesenswert
nicht lesenswert
Stefan Ernst wrote:
> Sorry Jahannes, dass ich mal wieder nörgeln muss. ;-)
Schon wieder ... Immer diese Nörgler...;-)

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Daniel:

Wie stellst du fest, welcher Pegel an PB0 ist? Da hängt nicht vielleicht 
eine LED dran, die bei Low (und nicht bei High) leuchtet?

Autor: Daniel P. (dpointeck)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nein hab das Oszi meines Vaters dranhängen.

Autor: Daniel P. (dpointeck)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hab den Code ein bischen überarbeitet funktioniert jedoch wieder nicht.
#define     F_CPU   3686400UL
#include <avr/io.h>
#include <avr/interrupt.h>
 
// globale Variablen
 

 
int main(void) 
{
 
// IO konfigurieren
 
    DDRB = 0xff;
 
// Timer0 konfigurieren
 
    TCCR0 |= (1<<CS00)|(1<<CS02);           // 
    TIMSK |= (1<<TOIE0);          // Timer Overflow Interrupt freischalten 
 
// Interrupts freigeben
 
    sei();
 
// Endlose Hauptschleife
    while(1) 
  
  {
     
    }

}
 
// Timer0 overflow Interrupt
 
ISR(TIMER0_OVF_vect) 
{
    PORTB = 0b00000001;
}

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

Bewertung
0 lesenswert
nicht lesenswert
Daniel P. wrote:
> Nein hab das Oszi meines Vaters dranhängen.

Der Code ist grundsätzlich ok.
Bist du sicher, dass dein Problem in Wirklichkeit nicht ein Oszi Problem 
ist? Wenn du ein Voltmeter hast, dann benutz doch dieses mal. An PB0 
müssen konstant 5V anliegen. Gleich daneben, an PB1 müssen es 0V sein.

Autor: Daniel P. (dpointeck)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nein das ist sicherlich kein Oszi Problem.
Da wenn ich den Port in der While schleife setze dann wird dieser auch 
gesetzt. Nun müsste der Port eigentlich immer low sein und der Interrupt 
diesen dann einschalten. Nur es tut sich nichts.
ich bin fertig mit den Nerven. ;-(

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

Bewertung
0 lesenswert
nicht lesenswert
Kriegst du vom Compiler irgendwelche Warnungen?

Autor: Daniel P. (dpointeck)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nein 0 Warnings gar nix.
Zum Mäusemelken!!!!!

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

Bewertung
0 lesenswert
nicht lesenswert
Daniel P. wrote:
> Nein 0 Warnings gar nix.
> Zum Mäusemelken!!!!!
Das kann, mit Verlaub, nicht wirklich sein...

Also:
- Du sagst, Hardware funktioniert (getestet mit Setzen des Bits in 
main() ohne Interrupt).

- Du sagst, Programm compiliert ohne jegliche Warn- oder Fehlermeldung.

Da bleibt nicht viel übrig.
- Programm für einen falschen Controller compiliert
   => würde vermutlich entweder zu Fehlermeldungen führen (unbekannter 
Interrupt-Vektor, unbekannte Register etc.) oder zu einem völligen 
nicht-Funktionieren des Codes führen (inklusive des Testcodes ohne 
Interrupt)
- sonstige Einstellungen dürften keinen Einfluss haben, es müsste 
zumindest nach recht kurzer Zeit etwas passieren...

Binde doch mal die util/delay.h ein und lasse z.B. mit _delay_ms(100) in 
der main-Schleife den Portpin wackeln (mit nem XOR).

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Programmierst Du Deinen Controller aus dem AVRStudio heraus? Falls ja: 
Check mal in der Programmer-Dialogbox, ob auch wirklich die richtige 
HEX-Datei geflasht wird. Es gab Leute hier, die den Controller nach 
Fehlerberichtigungen im Code versehentlich immer wieder mit der alten 
HEX-Datei programmiert haben, und sich wunderten, warum der Fehler 
weiterhin auftrat.

Autor: gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Und ob der richtige Controller in den Projekteinstellungen steht

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

Bewertung
0 lesenswert
nicht lesenswert
gast wrote:
> Und ob der richtige Controller in den Projekteinstellungen steht

Johannes M. wrote:
> - Programm für einen falschen Controller compiliert
>    => würde vermutlich entweder zu Fehlermeldungen führen (unbekannter
> Interrupt-Vektor, unbekannte Register etc.) oder zu einem völligen
> nicht-Funktionieren des Codes führen (inklusive des Testcodes ohne
> Interrupt)

Autor: Daniel P. (dpointeck)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So habs jetzt,
Es war der falsch uC in der Projekteinstellung eingestellt.
Danke nochmal an alle für die Tips!

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.