Forum: Compiler & IDEs Portieren von Beispielsources


von Reiner Rottmann (Gast)


Lesenswert?

Kann mir jemand Tipps geben, wie man am Besten Beispielsources, die
ursprünglich nicht für GCC oder für ein anderes MSP430 Modell
geschrieben wurden portieren kann?

Ich habe teilweise noch ganz schön Schwierigkeiten, da etwas zum Laufen
zu bringen. z.B. die Demoprogramme exklusiv für den MSP430-449STK-B
(ursprünglich für IAR) bekomme ich nicht zum Laufen, obwohl sie für die
verwendete Hardware gedacht sind.

Dieses Beispiel kann ich auch nicht kompilieren. Ich habe die ISR
angepasst, aber es kommt immernoch die Fehlermeldung "syntax error
before numeric constant" bei der Interrupt Service Routine:

===============
/*********************************************************************
  initialization of hardware UART0 on MSP430x44x

  File:  main_hardware.c
  Author:  Rudolf Brunner rudolf.brunner@gmx.ch
  Date:  30.4.03

  Description:  This file echos a received character @ 4800 baud

                MSP430F449
             -----------------
         /|\|              XIN|-
          | |                 |
          --|RST          XOUT|-
            |                 |
            |             P2.4|----------->
            |                 | 4800 - 8N1
            |             P2.5|<-----------

*********************************************************************/

/*********************************************************************
  includes
*********************************************************************/
#include <msp430x44x.h>

/*********************************************************************
  function prototypes
*********************************************************************/
void init_UART(void);

/*********************************************************************
  implementations
*********************************************************************/
int main(void)
{
  init_UART();
  for(;;);
  return 0;
}

void init_UART(void){
  P4DIR = 0xff;
  P4OUT = 0x00;
  WDTCTL = WDTPW + WDTHOLD;             // Stop WDT
  FLL_CTL0 |= XCAP14PF;                 // Configure load caps
  UTCTL0 = SSEL0;                       // UCLK = ACLK
  UBR00 = 0x06;                         // 32kHz @ 4800 baud
  UBR10 = 0x00;                         // 32kHz @ 4800 baud
  UMCTL0 = 0xef;                        // Modulation Sequence
7-7-7-7-6-7-7-7
  UCTL0 = CHAR;                         // 8-bit character SWRST
  ME1 |= UTXE0 + URXE0;                 // Enable USART0 TXD/RXD
  IE1 |= URXIE0;                        // Enable USART0 RX interrupt
  P2SEL |= 0x30;                        // P2.4,5 = USART0 TXD/RXD
  P2DIR |= 0x10;                        // P2.4 output direction
  _EINT();                              // Enable interrupts
}

/*********************************************************************
  interrupt service routine ISR
*********************************************************************/
//interrupt (UART0RX_VECTOR) void usart0_rx(void)***HIER DER FEHLER***
interrupt(UART0RX_VECTOR) void isr_usart1rx(void)
{
  while ((IFG1 & UTXIFG0) == 0);        // USART0 TX buffer ready?
  TXBUF0 = RXBUF0;                      // RXBUF0 to TXBUF0
  P4OUT = RXBUF0;
}
==============

Sind eigentlich teilweise voll die billigen Programme aber trotzdem
komme ich nicht mal dazu sie zu kompilieren. Kann mir da jemand
weiterhelfen?

von OldBug (Gast)


Lesenswert?

Hallo Reiner!

Erst mal: http://mspgcc.sourceforge.net/manual/x917.html

Demnach müsste Deine ISR-Deklaration so aussehen:
interrupt(UART0RX_VECTOR) isr_usart1rx(void)
{
  while ((IFG1 & UTXIFG0) == 0);        // USART0 TX buffer ready?
  TXBUF0 = RXBUF0;                      // RXBUF0 to TXBUF0
  P4OUT = RXBUF0;
}

Viel Erfolg!

Gruß,
Patrick...

von Reiner Rottmann (Gast)


Lesenswert?

Die Anleitung habe ich gelesen und auch schon ziemlich alles ausprobiert
davon. Auch wenn das Void weggelassen wird, kommt der gleiche Fehler.
Die Konstanten habe ich extra auch in den Headerfiles nochmal gesucht
um sicherzustellen, dass die auch passen, aber trotzdem meckert der
Compiler...

von OldBug (Gast)


Lesenswert?

Hm,
Poste doch mal bitte den gesamten Code und die Fehlermeldung...

Gruß,
Patrick...

von Reiner Rottmann (Gast)


Lesenswert?

Fehlermeldung des Compilers: "syntax error
before numeric constant"

Der Sourcecodode ist vollständig. Die Includes sind mspgcc Standard.

von OldBug (Gast)


Lesenswert?

Ah, hm...
Ich meinte eigentlich, daß Du die komplette Fehlermeldung posten
solltest, aber egal, habe gerade gesehen, daß Du die signal.h nicht
inkludierst.

#include <signal.h>

Da ist alles notwendige für Interrupts drin...

Gruß,
Patrick...

von Peter D. (peda)


Lesenswert?

Zu jeder Fehlermeldung gehört doch eine Zeilennummmer.
Ohne die sucht man die Stecknadel im Heuhaufen.


Peter

von Andreas S. (andreas) (Admin) Benutzerseite


Lesenswert?

