Forum: Mikrocontroller und Digitale Elektronik UART Beispielprogramm compilen


von wurf (Gast)


Angehängte Dateien:

Lesenswert?

Hallo!

Ich möchte wie gesagt das UART verwenden, dazu hab ich mir ein
Beispielprogramm heruntergeladen, das ich jetzt kompilieren will. Das
Programm befindet sich im Anhang. Ich habe daran nichts geändert außer
den Pfad für signal.h nach avr/signal.h geändert (sonst gibts noch mehr
Fehler)

Doch nun gibt es immer noch einige Fehler wenn ich das Programm mit
'avr-gcc -g -mmcu=at90s4433 -Wall -Wstrict-prototypes -Os
-mcall-prologues -Os -c avrledtest.c' kompilieren will.

Nämlich diese:

avrledtest.c: In function `uart_init':
avrledtest.c:81: error: `UCR' undeclared (first use in this function)
avrledtest.c:81: error: (Each undeclared identifier is reported only
once
avrledtest.c:81: error: for each function it appears in.)

Kann mir einer sagen was da zu bedeuten hat, und was ich ändern muss
damit der Fehler nicht mehr auftritt?

Danke für eure Hilfe schonmal,

Michi

von Frank Weuster (Gast)


Lesenswert?

Hi Michi,
nachfolgend habe ich dir einige Teile aus meinem Programm
zusammengestellt.Buffer und Pointer bitte selbst erstellen.
Die Daten werden hier über eine RS485/RS422 empfangen/ gesendet.
Versuch dich mal einzuarbeiten, vielleicht hilft es dir weiter.


//
// 9600,n,8,1
//
void Init_SCI_0 (void)
{
int i;

    cEmPtr = cEmBuffer;
   cSePtr = cSeBuffer;
  cEmMrk = 0;
  cSeMrk = 0;

  pd6_0  = 1;        // p6_0 als Ausgang, wichtig fuer 
Sendereinschaltung !
  p6_0  = 0;

  // Sleep=no, Parity=no, 1StopBit, IntClk, 8-Bit
  // Setting UART0 transmit/receive mode register (UART mode)
  u0mr = 0x05;            // XXXX XXXX
                          // |||| |||+- uart mode
                          // |||| ||+-- uart mode
                          // |||| |+--- uart mode
                          // |||| |     000: Serial I/O disable
                          // |||| |     100: 7 bit data
                          // |||| |     101: 8 bit data
                          // |||| |     110: 9 bit data
                          // |||| +---- Internal/external clock select
bit
                          // ||||       0: Internal clock
                          // ||||       1: External clock
                          // |||+------ Stop bit length select bit
                          // |||        0: One stop bit
                          // |||        1: Two stop bit
                          // ||+------- Odd/even parity select bit
                          // ||         Valid when bit 6 = 1
                          // ||         0: Odd parity
                          // ||         1: Even parity
                          // |+-------- Parity enable bit
                          // |          0: Parity disabled
                          // |          1: Parity enabled
                          // +--------- Sleep select bit
                          //            0: Sleep mode deselected
                          //            1: Sleep mode selected


    // Setting UART0 transmit/receive control register 0 (UART mode)
    // CMOS, No CTS/RTS
    u0c0 = 0x10;            // 00XX XXXX
                            // |||| |||+- BRG count source select bit
                            // |||| ||+-- BRG count source select bit
                            // |||| ||    00: f1 is selected
                            // |||| ||    01: f8 is selected
                            // |||| ||    10: f32 is selected
                            // |||| ||    11: inhibited
                            // |||| |+--- /CTS//RTS function select
bit
                            // |||| |     (Valid when bit 4 ='0')
                            // |||| |     0: /CTS function is selected
                            // |||| |     1: /RTS function is selected
                            // |||| +---- Transmit register empty flag

                            // ||||       0: Data present in transmit
register
                            // ||||          (during transmission)
                            // ||||       1: No Data present in
transmit register
                            // ||||          (transmission completed)
                            // |||+------ /CTS//RTS disable bit
                            // |||        0: /CTS//RTS function
enabled
                            // |||        1: /CTS//RTS function
disabled
                            // ||+------- Data output select bit
                            // ||         0: TxD0 pin is CMOS output
                            // ||         1: TxD0 pin is N-channel
open-drain
                            // ||            output
                            // |+-------- Must be fixed to '0'
                            // +--------- Must be fixed to '0'


  // Setting UART0 transmit/receive control register 1 (UART mode)
  u0c1 = 0x05;
  //u0c1 = 0x01;          // ---- X1X1
                          //      |||+- TE Transmit enable bit
                          //      |||      0: Transmission disabled
                          //      |||      1: Transmission enabled
                     //       ||+-- TI Transmit buffer empty flag
                     //       ||       0: Data present in transmit 
buffer
register
                     //       ||       1: No data present in transmit 
buffer
register
                           //      |+--- RE Receive enable bit
                          //      |        0: Reception disabled
                          //      |        1: Reception enabled
                          //      +---- RI Receive complete flag
                          //               0: No data present in
receive buffer
                          //               1: Data present in receive
buffer


   // Setting UART0 transmit/receive control register 2 (UART mode)
  ucon = 0x00;               // -X0- ---X    ????
                            //  ||     +- UART0 transmit interrupt
cause select bit
                            //  ||        0: Transmit buffer empty
(TI=1)
                            //  ||        1: Transmission completed
(TXEPT=1)
                            //  |+------- Must be fixed to '0'
                            //  +-------- Separate /CTS//RTS bit
                            //            0: /CTS//RTS shared pin
                            //            1: /CTS//RTS separate pin


  // Setting UART2 bit rate generator for 1200 baud (UART mode)
  u0brg = 0x67;          // REMARKS:
U0BRG=(Xin/(16*clock_select*Baud))-1
                            // For example:
                            // Xin = 16MHz
                            // clock_select = 1 (source=f8)  <<== f8
beachten
                            // Baud = 1200 Baud rate
                      // =>  u0brg = 103d = 0x67 (actual baud = 1200)



  // void setUART0Rxint(void)
   s0ric = 0x01;       // ---- XXXX
                      //      ||||
                      //      |||+-- Interupt priority level select
bit
                      //      ||+--- Interupt priority level select
bit
                      //      |+---- Interupt priority level select
bit
                      //      |      000: Level 0 (interrupt disabled)
                      //      |      001: Level 1
                      //      |      010: Level 2
                      //      |      011: Level 3
                      //      |      100: Level 4
                      //      |      101: Level 5
                      //      |      110: Level 6
                      //      |      111: Level 7
                      //      +----- Interupt request bit
                      //             0: Interrupt not requested
                      //             1: Interrupt requested

}



