Hi Leute,
ich habe hier einen DS89C430 DIP auf meinem Steckbrett mit Max232 und
versuche nun den Controller zu Programmieren. Das Testprogramm, habe ich
mit der Keil Demoversion geschrieben, hier der Code:
1
#include<ds89c4xx.h>
2
#include<stdio.h>
3
4
5
voidserialInit(){
6
TMOD=0x21;// Timer 1: 8-bit autoreload from TH1
7
TH1=0xf5;// 9600 baud rate at 20mhz
8
CKMOD=0x38;// Use system clock for timer inputs
9
T2CON=0x00;// Serial 0 runs off timer 1 overflow
10
TCON=0x50;// Enable timers 0 and 1
11
SCON0=0x50;// Enable serial port 0
12
SBUF0=' ';
13
}
14
15
voidmain(){
16
serialInit();// Initialize serial port 0
17
printf("\rHello from the Keil C51 compiler\r");
18
while(1){
19
;// Endless loop
20
}
21
}
Der Controller läuft bei 20Mhz, die Baudrateneinstellung müsste so
stimmen.
Ein anderes Testprogramm, welches einfach nur eine LED am Port 1.0 ein /
ausschalten sollte, funktionierte ebenso nicht.
Im Datenblatt steht, man muss zuerst den PSEN Pin floaten lassen, dann
Reset. Ich ziehe also das Kabel vom PSEN und danach vom Reset, tut sich
aber nichts. Auch wenn ich dann versuche einen Reset auszuführen indem
ich die Resetleitung auf Plus lege und wieder wegnehme, tut sich auch
nichts...
Flashen lässt sich der Chip ohne Probleme über das MTK von Dallas/Maxim.
Der Hardwareaufbau:
20mhz Quarz, Max232<->RS232 vom Controller,
zum Flashen: RST = 1, PSEN = 0, EA = 0
Ich hoffe, jemand von euch kann mir weiterhelen...
Meldet sich der Controller bzw der Bootloader denn mit seinem Prompt im
MTK?
In etwa "Dallas DS89C430... usw.
Sollte beim Betätigen der Leertaste im MTK passieren.
mfg
Hmmmm jetzt scheints zu funktionieren. In der letztendlichen Schaltung
wollte ich einen 7404 statt dem 74125 wie im Datenblatt verwenden, habs
mal ausprobiert aufm Steckbrett und funzt :)
siehe Anhang
Na gut.
Lädt MTK das Programm in den Programmbereich des Prozessors?
Ist der EA-Pin auf '1', wenn zB. das (Blink)Programm nach dem
Ladevorgang starten soll?
Im Datenblatt des Controllers ist zu sehen, dass Dallas einen 74X125 zur
Steuerung des Bootloaders einsetzt; er ist mit den entsprechenden
Portpins des Controllers verbunden und wird vom DTR-Signal des
Programmierrechners aktiviert (diese Funktion im MTK anwählen). Falls
dieser Baustein nicht zur Verfügung steht, bietet es sich an, die
Port-Pins des Controllers mit Einzeltransistoren in
Open-Collector-Konfiguration (oder hochohmigen Kollektorwiderständen) zu
beschalten, Ansteuerung der Transistoren wie oben.
Zuletzt muß natürlich sichergestellt seim, das der Linker der
Keil-Entwicklungsumgebung zumindest den Start-Up-Code des
Anwendungsprogramms an Adresse 0x0000 im Programmspeicher des
Controllers ablegt.
Na ich habe den 7404 verwendet, da ich den 125er nicht habe,
funktioniert. EA ist auf 1.
Von Hand hats irgendwie nicht funktioniert, mit dem Inverter-IC schon,
ist ja gut so :)
Noch etwas, da Du ja anscheinend Ahnung vom Controller hast :)
Im Einstellungsfeld BL51Locate, wie im Anhang zu sehen, was muss ich da
Eintragen? In der Appnote "Using the Keil C Compiler" von Dallas/Maxim
steht dazu nichts...
Hier die Appnote http://www.maxim-ic.com/app-notes/index.mvp/id/3267
Im Anhang ein Screenshot.
Kunststück, ich bastele gerade an einem autonomen Rasenmäher, dessen
Hirn ein DS89C450@40MHz ist.
Glückwunsch!
Vielleicht noch eine Anmerkung zum '125 bzw zur von mir vorgeschlagenen
Beschaltung. Beide haben gemeinsam, dass sie im inaktiven Zustand
'schwache' Pegel an die Pins des Controllers legen. Damit besteht die
Möglichkeit, diese während des Programmlaufs durch 'harte' Signale aus
anderen Schaltungsteilen zu überschreiben und den Programmablauf zu
beeinflussen. Vorteil der Anordnung ist, dass ohne
Hardwareänderung(Jumper umstecken, Stecker abziehen usw.) vom
Programmieren direkt in den Betrieb und zurück gewechselt werden kann.
Nun zur Frage, die ich allerdings nur bedingt und relativ allgemein
beantworten kann, da ich nicht mit der Keil-Umgebung und nicht unter
Windows mit 8051-Prozessoren arbeite(im Fall des Dallas-Prozessors habe
ich mir ein etwas rustikales MTK für DOS geschrieben, so dass ich meinen
alten DOS-Compiler, der selbstverständlich auf einem lupenreinen
DOS-Rechner läuft, verwenden kann).
Die Linkereinstellung, besser Linker-Locater-Einstellungen, brauchen
fürs erste nicht geändert werden. Der Programmcode wird nach Adresse
0x0000 gelinkt. Den Konstanten- und Variablensegmenten(IDATA, DATA,
XDATA), mit denen der Compiler arbeitet, in dieser Phase schon
Startadressen zuzuweisen, scheint mir nicht sinnvoll zu sein, da der
Compiler den Überblick hat. Außerdem bietet das MTK ähnliche
Möglichkeiten.
Die Abbildung der Grundeinstellungen in besagter AppNote zeigt die
verschiedenen Möglichkeiten auf, das Speichermodell für eine spezielle
Anwendung zu wählen. Für den von Dir verwendeten Prozessor, ohne
externen Daten- oder Programmspeicher kommt nur ein kleines
Speichermodell in Frage, also SMALL oä, bei dem der interne Ram(IDATA?)
und der interne Flash(CODE) verwendet werden. Der auf dem Chip vorhanden
Ram(XDATA) kann sowieso erst zur Laufzeit aktiviert werden und dann ist
hoffentlich klar, was mit dem Speicherzuwachs getan werden soll. Die
Option 'double DPTR' kann aktiviert werden(wenn's nichts nützt, so
schad's doch nichts).
mfg
> SCON0 = 0x50; // Enable serial port 0> printf("\rHello from the Keil C51 compiler\r");
Zumindest beim Raisonance-Compiler erwartet printf() bzw. putch() ein
gesetztes TI-Flag. Putch() prüft vor dem Versenden, ob die Schnittstelle
frei ist und wartet daher bei Dir ewig. Setzte SCON0 mal auf 0x52...
tschuessle
Bernhard