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 //---------------------------------------------------------------------- -------
Wo hast denn diesen Code abgeschrieben? Und wie war die Frage? Sende doch einfach das Datenbyte.
Code ist von Silabs als Appnote verfügbar, ist ja nur die initialisierung der Schnittstellen. Ich muss einmalig das ASCII Zeichen "c" als HEX Wert versenden...
Dann mache es doch einfach. Du beschriebst nur was du machen willst. Du nennst keine Frage und keine Probleme.
Ich habe keinen Schimmer wie ich das anstelle, über printf wird es ja wohl nicht gehen, ich weiß nur dass ich in irgend ein Register (verm. das SCON) etwas hineinschreiben muss. Frage: Kann mir jemand genau erklären und evtl sogar zeigen wie ich meinen Code ändern muss damit ich letztendlich ein Zeichen versenden kann?!?!
Hmmm. Ich dachte eher so: SBUF0 = 'c'; oder?!?!? Wo im Quellcode muss ich das dann einfügen wenn ich es einmalig senden will? Mein Empfangstelle muss es in HEX bekommen! Momentan ist es doch noch ASCII oder????
Als hex sind es aber zwei Zeichen 6 und 3. Aber willst du das überhaupt? Ob 'c' 0x63 oder 99 ist eine reine Darstellungssache
Ja ich brauch es als HEX-Wert, weil das Empfangsmodul nur HEX-Werte verarbeiten kann. Wo muss ich in meinem Quellcode das Zeichen / den Befehl einbinden?
Peter S. schrieb: > Ja ich brauch es als HEX-Wert, weil das Empfangsmodul nur HEX-Werte > verarbeiten kann. Was dir der Vorposter sagen wollte es gibt keinen "HEX-Wert". Der Wert ist immer der Gleiche. Es unterscheidet sich die Darstellung. Es gilt: 'c' == 0x63 == 99 auch wenn sich die Darstellung hier in Textform offensichtlich unterscheidet. Was wichtig ist: willst du es Zeichenfolge oder als natives Byte übertragen?
Gute Frage :D ich kann dir nur soviel sagen: Auf der anderen Seite wartet ein Modul welches auf einen Tastaturbefehl (via Hyperterminal z.B.) wartet z.B. "c" oder "v". Also wenn ich das Modul direkt über den Hypterm. anspreche funktioniert es. Das selbe soll jetzt mein Programm machen...
Peter S. schrieb: > Auf der anderen Seite wartet ein Modul welches auf einen Tastaturbefehl > (via Hyperterminal z.B.) wartet z.B. "c" oder "v". Also wenn ich das > Modul direkt über den Hypterm. anspreche funktioniert es. Das selbe soll > jetzt mein Programm machen... entlich mal ein sinnvolle aussage. Also braucht du es doch nicht als Hex. Sende einfach als 'C' und gut ist.
Ok gut, nur mir ist noch nicht klar wie und wo... printf wird es ja wohl nicht sein?!?!
so in der art: (wie schon oben geschrieben, ich kenn aber diesen controlerl nicht) SCON = 'c';
Peter S. schrieb: > Frage: Kann mir jemand genau erklären und evtl sogar zeigen wie ich > meinen Code ändern muss damit ich letztendlich ein Zeichen versenden > kann?!?! Du guckst im Datenblatt nach, wie dein UART signalisiert, dass sein Senderegister frei ist. Das Programm zum Senden des Zeichens sieht dann etwa so aus:
1 | while (Senderegister nicht frei); |
2 | Senderegister = "c"; |
Ich seh schon wir kommen der Sache näher :D hab jetzt in der headerdatei rumgestöbert, da ich im Datenblatt nichs finden konnte... aufjedenfall steht da folgendes zu UART: /* SCON0 0x98 */ sbit S0MODE = 0x9F ; /* UART 0 MODE */ sbit MCE0 = 0x9D ; /* UART 0 MCE */ sbit REN0 = 0x9C ; /* UART 0 RX ENABLE */ sbit TB80 = 0x9B ; /* UART 0 TX BIT 8 */ sbit RB80 = 0x9A ; /* UART 0 RX BIT 8 */ sbit TI0 = 0x99 ; /* UART 0 TX INTERRUPT FLAG */ sbit RI0 = 0x98 ; /* UART 0 RX INTERRUPT FLAG */ kann es sein dass ich das sbit TB80 setzen muss???
Peter S. schrieb: > hab jetzt in der headerdatei rumgestöbert, da ich im Datenblatt nichs > finden konnte... willst du wirklich behaupten das im Datenblatt nicht steht wie man daten per UART sendet? Hast du mal ein Link dazu?
Peter S. schrieb: > da ich im Datenblatt nichs finden konnte http://www.silabs.com/Support%20Documents/TechnicalDocs/C8051F33x.pdf Seite 159: SBUF0[7:0]: Serial Data Buffer Bits 7–0 (MSB–LSB)This SFR accesses two registers; a transmit shift register and a receive latch register. When data is written to SBUF0, it goes to the transmit shift register and is held for serial transmis-sion. Writing a byte to SBUF0 initiates the transmission. A read of SBUF0 returns the con-tents of the receive latch.
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.