UART Programmierung

Gast #508913
Lesenswert?

Hallo Leute,

hab ein kleines Problem mit dem UART des AT89S52. So will ich ein 
DMX-Signal über diesen ausgeben. Ich programmiere den AT89S52 mit C.

Problem: Die zu sendenden DMX Daten schreibe ich ins SBUF Register und 
das SCON Register habe ich mit 88h geladen (9 Bit UART,feste 
Baudrate).Obwohl ich nur kleine, oder zuletzt gar keine Zeitschleifen 
zwischen den zu ladenden DMX Werten (SBUF) programmiert habe, vergeht 
doch zwischen den einzelnen DMX-Kanälen ein gewisse Zeit (500µs !!!). 
ich möcht die DMX Kanäle allerdings direkt hintereinander senden.

Wenn einer eine Idee oder einen Codeschnipsel hat wäre vich sehr 
Dankbar.


Gruss Christoph
#508930
Lesenswert?

>Wenn einer eine Idee oder einen Codeschnipsel hat wäre vich sehr
>Dankbar.

Wie wäre es, wenn du deinen Code hier reinstellen würdest, damit man den 
Fehler darin finden kann?
Ansonsten klingt das eher danach, dass jemand wieder zu faul ist, etwas 
selber zu prgrammieren (oder im Netz zu suchen).
Gast #508939
Lesenswert?

Hier mei tolles Programm (man beachte das ich in C un µC ein Neuling 
bin)



//void zeit(void);   //Prototypen-Anmeldung der Verzögerung
//void zeit88(void);
//void zeit8(void);

void main(void)
{
  SCON=0xA8; //Mode 2 (Startbit, 8 Datenbits, zwei x Stoppbit)


//  while(1)
//  {
//    P3=0x02;
//    zeit();
//    P3=0x00;
//    zeit88();
//    P3=0x02;
//    zeit8();


        while(1)
        {
          SBUF=0x00;       //Sende das Startbyte (00h)
        //  P3=P3 &  0x02;
        //  P3=P3 + 0x02;
        //  while(TI==0);     //Senden beendet?
        //  TI=0;         //Wenn ja: Sendeflag löschen
        //  zeit();       //Delay von ca. 5000 Mikrosekunden
          SBUF=0xAA;      //Ersten Kanal übertragen
        //  P3=P3 + 0x02;
        //  zeit();
          SBUF=0xCC;      //Zweiten Kanal übertragen
        //  P3=P3 + 0x02;
        //  zeit();
          SBUF=0xEE;
        //  zeit();
          SBUF=0xFE;
        //  zeit();

        }


}

/*---------------------------------------------------------------------- 
-
Zusatzfunktionen
------------------------------------------------------------------------ 
-*/
/*void zeit(void)
{
  unsigned int x;
  for(x=0;x<=2;x++); //Int-Wert 1000 ergibt etwa 5 Millisekunden
}

void zeit88(void)
{
  unsigned int y;
  for(y=0;y<=12;y++);
  P2=~P2;
}

void zeit8(void)
{
  P2=~P2;
  P2=~P2;
}      */
Gast #508941
Lesenswert?

SBUF=0xAA;                //Ersten Kanal senden  ??
 //  P3=P3 + 0x02;
 //  zeit();
SBUF=0xCC;                //Zweiten Kanal senden ???


Sollte man nicht, bevor Daten ins Senderegister geschrieben werden, 
nachprüfen, ob das letzte Datum FERTIG gesendet wurde?
Gast #508950
Lesenswert?

hatte wie gesagt erst zeitschleifen dazwischen.

SBUF=0xAA;                //Ersten Kanal senden  ??
 //  P3=P3 + 0x02;
 //  zeit();
SBUF=0xCC;                //Zweiten Kanal senden ???

...ja, so hatte ich mir das vorgestellt...
Gast #508960
Lesenswert?

der µC müsste es doch irgendwie hinbekommen in 44µs (ein Startbit, 
8Datenbit, und zwei Stoppbit >> 11Bit a 4µs >>ges. also 44µs) den 
nächsten Kanal direkt im Anschluss zu senden.

Weiß halt, wie gesagt nicht wie...
Gast #508965
Lesenswert?

hey Joe,

werd das mal ausprobieren - Danke.
Ich möchte natürlich auch allen anderen Danken, darunter dem Mathias, 
meinen Eltern, den Müllmännern, dem Tankwart und ganz besonders Jürgen.

(wer Jürgen ist? -Davon in kürze mehr)

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