Forum: Mikrocontroller und Digitale Elektronik Byte senden über UART


von Peter S. (Gast)


Lesenswert?

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!

von Karl H. (kbuchegg)


Lesenswert?

Redest du von einem AVR?

Wenn ja
AVR-Tutorial
AVR-GCC-Tutorial

Jeweils die Abschnitte über UART

von Peter S. (Gast)


Lesenswert?

8051 derivat silabs

von Jim M. (turboj)


Lesenswert?

Dann bei Silabs.com nach Beispielcode (Appnotes) suchen. Dort gibts 
reichlich Beispiele.

von Chris S. (hondaracer1)


Lesenswert?

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

von Phantomix (Gast)


Lesenswert?

SBUF0 = send;

von Peter S. (Gast)


Lesenswert?

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

von Chris S. (hondaracer1)


Lesenswert?

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.

von Achim M. (minifloat)


Lesenswert?

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

von Falk B. (falk)


Lesenswert?

@  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

von Matthias L. (Gast)


Lesenswert?

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

von Bastler (Gast)


Lesenswert?

SBUF0 = 0x43;
bzw.
SBUF0 = 0x63;

Aber schau dir mal die Beispiele / Datenblätter von Silabs an, da gibt 
es alles!


Dir fehlen GRUNDLAGEN!

von Chris S. (hondaracer1)


Lesenswert?

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.

von Jobst M. (jobstens-de)


Lesenswert?

Was soll das denn bitte?

Reicht einer nicht?

Beitrag "ASCII über UART senden"


Gruß

Jobst

von Peter S. (Gast)


Lesenswert?

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

von Sebastian H. (sh______)


Lesenswert?

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 :)

von Peter S. (Gast)


Lesenswert?

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

von µC Bastler (Gast)


Lesenswert?

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