mikrocontroller.net

Forum: Compiler & IDEs Variable über Interrupt ändern


Autor: DL4MCV (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: DL4MCV (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Jörg,

Prozessor ist ein mega128.

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

Any idea?

Danke und Ciao

Maurice

Autor: DL4MCV (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
P.S.: Habe auch schon verschiedene Compilerversionen ausprobiert - ohne
Erfolg.

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Prozessor ist ein mega128.

Ist die M103C fuse gelöscht?

Autor: DL4MCV (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja. Mit oder ohne M103C - Ergebnis negativ.

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: DL4MCV (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: DL4MCV (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Detlef _a (detlef_a)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: DL4MCV (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: DL4MCV (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Yeah. Natürlich.

# MCU name
MCU=atmega128

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

OK?

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

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

Autor: DL4MCV (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: DL4MCV (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.