ASCII über UART senden

Gast #2635770
Lesenswert?

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
//---------------------------------------------------------------------- 
-------
Gast #2635822
Lesenswert?

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?!?!
Gast #2635901
Lesenswert?

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????
Gast #2635932
Lesenswert?

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?
Gast #2636176
Lesenswert?

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...
Gast #2636178
Lesenswert?

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.
Gast #2636239
Lesenswert?

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";
Gast #2636493
Lesenswert?

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???
Gast #2636547
Lesenswert?

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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren