hmm also ich hab jetzt nochmal folgenden Code ausprobiert:
Da wird wenn ich den Controller starte jeweils einmal in nb_getkey und einmal in b_getkey gesprungen. Ich lass mir das jeweils auf dem Terminal ausgeben. Aber Zeichen kann ich so nicht empfangen.Code:#include <c8051F330.h> #include <stdio.h> #define SYSCLK 24500000 #define BAUDRATE 115200 #define RX_length 25 //----------------------------------------------------------------------------- // Global Variables //----------------------------------------------------------------------------- //bit TX_ready; //True = OK zur Übertragung //char *TX_ptr; //pointer auf zu übermittelnden String bit RX_ready; //True = string empfangen char RX_buf[RX_length]; //Array als Eingangsbuffer anlegen unsigned char the_char; //zwischenspeicher sfr SBUF = 0x99; sbit RI = 0x98; //----------------------------------------------------------------------------- // Function Prototypes //----------------------------------------------------------------------------- void OSCILLATOR_Init (void); void UART0_Init (void); void PORT_Init (void); void UART0_ISR (void); void Print_String (char pstring[]); char nb_getkey (); char b_getkey (); //----------------------------------------------------------------------------- // main Routine //----------------------------------------------------------------------------- void main (void) { // Disable Watchdog timer PCA0MD &= ~0x40; // WDTE = 0 (clear watchdog timer // enable) OSCILLATOR_Init (); // Initialize Oscillator PORT_Init(); // Initialize Port I/O UART0_Init (); // Initialize UART0 EA = 1; //Interrupts global freigeben //ES0 = 1; //UART0 interrupt freigeben while(1) { nb_getkey (); b_getkey (); } } //----------------------------------------------------------------------------- // Initialization Subroutines //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- // OSCILLATOR_Init //----------------------------------------------------------------------------- // // Return Value : None // Parameters : None // // This routine initializes the system clock to use the internal 24.5MHz // oscillator as its clock source. Also enables missing clock detector reset. // //----------------------------------------------------------------------------- void OSCILLATOR_Init (void) { OSCICN |= 0x03; // Configure internal oscillator for // its maximum frequency RSTSRC = 0x04; // Enable missing clock detector } //----------------------------------------------------------------------------- // PORT_Init //----------------------------------------------------------------------------- // // Return Value : None // Parameters : None // // P0.4 digital push-pull UART TX // P0.5 digital open-drain UART RX // //----------------------------------------------------------------------------- void PORT_Init (void) { P0SKIP |= 0x01; // Skip P0.0 for external VREF P1MDIN |= 0xEF; // Configure P1.4 as analog input. 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 } //----------------------------------------------------------------------------- // 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 |= 0x09; } 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 } /* void UART0_ISR (void) interrupt 4 { static unsigned char RX_index = 0; //receive buffer index unsigned char the_char; //zwischenspeicher Print_String ("In ISR..."); //Debugausgabe auf UART //RI0 = 0; if (RI0==1) { the_char = SBUF0; RX_buf[RX_index] = the_char; //Byte in array speichern if(RX_index < (RX_length-2)) { RX_index++; } else { RX_index = 0; RX_ready = 1; RX_buf[RX_index-1] = '\0'; } } } */ void Print_String (char pstring[]) { unsigned char i = 0; while (pstring[i]) { putchar(pstring[i++]); } } char nb_getkey () { char c; int i; Print_String ("In nb_getkey..."); while(!RI && i++<100); if(RI) { c = SBUF; RI = 0; } else c = '\3'; return (c); } char b_getkey () { char c; Print_String ("In b_getkey..."); while (!RI); c = SBUF; RI = 0; return (c); }![]()
Mit der Abfrage hast recht, das muss ich noch ändern.
Aber im Moment will ich eigentlich nur mal ein Zeichen aus Sbuf auslesen...![]()
Grüße!
Bean







Zitieren
Lesezeichen