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.
> Weiß jemand woran das liegen könnte?
Läuft da noch ein zusätzliches Programm auf dem µC? So eine Art
Monitorprogramm o.ä?
Ralf
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.
1 | void init_msc1210(void) |
2 | {
|
3 | |
4 | /***********************************************************************
|
5 | * UART
|
6 | ***********************************************************************/
|
7 | T2CON = INIT_T2CON; // T2 as baudrate generator |
8 | RCAP2H = (T2RELOAD >> 8); // baudrate reload factor |
9 | RCAP2L = (T2RELOAD & 255); // Low byte |
10 | SCON0 = INIT_SCON0; // Async mode 1, 8-bit UART, enable rcvr, TI=0, RI=0 |
11 | |
12 | /***********************************************************************
|
13 | * System Timers
|
14 | ***********************************************************************/
|
15 | MSECH = (ONEMS>>8); // Milisecond register |
16 | MSECL = (ONEMS&255); // Low byte |
17 | HMSEC = INIT_HMSEC; // 100 Milisecondregister |
18 | |
19 | /***********************************************************************
|
20 | * Peripherals Power Control
|
21 | ***********************************************************************/
|
22 | PDCON &= INIT_PDCON; // ADC-ON |
23 | |
24 | |
25 | |
26 | /*************************************************************************
|
27 | * Constant definitions
|
28 | **************************************************************************/
|
29 | #define XTAL 11059200 // XTAL frequency
|
30 | #define BAUDRATE 115200
|
31 | #define SAMPLERATE 800
|
32 | #define INIT_ACLK 1
|
33 | |
34 | #define ONEMS (XTAL/1000)
|
35 | #define FMOD (XTAL/((INIT_ACLK+1)*64))
|
36 | #define DECIMATION (FMOD/SAMPLERATE)
|
37 | #define T2RELOAD (65536-(XTAL/32/BAUDRATE))
|
38 | |
39 | #define INIT_T2CON 0x34
|
40 | #define INIT_SCON0 0x50
|
41 | #define INIT_HMSEC 99
|
42 | #define INIT_ADCON1 0x00
|
43 | #define INIT_AIE 0x20
|
44 | #define INIT_PDCON 0x0f7
|
45 | #define DISCARD_SAMPLES 1 // wenn Filter aus 1 Bei SYNC3 =3
|
46 | #define ADC_BIT 32
|
@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:
1 | #define ONEMS 11059 // XTAL-1 ms
|
2 | #define DECIMATION (uint)720 // 20 Hz data rate
|
3 | #define RCAP2 65500 // T2: 9600 Bd
|
4 | #define WDSERV() WDTCON |= 0x2F; WDTCON &= ~0x20; // Watchdog Service
|
5 | #define EVREF 32 // If set, internal reference enabled
|
6 | #define VREFH 16 // Reference Voltage: 0: 1.25, 1: 2.5 V
|
7 | #define EBUF 8 // If set: Input buffer enabled
|
8 | #define GAIN_1 0 // Flags for several PGA GAINS
|
9 | |
10 | void init_msc1210_2(void){ |
11 | T2CON = 0x34; // T2 as baudrate generator |
12 | RCAP2H = (RCAP2>>8); |
13 | RCAP2L = (RCAP2&255); |
14 | SCON = 0x50; // Async mode 1, 8-bit UART, enable rcvr, TI=0, RI=0 |
15 | |
16 | MSECH=(ONEMS>>8); // Milisecond register |
17 | MSECL=(ONEMS&255); |
18 | HMSEC=99; // 100 Milisecondregister |
19 | |
20 | PDCON &= 0x0f7; //ADC-ON |
21 | PDCON &= ~0x04; // WD ON |
22 | |
23 | WDTCON=0x80; // WD-Enable |
24 | WDTCON=0x00; |
25 | WDSERV(); // initial serve Watchdog |
26 | |
27 | ACLK = 11; // ACLK = 11.0592MHz/(11+1)= 0.9216MHz |
28 | |
29 | ADCON3=(DECIMATION>>8); |
30 | ADCON2=(DECIMATION&255); // AD-Speed |
31 | |
32 | 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 | void main(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!
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.