Forum: Compiler & IDEs Timer Overflow Interrupt


von Daniel P. (dpointeck)


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?
1
#define     F_CPU   3686400UL
2
#include <avr/io.h>
3
#include <avr/interrupt.h>
4
 
5
// globale Variablen
6
 
7
8
 
9
int main(void) 
10
{
11
 
12
// IO konfigurieren
13
 
14
    DDRB = 0xFF;
15
 
16
// Timer0 konfigurieren
17
 
18
    TCCR0  = 0b00000011;            // 
19
    TIMSK  = 0b00000001;      // Timer Overflow Interrupt freischalten 
20
 
21
// Interrupts freigeben
22
 
23
    sei();
24
 
25
// Endlose Hauptschleife
26
    while(1) 
27
  
28
  {
29
     
30
    }
31
32
}
33
 
34
// Timer0 overflow Interrupt
35
 
36
ISR(TIMER0_OVF_vect) 
37
{
38
    PORTB = 0b00000001;
39
}

von Johann L. (gjlayde) Benutzerseite


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...

von Johannes M. (johnny-m)


Lesenswert?

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


Und das hier:
1
 TCCR0  = 0b00000011;            // 
2
 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!

von Johannes M. (johnny-m)


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...;-)

von Daniel P. (dpointeck)


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.

von Johannes M. (johnny-m)


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?

von Johannes M. (johnny-m)


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?

von Stefan E. (sternst)


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. ;-)

von Johannes M. (johnny-m)


Lesenswert?

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

von Stefan E. (sternst)


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?

von Daniel P. (dpointeck)


Lesenswert?

Nein hab das Oszi meines Vaters dranhängen.

von Daniel P. (dpointeck)


Lesenswert?

Hab den Code ein bischen überarbeitet funktioniert jedoch wieder nicht.
1
#define     F_CPU   3686400UL
2
#include <avr/io.h>
3
#include <avr/interrupt.h>
4
 
5
// globale Variablen
6
 
7
8
 
9
int main(void) 
10
{
11
 
12
// IO konfigurieren
13
 
14
    DDRB = 0xff;
15
 
16
// Timer0 konfigurieren
17
 
18
    TCCR0 |= (1<<CS00)|(1<<CS02);           // 
19
    TIMSK |= (1<<TOIE0);          // Timer Overflow Interrupt freischalten 
20
 
21
// Interrupts freigeben
22
 
23
    sei();
24
 
25
// Endlose Hauptschleife
26
    while(1) 
27
  
28
  {
29
     
30
    }
31
32
}
33
 
34
// Timer0 overflow Interrupt
35
 
36
ISR(TIMER0_OVF_vect) 
37
{
38
    PORTB = 0b00000001;
39
}

von Karl H. (kbuchegg)


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.

von Daniel P. (dpointeck)


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. ;-(

von Karl H. (kbuchegg)


Lesenswert?

Kriegst du vom Compiler irgendwelche Warnungen?

von Daniel P. (dpointeck)


Lesenswert?

Nein 0 Warnings gar nix.
Zum Mäusemelken!!!!!

von Johannes M. (johnny-m)


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).

von Gast (Gast)


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.

von gast (Gast)


Lesenswert?

Und ob der richtige Controller in den Projekteinstellungen steht

von Johannes M. (johnny-m)


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)

von Daniel P. (dpointeck)


Lesenswert?

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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.