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?
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...
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...
Hm, Poste doch mal bitte den gesamten Code und die Fehlermeldung... Gruß, Patrick...
Fehlermeldung des Compilers: "syntax error before numeric constant" Der Sourcecodode ist vollständig. Die Includes sind mspgcc Standard.
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...
Zu jeder Fehlermeldung gehört doch eine Zeilennummmer. Ohne die sucht man die Stecknadel im Heuhaufen. Peter
(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
Hab das gerade mal ausprobiert, wenn ich die signal.h nicht inkludiere, dann kommt: test1.c:4: syntax error before numeric constant Gruß, Patrick...
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.
Vielleicht bin ich ja blind und meine Suchfunktion im Emacs fehlerhaft, jedenfalls ist die signal.h nicht in der msp430x44x.h inkludiert! Gruß, Patrick...
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?
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!
Ich würde das nicht in die GCC-Header einfügen, macht doch keinen Sinn! Inkludier das Zeugs doch in Deinem Projekt... Gruß, Patrick...
// // 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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.