Portieren von Beispielsources

Gast #76883
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?
Gast #76885
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...
Gast #76888
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...
Gast #76892
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.
Gast #76894
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?
Gast #76897
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...
Angehängte Dateien:

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.