Forum: Mikrocontroller und Digitale Elektronik Wickenhäuser uC51 - Hex-Datei arbeitet nicht korrekt.


von Simon S. (antoras)


Lesenswert?

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.

von Ralf (Gast)


Lesenswert?

> Weiß jemand woran das liegen könnte?
Läuft da noch ein zusätzliches Programm auf dem µC? So eine Art 
Monitorprogramm o.ä?

Ralf

von Simon S. (antoras)


Lesenswert?

Nein, nur dieses eine Programm.

von Peter D. (pdiener) Benutzerseite


Lesenswert?

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

von Ralf (Gast)


Lesenswert?

> 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

von Frank B. (frankman)


Lesenswert?

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

von Simon S. (antoras)


Angehängte Dateien:

Lesenswert?

@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.

von Simon S. (antoras)


Lesenswert?

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
Noch kein Account? Hier anmelden.