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.
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.
Wackelt der Pin denn wenn Du Dein Toogle-Konstrukt in die For-Schleife setzt und den Interrupt nicht enablest ?
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.
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); |
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!
> Tut nicht das ... Pins wackeln geht anders
?
Also bei mir läuft das, mutatis mutandis, auf einem ATmega168.
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
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.
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.
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.
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
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.
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
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.
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.
> Dein Code ist ok.
Nachdem ich nun einen ATmega16 hervorgeholt habe, läuft das
Originalprogramm auch auf diesem, unverändert.
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.
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);
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.
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.
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.
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
ATmega8 <-> ATmega16: tja, klar, bei Letzterem, dem 'großen Bruder', haben die Interruptadressen 4 Bytes statt 2.
Georg M. schrieb: > https://norwegianfarmersson.files.wordpress.com/2021/06/2nfs-6.04s.png Volle Zustimmung !! Schönen Sonntag
timer0 schrieb: > Volle Zustimmung !! naja. Ich glaube das ist jedem schon einmal passiert. Mach dir nix draus. :)
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.