Forum: Mikrocontroller und Digitale Elektronik Timer interrupt funktioniert nicht


von ich d. (tracktorad)


Angehängte Dateien:

Lesenswert?

Den angehängten Code habe ich von dem Interrupt Tutorial. 
(http://www.mikrocontroller.net/articles/Interrupt#.28AVR-.29_Beispiele_f.C3.BCr_die_praktische_Programmierung)

Ich habe eine LED am Port D5 anhängen.
Die Fuses habe ich auf Werkseinstellung.
Ich benutze einen ATmega8 und das AVR-Studio 4

Ich habe noch nie mit einem Timer oder Interrupt
gearbeitet (Status: Anfänger :D) und wollte das mal
ausprobieren aber es klappt einfach nicht.

Das Interrupt Tutorial habe ich schon mehrmals durchgelesen und
auch im Datenblatt den abschnitt über den Timer gelesen.

Könnte mir vielleicht einer den Fehler zeigen??

von Uwe (de0508)


Lesenswert?

Hallo !

ich du schrieb:
> und wollte das mal
> ausprobieren aber es klappt einfach nicht.

und was klappt nicht ?

Hast Du mal die Blinkfrequenz ausgerechnet ?

Dazu schaut man in's Datenblatt, das gibt's bei Atmel.com

Warum setzt Au ALLE Ports auf Ausgabe ?
1
// IO konfigurieren
2
 
3
 DDRA = 0xFF;
4
 DDRB = 0xFF;
5
 DDRC = 0xFF;
6
 DDRD = 0xFF;

Reichen würde doch nur das Bit 5 von Portd ?
1
DDRD |= (1 << PD5);

von Krapao (Gast)


Lesenswert?

Viel Zutrauen in den Code aus dem Artikel habe ich nicht. Ein Beispiel 
zum Blinken einer LED an PD5 braucht keine solche IO-Konfiguration. IMHO 
extrem kontraproduktiv in einem Tutorial. Worst case raucht die ein oder 
andere Schaltung ab.

> // IO konfigurieren
>
>     DDRA = 0xFF;
>     DDRB = 0xFF;
>     DDRC = 0xFF;
>     DDRD = 0xFF;

Deine Blinkfrequenz ist (vorausgesetzt dein unbekannter µC läft 
physikalisch mit 1 MHz wie im Programm vorausgesetzt):

1000000  1024  256 => LED Toggle alle 262 ms bzw. ca. 4x je Sekunde.

> Ich habe eine LED am Port D5 anhängen.

Nur die LED (Kenndaten? Datenblatt?), die könnte dann bereits hinüber 
sein, oder auch den Widerstand R z.B. so?

               R     LED
Pin PD5 o-----###----|<----o Vcc

von ich d. (tracktorad)


Lesenswert?

Das Datenblatt habe ich wie oben schon geschrieben gewälzt und bin grade 
wieder dabei :D

ich habe einen Takt von 1 MHZ und den Vorteiler 1024... Ich habe die 
Frequenz nicht ausgerechnet aber es müsste sichtbar sein...

Uwe S. schrieb:
> und was klappt nicht ?

Die LED bleibt aus...
wenn ich nach der while(1) schleife in der if-Verzweigung flag == 0 
schreibe leuchtet die led.. das heißt es muss ab timer liegen, oder ?

von Uwe (de0508)


Lesenswert?

Krapao schrieb:
> 1000000  1024  256 => LED Toggle alle 262 ms bzw. ca. 4x je Sekunde.

Nein, die Blinkfrequenz ist nicht gleich der LED Togglezeit, sondern 
0,524ms ~ 1/2 Sekunde.

von Christian F. (cmf) Benutzerseite


Lesenswert?

Oben steht überall Timer2, unten aber ISR(TIMER*0*...

von Christian F. (cmf) Benutzerseite


Lesenswert?

Bitte Code demnächst als .c posten. Dann gibt es Syntax-Highlighting

von ich d. (tracktorad)


Lesenswert?

Krapao schrieb:
> Nur die LED (Kenndaten? Datenblatt?), die könnte dann bereits hinüber
> sein, oder auch den Widerstand R z.B. so?

einen 1k-Ohm Wiederstand hab ich natürlich.. sry, vergessen zu schreiben
und die LED ist auf jeden fall nicht kapput.


Muss man vielleicht etwas an den fuses verstellen??

Christian F. schrieb:
> Bitte Code demnächst als .c posten. Dann gibt es Syntax-Highlighting

OK mach ich

Christian F. schrieb:
> Oben steht überall Timer2, unten aber ISR(TIMER*0*...

Das hab ich vergessen zu änder.. ändert aber am Ergebnis nichts

von Christian F. (cmf) Benutzerseite


Lesenswert?

ich du schrieb:
> Muss man vielleicht etwas an den fuses verstellen??

Nein.

von Thomas E. (thomase)


Lesenswert?

ich du schrieb:
> Ich benutze einen ATmega8
Der Code kompiliert doch gar nicht. Denn ein Atmega8 hat keinen PORTA 
und somit auch kein DDRA.
>DDRA = 0xFF;
Kompiliert es trotzdem fehlerfrei, hast du einen falschen Controller 
eingestellt.

> Den angehängten Code habe ich von dem Interrupt Tutorial.
Der Code ist für einen Atmega32.

mfg.

von Uwe (de0508)


Lesenswert?

Christian F. schrieb:
> Oben steht überall Timer2, unten aber ISR(TIMER*0*.

Spielt doch keine Rolle, nur der C-Code, nicht die Kommentare werden vom 
avr-gcc übersetzt.

_

von Christian F. (cmf) Benutzerseite


Lesenswert?

Uwe S. schrieb:
> Christian F. schrieb:
>> Oben steht überall Timer2, unten aber ISR(TIMER*0*.
>
> Spielt doch keine Rolle, nur der C-Code, nicht die Kommentare werden vom
> avr-gcc übersetzt.
Ach wirklich? ;)

Ich dachte nur, dass die Wahrscheinlichkeit, dass TCCR0 für Timer2 
zuständig ist hoch ist, wenn solche Kommentare drüber stehen. (Was im 
Nachhinein auch wieder Blödsinn ist, es ist ja TCCR*0*)

von ich d. (tracktorad)


Lesenswert?

Thomas Eckmann schrieb:
> Der Code kompiliert doch gar nicht. Denn ein Atmega8 hat keinen PORTA
> und somit auch kein DDRA.

Ich hab alle bis auf DDRD gelöscht ... ändert leider nix

von spess53 (Gast)


Lesenswert?

Hi

>Ich hab alle bis auf DDRD gelöscht ... ändert leider nix

Wenn der falsche Controller eingestellt, ändert das garnichts.

MfG Spess

von Uwe (de0508)


Angehängte Dateien:

Lesenswert?

hänge uns doch bitte immer den gesamten Code und auch die LSS-Datei an.
Dann können wir sehen, was der C Compiler daraus macht !

Hier noch ein Beispiel.

_

von ich d. (tracktorad)


Lesenswert?

Uwe S. schrieb:
> hänge uns doch bitte immer den gesamten Code und auch die LSS-Datei an.
> Dann können wir sehen, was der C Compiler daraus macht !
Ok

von ich d. (tracktorad)


Angehängte Dateien:

Lesenswert?

sry vergessen anzuhänge :D

von Karl H. (kbuchegg)


Lesenswert?

Hä?

>    4:  0c 94 65 00   jmp  0xca  ; 0xca <__bad_interrupt>

Du hast ganz sicher keinen Mega8 in den Project Settings eingetragen. 
Der Mega8 kann doch gar keine JMP Instruktion, sonder nur einen RJMP. 
Und der ist dann auch nicht 4 Bytes sondern nur 2 Bytes groß.

von spess53 (Gast)


Lesenswert?

Hi

Das lss-File dürfte zu einem ATMega128 passen. Auf keinen Fall für einen 
ATMega8.

MfG Spess

von ich d. (tracktorad)


Lesenswert?

OK thx für die Hilfen... es klappt jetzt

:D

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.