Hallo,
folgender Code:
char text[] ="HelloAVR";
text[0]='H';
text[1]='e';
for(int ci=0; text[ci] != '\0'; ++ci)
{
putch(text[ci]);
}
putch('\n');
(putch gibt das Zeichen auf dem uart aus, geht auch)
erzeugt folgende Ausgabe auf dem Terminal:
Heì\0x01\0x0f\0x01\0x03\0x02
Das verstehe ich nicht. warum funktioniert die Zuweisung in der
initialisierung nicht?
Vielleicht kann mir jemand einen Tip geben?
Danke!
MFG
Martin
Den Code des Programmes hab ich übrigens hauptsächlihc aus Beispielen
aus dem Internet zusammenkopiert, auch den Teil mit dem String,daher
könnte der Fehler auch irgendwo anders liegen.
Gruß
Martin
mit der EZuweisung scheint aber was fault zu sein.
char text[] = "HelloAVR";
hier:
text[0]='H';
text[7]='R';
habe ich das ja eingefügt, und "H" und "R" kommen an. nur der Rest der
nicht nochmal neu zugewiesen wird wird "zerstückelt":
"aH%ì\0x01\0x0f\0x01\0x03R"
als Hexdump:
0x61 a
0x48 H
0x25 EM
0xec
0x01 SOH
0x0f SI
0x01 SOH
0x03 ETX
0x52 R
0x0a LF
a,H,R,LF sind OK.
Ich rate anhand der Namen der IO-Register, dass es für einen Atmega128
sein soll.
Sourcecode #2 kompiliert nicht mit:
AVR Studio 4.12.498 Service Pack 4
GUI Version 4, 12, 0, 491AVR Simulator 1, 0, 1, 8
ATMEGA8 243
Operating System
Major 4
Minor 10
PlatformID 1
Build 67766446
A
Plugins:
AVRPLUGINAVRASMOBJECT 1, 0, 0, 43
STK500DLL 1, 0, 1, 0
AVRPLUGINAVRGCCPLUGIN 1, 0, 0, 6
Fehlermeldungen im Build-Fenster:
Build started 7.1.2007 at 16:49:44
avr-gcc.exe -mmcu=atmega128 -Wall -gdwarf-2 -O0 -fsigned-char -MD -MP
-MT martin_text.o -MF dep/martin_text.o.d -c ../martin_text.c
../martin_text.c: In function `main':
../martin_text.c:57: error: 'for' loop initial declaration used outside
C99 mode
make: *** [martin_text.o] Error 1
Ich habe statt dem for ein while benutzt
Hallo,
danke für die Mühe. Aber kannst du dir vorstellen, wo der Fehler sein
kann?
Wenn ich jeden Buchstaben einzeln zuweise:
char text[10];
text[0]='H';
text[1]='e';
text[2]='l';
text[3]='l';
text[4]='o';
text[5]='A';
text[6]='V';
text[7]='R';
text[8]='\0';
geht es auch: HelloAVR
Es liegt also an der Zuweisung: char text[] = "HelloAVR";
:confused:
MFG
Martin
Ich kann im Moment nicht live auf einem Atmega128 testen. Läuft dein
Projekt im AVR Simulator und kannst du das Fehlverhalten dort auch
beobachten?
Ich kann den Fehler provozieren, wenn ich den falschen AVR Typ im AVR
Studio einstelle (beim AVR Simulator und/oder im Projekt).
Bitte kontrolliere deine Projekteinstellungen zum Prozessortyp beim
Kompilieren.
Hab' mir einen ATmega128 in den STK gesteckt und die Baudrate auf 9600
geändert, weil das gerade mein angeklemmtest Terminal macht:
1
loAVR
2
HelloAVR
3
HelloAVR
4
HelloAVR
5
HelloAVR
6
HelloAVR
7
HelloAVR
8
HelloAVR
9
HelloAVR
10
HelloAVR
usw. usf.
Da du offenbar Probleme mit den initialisierten Daten hast, vermute ich
die Ursache eher in deinem avr-objcopy-Kommando.
(Ich habe deine zweite Version genommen, mit -std=gnu99 compiliert auf
einem AVR-GCC 4.1.1.)
Im AVRSimulator läuft es auch mit diesen Optionen. Ich habe das Projekt
gepackt und angefügt, vielleicht ist das "funktionierende" HEX-File
interessant für dich. Toolchain war WinAVR-20060125 aus AVRStudio heraus
bedient. Bei mir heisst das Projekt anders. Leider kann man damit nur
auf ASM-Ebene in AVRStudio debuggen. Ich habe es auf die Schnelle nicht
geschafft, das externe Makefile so anzupassen, dass AVRStudio die
C-Source akzeptiert. Aber das bisschen ASM-Code hat man auch schnell so
im Blick.
> Ich habe es auf die Schnelle nicht geschafft, das externe Makefile so> anzupassen, dass AVRStudio die C-Source akzeptiert.
Hab's raus: Es ist ein schädlicher Zeilenumbruch in der Zeile mit den
CFGLAS drin ;-) Das muss alles in eine Zeile... Jetzt geht in diesem
Projekt auch Debugging auf C-Source Ebene in AVRStudio.
Merke: Makefiles nicht mit beliebigen Editoren bearbeiten! Wenn der
Editor auf automatische Zeilenumbrüche eingestellt ist oder Tabs in
Leerzeichen wandelt oder \n zu \r\n macht, kann es schwer auffindbaren
Ärger geben...
Alles sowas sollte ein Editor ja auch nicht machen...
Zeilen im Makefile kann man umbrechen, indem man am Ende ein \
notiert (aber dann direkt danach das Newline!).
Hallo,
danke euch! Das Hex File läuft bei mir auch.
Nur weiß ich leider immer noch nicht wie ich es selbst compilieren kann.
Deine AVRStudio-Files kann ich leider nicht gebrauchen, da ich unter
LINUX arbeite. Aber wenn die Flags so auch bei dir gehen, kann das ja
der Fehler auch nicht sein.
wisst ihr vielleicht noch eine "Schraube" an der ich drehen kann?
Danke und Grüße
Martin
Macht deine Toolchain unter Linux auch die *.lss und *.map Dateien? Wie
sehen die im Vergleich zur funktionierenden Version aus?
Aus dem Listing (*.lss) kann man sehen wie char text[] gefüllt wird und
aus dem Map-File (*.map), wo die Daten herkommen.
Bei deinem Programm stammt "HelloAVR" ja aus dem FLASH-ROM, wird von
dort von __do_copy_data ins SRAM kopiert (.data Bereich zwischen
__data_start und __data_end) und wird dann in main() über Register auf
den Stack kopiert.
Wie Jörg schon schrieb, ist da irgendwas faul.
Was findest du vielleicht anhand der funktionierenden Variante heraus.
Achtung: Ich habe allerdings noch zwei globale char Variablen vom
Debuggen her im Programm vergessen. Die Zuweisungen sind zwar
auskommentiert, aber der Platz wird noch angelegt.