Forum: Mikrocontroller und Digitale Elektronik AT89C2051 und Keil µVision


von Manfred B. (fredl0511)


Lesenswert?

Hallo,

ich habe mir von Keil µVision das Hex File erstellt. Wenn ich das 
Hex-File aber in den Galep lade, hab ich immer einen Offset von 0x7FF 
d.h. Das Programm fängt erst ab Adresse 0x800 an??? Mein Flash hat aber 
nur 2kB d.h. bis 0x7FF programmierbar. Galep regt sich darüber natürlich 
auf und weigert sich was zu tun.

Wo kann ich im Keil einstellen, dass das Programm schon ab Adresse 
0x0000 anfängt?????

mfg

Manfred

von Lars (Gast)


Lesenswert?

Das Problem habe ich auch schon festgestellt. Es liegt daran, dass du 
wahrscheinlich nur die Evaluierungsversion von Keil benutzt. In dieser 
wird scheinbar versucht relative Segmente (rseg) zu blockieren. Lass 
einfach mal die rseg's weg und schreib statisch hintereinander weg, dann 
sollte es funktionieren.

von Manfred B. (fredl0511)


Lesenswert?

@Lars: was genau meinst du mit "Lass
einfach mal die rseg's weg und schreib statisch hintereinander weg"????

Ich habe jetzt noch folgendes probiert. Das File welches mir Keil 
erstellt ist ein Hex-File. Galep will aber lieber ein Bin.File haben 
also nicht das aufgeblassene Hex-File. Jetzt passt das Programm  auch in 
den Flash-Speicher. Jedoch will Galep noch immer nicht programmiern bzw. 
weder lesen noch löschen...verdammt......

Manfred

von Manfred B. (fredl0511)


Lesenswert?

Ok, das mit dem Bin-File funktioniert auch nicht. Hab noch ein Hex-File 
probiert und siehe da, Galep programmiert den µC. Aber wie schaffe ich 
es dass mein Hex-File schon bei 0x00 anfängt und nicht bei 0x800???

Manfred

von Lars (Gast)


Lesenswert?

also 0x000 wird mit org 000h erzwungen ;-)
und wenn du irgendwelche "rseg" befehle in deinem code siehst, dann 
kommentiere sie bitte aus
schreib erstmal was einfaches

sowas zum beispiel

org 000h
test:
nop
inc a
sjmp test

da passiert nichts spektakuläres und das steht bei 0x000

von Manfred B. (fredl0511)


Lesenswert?

@Lars: Ich habe vergessen zu erwähnen das mein Programm in C 
vorliegt,sorry.

Manfred

von Matthias (Gast)


Lesenswert?

Der Offset ist in der Keil-Demoversion erzwungen, damit werden MCs mit 
kleinen interen FLASH, wie Du hast, ausgesperrt. Sonst würde ja keiner 
die Vollversion kaufen.

Vielleicht ist SDCC (kostenlos) mit IDE eine Alternative.
www.opcube.com

Dieser C-Compiler hat diese Einschränkung nicht.

Gruß Matthias

von Manfred B. (fredl0511)


Lesenswert?

Hallo, Danke für eure Antworten.

Hab jetzt das Entwicklungstool von Cypress 
(http://www.cypress.com/portal/server.pt?in_hi_opt_comm_community=223&in_hi_space=SearchResult&in_hi_control=bannerstart&in_tx_query=Keil) 
benutzt. Da ist KeilµVision2 dabei und programmierbar bis zu 4kb
Jetzt fängt auch der COde bei 0x00an :-)

Jedoch kann man als Target nur ein paar spezielle CHips von Cypress 
auswählen.  Ich hab jetzt als Target keines Ausgewählt aber unter 
Options for Target steht mein AT89C2051 drin! Jedoch stimmt jetzt 
irgendwas mit dem Timing nicht mehr ganz. Hab eine Schleife die vorher 
genau 1ms dauerte und die dauert jetzt plötzlich nur mehr 680µs ????


mfg
Manfred

von Matthias (Gast)


Lesenswert?

Die Target-Einstellung ist für 8051er relativ bedeutungslos, da alle in 
den Grundfunktionen kompatibel sind. Du musst nur dafür sorgen, das die 
Linkereinstellungen deinem Typ entsprechen, zB.:

RAMSIZE(256)
CODE ( 0X0000-0X07FF )
und ggf.
XDATA( 0X0000-0X1FFF )
PDATA( 0X0000 )

(muss nicht zu Deinen MC passen, musst halt genau das  Datenblatt 
lesen!)

Dann musst Du auf jedem Fall im C-Prg. das richtige Include mit den SFR 
für deinen MC einbinden, Bsp.

#include <at89c51.h>

Das Timing-Problem dürfte nichts mit Keil zu tun haben. Eventuell ist 
eine andere Optimierungsoption eingestellt, so das der code nun 
effizienter ist.

#pragma optimize(8,size)  // speed oder size Dokumentation lesen

von Manfred B. (fredl0511)


Lesenswert?

@Matthias : Wo genau soll ich diese Daten eingeben? Unter BL51 Locate 
und dann unter Code Range 0x07FF??? Was genau geb ich unter Data, Idata 
,Pdata an?? RAM hat der 2051er 128. Anmerkung: Im Programm werden auch 
variablen mit idata verwendet.Muss ich da irgendwie was voreinstellen?

mfg
Manfred

von Matthias (Gast)


Lesenswert?

Bei "Target" und/oder "BL51-Locate".
Entscheidend ist was letztlich bei "BL51-Locate" unten als 
LINKER-CONTROL-STRING steht, auch mal weiter runterscrollen. Der Linker 
orientiert sich nur an dem was da steht.

Wichtig ist, das da
RAMSIZE(128)
CODE ( 0X0000-0X07FF )
steht

Bei BIT,DATA,IDATA,STACK nichts vorgeben, dann gelten 
Standardeinstellungen. PDATA kannst du eh nur nutzen, wenn auch XDATA da 
wäre, also beides offenlassen.

Im C-Programm kann auch IDATA verwendet werden, wenn der MC nur 128Byte 
hat. Besser wäre aber nur DATA zu verwenden oder den Präfix ganz weg zu 
lassen. (Memorymodell "Small" einstellen, dann gelangen automatische 
alle Variablen ohne Speicherbereichsangabe ins interne DATA)

von Manfred B. (fredl0511)


Lesenswert?

@Matthias: RAMSIZE kann ich nirgendwo einstellen das mir das im Linker 
Control string steht....

von Matthias (Gast)


Lesenswert?

Vermutlich wird RAMSIZE automatisch erstellt, aus den Angaben in der 
Device-Datenbank. Ohne Angabe von RAMSIZE im Linker-control-String wird 
auch nur 128Byte benutzt.

Versuch doch mal bei File/Device-Database mit ADD den 89C2051 neu zu 
erstellen. Die Befehle sind in der Doku. erleutert. Kannst auch ein 
anderes Device als Vorlage nehmen.
sollte dort etwa so aussehen:
CPU=IRAM(0 - 0x7F) IROM(0 - 0x7FF) CLOCK(24000000)

Kannst auch von deiner anderen Demoversion die Einstellung abschauen.

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.