(fast?) alle Beispielprogramme von TI (C und Assembler) gibt es übrigens
auch für MSPGCC, vielleicht kannst du dir da ein paar Sachen abschauen.
Speziell für dein Vorhaben:
http://cvs.sourceforge.net/viewcvs.py/*checkout*/mspgcc/examples/slac019/fet440_uart01_02400.c?content-type=text%2Fplain&rev=1.1

von OldBug (Gast)


Lesenswert?

Hab das gerade mal ausprobiert, wenn ich die signal.h nicht inkludiere,
dann kommt:

test1.c:4: syntax error before numeric constant

Gruß,
Patrick...

von Reiner Rottmann (Gast)


Lesenswert?

Signal.h ist in der msp430x44x.h bereits inkludiert.

Die Zeilennummer hab ich nicht angegeben, da der Source zusammen mit
meinem Text geschrieben ist. Aber ich habe die Stelle markiert, also
genau der Anfang der ISR.

von OldBug (Gast)


Lesenswert?

Vielleicht bin ich ja blind und meine Suchfunktion im Emacs fehlerhaft,
jedenfalls ist die signal.h nicht in der msp430x44x.h inkludiert!

Gruß,
Patrick...

von OldBug (Gast)


Lesenswert?

Ahja, hier mal die zwei Versionen von test1.c, kompiliert mit
# msp430-gcc -o test.elf test1.c
ohne jegliche Warnung:

test1.c
--8<--
#include <msp430x14x.h>
#include <signal.h>

interrupt(UART0RX_VECTOR) isr_usart1rx(void)
{
  while ((IFG1 & UTXIFG0) == 0);        // USART0 TX buffer ready?
  TXBUF0 = RXBUF0;                      // RXBUF0 to TXBUF0
  P4OUT = RXBUF0;
}

int
main(void)
{
  while(1);
}

--8<--

Zweite Version, kompiliert nicht, bricht mit error
test1.c:4: syntax error before numeric constant
ab:

test1.c
--8<--
#include <msp430x14x.h>
//#include <signal.h>

interrupt(UART0RX_VECTOR) isr_usart1rx(void)
{
  while ((IFG1 & UTXIFG0) == 0);        // USART0 TX buffer ready?
  TXBUF0 = RXBUF0;                      // RXBUF0 to TXBUF0
  P4OUT = RXBUF0;
}

int
main(void)
{
  while(1);
}

--8<--

Nachvollziehbar?

von Reiner Rottmann (Gast)


Lesenswert?

Stimmt. Mein Fehler. In den Headerdateien von GCC ist die Signal.h noch
nicht eingetragen. Fügt man es hinzu klappt das Kompilieren. Vielen
Dank!

von OldBug (Gast)


Lesenswert?

Ich würde das nicht in die GCC-Header einfügen, macht doch keinen Sinn!
Inkludier das Zeugs doch in Deinem Projekt...

Gruß,
Patrick...

von Reiner Rottmann (Gast)


Angehängte Dateien:

Lesenswert?

//
// Dieses Programm erzeugt ein Rechteckmuster an der RS232
Schnittstelle.
// Kann man verwenden um mit dem Oszilloskop die Schnittstelle zu
debuggen.
//
#include  <signal.h>
#include <msp430x44x.h>
#include  <io.h>

int main(void)
{
  int j,i;
  WDTCTL = WDTPW + WDTHOLD;             // Stop WDT
  FLL_CTL0 |= XCAP14PF;                 // Configure load caps
  UTCTL0 = SSEL1;                       // UCLK = SMCLK
  UBR00 = 0x6D;                         // 1MHz 9600
  UBR10 = 0x00;                         // 1MHz 9600
  UMCTL0 = 0x00;                        // no modulation
  UCTL0 = CHAR;                         // 8-bit character SWRST
  ME1 |= UTXE0 + URXE0;                 // Enable USART0 TXD/RXD
  IE1 |= URXIE0;                        // Enable USART0 RX interrupt
  P2SEL |= 0x30;                        // P2.4,5 = USART0 TXD/RXD
  P2DIR |= 0x10;                        // P2.4 output direction
//  _EINT();                              // Enable interrupts
  TXBUF0=1;
  RXBUF0=0;
  for (;;)
  {
    P5DIR = BIT7;                         // Set P5.7 to output
direction
    P5OUT = BIT7;                         // Lights on
    TXBUF0!=TXBUF0;
    for(i = 0; i < 100; i++){for(j = 0; j < 2; j++);};
    RXBUF0!=RXBUF0;
    for(i = 0; i < 100; i++){for(j = 0; j < 2; j++);};

//    _BIS_SR(CPUOFF);                    // Enter LPM0
//    _NOP();                             // Required only for C-spy
  }
  return 0;
}

Hab den Beispielsource mal angepasst und die Interruptroutine
rausgenommen. In der Endlosschleife müsste er doch eigentlich ein
Rechteckmuster an Pin 2.4 und 2.5 erzeugen oder? Kann das jemand
verifizieren? Hab das diesen Code auch mal für den msp430 kompiliert
angefügt.

Welches Signal hat man auf dem Oszi zu erwarten. Hab ein
Terminalprogramm auf Handshake=off eingestellt und sinnlose
Zeichenfolgen an den Ausgang geworfen und es waren bei mir immer nur 6
ganz kleine Spikes mit 40mV und Tastkopf 10:1. Kaum vom
Hintergrundrauschen zu unterscheiden aber eindeutig auf Tasteneingaben
zurückzuführen. An den Pins der Platine finde ich nur Rauschen...

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.