Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Atmel und SDCC

26 views
Skip to first unread message

Andreas Schibilla

unread,
May 10, 2005, 6:01:36 AM5/10/05
to
Hallo alle zusammen,


ich versuche mit dem AT89C5131A von Atmel eine Schaltung aufzubauen, die
über USB Daten austauschen soll.
Ich habe den Mikrocontroller wie im Datenblatt gezeigt beschaltet und
übertrage meine Programme (Hex-Dateien) mittels Flip über USB zum
Controller.
Mein unter Keil geschriebenes C-Testprogramm, das lediglich 4 LED's
ansteuert, kann ich fehlerlos compilieren und die entstandene Hex-Datei in
den Controller laden, klappt wunderbar!

Jetzt habe ich versucht, das gleiche Programm unter SDCC zu compilieren (mit
den entspr. Headerfiles für SDCC von Atmel). Dies klappt auch fehlerlos,
wenn ich jedoch die IHX-Datei via Flip zum Controller übertrage bleibt alles
stehen und nichts läuft mehr. Muss ich beim compilieren/linken mit SDCC
irgendwas beachten?
Die Dateiendung ist dort IHX und nicht HEX, macht das einen Unterschied?
Hat jemand einen Tipp, wie ich SDCC mit dem Atmel zum Laufen bekomme?


Hier mein kleines Programm:

#include "at89c5131.h" /* Headerfile von der Atmel Homepage */

void main(void)
{
LEDCON = 0x0F;
P3_3 = 1;
P3_5 = 0;
P3_6 = 1;
P3_7 = 0;
while (1) { }
}


Gibt es irgendwo weitere Beispiele oder Tipps zum Thema USB mit dem Chip?
Ich habe auf der Atmel-Homepage gesehen, dass es ein Starter Kit
"AT89STK-05" von Atmel gibt. Weiß jemand, wo man das bekommen kann (bei den
angegebenen Distributoren wurde ich nicht fündig)?


Schöne Grüße und schonmal vielen Dank,

Andreas Schibilla


Robin Wenninger

unread,
May 10, 2005, 11:56:00 AM5/10/05
to
Hellas,

Andreas Schibilla schrieb:


> Die Dateiendung ist dort IHX und nicht HEX, macht das einen Unterschied?
> Hat jemand einen Tipp, wie ich SDCC mit dem Atmel zum Laufen bekomme?

die Dateiendung ist nicht relevant, ist trotzdem Intel Hex (iirc).

> Hier mein kleines Programm:
>
> #include "at89c5131.h" /* Headerfile von der Atmel Homepage */
>
> void main(void)
> {
> LEDCON = 0x0F;
> P3_3 = 1;
> P3_5 = 0;
> P3_6 = 1;
> P3_7 = 0;
> while (1) { }
> }

Welche Funktion hat denn das "while(1) { }" da unten?


mfg

Gernot Fink

unread,
May 10, 2005, 12:01:33 PM5/10/05
to
In article <3ebf3tF...@uni-berlin.de>,
"Andreas Schibilla" <sp...@as3.de> writes:
> Hallo alle zusammen,

>
>
> Jetzt habe ich versucht, das gleiche Programm unter SDCC zu compilieren (mit
> den entspr. Headerfiles für SDCC von Atmel). Dies klappt auch fehlerlos,
> wenn ich jedoch die IHX-Datei via Flip zum Controller übertrage bleibt alles
> stehen und nichts läuft mehr. Muss ich beim compilieren/linken mit SDCC
> irgendwas beachten?

Die IHX- files vom SDCC enthalten lücken und sind nicht zwingend in
aufsteigende Richtung sortiert

Vieleicht brauchst du ein tool wie packihx.
Vergleiche einfach mal die Hexfiles der beiden Compiler.

--
MFG Gernot

Andreas Schibilla

unread,
May 10, 2005, 2:02:10 PM5/10/05
to
Hallo!

>
>Welche Funktion hat denn das "while(1) { }" da unten?
>

das ist nur eine Endlosschleife, die später natürlich erweitert wird.

