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
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(); } }
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.