Hi Versuche gerade den UART auf dsPIC33 zu initialisieren, erhalte aber folgende Fehlermeldung beim Builden. Kann mir jemand weiterhelfen? serial.c: In function `initU2': serial.c:23: error: `TRTS' undeclared (first use in this function) serial.c:23: error: (Each undeclared identifier is reported only once serial.c:23: error: for each function it appears in.) serial.c: At top level: serial.c:45: warning: return type defaults to `int' Hier der Sourcecode: //---------------------------------------------------------------------- ------- // Asinchronous Serial communication // UART RS232 asynchronous communication demo code //---------------------------------------------------------------------- ------- #include "p33FJ64MC508.h" //---------------------------------------------------------------------- ------- // I/O definitions for the dsPIC30 Motor Control Dev board //---------------------------------------------------------------------- ------- # define CTS _RG3 // Clear to Send, input, HW handshake # define RTS _RG2 // Request to Send, output, HW handshake # define TRTSTRISGbits .TRISG2 // Tris control for RTS pin # define BRATE 34 // 115200 Bd (BREGH=1) # define U_ENABLE 0x8008 // enable UART, BREGH=1, 1 stop, no parity # define U_TX 0x0400 //---------------------------------------------------------------------- ------- // Initialization of UART 2 module //---------------------------------------------------------------------- ------- void initU2(void){ U2BRG = BRATE; // initialize the baud rate generator U2MODE = U_ENABLE; // initialize the UART module TRTS = 0; // make RTS an output pin RTS = 1; // set RTS default status (not ready) } // initU2 int putU2(int c){ while(CTS); // wait for !CTS, clear to send while(U2STAbits.UTXBF); // wait while Tx buffer full U2TXREG = c; return c; } // putU2 char getU2(void){ RTS = 0; // assert Request To Send !RTS while(!U2STAbits.URXDA); // wait for a new character to arrive return U2RXREG; // read the character from the receive buffer RTS = 1; } // getU2 //---------------------------------------------------------------------- ------- // Main routine //---------------------------------------------------------------------- ------- main() { char c; initU2(); // init the UART2 serial port putU2('>'); // prompt while(1){ c = getU2(); // wait for character putU2(c); // echo the character } // while } //main
sollte es nicht
1 | int main (void) |
2 | {...
|
3 | return 0; |
4 | }
|
heissen?
Naja, vermutlich sollte das TRTS irgendwo aus einem System-Headerfile kommen, steht dort aber nicht so drin. Entweder Schreibfehler, oder Fehler im Systemheader. Ah nein, ich hab's gefunden:
1 | # define TRTSTRISGbits .TRISG2 // Tris control for RTS pin
|
Da fehlt simpel ein Leerzeichen:
1 | # define TRTS TRISGbits .TRISG2 // Tris control for RTS pin
|
Das Problem war, dass bei den I/O definitions die Zuweisung der Konstante TRTS zusammenhängend geschrieben wurde und sollte natürlich #define TRTS TRISGbits.TRISG2 lauten. Die 'warning' stammte daher, wie Patrick (Gast) korrekterweise bemerkt hat, dass die Funktion 'main' folgendermassen lauten sollte: int main (void) { ... return 0; } Vielen Dank für die schnelle Hilfe
Nun kann ich das Projekt zwar compilieren und builden. Aber leider funktioniert die Kommunikation mit dem Hyperterminal nicht. Die Verbindung zum Hyperterm kann nicht aufgebaut werden. Die Einstellungen im Hyperterm sollten jedoch korrekt sein (115200 Bd, (8 Datenbit, 1 Stopbit, No parity, Hardware handshake). Muss ich im dsPIC33 zusätzlich noch den Oszillator konfigurieren, oder mit welcher Frequenz lauft der uC per default?
Du musst den Oszillator schon konfigurieren, und zwar mit den FUSES, die Du entweder im Sourcecode eingeben kannst (ich glaube irgendwie so #PRAGMA ...) oder im Programmer (d.h. in MPLAB). Und zwar müssen die FUSES zum Oszillator passen, der in Hardware realisiert ist, also z.B. Quarz. Hast Du denn ein Schema? Die Default-Frequenz (für den internen RC-Osziollator?) entnimmst Du am besten dem Datenblatt.
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.