> Die IHX- files vom SDCC enthalten lücken und sind nicht zwingend in
> aufsteigende Richtung sortiert
>
> Vieleicht brauchst du ein tool wie packihx.
> Vergleiche einfach mal die Hexfiles der beiden Compiler.

Vielen Dank für die Info. Im SDCC-Bin Ordner gibt es das Tool "packihx.exe",
das diese Aufgabe
übernimmt. Leider läuft mein Programm auch damit nicht :-(((

Gibt es evtl. spezielle Parameter z.B. für's Linken, die für den At89C5131A
wichtig sind????

Schöne Grüße,

Andreas Schibilla


Dirk Ruth

unread,
May 10, 2005, 2:45:21 PM5/10/05
to
Andreas Schibillaschrieb:

Kannst Du mal das Assemblerlisting und das Map-File, dass der SDCC
erzeugt mit dem vom Keil vergleichen?

Dirk

Bernhard Roessmann

unread,
May 10, 2005, 3:01:32 PM5/10/05
to
Wie waere es mit dem gcc fuer avr?
Ist auch kostenlos und irgendwie eher ein "richtiger" Compiler (bitte
nicht pruegeln fuer diese Formulierung...).

LG,

--
Bernhard Roessmann
Don't Fear The Penguins!

Christian Zietz

unread,
May 10, 2005, 3:08:37 PM5/10/05
to
Bernhard Roessmann schrieb:

> Wie waere es mit dem gcc fuer avr?
> Ist auch kostenlos und irgendwie eher ein "richtiger" Compiler

Produziert dafür aber keinen Code für eine 8051er, wie es der AT89C5131A
des OP nunmal ist. Merke: Nicht alles, was von Atmel kommt, ist auch
ein AVR.

CU Christian
--
Christian Zietz - CHZ-Soft - czietz (at) gmx.net
WWW: http://www.chzsoft.com.ar/
PGP-Key-ID: 0x6DA025CA

Gerald Oppen

unread,
May 10, 2005, 7:09:30 PM5/10/05
to

Robin Wenninger schrieb:


>>void main(void)
>>{
>> LEDCON = 0x0F;
>> P3_3 = 1;
>> P3_5 = 0;
>> P3_6 = 1;
>> P3_7 = 0;
>> while (1) { }
>>}
>
> Welche Funktion hat denn das "while(1) { }" da unten?

Ein Mikrocontrollerprogramm hat kein Ende, darum muss man dafür sorgen
dass er in einer Endlosschleife läuft bevor er unkrontrolliert versucht
unbeschriebene bzw. undefinierte Speicherbereiche als Programmcode zu
interpretieren.

Gerald

Andreas Schibilla

unread,
May 11, 2005, 1:15:28 PM5/11/05
to

> Kannst Du mal das Assemblerlisting und das Map-File, dass der SDCC
> erzeugt mit dem vom Keil vergleichen?
>

Ich habe mir das Assemblerlisting von SDCC angeschaut und festgestellt, dass
dort ein rel. langer Startup-Code eingefügt wurde. Von Keil habe ich leider
keine ASM-Datei bekommen (wie geht das?), aber die Hex-Datei ist
wesentlicher kürzer ausgefallen als die vom SDCC.
Wenn das Problem beim SDCC wirklich am autom. erzeugten Code liegt, wie kann
ich das beeinflussen? Welche Parameter muss ich setzen? Ich habe in der SDCC
Doku allerhand Parametermöglichkeiten gefunden und ausprobiert, jedoch
bislang ohne Erfolg...

Schöne Grüße,

Andreas Schibilla


Dirk Ruth

unread,
May 11, 2005, 4:32:36 PM5/11/05
to
Andreas Schibillaschrieb:

"
>
>> Kannst Du mal das Assemblerlisting und das Map-File, dass der SDCC
>> erzeugt mit dem vom Keil vergleichen?
>>
>
>Ich habe mir das Assemblerlisting von SDCC angeschaut und festgestellt, dass
>dort ein rel. langer Startup-Code eingefügt wurde. Von Keil habe ich leider
>keine ASM-Datei bekommen (wie geht das?), aber die Hex-Datei ist
>wesentlicher kürzer ausgefallen als die vom SDCC.

In der µVision unter Project->Options for Target '...' im Reiter
Listing entsprechendes anklicken.

>Wenn das Problem beim SDCC wirklich am autom. erzeugten Code liegt, wie kann
>ich das beeinflussen? Welche Parameter muss ich setzen? Ich habe in der SDCC
>Doku allerhand Parametermöglichkeiten gefunden und ausprobiert, jedoch
>bislang ohne Erfolg...


Dann schau Dir doch erstmal den Startup-Code an. Beim Keil sind das
die *.a51 Files im Lib-Verzeichnis. Beim SDCC ist es _startup.asm im
lib-Verzeichnis. Hab gerade mal in die Hilfe des SDCC gesehen. Da
gibt's ja unzählige Switches, die man setzen kann.

Hast Du auch das richtige Memory-Modell ausgewählt?

Im startup wird eigendlich nur der RAM gelöscht, static's
initialisiert, evtl. der Stackpointer gesetzt und dann in die main
gehüpft.

Gib's zu Deinem Controller keinen Debugger, ICE oder Monitor? Evtl.
auch mal einen Simulator verwenden und dort den Code ausprobieren.

Dirk

Ralf Kleemann

unread,
May 12, 2005, 6:45:55 PM5/12/05
to
Andreas Schibilla schrieb:

> Ich habe mir das Assemblerlisting von SDCC angeschaut und festgestellt, dass
> dort ein rel. langer Startup-Code eingefügt wurde. Von Keil habe ich leider
> keine ASM-Datei bekommen (wie geht das?), aber die Hex-Datei ist
> wesentlicher kürzer ausgefallen als die vom SDCC.
> Wenn das Problem beim SDCC wirklich am autom. erzeugten Code liegt, wie kann
> ich das beeinflussen? Welche Parameter muss ich setzen? Ich habe in der SDCC
> Doku allerhand Parametermöglichkeiten gefunden und ausprobiert, jedoch
> bislang ohne Erfolg...

Ich benutze den sdcc zum programmieren des at89S8252 und habe damit
keine Probleme.

Wenn ich den sdcc wie folgt starte, bekomme ist einen recht kurzen
Startup-Code:

./sdcc --no-xinit-opt test.c

Hier ist ein Auszug aus der lst-Datei:


348 ;---------------------------------
349 ; global & static initialisations
350 ;---------------------------------
351 .area GSINIT (CODE)
352 .area GSFINAL (CODE)
353 .area GSINIT (CODE)
0000 354 __sdcc_gsinit_startup:
0000 75 81rFF 355 mov sp,#__start__stack - 1
0003 12s00r00 356 lcall __sdcc_external_startup
0006 E5 82 357 mov a,dpl
0008 60 03 358 jz __sdcc_init_data
000A 02s00r2C 359 ljmp __sdcc_program_startup
000D 360 __sdcc_init_data:
361 .area GSFINAL (CODE)
0000 02s00r2C 362 ljmp __sdcc_program_startup

371 .area CSEG (CODE)
002C 372 __sdcc_program_startup:
002C 12s00rD3 373 lcall _main
374 ; return from main will lock up
002F 80 FE 375 sjmp .


Und hier ist ein auszug aus dem Binärcode.

0000: 02 03 37 32 FF FF FF ...
...
0330: 01 05 22 75 82 00 22 75 81 37 12 03 33 E5 82 60
0340: 03 02 00 2C 02 00 2C FF FF FF FF FF FF FF FF FF


Gruß Ralf

Andreas Schibilla

unread,
May 13, 2005, 6:06:46 AM5/13/05
to

> Dirk Ruth wrote:
>...

> Ralf Kleemann wrote:
> ...


Vielen Dank für eure Tipps!!!
Aber leider funktioniert der SDCC bei mir immer noch nicht.
Ich habe als Memory-Modell "--model-small" angegeben, da ich keinen externen
Speicher angeschlossen habe.
Auch die Option "--no-xinit-opt" ändert nichts.
Die Größe des Startup-Codes (und Hex-Files) ist zwar geschrumpft und es wird
im wesentlichen nur zum Hauptprogramm gesprungen, meine Test-LED's leuchten
aber trotzdem nicht.
Das gleiche Programm mit Keil compiliert läuft tadelos...

Schöne Grüße,

Andreas Schibilla


Hier ein Auszug aus dem erzeugten Asm-File:

;--------------------------------------------------------
; global & static initialisations
;--------------------------------------------------------
.area GSINIT (CODE)
.area GSFINAL (CODE)
.area GSINIT (CODE)
__sdcc_gsinit_startup:
mov sp,#__start__stack - 1
lcall __sdcc_external_startup
mov a,dpl
jz __sdcc_init_data
ljmp __sdcc_program_startup
__sdcc_init_data:
;sdcc01.c:29: }

; genAssign
mov _ACC,#0xE0
;sdcc01.c:30: }

; genAssign
mov _B,#0xF0
;sdcc01.c:31: }

