Forum: Mikrocontroller und Digitale Elektronik Keil µvision2 -> AT89C2051


von Roland Mayer (Gast)


Lesenswert?

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

von Enrico Schleske (Gast)


Lesenswert?

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.

von Roland Mayer (Gast)


Lesenswert?

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

von Enrico Schleske (Gast)


Lesenswert?

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

von Roland Mayer (Gast)


Lesenswert?

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

von Enrico Schleske (Gast)


Lesenswert?

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

von Roland Mayer (Gast)


Lesenswert?

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

von Peter D. (peda)


Lesenswert?

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

von Enrico Schleske (Gast)


Lesenswert?

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

von Roland Mayer (Gast)


Lesenswert?

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

von Roland Mayer (Gast)


Lesenswert?

Hallo
Ich hab&#8217;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

von Thomas Zepf (Gast)


Lesenswert?

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

von Roland Mayer (Gast)


Angehängte Dateien:

Lesenswert?

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

von Thomas Zepf (Gast)


Lesenswert?

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

von Peter D. (peda)


Lesenswert?

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

von Roland Mayer (Gast)


Lesenswert?

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?

von Thomas Zepf (Gast)


Lesenswert?

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

von Roland Mayer (Gast)


Lesenswert?

ich habs jetzt glaube ich gefunden..
http://www.cypress.com/support/dev_kit.cfm?objectID=3CC23CE9-BB6E-491A-8877E6BA2045E739&tid=EF028E39-2658-41C0-828715F47620AEE8

allerdings kann ich es bei mir schlecht runterladen weil ich kein dsl
hab :-) da muß ich mal bei nem kumpel vorbeischauen

von Twin (Gast)


Lesenswert?

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

von Matthias K. (matthiask)


Lesenswert?

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.

von Twin (Gast)


Lesenswert?

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!

von Matthias K. (matthiask)


Lesenswert?

>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?

von Twin (Gast)


Angehängte Dateien:

Lesenswert?

danke für die Hilfe! Was meinst du mit Port-IC setzten. Ich messe die 
Ports mit einem üblichen Multimeter!

von Matthias K. (matthiask)


Lesenswert?

Abblockkondensator fehlt, Reset-Beschaltung, 24MHz-Quarz oft kritisch, 
funktioniert nur mit Grundtonquarz?

Und Dein Programm?

von Twin (Gast)


Lesenswert?

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.

von Matthias K. (matthiask)


Lesenswert?

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:
1
#include "at89x051.h"   // Register des AT89C2051
2
#define LED P0_7
3
4
// ***********************************************************************
5
// Verzögerungsschleife ohne Timer
6
// Zähler-Startwert anpassen
7
// ***********************************************************************
8
void delay (void) {
9
  unsigned int zaehler;
10
  for (zaehler = 10000; zaehler; zaehler--) {
11
     _asm nop; _endasm;
12
  }
13
}
14
15
// ********************************************************************
16
// Hauptprogramm
17
// ********************************************************************
18
void main (void) {
19
  while(1) {
20
    LED = 0;
21
    delay();
22
    LED = 1;
23
    delay();
24
  }
25
}

von Twin (Gast)


Lesenswert?

Ok jetzt wird es langsam klarer!  Wenn man aber die vollversion von Keil 
hat, dann wird es doch funktionieren oder?

von Matthias K. (matthiask)


Lesenswert?

ja

Bsp. ist für SDCC

nop bei Keil anders:

#include <intrins.h>
_nop_();

von Twin (Gast)


Lesenswert?

Irgendwie komme ich mit SDCC und MIDE nicht wirkliche klar wie erstelle 
ich ein neues Projekt? und wie erstelle ich eine HEX Datei?

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.