Servus zusammen, ich möchte aus einer Interruptroutine heraus eine Variable "a" ändern. Diese habe ich - wie es sich gehört - global mit "volatile" deklariert. Trotzdem scheinen andere Programmteile (hier main) diese Änderung nicht zu sehen. Port a bleibt auf 0 stehen. Wenn ich die Zeile "if(a==1) PORTA=255;" aus main in die ISR kopiere, funktioniert es auch wie es soll. Kennt Ihr das Problem? Danke und 73 de DL4MCV Maurice
Müsste gehen (außer dass niemand mehr a zurücksetzt).
Was für ein Prozessor?
> SREG|=(1<<SREG_I);
Ick. sei() ist kürzer und besser zu verstehen.
Hallo Jörg, Prozessor ist ein mega128. a wird von niemnandem zurückgesetzt. Geht aber trotzdem nicht. Any idea? Danke und Ciao Maurice
P.S.: Habe auch schon verschiedene Compilerversionen ausprobiert - ohne Erfolg.
Kann ich mir fast nicht vorstellen. > TCCR1A=(1<<COM1A0); Das verlangt, dass OC1A (PB5) bei jedem compare match umschaltet. Ist wirkungslos, weil du DDRB5 nicht auf 1 gesetzt hast, der Port also kein Ausgang ist. > TCCR1B=(1<<WGM12)|(1<<CS10); Du lässt den Timer mit full speed laufen. Im Auslieferungszustand wären das 1 MHz. OCR1A steht auf 65280, d. h. nach 65 ms wird dein PORTA auf 0xFF gesetzt. Danach ändert sich an PORTA nie wieder was. Bist du dir sicher, dass du die 65 ms low-Pegel an PORTA vom vorherigen (während des Reset) hochohmigen Zustand unterscheiden kannst, um anschließend den Potenzialwechsel auf high zu sehen? Oder wolltest du was ganz anderes tun? Ach so, M103C sollte nicht gesetzt sein, falls das nicht klar war. Ansonsten verhält sich den Prozessor wie ein ATmega103, was u. a. eine andere Lage des internen RAMs bedeutet.
Hallo Jörg, da hast Du recht. DDRB=255 hab ich wieder weggelöscht, um das Programm so übersichtlich wie möglich zu machen. Ich habe den OC1A-Pin lediglich für Kontrollzwecke mit dem Oszi genutzt, um zu sehen, ob der Timer auch wirklich läuft. An PA2 hab ich eine LED hängen. Die sollte angehen, wenn 5V kommen. Aber Port A geht eben nicht auf 0xFF, sondern bleibt auf 0. Die LED bleibt zappenduster. Ich habe das Programm übrigens grad auf einen mega8 portiert, der tut alles wie er soll - ohne Probleme. Die Software soll natürlich später was anderes tun, ich hab sie halt auf das eigentliche Problem reduziert. M103C hab ich wieder ausgeschaltet. 73 de Maurice
Das Problem konnte ich einkreisen. Ich habe folgendes herausgefunden: 1. Die Variablendeklaration mit volatile erfüllt in diesem Fall nicht ihren Zweck. Wenn ich statt einer volatile-Variablen ein Portregister missbrauche (ist physikalisch ja auch nur ein 8-bit-Register), funktioniert die Sache einwandfrei. Siehe Anhang. 2. Das Problem tritt nur beim ATmega128 auf, nicht jedoch beim ATmega8. Ich werde jetzt noch checken, ob eventuell Fuse-Bit-Geschichten damit zu tun haben. Danke jedenfalls Jörg 73 de Maurice DL4MCV
Die defines sind prozessorabhängig. Sagste dem Compiler irgendwo (makefile?), daß er das für nen mega128 compilieren soll, damit er das richtige headerfile einbindet (iom128.h)? Wo sagste denn, woher der Takt fürn Timer kommt? Braucht der keinen oder ist der irgendwie default eingestellt. Cheers Detlef
Hallo Detlef, klar hab ich iom128.h im makefile eingestellt. Wo der Takt herkommen soll, stellt man mit den Clock-Select-Fusebits ein. Der Timer, der keinen Takt braucht, muss erst noch erfunden werden. Das passt schon alles, der Timer rennt ja auch. Cheers too (trinke heute ein feines fränkisches Weissbier) Maurice
> klar hab ich iom128.h im makefile eingestellt.
??
Im Makefile stellst du einen Header ein? Da solltest du eigentlich eher
irgendwas einstellen, das dafür sorgt, daß an den gcc ein
-mmcu=atmega128 übergeben wird.
Yeah. Natürlich. # MCU name MCU=atmega128 Das bedeutet dem Compiler, dass er atmega128.h einbinden soll. OK?
Nur so, beim Linken steht aber das -mmcu=atmega128 auch noch drin, ja?
Steht drin: Compiling: testit.c avr-gcc -c -mmcu=atmega128 -I. -gdwarf-2 -DF_CPU=10000000UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=testit.lst -std=gnu99 -MD -MP -MF .dep/testit.o.d testit.c -o testit.o Linking: testit.elf avr-gcc -mmcu=atmega128 -I. -gdwarf-2 -DF_CPU=10000000UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=testit.o -std=gnu99 -MD -MP -MF .dep/testit.elf.d testit.o --output testit.elf -Wl,-Map=testit.map,--cref -lm Creating load file for Flash: testit.hex avr-objcopy -O ihex -R .eeprom testit.elf testit.hex
Ich werd verrückt, Leute... habe eben WINAVR neu installiert und die ursprüngliche Version meines Programmes (mit der a-Variablen) nochmal compiliert, jetzt geht die Sache plötzlich! Werde der Sache näher auf den Grund gehen. Danke Euch allen! 73 Maurice
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.