Forum: Mikrocontroller und Digitale Elektronik Compiler error: undeclared (first use in this function)


von Patrick H. (paddix)


Lesenswert?

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

von Patrick (Gast)


Lesenswert?

sollte es nicht
1
int main (void)
2
{...
3
return 0;
4
}
heissen?

von Patrick (Gast)


Lesenswert?

und muss da nicht noch ein
1
#define TRTS ...
hin?

Ich weiss nicht, ob das stimmt. Ich kenne nur AVR.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

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

von Patrick H. (paddix)


Lesenswert?

Danke, ja das war das Problem.

von Patrick H. (paddix)


Lesenswert?

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

von Patrick H. (paddix)


Lesenswert?

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?

von Severino R. (severino)


Lesenswert?

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
Noch kein Account? Hier anmelden.