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.
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 |
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.)
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.