; genAssign
mov _PSW,#0xD0
;sdcc01.c:32: }

.....

; genAssign
setb _EP0INT
.area GSFINAL (CODE)
ljmp __sdcc_program_startup
;--------------------------------------------------------
; Home
;--------------------------------------------------------
.area HOME (CODE)
.area CSEG (CODE)
;--------------------------------------------------------
; code
;--------------------------------------------------------
.area CSEG (CODE)
__sdcc_program_startup:
lcall _main


; return from main will lock up

sjmp .
;------------------------------------------------------------
;Allocation info for local variables in function 'main'
;------------------------------------------------------------
;------------------------------------------------------------
;sdcc01.c:3: void main(void)
; -----------------------------------------
; function main
; -----------------------------------------
_main:
ar2 = 0x02
ar3 = 0x03
ar4 = 0x04
ar5 = 0x05
ar6 = 0x06
ar7 = 0x07
ar0 = 0x00
ar1 = 0x01
;sdcc01.c:5: LEDCON = 0x0F;
; genAssign
mov _LEDCON,#0x0F
;sdcc01.c:6: P3_3 = 1;
; genAssign
setb _P3_3
;sdcc01.c:7: P3_5 = 0;
; genAssign
clr _P3_5
;sdcc01.c:8: P3_6 = 1;
; genAssign
setb _P3_6
;sdcc01.c:9: P3_7 = 0;
; genAssign
clr _P3_7
;sdcc01.c:10: while (1) { }
00102$:
; Peephole 112.b changed ljmp to sjmp
sjmp 00102$
00104$:
ret
.area CSEG (CODE)

