Forum: Mikrocontroller und Digitale Elektronik ASCII über UART senden


von Peter S. (Gast)


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
//---------------------------------------------------------------------- 
-------

von chick (Gast)


Lesenswert?

Wo hast denn diesen Code abgeschrieben? Und wie war die Frage?

Sende doch einfach das Datenbyte.

von Peter S. (Gast)


Lesenswert?

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...

von max (Gast)


Lesenswert?

Dann mache es doch einfach.

Du beschriebst nur was du machen willst. Du nennst keine Frage und keine 
Probleme.

von Peter S. (Gast)


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?!?!

von Bernhard S. (b_spitzer)


Lesenswert?

SCON = 'c';

von Peter S. (Gast)


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????

von DirkB (Gast)


Lesenswert?

Als hex sind es aber zwei Zeichen 6 und 3.

Aber willst du das überhaupt?
Ob 'c' 0x63 oder 99 ist eine reine Darstellungssache

von Peter S. (Gast)


Lesenswert?

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?

von max (Gast)


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?

von Peter S. (Gast)


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...

von Peter II (Gast)


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.

von Peter S. (Gast)


Lesenswert?

Ok gut, nur mir ist noch nicht klar wie und wo... printf wird es ja wohl 
nicht sein?!?!

von Peter II (Gast)


Lesenswert?

so in der art: (wie schon oben geschrieben, ich kenn aber diesen 
controlerl nicht)

SCON = 'c';

von µC Bastler (Gast)


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";

von Peter S. (Gast)


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???

von Peter II (Gast)


Lesenswert?

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?

von Zeh (Gast)


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.

von Jobst M. (jobstens-de)


Lesenswert?

Was soll das denn bitte?

Reicht einer nicht?

Beitrag "Byte senden über UART"


Gruß

Jobst

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
Noch kein Account? Hier anmelden.