Hallo,
ich hab gerade festgestellt, dass die Hex-Codes, die beim uC51 Compiler
von Wickenhäuser mitgeliefert werden nicht zum mitgelieferten
C-Quelltext passen.
Ich hab das Programm msc1210/elmet/elm_volt.hex auf meinen uC gebrannt
und das Programm hat das gemacht was es machen soll. Als ich den
dazugehörigen C-Quelltext aber selber kompiliert und gebrannt hab ging
plötzlich gar nichts mehr (z.B. wurden kein Text über die serielle
Schnittstelle geschickt).
Laut Quelltext muss nur die printf-Funktion aufgerufen werden um die
serielle Schnittstelle zu benutzen, die Schnittstelle wird nicht
konfiguriert. Das funktioniert allerdings nur beim fertigen Hex-File.
Bei meinen eigenen Compilaten kann ich keine Datenübertragung
feststellen (über der Konsole des TI Downloaders).
Weiß jemand woran das liegen könnte? Muss ich da noch irgendwas beim
Compiler einstellen? Ich hab an den Programm nichts verändert außer die
benötigten Source-Dateien in einen Ordner kopiert.
Vielleicht ist das falsche Projekt offen oder irgend etwas in dieser
Richtung, was den falschen Quelltext übersetzt.
Es wird ja nicht zwingend der Quelltext übersetzt, der gerade im Editor
geöffnet ist, sondern der der im Makefile bzw. Projektfile steht.
Grüße,
Peter
> Laut Quelltext muss nur die printf-Funktion aufgerufen werden um die> serielle Schnittstelle zu benutzen, die Schnittstelle wird nicht> konfiguriert.
Ich kenne deinen Controller nicht, aber ich bezweifle, dass die
Schnittstelle nach einem Reset genau dem entspricht, was du auf der
Gegenseite eingestellt hast :)
Hast du das originale HEX-File noch? Lade das mal in einen HEX-Editor,
vielleicht sieht man ja doch irgendwelche "Spuren" eines
Monitorprogrammes o.ä. Oder poste die Datei hier, zusammen mit dem laut
Beschreibung angeblich passenden Quellcode.
Warnungen beim Neucompilieren/Linken gab's keine?
Ralf
Das Problem kenne ich. Es hatte etwas damit zu tun, dass Wickenhäuser
zuerst mit Putc() auf die Schnittstelle schreibt, danach funktioniert
die Printf() normalerweise.
Das läßt sich aber vermeiden, wenn man den Prozessor vernünftig
initialisiert.
Außerdem optimiert der Wickenhäuser-Compiler Deinen Code recht stark.
Da muß man recht gut aufpassen, dass nicht auch "sinnvoller " Code
entfernt wird...
Ach ja nochwas:
Wenn du die Sourcen in einen anderen Ordner kopierst, achte darauf, das
diese wieder in C:/yc51/src/msc1210 liegen.
Und: Der Ordner darf keine Ö/Ü´s etc. enthalten und am besten auch keine
Leerzeichen. Sonst schmeisst es das umshell-Programm.
@frankman
Deine Initialisierungsroutine funktioniert bei mir leider genauso wenig
wie die des Beispielprogramms. Ich hab zu Testzwecken mal ein
HalloWelt-Programm geschrieben, das einzelnen LEDs auf dem Controller
leuchten lässt. Wenn ich die Initialisierungsroutine von dir nutze, dann
werden alle LEDs bis vor dem Aufruf von puts/printf eingeschaltet - beim
Aufruf der Funktionen bricht das Programm offenbar ab.
Bei der Initialisierungsroutine des Beispielprogramms leuchten hingegen
alle LEDs - eine Ausgabe über die serielle Schnittstelle erhalte ich
aber trotzdem nicht.
Hier mal die Initialisierungsroutine des Beispielprogramms:
ADCON0=EVREF|EBUF|GAIN_1;// Vref on 1.25V, Buff on, BOD off, PGA 1
33
34
EAI=1;// Enable Auxiliary IRQ
35
AIE=0x20;// Enable A/D aux IRQ
36
}
Kompilieren tut das alles ohne Warnings.
@Ralf
Die Hex-Files vom vorgefertigten Beispielprogramm und dem selbst
kompilierten Code sind fast gleich groß - sie unterscheiden sich nur um
ein paar Bytes. Ich hatte leider keine Ahnung nach was ich vergleichen
soll - der Hex-Editor MX hat auch mehr als 3000 Unterschiede gefunden.
Ich hab die beiden Hex-Dateien mal angehängt. Ich glaub aber nicht, dass
das was bringt.
Ich hab jetzt einen User Guide gefunden, in dem beschrieben steht wie
man die serielle Schnittstelle konfigurieren muss. Ich werd mir den mal
durchlesen. Vllt. finde ich ja so eine Lösung.
Juhu, es geht!
Ich hab ein weiteres Beispielprogramm gefunden, in dem beschrieben steht
welche Register für den UART gesetzt werden müssen. Das hat zwar zuerst
auch nicht funktioniert, nachdem ich aber noch ein wenig in dem User
Guide gestöbert hab ist es mir dann doch noch gelungen Daten zu
übertragen:
1
#include<stdio.h>
2
#include<reg1210.h>
3
4
voidmain(void)
5
{
6
PCON|=128;// Baudrate double
7
SCON=124;// 8 Bit UART - PC-compatible
8
TH1=250;// Divisor = -6 (57600/6=9600 Bd.)
9
TMOD=32;// use timer 1 as baudrate generator
10
TCON=64;
11
ES=0;// Enable Serial IRQ (if required)
12
EA=1;// Enable general IRQs (if required)
13
TI=1;// Transmitter Interrupt Flag
14
15
printf("hello world\n");
16
while(1);
17
}
Hab das mit der Baudrate aber noch nicht verstanden. Muss ich nochmal
nachlesen.
Außerdem wird mir der Output zweimal auf der Konsole angezeigt. Aber das
kann auch sein, dass das an der Konsole liegt. Muss ich noch
nachprüfen...
Danke für eure Hilfe!