Hallo zusammen, wenn ich meine UART Schnittstelle initialisiert habe, wie kann ich dann 1Byte abschicken? Hat jemand einen Beispielcode dafür? Printf sicherlich nicht... ich kenne mich mit UART nicht wirklich aus und bräuchte dringend Hilfe!
Dann bei Silabs.com nach Beispielcode (Appnotes) suchen. Dort gibts reichlich Beispiele.
INT8U SerIntReceive(INT8U *cc) { INT8U retval=0; if(SCON0 & 0x01){ //RI==1? //Byte was received *cc =SBUF0; //get byte SCON0 =SCON0 & 0xFE; //1111 1110 reset RI switch(*cc){ case XON: //XON, XOFF Erkennung case XOFF: retval=*cc; //Rückgabewert ist XON oder XOFF break; default: retval=1; //normal receive action } } return(retval); } INT8U SerIntTransmit(INT8U cc) { INT8U retval=0; if(SCON0 & 0x02){ //TI==1? //preceding Byte was sent retval =1; //mark last transmit action was ok if(cc!='\n'){ //special character in order to check //wether preceding transmit was successfull //Can be any other usefull character SBUF0 =cc; //send byte SCON0 =SCON0 & 0xFD; //1111 1101 reset TI } } return(retval); } ist von nem C8051F340
DANKE für den Tipp, komm damit aber nicht zurecht INT8U kennt der compiler nicht...hab selbst auch noch nicht davon gehört, was ist das für ein Datentyp? Ums einfach zu erklären: Ich möchte gerne das ASCII Zeichen "c" senden und zwar in HEX. Mein Code sieht aus wie folgt. //---------------------------------------------------------------------- -------------------------- //---------------------------------------------------------------------- -------------- // FID: 33X000035 // Target: C8051F33x // Tool chain: Keil C51 7.50 / Keil EVAL C51 // Command Line: None // // Release 1.0 // -Initial Revision (PD) // -16 AUG 2006 // //---------------------------------------------------------------------- ------- // Includes //---------------------------------------------------------------------- ------- #include <c8051F330.h> // SFR declarations #include <stdio.h> //---------------------------------------------------------------------- ------- // Global CONSTANTS //---------------------------------------------------------------------- ------- #define SYSCLK 24500000 // SYSCLK frequency in Hz #define BAUDRATE 9600 // Baud rate of UART in bps //---------------------------------------------------------------------- ------- // Function PROTOTYPES //---------------------------------------------------------------------- ------- void SYSCLK_Init (void); void UART0_Init (void); void PORT_Init (void); void Timer2_Init (int); //---------------------------------------------------------------------- ------- // MAIN Routine //---------------------------------------------------------------------- ------- void main (void) { unsigned char inputcharacter; // Used to store character from UART PCA0MD &= ~0x40; // WDTE = 0 (clear watchdog timer // enable) PORT_Init(); // Initialize Port I/O SYSCLK_Init (); // Initialize Oscillator UART0_Init(); while (1) { } } //---------------------------------------------------------------------- ------- // Initialization Subroutines //---------------------------------------------------------------------- ------- //---------------------------------------------------------------------- ------- // PORT_Init //---------------------------------------------------------------------- ------- // // Return Value : None // Parameters : None // // Configure the Crossbar and GPIO ports. // // P0.4 digital push-pull UART TX // P0.5 digital open-drain UART RX // //---------------------------------------------------------------------- ------- void PORT_Init (void) { P0MDOUT |= 0x10; // Enable UTX as push-pull output XBR0 = 0x01; // Enable UART on P0.4(TX) and P0.5(RX) XBR1 = 0x40; // Enable crossbar and weak pull-ups } //---------------------------------------------------------------------- ------- // SYSCLK_Init //---------------------------------------------------------------------- ------- // // Return Value : None // Parameters : None // // This routine initializes the system clock to use the internal oscillator // at its maximum frequency. // Also enables the Missing Clock Detector. //---------------------------------------------------------------------- ------- void SYSCLK_Init (void) { OSCICN |= 0x03; // Configure internal oscillator for // its maximum frequency RSTSRC = 0x04; // Enable missing clock detector } //---------------------------------------------------------------------- ------- // UART0_Init //---------------------------------------------------------------------- ------- // // Return Value : None // Parameters : None // // Configure the UART0 using Timer1, for <BAUDRATE> and 8-N-1. //---------------------------------------------------------------------- ------- void UART0_Init (void) { SCON0 = 0x10; // SCON0: 8-bit variable bit rate // level of STOP bit is ignored // RX enabled // ninth bits are zeros // clear RI0 and TI0 bits if (SYSCLK/BAUDRATE/2/256 < 1) { TH1 = -(SYSCLK/BAUDRATE/2); CKCON &= ~0x0B; // T1M = 1; SCA1:0 = xx CKCON |= 0x08; } else if (SYSCLK/BAUDRATE/2/256 < 4) { TH1 = -(SYSCLK/BAUDRATE/2/4); CKCON &= ~0x0B; // T1M = 0; SCA1:0 = 01 CKCON |= 0x01; } else if (SYSCLK/BAUDRATE/2/256 < 12) { TH1 = -(SYSCLK/BAUDRATE/2/12); CKCON &= ~0x0B; // T1M = 0; SCA1:0 = 00 } else { TH1 = -(SYSCLK/BAUDRATE/2/48); CKCON &= ~0x0B; // T1M = 0; SCA1:0 = 10 CKCON |= 0x02; } TL1 = TH1; // Init Timer1 TMOD &= ~0xf0; // TMOD: timer 1 in 8-bit autoreload TMOD |= 0x20; TR1 = 1; // START Timer1 TI0 = 1; // Indicate TX0 ready } //---------------------------------------------------------------------- ------- // End Of File //---------------------------------------------------------------------- -------
INT8U ist per define als unsigned int definiert in einem extra header file, das wirst du ja wohl noch für dich umschreiben können. Jeder macht sich seine Namenkonvention so wie er sie schön und sinnvoll findet.
Chris S. schrieb: > Jeder macht > sich seine Namenkonvention so wie er sie schön und sinnvoll findet Warum willst du ihn zu einem solchen Wildwuchs auffordern? Ich mache immer #include <inttypes.h>, das sollte bei jedem Compiler beiliegen und sollte auch entsprechend standardisiert sein. Wenns nicht beiliegt, muss mans eben selber schreiben. Nun gibt es uint8_t usw. wie es eigentlich überall verwendet wird. Ich hasse diese uralten Mnemonics wie z.B. "long" und ganz toll ist es wenn man mit "long long" daherkommt... mfg mf
@ Mini Float (minifloat) >Ich mache immer #include <inttypes.h>, das sollte bei jedem Compiler >beiliegen und sollte auch entsprechend standardisiert sein. Wenns nicht Eben. >es eigentlich überall verwendet wird. Ich hasse diese uralten Mnemonics Me too! >wie z.B. "long" und ganz toll ist es wenn man mit "long long" Haben die Chinesen C erfunden? ;-) MfG Falk
>Ich möchte gerne das ASCII Zeichen "c" senden und zwar in HEX.
Ich würde die Grundlagen empfehlen. Die, die weit vor der UART liegen.
SBUF0 = 0x43; bzw. SBUF0 = 0x63; Aber schau dir mal die Beispiele / Datenblätter von Silabs an, da gibt es alles! Dir fehlen GRUNDLAGEN!
Mini Float schrieb: > Chris S. schrieb: >> Jeder macht >> sich seine Namenkonvention so wie er sie schön und sinnvoll findet > > Warum willst du ihn zu einem solchen Wildwuchs auffordern? Ich hab nie gesagt das ich INT8U für eine sinnvolle Namenskonvention halte, wollt ihn nur darauf hinweisen das nicht überall unsigned int davor steht wo unsigned int drin steckt.
Super Danke für die viele Infos, jetzt brauch ich allerdings weitere Hilfestellungen. Habe mein aktuelles Programm und die noch zu erledigenden Aufgaben unten notiert. Wäre sehr gut wenn mir jemand sagen kann was ich ändern muss oder wie es funktioniert. Was der uC bereits macht: 1. Er sendet den einmaligen Befehl "c" hinaus. Was er noch machen soll: 1. Daten auf welche über SBUF kommen speichern in einer Variable 2. Variable mit einer Konstanten vergleichen 3. Port ansteuern //---------------------------------------------------------------------- ---- //---------------------------------------------------------------------- ------- // Includes //---------------------------------------------------------------------- ------- #include <c8051F330.h> // SFR declarations #include <stdio.h> //---------------------------------------------------------------------- ------- // Global CONSTANTS //---------------------------------------------------------------------- ------- #define SYSCLK 24500000 // SYSCLK frequency in Hz #define BAUDRATE 9600 // Baud rate of UART in bps sbit LEDgrn = P1^2; //---------------------------------------------------------------------- ------- // Function PROTOTYPES //---------------------------------------------------------------------- ------- void SYSCLK_Init (void); void UART0_Init (void); void PORT_Init (void); void Read_C(void); void SerIntReceive(void); //---------------------------------------------------------------------- ------- // MAIN Routine //---------------------------------------------------------------------- ------- void main (void) { int a=0; PCA0MD &= ~0x40; // WDTE = 0 (lear watchdog timer // enable) PORT_Init(); // Initialize Port I/O SYSCLK_Init (); // Initialize Oscillator UART0_Init(); while (1) { if(a==0) { Read_C(); //Function READ CONTINUOUS a=1; } if(a==1) { SCON0=0x01; SerIntReceive(); } } } //---------------------------------------------------------------------- ------- // PORT_Init //---------------------------------------------------------------------- ------- // // P0.4 digital push-pull UART TX // P0.5 digital open-drain UART RX // //---------------------------------------------------------------------- ------- void PORT_Init (void) { P0MDOUT |= 0x10; // Enable UTX as push-pull output P1MDOUT |= 0x0; XBR0 = 0x01; // Enable UART on P0.4(TX) and P0.5(RX) XBR1 = 0x40; // Enable crossbar and weak pull-ups } //---------------------------------------------------------------------- ------- // SYSCLK_Init //---------------------------------------------------------------------- ------- void SYSCLK_Init (void) { OSCICN |= 0x03; // Configure internal oscillator for // its maximum frequency RSTSRC = 0x04; // Enable missing clock detector } //---------------------------------------------------------------------- ------- // UART0_Init // // Configure the UART0 using Timer1, for <BAUDRATE> and 8-N-1. //---------------------------------------------------------------------- ------- void UART0_Init (void) { SCON0 = 0x10; // SCON0: 8-bit variable bit rate // level of STOP bit is ignored // RX enabled // ninth bits are zeros // clear RI0 and TI0 bits if (SYSCLK/BAUDRATE/2/256 < 1) { TH1 = -(SYSCLK/BAUDRATE/2); CKCON &= ~0x0B; // T1M = 1; SCA1:0 = xx CKCON |= 0x08; } else if (SYSCLK/BAUDRATE/2/256 < 4) { TH1 = -(SYSCLK/BAUDRATE/2/4); CKCON &= ~0x0B; // T1M = 0; SCA1:0 = 01 CKCON |= 0x01; } else if (SYSCLK/BAUDRATE/2/256 < 12) { TH1 = -(SYSCLK/BAUDRATE/2/12); CKCON &= ~0x0B; // T1M = 0; SCA1:0 = 00 } else { TH1 = -(SYSCLK/BAUDRATE/2/48); CKCON &= ~0x0B; // T1M = 0; SCA1:0 = 10 CKCON |= 0x02; } TL1 = TH1; // Init Timer1 TMOD &= ~0xf0; // TMOD: timer 1 in 8-bit autoreload TMOD |= 0x20; TR1 = 1; // START Timer1 TI0 = 1; // Indicate TX0 ready } //---------------------------------------------------------------------- ------ //Read Continuous TAGs //---------------------------------------------------------------------- ------ void Read_C(void) { SBUF0 = 'c'; SBUF0 = '0'; } //---------------------------------------------------------------------- ------ //Compare //---------------------------------------------------------------------- ------ void SerIntReceive(void) { unsigned char serial1[] = "927124B8"; unsigned char varserial[8]; if(SCON0 == 0x01) //RI==1? { SBUF0= //Byte was received varserial[8] = SBUF0; //get byte SCON0 = SCON0 & 0xFE; //1111 1110 reset RI if(varserial[8]==serial1[8]) { LEDgrn=1; } } } //---------------------------------------------------------------------- ------ // End Of File //---------------------------------------------------------------------- ------
Peter S. schrieb: > Hallo zusammen, > > wenn ich meine UART Schnittstelle initialisiert habe, wie kann ich dann > 1Byte abschicken? Hat jemand einen Beispielcode dafür? Printf sicherlich > nicht... ich kenne mich mit UART nicht wirklich aus und bräuchte > dringend Hilfe! http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Die_Nutzung_von_sprintf_und_printf Steht eigentlich alles im Tutorial hier auf der Seite :)
Super Danke für die viele Infos, jetzt brauch ich allerdings weitere Hilfestellungen. Habe mein aktuelles Programm und die noch zu erledigenden Aufgaben unten notiert. Wäre sehr gut wenn mir jemand sagen kann was ich ändern muss oder wie es funktioniert. Was der uC bereits macht: 1. Er sendet den einmaligen Befehl "c" hinaus. Was er noch machen soll: 1. Daten auf welche über SBUF kommen speichern in einer Variable 2. Variable mit einer Konstanten vergleichen 3. Port ansteuern Quellcode: //---------------------------------------------------------------------- ------- // Includes //---------------------------------------------------------------------- ------- #include <c8051F330.h> // SFR declarations #include <stdio.h> #include <string.h> //---------------------------------------------------------------------- ------- // Global CONSTANTS //---------------------------------------------------------------------- ------- #define SYSCLK 24500000 // SYSCLK frequency in Hz #define BAUDRATE 9600 // Baud rate of UART in bps //---------------------------------------------------------------------- ------- // Function PROTOTYPES //---------------------------------------------------------------------- ------- void SYSCLK_Init (void); void UART0_Init (void); void PORT_Init (void); void Read_C(void); void SerIntReceive(void); //---------------------------------------------------------------------- ------- // MAIN Routine //---------------------------------------------------------------------- ------- void main (void) { int a=0; PCA0MD &= ~0x40; // WDTE = 0 (lear watchdog timer // enable) PORT_Init(); // Initialize Port I/O SYSCLK_Init (); // Initialize Oscillator UART0_Init(); while (1) { if(a==0) { Read_C(); //Function READ CONTINUOUS a=1; } if(a==1) { SerIntReceive(); } } } //---------------------------------------------------------------------- ------- // PORT_Init //---------------------------------------------------------------------- ------- // // P0.4 digital push-pull UART TX // P0.5 digital open-drain UART RX // //---------------------------------------------------------------------- ------- void PORT_Init (void) { P0MDOUT |= 0x10; // Enable UTX as push-pull output P1MDOUT |= 0x0; XBR0 = 0x01; // Enable UART on P0.4(TX) and P0.5(RX) XBR1 = 0x40; // Enable crossbar and weak pull-ups } //---------------------------------------------------------------------- ------- // SYSCLK_Init //---------------------------------------------------------------------- ------- void SYSCLK_Init (void) { OSCICN |= 0x03; // Configure internal oscillator for // its maximum frequency RSTSRC = 0x04; // Enable missing clock detector } //---------------------------------------------------------------------- ------- // UART0_Init // // Configure the UART0 using Timer1, for <BAUDRATE> and 8-N-1. //---------------------------------------------------------------------- ------- void UART0_Init (void) { SCON0 = 0x10; // SCON0: 8-bit variable bit rate // level of STOP bit is ignored // RX enabled // ninth bits are zeros // clear RI0 and TI0 bits if (SYSCLK/BAUDRATE/2/256 < 1) { TH1 = -(SYSCLK/BAUDRATE/2); CKCON &= ~0x0B; // T1M = 1; SCA1:0 = xx CKCON |= 0x08; } else if (SYSCLK/BAUDRATE/2/256 < 4) { TH1 = -(SYSCLK/BAUDRATE/2/4); CKCON &= ~0x0B; // T1M = 0; SCA1:0 = 01 CKCON |= 0x01; } else if (SYSCLK/BAUDRATE/2/256 < 12) { TH1 = -(SYSCLK/BAUDRATE/2/12); CKCON &= ~0x0B; // T1M = 0; SCA1:0 = 00 } else { TH1 = -(SYSCLK/BAUDRATE/2/48); CKCON &= ~0x0B; // T1M = 0; SCA1:0 = 10 CKCON |= 0x02; } TL1 = TH1; // Init Timer1 TMOD &= ~0xf0; // TMOD: timer 1 in 8-bit autoreload TMOD |= 0x20; TR1 = 1; // START Timer1 TI0 = 1; // Indicate TX0 ready ES0 = 1; //enabled UART0 Interrupt } //---------------------------------------------------------------------- ------ //Read Continuous TAGs //---------------------------------------------------------------------- ------ void Read_C(void) { SBUF0 = 'c'; SBUF0 = '0'; } //---------------------------------------------------------------------- ------ //Compare //---------------------------------------------------------------------- ------ void SerIntReceive(void) { unsigned char serial1[] = "927124B8"; unsigned char varserial[8]; if(SCON0 == 0x01) //RI==1? { //Byte was received varserial[8] = SBUF0; //get byte SCON0 = SCON0 & 0xFE; //1111 1110 reset RI if(strcmp(serial1,varserial)==0) { P1MDOUT |= 0x01; } } } //---------------------------------------------------------------------- ------ // End Of File //---------------------------------------------------------------------- ------
Peter S. schrieb: > Super Danke für die viele Infos, jetzt brauch ich allerdings weitere > Hilfestellungen. Habe mein aktuelles Programm und die noch zu Peter S. schrieb: > Super Danke für die viele Infos, jetzt brauch ich allerdings weitere > Hilfestellungen. Habe mein aktuelles Programm und die noch zu Hab' jetzt leider keine Lust deine beiden Posts im Einzelnen zu vergleichen. Kannst du mal in 3 Zeilen sagen, was der Unterschied zwischen beiden Versionen ist?
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.