Hallo,
ich versuche gerade, mit U. Bangerts Programm AtmelISP (Aktuelle Version
vom 21.5.2005) den AT89S52 zu programmieren. Beim Laden einer
(minimalen) Datei erhalte ich jedoch die Meldung "The Hexfile you are
going to load contains addresses beyond the buffer capacity...", obwohl
die Datei passen müsste.
Beim Versuch, den Buffer zu editieren, kommt die Meldung "Invalid
SelStart". Wähle ich zum Laden eine anderes Device und wähle danach den
89S52, dann lässt er sich programmieren, aber das kann ja nicht im Sinne
des Erfinders sein.
Code:
Schau Dir mal das HEX-File mit einem beliebigen Editor an. Dort kannst
Du sehen, wohin der Linker den Code im Speicher plaziert hat. Im
Datenblatt des Controllers findest du den Programmspeicherbereich. Das
muss natürlich zusammenpassen.
Wie das HEX-File aufgebaut ist, findest Du z.B. unter
http://www.schulz-koengen.de/biblio/intelhex.htm
Welche Keil-Version (Demo)?
Auf Weche Adresse hast Du das Programm gelinkt? Sieht danach aus, als
willst Du das Programm in einen Bereich laden, wo der AT89S52 gar keinen
FLASH hat.
Ja habs mit dem Demo von Keil compiliert.
Wo kann ich das einstellen, auf welche Adresse ich das Programm gelinkt
haben möchte?
Muss ich das schon in Keil einstellen, bevor ich compilier?
In AtmelISP hab ich nämlich nichts gefunden, wo ich einstellen könnte,
wohin das Programm geladen wird.
Grüße Alex
Also der Hex-Code sieht ok aus. Dein Programm wird ab Adresse 0800H
geladen. Das ist ok, weil die Demoversion von Keil einen 2KByte Offset
generiert. Auf Adresse 0000H (Startvector) steht auch der richtige
Einsprungpunkt. An Keil sollte es nicht liegen.
>(Aktuelle Version vom 21.5.2005)
Ein aktuelleres Tool zum programmieren wäre empfehlenswert, z.B.:
http://www.amwaw.edu.pl/~adybkows/elka/ispprog.html
ist sehr schnell und einfach zu bedienen, läuft auch unter Vista
Hab mal für Dich gegoogelt. Es gibt eine aktuellere Version (22.06.2006)
vom Bangert ATMELISP, siehe:
http://www.ulrich-bangert.de/html/downloads.html
Damit kann ich zumindest Deinen HEX-Code ohne Probleme laden und
editieren.
Freeware C-Compiler für 8051 gibt es auch, google mal selber nach SDCC.
Dane,
So habe MIDE heruntergeladen.
Compilen, downloaden klappt alles super, aber ...
Folgendes problem:
Ich will ein ganzen Port auf ein setzen, nur es passiert nichts.
Programmcode:
1
#include<at89x52.h>
2
3
voidmain(void){
4
P1=0xFF;
5
6
while(1){
7
P1|=0xFF;
8
}
9
}
Hex-Code:
:03000000020003F8
:03005C0002005F40
:05005F0012006480FEA8
:030064007590FF95
:07006700E5907590FF80F9A0
:06003200E478FFF6D8FDA2
:080010007900E94400601B7A4D
:05001800009000727869
:03001D000075A0CB
:0A00200000E493F2A308B800020503
:08002A00A0D9F4DAF275A0FF81
:080038007800E84400600A7939
:030040000075A0A8
:0600430000E4F309D8FC03
:080049007800E84400600C7926
:0B00510000900000E4F0A3D8FCD9FAF6
:03000300758107FD
:0A00060012006EE582600302005F45
:04006E007582002275
:00000001FF
Ich bin mir auch nicht sicher, ob das HEX-File richtig in den
Mikroconroller geladen wird. Wenn ich, nachdem ich das HEX-File
downgeloadet habe, Read Code Memory to Buffer anwähle, stehen im Buffer
nur F's, was aber nicht meinem HEX-Code entspricht.
Bitte um Hilfe.
Grüße Alex
> Folgendes problem:> Ich will ein ganzen Port auf ein setzen, nur es passiert nichts.>
Was heisst für dich "Port ein" ? LED angeschlossen, wenn ja, wie?
Ich kenne zwar den at89x52 nicht, vermute aber stark, dass Du den
Portpin als Ausgang konfigurieren musst.
DDR1 = 0xFF;
oder so ähnlich, je nachdem wie das Register genannt wird.
Schalte sie mal probeweise nicht auf 0xFF, sondern auf 0x00.
Dann solltest du nach dem Reset sowas in der Gegend von 0V am Pin
messen. (die pins gehen defaultmässig auf 1)
Ansonsten: welche Programmierhardware?
Jo mach ich. Ich verwende ATMEL ISP.
Ich beschreibe mal kurz meine Vorgangsweise:
Ich compiliere den c Code mit dem SDCC Compiler (Als grafische Umgebung
verwende ich MIDE).
C-Code:
1
#include<at89x52.h>
2
3
voidmain(void){
4
P0=0xFF;
5
P1=0xFF;
6
P2=0xFF;
7
P3=0xFF;
8
9
while(1){
10
P0|=0x00;
11
P1|=0x00;
12
P2|=0x00;
13
P3|=0x00;
14
}
15
}
Nun habe ich das Hex-File.
Ich lade nun das Hex-File in den Buffer (Buffer -> Load from Disk -> As
a Intel HEX File). Danach überprüff ich ob alles ordnngsgemäß in den
Buffer geladen wurde (Buffer -> Edit). Wenn alles passt, lad ich nun den
ganzen Kram in den Speicher des Mikrocontrollers (Device -> Write Buffer
to Code Memory). Danach öffne ich das Terminal um das Programm zu
starten (Terminal). Nur passiert nichts.
Grüße Alex
Mit dem Terminal kannst du über UART mit deinem Controller
kommunizieren, das hat mit dem Programmieren erstmal nix zu tun.
Bei Device->Verify Code-Memory kriegst du immer noch nen Fehler und der
Bufferinhalt entspricht nicht deinem hex-file, oder?
Dann nochmal: Welche Programmierhardware (Board, Anschluss,
evtl.Schaltplan) und wie ist der ATMELISP denn eingestellt(Parameters) ?
Parameter:
http://www.imgwelt.de/show.php?code=41488P5V243
Bei meinem AT89S52 ist esg gar nicht möglich "Read Code Memory to
Buffer" auszführen.
Zitat: "Simply choose the second entry if the <Device> menu, as shown
above. Note that this option is only available if the current device is
an AT89S8252 or an AT89S8253."
Also denke ich auch, dass es nicht möglich ist "Verify Code Memory
auszuführen. Oder doch?
Wie starte ich dann das ganze Programm?
Ich verwende die STK500 zum prgrammieren.
> P0 |= 0x00;> P1 |= 0x00;> P2 |= 0x00;> P3 |= 0x00;
Das bringt nix, weil verodern mit 0 den Wert nicht ändert. Wie wärs mit
P0++ o.ä. dann siehst du was am Port zucken. Ist nur so ne Idee.
Ralf
Alex wrote:
> Parameter:> http://www.imgwelt.de/show.php?code=41488P5V243>> Bei meinem AT89S52 ist esg gar nicht möglich "Read Code Memory to> Buffer" auszführen.> Zitat: "Simply choose the second entry if the <Device> menu, as shown> above. Note that this option is only available if the current device is> an AT89S8252 or an AT89S8253."> Also denke ich auch, dass es nicht möglich ist "Verify Code Memory> auszuführen. Oder doch?>
autsch... ich hab nen 8253 und daher nie sonderlich drauf geachtet ;)
>> Ich verwende die STK500 zum prgrammieren.
Das STK500 tut nur für AVR-µC, für deinen '51 brauchst du ne andere
Schaltung (Google fragen).
Also mir wurde gesagt, es müsse mit der STK500 auch gehen.
Die Pins RESET, MOSI, SCL, MISO vom Prozessor sind ja an der richitgen
Stelle.
Atmel ISP lädt das Programm ja ohne Probleme rüber.
P.S. Wie start ich das Programm denn, wenn nicht mit dem Terminal...
Grüße
Alex wrote:
> Also mir wurde gesagt, es müsse mit der STK500 auch gehen.> Die Pins RESET, MOSI, SCL, MISO vom Prozessor sind ja an der richitgen> Stelle.
Dann frag mal nach, wie das genau gehen soll- mir ist da nix bekannt.
> Atmel ISP lädt das Programm ja ohne Probleme rüber.
Steck mal das serielle Kabel vom stk ab und mach dann noch nen
Programmierversuch... ;)
> P.S. Wie start ich das Programm denn, wenn nicht mit dem Terminal...
Naja, sobald der Reset nach dem Proggen weg ist, läuft das Ding los.
Ouch, ok .. es geht ned mit der STK500 :-(.
Hast du zufällig ne Schaltung parat, mit der ich den AT89S52 ISP Progen
kann. Oder gibts da auch was zum kaufen?
@jack
die Schaltung ist nicht AtmelISP-kompatibel.
Die der Anlage ist für AtmelISP, wobei man den Treiber und die
Beschaltung noch stark vereinfachen kann.
Ansonsten ist hier ein einfacher Programmer:
http://www.amwaw.edu.pl/~adybkows/elka/ispprog.html
> http://www.sixca.com/eng/articles/at89s_isp/
Geht auch. Allerdings passt die LPT-Belegung nicht zur Original
AtmelSP89 Software. (Jeder Programmer benutzt praktisch eine andere
Belegung der LPT-Pins.)