Heiko Weinbrenner

unread,
May 13, 2005, 2:31:20 PM5/13/05
to
Andreas Schibilla schrieb:

Hallo!

> Das gleiche Programm mit Keil compiliert läuft tadelos...

Ich habe heute zum ersten mal etwas mit dem SDCC kompiliert (8051).

Die Zeile sieht so aus und funktioniert:
sdcc -mmcs51 --out-fmt-ihx --model-small --opt-code-size --debug
--std-sdcc89 main.c

Atmels at89c5131.h sieht aber nicht so aus, wie die, die ich z.B. für
den 89LPC935 gebastelt habe.

Ich weiß ja nicht, was der SDCC bei sbit und sfr alles durchgehen läßt...

In den eigenen Dateien vom SDCC (und jetzt auch bei mir) sieht das so aus:

__sfr __at 0x80 P0;
__sbit __at 0x80 P00;
__sbit __at 0x81 P01;
__sbit __at 0x82 P02;
__sbit __at 0x83 P03;
__sbit __at 0x84 P04;
__sbit __at 0x85 P05;
__sbit __at 0x86 P06;
__sbit __at 0x87 P07;

Ohne die "__" sollte es auch gehen (so steht es im Manual- habe ich
gerade nachgeschaut).

Versuche mal LEDCON und P3_x in diese Form zu bringen- kann auf jeden
Fall nicht schaden!

HTH, Heiko.

Andreas Schibilla

unread,
May 14, 2005, 12:37:29 PM5/14/05
to
Hallo Heiko!


Vielen Dank für deine Tipps, aber leider habe ich es immer noch nicht
hinbekommen.


