Forum: Mikrocontroller und Digitale Elektronik Atmega8A: loop über Ports/Pins funktioniert nicht


von Np R. (samweis)


Angehängte Dateien:

Lesenswert?

Hallo!

Da habe ich ein altes Board gefunden, auf das ich irgendwann einen 
Atmega8A gelötet hatte, und wollte "mal eben" testen, ob's noch 
funktioniert.
"Mal eben" ist jetzt zwei Tage her und ich bin ausreichend frustriert, 
um hier nachzufragen:

m8a_Pin-Test.c funktioniert, m8a_Pin-Test2.c funktioniert nicht. Warum?

Hintergrund:
Ich hatte die Idee einen Array für die Port-Pins anzulegen und in der 
Timer-ISR über die einzelnen Pins zu gehen und jeweils einen auf Output, 
low zu stellen und alle anderen auf Input mit pull-up.

Aber nichts tat sich.
Nun kann man sich ja mit Pointern beim Dereferenzieren ins Knie 
schießen, besonders, wenn der Compiler auf die Idee kommt, den Array im 
Flash zu belassen.

Testweise habe ich den Array mal mit "const PinDesc PROGMEM..." 
absichtlich im Flash gelassen und von dort mit pgm_read_word() 
ausgelesen. Das funktioniert, und die Pins werden wie erwartet 
getoggelt.

Dann habe ich die "Array im RAM"-Version (m8a_Pin-Test2.c) so 
umgestrickt, dass sie fast genau der "Array im Flash"-Version 
(m8a_Pin-Test.c) entspricht - sie funktioniert trotzdem nicht.
Die ISR wird aufgerufen, das ist es nicht.
Der Array liegt in der .data section, sollte von __do_copy_data ins RAM 
kopiert worden sein und hat da offenbar auch einen von 0 verschiedenen 
Inhalt. Also muss der wohl den falschen Typ haben - aber wie? Ich seh's 
nicht.
Und sowohl in simulavr als auch in simavr funktioniert die "Array im 
RAM"-Version.

von Np R. (samweis)


Lesenswert?

Oh, vergessen: Ich nutze avr-gcc 14.1 aus eclipse mit:
1
gcc -mmcu=${DEVICE} -DF_CPU=16000000UL -I/Pfad/zu/avr-gcc-14.1.0-x64-linux/avr/include -Os -Wall -c -fmessage-length=0 -ffunction-sections -fdata-sections

von Manuel H. (Firma: Universität Tartu) (xenos1984)


Lesenswert?

Was genau funktioniert denn nicht? Die Pins werden nicht geschaltet? 
Hast du mal versucht...

* die erzeugte Programmdatei zu disassemblieren und beide Versionen zu 
vergleichen, ob die Daten dort sind bzw. abgelegt werden, wo sie sein 
sollen?
* die Daten zu Beginn des Programms seriell auszugeben und zu 
vergleichen?

(Wobei mit Daten das Array der Pin-Adressen gemeint ist.)

von Np R. (samweis)


Lesenswert?

Manuel H. schrieb:
> Was genau funktioniert denn nicht? Die Pins werden nicht geschaltet?
Genau.
Es rühren sich nur die "zum Debuggen" ohne Zugriff auf den Array 
getoggelten PB0 und PD2.

> Hast du mal versucht...
>
> * die erzeugte Programmdatei zu disassemblieren und beide Versionen zu
> vergleichen, ob die Daten dort sind bzw. abgelegt werden, wo sie sein
> sollen?
Ja. Bei der Flash-Version liegt das Array in .text, bei der RAM-Version 
in .data. Der Inhalt scheint identisch.

> * die Daten zu Beginn des Programms seriell auszugeben und zu
> vergleichen?
Das kommt morgen, wenn ich wieder zu Hause bin. Ich habe gerade keinen 
USB-seriell-Adapter bei mir.
Aber in m8a_Pin-Test2.c wird der Inhalt des Arrays geprüft. Wenn da 
nichts drin wäre, würde PD2 nicht getoggelt. Wird er aber.

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.