Ich möchte mit µVision2 ein Programm in C schreiben und dieses als
HEX-File in meinen AT89C2051 laden..
- Hardware/Programmer funktioniert
auf dieser seite habe ich ein test hex-file gefunden damit bekomme ich
meine LED an P1.7 zum blinken
http://www.pjrc.com/tech/8051/board3/blink_sdcc.html
- Wenn ich mir selber etwas in µVision2 Programmiere funktioniert es
zwar im simulator und die hex datei wird auch ereugt aber nach dem
einspielen in den AT89C2051 tut sich nix...
warscheinlich stimmen irgendwelche einstellungen in µVision2 nicht..
kann mir da jemand weiterhelfen?
oder kann mir jemand ein Projekt schicken das mit µVision2 für den
AT89C2051 in C geschrieben wurde?
mfg
Roland
Hallo,
die wichtigsten Projekt-Einstellungen in µVision2 sind folgende:
- als Device natürlich den jeweiligen µC
- auf der nächsten Seite dann die Frequenz des Quarzes eintragen (wird
gerne vergessen)
- nächste Seite Assembly Code und Hex-File erzeugen
- weiter hinten bei programm code: 0x0100 - 0xffff eintragen, da die
Adressen 0x0000 - 0x0100 als Interrupt-Einsprungadressen verwendet
werden (zumindest bei 8051-Derivaten)
- vorletzte Seite trage ich dann noch eine eigene watchdog.ini ein
das wars.
Wenns trotzdem nicht läuft, das Programm mal vorher debuggen und auf
Fehler überprüfen oder die Beschaltung der Pins überprüfen. Es werden
nämlcih auch ganz gerne mal unterschiedliche Massen verwendet.
Viel Glück
Enrico
P.S.: Wenns noch immer nicht läuft kann ich später ne Test-File
schicken.
ich habs mal mit folgendem programm getestet geht aber immer noch nicht
(mit dem debuger gehts)
#include <AT892051.H>
unsigned int Z;
void main(void)
{
while(1)
{
Z = 40000;
P1 = 0xFF;
for(Z;Z>0;Z--);
Z = 40000;
P1 = 0x00;
for(Z;Z>0;Z--);
}
}
folgende dinge hab ich nicht ganz kapiert der rest passt..
- weiter hinten bei programm code: 0x0100 - 0xffff
- vorletzte Seite trage ich dann noch eine eigene watchdog.ini
mfg
roland
Hallo,
ob Du
Z = 40000;
.
for(Z;Z>0;Z--);
.
.
.
oder nur
for(Z=40000;Z>0;Z--);
schreibst, sollte glaube ich keinen Unterschied machen. Ich definiere
halt meistens in der Klammer, bei festen Zählschleifen (aber im
Debugger gehts ja anscheinend).
Naja, ansonsten benutze ich auch gerne eine einfache Warte Funktion wie
z.B.:
void wait(unsigned int x)
{
unsigned int i;
for(i=x; i>0; i--);
}
und dann irgendwo in main() einfach diese Fkt. mit einem Wert
aufrufen.
Jetzt zu den Projekteinstellungen:
- Registerkarte "BL51 Locate" hier hinter Code: und unter Segments:
die Anweisung 0x100-0xffff eintragen. Diese teilt dem µC mit, dass der
Programmcode der nach dem Reset ausgeführt werden soll bei der Adresse
0x100 im Programmspeicher steht. Denn würde er bei 0x0000 beginnen, so
würde es Probleme geben, wenn auf die dort angesiedelten
Einsprungadressen für Interrupts (Ext., Timer, usw.) zugegriffen werden
soll. Denn eben dieser Adressraum von 0x0000 bis 0x100 ist für diese
Interrupts reserviert.
- Registerkarte "Debug" hier habe ich bei Initialization File: eine
watchdog.ini eingetragen, da ich mit meinem µC Probleme mit dem
internen Watchdog hatte. In der watchdog.ini (einfach selber erstellen)
steht nicht viel drin, nur:
PE_SWD = 0 /* Disable Watchdog with pin PE_SWD */
reset /* perform CPU reset: uses value at PE_SWD */
Konnte ich helfen?
Enrico
Hallo..
ich hab jetzt alles so eingestellt
(ich hatte im register device bei "Use extended linker..." ein
häkchen desshalb konnte ich das register "bl51 locate" erst nich
finden)
allerdings tut sich immer noch nix
mfg
Roland
Gibt es nur mit dieser HEx-File Probleme (lief schon mal irgendein
bestimmtes Programm mit diesem Controller) oder wird der Controller zum
ertsen Mal benutzt.
Was ich meine ist, ob man Hardwareprobleme wie z.B. falscher
Schaltungsaufbau, Schwingkreis geht nicht, Reset-Pin falsch beschaltet
usw. ausschließen kann. Dann würde es mehr Aufwand kosten, den Fehler
zu finden.
Wenn aber schon mal ein Programm erfolgreich mit dem Hardwareaufbau
lief, dann kann es nur an der Software liegen.
Enrico
hallo..
ich hab mir auf folgender seite ein hex file runtergeladen damit
bekomme ich meine led an P1.7 zum blinken
http://www.pjrc.com/tech/8051/board3/blink_sdcc.html
d.h. programmer und hardware sind okay (ich habs gerade nocheinmal
getestet)
mfg
roland
Du hast nicht zufällig nur die Demoversion, die nur nach 8000h linkt ?
Dem 89C2051 ist das egal, der ignoriert einfach die höheren Adreßbits.
Du brauchst aber einen Programmer der die auch ignoriert.
Notfalls hilft auch ein Hex-Bin Converter, dann die unteren 32kB Nullen
weglöschen und dann wieder in Hex zurückwandeln.
Peter
Jaja, da habe ich wohl - wie des öfteren - nicht alles genau lesen,
sondern nur überflogen.
Ein kurzer Hinweis darauf hätte es aber auch getan ;-)
Naja, mit dem AT89C2051 habe ich noch nicht gearbeitet und habe mir
daher mal die <at89c2051.h> angesehen. Daraus folgt, dass P1.0 und P1.1
als "+/- Analog comparator input" fungieren. Denn ich habe Deinen
Quellcode auch mal schnell simuliert, und gerade die ersten beiden Pins
blieben immer auf 0. Jetzt ist die Frage, an welchen Ports Du gemessen
hast an P1.0 + P1.1 oder gehen alle nicht? Denn P1.7 hat ja (mittels
hex-Datei) wie beschrieben funktioniert, ist ja auch nicht mit einer
Zweitfunktion belegt, vielleicht gibts ein sfr zum An/Abschalten der
Comparator inputs - weiß ich aber nicht? Aber dafür gibts ja zum Glück
Datenblätter :-)
Vielleicht hat Peter Danneggers Tipp ja schon geholfen.
Viel Spaß noch
Enrico
ja ich verwende die demo version von µVision2
ich hab mal versucht die nullen weg zu löschen hat aber auch nix
gebracht die nullen waren allerdings ziemlich am anfang des bin
files...
ich hab im datenblatt etwas zu dem sfr gefunden, da ist ne tabelle
links von P1 steht 90H kann man damit den P1 irgendwie
"einschallten"?
mfg
roland
Hallo
Ich hab’s bis jetzt noch nicht hin bekommen aber trotzdem danke
für eure Bemühungen ich bin bis Dienstag Abend weg und werds dann
weiter probieren.
mfg
Roland
Die Demo Version linked nach 0x0800 nicht nach 0x8000.
Schau dir mal das M51 File näher an und teste das Programm
noch mal im Assembler Mode, dann siest du auch die Addressen.
Dein Programm sollte jedenfalls gehen.
Ansonsten bei Cypress das USB Paket laden dort ist eine 4k Version
drin die auch nach 0 linken kann.
(Die anderen Einschränkungen bestehen aber weiterhin)
Thomas
hallo
was hat das für auswirkungen wenn nur auf 0x0800 gelinkt wird?
ich habe das m51 file mal als anhang gepostet vielleicht kann da irgend
jemand was herauslesen...
mfg roland
Hallo Roland,
Nun überleg mal selbst der 2051 hat 2k Flash das sind 0x0800 Bytes
Dein Programm startet bei 0x0800 landet also im nirwana.
Ich sehe da mindestens 3 Lösungen:
- das Cypress Release verwenden.
- anderen Controller verwanden mit mehr Flash
- anderen C Compiler verwenden (Raisonance hat das Problem nicht)
Thomas
Nach Deinem .map File zu urteilen, steht am Anfang ein 02,08,00. Das muß
natürlich auch gelöscht werden. Ansonsten springt der ja immer zu sich
selber.
Also nur den Code übrig lassen, der an Adressen >=0800h steht.
Peter
juppi es hat geklappt
ich habe..
jetzt die programmer software auf einen at89c4051
(4k flash) eingestellt
das hex file geöffnet
dann das ganze als bin file gespeichert
in dem gespeichertem bin file alle "ÿ" zeichen mit dem editor
entfernt
dannach habe ich die programmer software wieder auf den at89c2051
eingestellt und das bin file geöffnet und beschrieben
und schon blinkt die led ;-)
(wenn ich das gleiche mit dem hex2bin converter mache geht's nicht)
ich danke euch allen ich hätte alleine wahrscheinlich schon längst
aufgegeben...
mfg
roland
ach ja ich habe mir von cypres "ISR Programming Software V3.0.13"
heruntergeladen da kann man aber bei device keine at89c2051 einstellen
habe ich mir da was falsches herunter geladen?
Ja du hast das falsche geladen.-)
Cypress hat ein USB Developer Paket (so um die 40 MB)
Dort ist eine Keil uV2 Version drin die nicht nach 0x0800
linkt und 4 kCode kann.
Thomas
Liebe Gemeinde,
Brauche eure Hilfe, ich kriege meinen AT89C2051 nicht zum Laufen. Ich
benutze derzeit den Parallelprogrammer DL2TM und habe versucht mit dem
IC-Prog 1.06 die Beispiel( wie oben von Rolynd Mayer angegeben) Hex
Datei auf den µC zu flashen. Leider passier am Port 1.7 nichts, dieser
bleibt auf LOW. Wenn ich dann am PIN1 zum Reseten auf HIGH setzte,
gehen alle Port auf HIGH und es pasiert auch nichts mehr.
Kann mir eventuell einer eigene Hex Datei mit Blinkenden Port zuschicken
um zu gucken ob diese funktioniert. Wie kann ich noch meinen Programmer
Testen? Funktioniert das Programm zum Flashen IC-Prog? Wenn ich mit
IC-Prog die Hex Datei öffne sieht man im Programm nicht wirklich ob
diese geladen wurde.
Vielen Dank im Vorraus
Artikel ist 7 Jahre alt. Hättest lieber einen neuen aufmachen sollen.
Wie sollen wir das beurteilen, wenn Du uns nicht mal den Quelltext
zeigst?
Welche Keil-Version hast Du? EVA-Version? Dann geht es sowieso nicht mit
den C2051, weil der nur 2K Flash hat und die EVA-Version einen Offset
von 0x0800 generiert.
Abgesehn von der Keil Version möchte ich zunächst versuchen eine bereits
generierte Hex Datei zum Testen auf den µC flashen. Die Hex Datei gibt
es zum download auf http://www.pjrc.com/tech/8051/board3/blink_sdcc.html
. Diese benutzte auch der Threadstarter , Roland Mayer!
>Die Hex Datei gibt es zum download ...
Die Blink-Funktion dort setzt einen Port-Ic im XDATA Bereich voraus.
Wird wohl bei Dir nicht funktionieren.
Zeig mal den Schaltplan Deiner Hardware?
Welchen Abblockkondensator soll ich verwenden? Reset setze ich mit einem
einfachen draht +5V .Ich verwende einen Grundwellenquarz. Ist ein 12MHz
Quarz besser? Ich habe zunächst nur die Hex Datei die zum Download
bereit liegt verwendet.
Irgendwie verstehtst Du es nicht. Das Programm unter den obrigen Link
setzt doch ein ganz anderes Board voraus. Die Leds hängen an einer
Porterweiterung (U5). Sieh Dir doch erstmal den Schaltplan an. Die
HEX-Datei nutzt bei Deiner Schaltung überhaupt nichts.
Abblockkondensator 100nF, zwischen VCC-GND, nahe am µC anordnen.
Nimm SDCC und die MIDE-51. Mit der Keil EVA-Version kannst Du nur
Programme für Mikrocontroller erstellen, die mehr als 2k Flash intern
haben (wegen dem Offset von 0x0800).
http://www.opcube.com/home.html#MIDE51
So könnte es blinken: