Forum: Compiler & IDEs Variable über Interrupt ändern


von DL4MCV (Gast)


Angehängte Dateien:

Lesenswert?

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

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

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.

von DL4MCV (Gast)


Lesenswert?

Hallo Jörg,

Prozessor ist ein mega128.

a wird von niemnandem zurückgesetzt. Geht aber trotzdem nicht.

Any idea?

Danke und Ciao

Maurice

von DL4MCV (Gast)


Lesenswert?

P.S.: Habe auch schon verschiedene Compilerversionen ausprobiert - ohne
Erfolg.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

> Prozessor ist ein mega128.

Ist die M103C fuse gelöscht?

von DL4MCV (Gast)


Lesenswert?

Ja. Mit oder ohne M103C - Ergebnis negativ.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

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.

von DL4MCV (Gast)


Lesenswert?

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

von DL4MCV (Gast)


Angehängte Dateien:

Lesenswert?

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

von Detlef _. (detlef_a)


Lesenswert?

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

von DL4MCV (Gast)


Lesenswert?

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

von Rolf Magnus (Gast)


Lesenswert?

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

von DL4MCV (Gast)


Lesenswert?

Yeah. Natürlich.

# MCU name
MCU=atmega128

Das bedeutet dem Compiler, dass er atmega128.h einbinden soll.

OK?

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Nur so, beim Linken steht aber das -mmcu=atmega128 auch noch
drin, ja?

von DL4MCV (Gast)


Lesenswert?

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

von DL4MCV (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.