> Die Zeile sieht so aus und funktioniert:
> sdcc -mmcs51 --out-fmt-ihx --model-small --opt-code-size --debug
> --std-sdcc89 main.c

Wenn ich die Optionen so verwende, bekomme ich folgende Warnungen:

-:0: warning: unknown compiler option '--opt-code-size' ignored
-:0: warning: unknown compiler option '--std-sdcc89' ignored

Der Compiler scheint die beiden Parameter nicht zu kennen.


>...
>__sfr __at 0x80 P0;
>...


> Versuche mal LEDCON und P3_x in diese Form zu bringen

Leider weiß ich nicht genau, was du damit meinst.
Soll ich die Headerdatei "at89c5131.h" von Atmel ändern?


Schöne Grüße und ein schönes Wochenende,

Andreas Schibilla


Heiko Weinbrenner

unread,
May 14, 2005, 12:45:29 PM5/14/05
to
Andreas Schibilla schrieb:

Hallo!

> Wenn ich die Optionen so verwende, bekomme ich folgende Warnungen:
>
> -:0: warning: unknown compiler option '--opt-code-size' ignored
> -:0: warning: unknown compiler option '--std-sdcc89' ignored
>
> Der Compiler scheint die beiden Parameter nicht zu kennen.

Welche Version hast du denn?

sdcc --version

Meldet bei mir:
SDCC : mcs51/gbz80/z80/avr/ds390/pic16/pic14/TININative/xa51/ds400/hc08
2.5.0-pre1 #1018 (May 7 2005) (MINGW32)

>>Versuche mal LEDCON und P3_x in diese Form zu bringen
>
>
> Leider weiß ich nicht genau, was du damit meinst.
> Soll ich die Headerdatei "at89c5131.h" von Atmel ändern?

Ja, genau.

HTH, Heiko.

Andreas Schibilla

unread,
May 14, 2005, 12:53:46 PM5/14/05
to
> Welche Version hast du denn?
>
> sdcc --version

meine ist:
SDCC : mcs51/gbz80/z80/avr/ds390/pic16/pic14/TININative/xa51/ds400/hc08
2.4.0 (F
eb 23 2004) (MINGW32)

Ich werde mir mal die neue downloaden!

>> Leider weiß ich nicht genau, was du damit meinst.
>> Soll ich die Headerdatei "at89c5131.h" von Atmel ändern?
>
> Ja, genau.

ok, wird versucht! Danke!

MfG,

Andreas Schibilla


Andreas Schibilla

unread,
May 14, 2005, 1:13:18 PM5/14/05
to
Hallo Heiko!!!

>>> Versuche mal LEDCON und P3_x in diese Form zu bringen
>>

Ich habe die Headerdatei entsprechend angepasst und es funktioniert
tatsächlich!!!! Super! Vielen Dank!

Bleibt nur die Frage, warum Atmel die Headerdateien nicht so aufgebaut hat,
immerhin bieten sie ja schon
unterschiedliche Versionen für unterschiedliche Compiler an...

Dann werde ich mal die anderen Register im Headerfile korrigieren.

Schöne Grüße,


Andreas Schibilla


Heiko Weinbrenner

unread,
May 14, 2005, 1:17:16 PM5/14/05
to
Andreas Schibilla schrieb:


> Ich habe die Headerdatei entsprechend angepasst und es funktioniert
> tatsächlich!!!!

Sehr schön!

> Bleibt nur die Frage, warum Atmel die Headerdateien nicht so aufgebaut hat,
> immerhin bieten sie ja schon
> unterschiedliche Versionen für unterschiedliche Compiler an...

Vom Keil- Verzeichnis ins SDCC- Verzeichnis kopieren ist halt um einiges
einfacher als das, was du jetzt machen musst ;)
Obwohl ich diese "Notation" auch nicht von Keil her kenne (ist aber
schon etwas länger her- war Keil nicht so in der Art: "sbit P00=0x80;"?)

> Dann werde ich mal die anderen Register im Headerfile korrigieren.

Na, viel Spaß :D

MfG, Heiko.

0 new messages