www.mikrocontroller.net

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


Autor: Simon S. (antoras)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Ralf (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Simon S. (antoras)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nein, nur dieses eine Programm.

Autor: Peter Diener (pdiener) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Ralf (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Frank B. (frankman)
Datum:

Bewertung
0 lesenswert
nicht 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.
void init_msc1210(void)
{

    /***********************************************************************
    * UART
    ***********************************************************************/
    T2CON   =   INIT_T2CON;         // T2 as baudrate generator
    RCAP2H  =   (T2RELOAD >> 8);    // baudrate reload factor
    RCAP2L  =   (T2RELOAD & 255);   // Low byte
    SCON0   =   INIT_SCON0;         // Async mode 1, 8-bit UART, enable rcvr, TI=0, RI=0

    /***********************************************************************
    * System Timers
    ***********************************************************************/
    MSECH   =   (ONEMS>>8);           // Milisecond register
    MSECL   =   (ONEMS&255);          // Low byte
    HMSEC   =   INIT_HMSEC;           // 100 Milisecondregister

    /***********************************************************************
    * Peripherals Power Control
    ***********************************************************************/
    PDCON   &=  INIT_PDCON;             // ADC-ON



/*************************************************************************
* Constant definitions
**************************************************************************/
#define XTAL        11059200        // XTAL frequency
#define BAUDRATE    115200                
#define SAMPLERATE  800
#define INIT_ACLK   1      
               
#define ONEMS       (XTAL/1000)                  
#define FMOD        (XTAL/((INIT_ACLK+1)*64))
#define DECIMATION  (FMOD/SAMPLERATE)      
#define T2RELOAD    (65536-(XTAL/32/BAUDRATE))

#define INIT_T2CON  0x34 
#define INIT_SCON0  0x50
#define INIT_HMSEC  99
#define INIT_ADCON1 0x00
#define INIT_AIE    0x20
#define INIT_PDCON  0x0f7
#define DISCARD_SAMPLES 1  // wenn Filter aus 1  Bei SYNC3 =3
#define ADC_BIT     32


Autor: Simon S. (antoras)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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:
#define ONEMS   11059       // XTAL-1 ms
#define DECIMATION (uint)720    // 20 Hz data rate
#define RCAP2   65500       // T2: 9600 Bd
#define WDSERV()    WDTCON |= 0x2F; WDTCON &= ~0x20; // Watchdog Service
#define EVREF   32      // If set, internal reference enabled
#define VREFH   16      // Reference Voltage: 0: 1.25, 1: 2.5 V
#define EBUF    8       // If set: Input buffer enabled
#define GAIN_1  0       // Flags for several PGA GAINS

void init_msc1210_2(void){
    T2CON  = 0x34;   // T2 as baudrate generator 
    RCAP2H  = (RCAP2>>8);
    RCAP2L  = (RCAP2&255);
    SCON   = 0x50;   // Async mode 1, 8-bit UART, enable rcvr, TI=0, RI=0

    MSECH=(ONEMS>>8); // Milisecond register
    MSECL=(ONEMS&255); 
    HMSEC=99;   // 100 Milisecondregister

    PDCON &= 0x0f7;  //ADC-ON
    PDCON &= ~0x04; // WD ON

    WDTCON=0x80;    // WD-Enable
    WDTCON=0x00;
    WDSERV();   // initial serve Watchdog

    ACLK = 11;              // ACLK = 11.0592MHz/(11+1)= 0.9216MHz

    ADCON3=(DECIMATION>>8);
    ADCON2=(DECIMATION&255);        // AD-Speed

    ADCON0 = EVREF|EBUF|GAIN_1;         // Vref on 1.25V, Buff on, BOD off, PGA 1

    EAI=1;              // Enable Auxiliary IRQ
    AIE=0x20;           // Enable A/D aux IRQ
}
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.

Autor: Simon S. (antoras)
Datum:

Bewertung
0 lesenswert
nicht 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:
#include <stdio.h>
#include <reg1210.h>

void main(void)
{
  PCON |= 128;  // Baudrate double
  SCON = 124;   // 8 Bit UART - PC-compatible
  TH1 = 250;    // Divisor = -6 (57600/6=9600 Bd.)
  TMOD = 32;    // use timer 1 as baudrate generator
  TCON = 64;
  ES = 0;       // Enable Serial IRQ (if required)
  EA = 1;       // Enable general IRQs (if required)
  TI = 1;       // Transmitter Interrupt Flag
  
  printf("hello world\n");
  while (1);
}
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!

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.