// #############################################################
// Aufgerufen, durch Zeichenampfang an UART 0 (Party-Line RS485)
// #############################################################
void far INT_SCI_0_R (void)
  {
  unsigned char c;

  ir_s0ric  = 0;

  if (u0c1 & 0x08)      // check UART0 Receive Complete Flag
     {              // if valid data is present
     c = u0rbl;

    if (cEmMrk == TRUE)  // Wenn Mrk schon gesetzt ist dann raus,
      return;        // es koennte sich bei 2-Draht um eigene Daten 
handeln !

    if ( (cEmPtr < cEmBuffer) ||  (cEmPtr >= &cEmBuffer[LEN_EBUF]) )
      cEmPtr = cEmBuffer;

    switch (c)
      {

         case STX:  cEtxMrk     = FALSE;
                   cEmXor      = 0;
                   cEmPtr      = cEmBuffer;
                   *cEmPtr     = c;
                   break;

      case ETX:  *cEmPtr     = c;
                  cEtxMrk     = TRUE;
                  break;

      case EOT:  *cEmPtr     = c;
                  cEmMrk     = TRUE;
              break;

      default:   *cEmPtr     = c;
                  if (!cEtxMrk)
                      cEmXor ^= c;

        }//EndOfSwitch
    cEmPtr++;
    }

  else  // Falls Uebertragungsfehler
    c = u0rbl;

  } // EndOfInterrupt

void SendeRoutine (void)
  {
  //
  // Wenn cSeMrk == 0 ist, steht nichts zu senden an
  //
  if ( cSeMrk == FALSE )
    {
    return;  //  SenderAus();
    }

  //
  // Wenn cSeMrk == 1 ist, Daten aus Buffer senden
  //
  else if ( cSeMrk == 1 )
    {
    if (!(u0c1 & 0x02))          // Wait while data is present in 
transmit
BUFFER
      return;

    if ((u0tbl = *cSePtr++) == EOT)  // write new data to UART0 transmit
buffer
      cSeMrk = 2;
    return;
    }

  //
  // Wenn cSeMrk == 2 ist, wurde das original EOT bereits uebergeben.
  //
  else if (cSeMrk == 2 )
    {
    if (!(u0c1 & 0x02))          // Wait while data is present in 
transmit
BUFFER
      return;

    u0tbl = EOT;
    cSeMrk = 3;
    return;
    }

  //
  // Wenn cSeMrk == 3 ist, wurde das original EOT bereit gesendet !
  //
  else if (cSeMrk == 3 )
    {
    if (!(u0c1 & 0x02))         // Wait while data is present in 
transmit
BUFFER
      return;

     cSeMrk = 0;
     cEmMrk = 0;
     SenderAus();
     }
   }

von Peter Fleury (Gast)


Lesenswert?

Das AVR-GCC Beispiel das du heruntergeladen hast, ist völlig veraltet,
und compiliert deshalb nicht mehr mit aktuellen WinAVR.

Das wurde in diesen Forum schon mehrfach erwähnt dass die gcctest
Beispiele völlig veraltet sind.

Schau besser meine UART library an:
http://www.mysunrise.ch/users/pfleury/avr-software.html

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.