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!
Dann bei Silabs.com nach Beispielcode (Appnotes) suchen. Dort gibts reichlich Beispiele.
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
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
//----------------------------------------------------------------------
-------
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.
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
@ 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
>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.
SBUF0 = 0x43; bzw. SBUF0 = 0x63; Aber schau dir mal die Beispiele / Datenblätter von Silabs an, da gibt es alles! Dir fehlen GRUNDLAGEN!
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.
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
//----------------------------------------------------------------------
------
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 :)
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
//----------------------------------------------------------------------
------
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.