Atmel und SDCC

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

Reply to
Andreas Schibilla
Loading thread data ...

Hellas,

Andreas Schibilla schrieb:

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

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

mfg

Reply to
Robin Wenninger

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
Reply to
Gernot Fink

Hallo!

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

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

Reply to
Andreas Schibilla

Andreas Schibillaschrieb: "

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

Dirk

Reply to
Dirk Ruth

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!
Reply to
Bernhard Roessmann

Bernhard Roessmann schrieb:

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
Reply to
Christian Zietz

Robin Wenninger schrieb:

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

Reply to
Gerald Oppen

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

Reply to
Andreas Schibilla

Andreas Schibillaschrieb: "

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

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

Reply to
Dirk Ruth

Andreas Schibilla schrieb:

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

Reply to
Ralf Kleemann

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)
Reply to
Andreas Schibilla

Andreas Schibilla schrieb:

Hallo!

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.

Reply to
Heiko Weinbrenner

Hallo Heiko!

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

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.

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

Reply to
Andreas Schibilla

Andreas Schibilla schrieb:

Hallo!

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)

Ja, genau.

HTH, Heiko.

Reply to
Heiko Weinbrenner

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!

ok, wird versucht! Danke!

MfG,

Andreas Schibilla

Reply to
Andreas Schibilla

Hallo Heiko!!!

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

Reply to
Andreas Schibilla

Andreas Schibilla schrieb:

Sehr schön!

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;"?)

Na, viel Spaß :D

MfG, Heiko.

Reply to
Heiko Weinbrenner

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.