Forum: Mikrocontroller und Digitale Elektronik ATMEGA8 timer0 interrupt


von timer0 (Gast)


Angehängte Dateien:

Lesenswert?

Guten Morgen.
Ich brauche mal Eure Hilfe!
Was mache ich hier falsch:
Der Code compiled fehlerfrei, aber ich bekomme kein Signal am OUT-PORT.

Im Voraus vielen Dank.

von EAF (Gast)


Lesenswert?

Ohne jetzt Erfahrung mit dem konkreten AVR zu haben, oder gar testen zu 
können...
Manchmal macht es Sinn, das gewünschte Timer Interrupt Flag explizit 
zurückzusetzen.

von ArminD (Gast)


Lesenswert?

Wackelt der Pin denn wenn Du Dein Toogle-Konstrukt in die For-Schleife 
setzt und den Interrupt nicht enablest ?

von timer0 (Gast)


Lesenswert?

ArminD schrieb:
> Wackelt der Pin denn wenn Du Dein Toogle-Konstrukt in die For-Schleife
> setzt und den Interrupt nicht enablest ?

Ja klar.  Als erstes habe ich natürlich getestet ob der Pin reagiert.

Hier ist irgendwas absolut idiotisch:  Wenn ich den Code aus der ISR 
komplett entferne (auskommentiere) also eine leere ISR habe, und direkt 
nach der Port Initialisierung (also ausserhalb der for-Schleife ein 
OUT_PORT ^= 0x01 einsetze, dann bekomme ich ein Signal von 15 Hz, was 
bei laufendem Interrupt ja richtig wäre (8.000,000  1024  256 / 2).

Aber das macht so überhaupt keinen Sinn.

von EAF (Gast)


Lesenswert?

timer0 schrieb:
> Aber das macht so überhaupt keinen Sinn.

Dauerreset?!?

von Lötlackl *. (pappnase) Benutzerseite


Lesenswert?

1
OUT_PORT ^= 0x01;            // toggle
Tut nicht das, was Du vermutlich vor hast.

Pins wackeln geht anders, z.B.
1
PIN(OUT_PORT) ^= 0x01;       // toggle
oder meinetwegen
1
PIN(OUT_PORT) ^= _BV(OUT_PIN);

von Falk B. (falk)


Lesenswert?

Lötlackl *. schrieb:
> OUT_PORT ^= 0x01;            // toggle
> Tut nicht das, was Du vermutlich vor hast.

Doch, das tut es.

PORTB ^= 0x01;

Aber dein Login Name ist Programm!

von S. Landolt (Gast)


Lesenswert?

> Tut nicht das ... Pins wackeln geht anders

?
Also bei mir läuft das, mutatis mutandis, auf einem ATmega168.

von Oliver S. (oliverso)


Lesenswert?

Lötlackl *. schrieb:
> OUT_PORT ^= 0x01;            // toggle
> Tut nicht das, was Du vermutlich vor hast.

Doch, tut es.
Deine Lösungen dagegen tun es auf einem Mega8 nicht.

Oliver

von S. Landolt (Gast)


Lesenswert?

Wie sehen die Fuses aus?

von MaWin O. (mawin_original)


Lesenswert?

Lötlackl *. schrieb:
> OUT_PORT ^= 0x01;            // toggle
> Tut nicht das, was Du vermutlich vor hast.
>
> Pins wackeln geht anders, z.B.PIN(OUT_PORT) ^= 0x01;       // toggle

Das ist auf so vielen Ebenen falsch, dass es schon als Kunst durchgeht.

von EAF (Gast)


Lesenswert?

Lötlackl *. schrieb:
> Pins wackeln geht anders, z.B.PIN(OUT_PORT) ^= 0x01;       // toggle
> oder meinetwegenPIN(OUT_PORT) ^= _BV(OUT_PIN);

Das können diese alten AVR nicht.

von Rolf M. (rmagnus)


Lesenswert?

EAF schrieb:
> Lötlackl *. schrieb:
>> Pins wackeln geht anders, z.B.
>> PIN(OUT_PORT) ^= 0x01;       // toggle
>> oder meinetwegen
>> PIN(OUT_PORT) ^= _BV(OUT_PIN);
>
> Das können diese alten AVR nicht.

Auch auf denen, die das können, ist der Code falsch.

von Georg M. (g_m)


Lesenswert?

timer0 schrieb:
> Der Code compiled fehlerfrei, aber ich bekomme kein Signal am OUT-PORT.

Läuft wenigstens der Originalcode?

https://www.electronicsplanet.ch/mikrocontroller/source-code/ATmega8/ATmega8-Timer0-interrupt.htm

von EAF (Gast)


Lesenswert?

Rolf M. schrieb:
> Auch auf denen, die das können, ist der Code falsch.
Durchaus!
Sach ich ja nix gegen....

2 Probleme in einer Zeile.

von Oliver S. (oliverso)


Lesenswert?

Zurück zum TO:

Dein Code ist ok.

timer0 schrieb:
> Aber das macht so überhaupt keinen Sinn.

Hast du für den richtigen Prozessor compiliert, und lädst du auch das 
richtige Programm hoch?

Welche Compilerversion, und wird die aufgerufen?

Oliver

von Lötlackl *. (pappnase) Benutzerseite


Lesenswert?

EAF schrieb:
> Das können diese alten AVR nicht.

Stimmt, habe ich auch gerade rausgefunden.

Rolf M. schrieb:
> Auch auf denen, die das können, ist der Code falsch.
1
PIN(OUT_PORT) ^= _BV(OUT_PIN);
soll natürlich heißen:
1
PIN(OUT_PORT) |= _BV(OUT_PIN);
Sorry für die Verwirrung.

von MaWin O. (mawin_original)


Lesenswert?

Lötlackl *. schrieb:
> PIN(OUT_PORT) ^= _BV(OUT_PIN);
> soll natürlich heißen:PIN(OUT_PORT) |= _BV(OUT_PIN);
> Sorry für die Verwirrung.

Nein. Dein Code war richtig.
Lasse dich nicht von den Nasen hier verwirren.

von S. Landolt (Gast)


Lesenswert?

> Dein Code ist ok.
Nachdem ich nun einen ATmega16 hervorgeholt habe, läuft das 
Originalprogramm auch auf diesem, unverändert.

von MaWin O. (mawin_original)


Lesenswert?

MaWin O. schrieb:
> Nein. Dein Code war richtig.
> Lasse dich nicht von den Nasen hier verwirren.

Ok, jetzt hast du mich tatsächlich selbst verwirrt.
Du bist der Stifter der ganzen Verwirrung, nicht der Threaderteller, 
dessen Code richtig ist.

von EAF (Gast)


Lesenswert?

Lötlackl *. schrieb:
> soll natürlich heißen:PIN(OUT_PORT) |= _BV(OUT_PIN);

Auch das ist falsch.
Für die alten sowieso..
Für die neuen sollte das toggeln so aussehen:
PIN(OUT_PORT) = _BV(OUT_PIN);

von timer0 (Gast)


Lesenswert?

Georg M. schrieb:
> Läuft wenigstens der Originalcode?

Nee, das ist ja praktisch der "Originalcode".

Ich hatte in früheren Projekten ja auch ähnliche Konstrukte als Ticker 
drin. die alle liefen.  Fuses sind D4, D9, FF

Ich tippe jetzt auf ein HW Problem.
Es kann einfach nicht sein, daß Code ausserhalb der Endlosloop immer 
dann ausgeführt wird, wenn der Interrupt kommt.

Ich habe testweise folgendes gemacht: siehe test.c

Man beachte den leeren Interrupthandler!  Aber, offenbar wird das toggle 
am Programmanfang immer dann ausgeführt wenn der Interrupt kommt. Und 
das togglen erfolgt mit der richtigen Frequenz von ca 16 Hz.
Betriebsspannung ist stabil Brown-out ist disabled.

von MaWin O. (mawin_original)


Lesenswert?

timer0 schrieb:
> Ich tippe jetzt auf ein HW Problem.

Ziemlich unwahrscheinlich. Eher hast du für die falsche HW compiliert 
oder sowas in der Art.

von EAF (Gast)


Lesenswert?

timer0 schrieb:
> Aber, offenbar wird das toggle
> am Programmanfang immer dann ausgeführt wenn der Interrupt kommt.

Dauerreset?!?

Z.B. falschen Prozessor in der IDE/Makefile angegeben, und darum 
Interrupt Tabelle kaputt.

von timer0 (Gast)


Lesenswert?

Oliver S. schrieb:
> Hast du für den richtigen Prozessor compiliert, und lädst du auch das
> richtige Programm hoch?
>
> Welche Compilerversion, und wird die aufgerufen?

Oh Sch..
Klar, Fehler gefunden.  Asche auf mein Haupt.  Ich habe momentan zwei 
Projekte auf dem Tisch liegen.  Beim Programmer habe ich natürlich einen 
ATMEGA8 eingestellt, aber im Makefile die Zeile für den Prozessor 
vergessen zu ändern.  Das andere Projekt ist ein ATMEGA16.

Vielen Dank für Eure Hilfe.  Ich war lange am Suchen.

> "make.exe" all
------------------------ COMPILE timer.c -------------------------------
avr-gcc -c -mmcu=atmega8 -I. -g -Os -funsigned-char -funsigned-bitfields 
-fpack-struct -fshort-enums -Wall -W -Wstrict-prototypes 
-Wa,-ahlms=timer.lst timer.c -o timer.o
avr-gcc -mmcu=atmega8 -I. -g -Os -funsigned-char -funsigned-bitfields 
-fpack-struct -fshort-enums -Wall -W -Wstrict-prototypes 
-Wa,-ahlms=timer.o timer.o   --output timer.elf 
-Wl,-Map=timer.map,--cref -lm
avr-objcopy -O ihex -R .eeprom timer.elf timer.hex
avr-objcopy -j .eeprom --set-section-flags=.eeprom="alloc,load" 
--change-section-lma .eeprom=0 -O ihex timer.elf timer.eep
c:\WinAVR\bin\avr-objcopy.exe: --change-section-lma .eeprom=0x00000000 
never used
avr-objdump -h -S timer.elf > timer.lss
Size after:
   text     data      bss      dec      hex  filename
    114        0        0      114       72  timer.elf

Creating FLASH file "timer.e2p" for atmega8
Errors: none
----------------------------- end --------------------------------------

> Process Exit Code: 0
> Time Taken: 00:00

von Georg M. (g_m)


Lesenswert?


von S. Landolt (Gast)


Lesenswert?

ATmega8 <-> ATmega16: tja, klar, bei Letzterem, dem 'großen Bruder', 
haben die Interruptadressen 4 Bytes statt 2.

von timer0 (Gast)


Lesenswert?


von MaWin O. (mawin_original)


Lesenswert?

timer0 schrieb:
> Volle Zustimmung !!

naja. Ich glaube das ist jedem schon einmal passiert.
Mach dir nix draus. :)

von timer0 (Gast)


Lesenswert?

MaWin O. schrieb:
> naja. Ich glaube das ist jedem schon einmal passiert.

Ja, sollte aber nicht.  Aber, das Forum ist schon Klasse, wenn man blind 
vor einer Mauer steht.  Euch allen einen schönen Sonntag.

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.