Forum: Mikrocontroller und Digitale Elektronik UART Programmierung


von christoph (Gast)


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

von Rahul D. (rahul)


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

von christoph (Gast)


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;
}      */

von Matthias (Gast)


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?

von christoph (Gast)


Lesenswert?

...wie man sieht sind die Startbedingungen (88µs "Pause" gefolgt von 8µs 
High Pegel) auskommentiert un zunächst den UART an sich zu testen.

Noch mal Danke für eure Mühen...

von christoph (Gast)


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

von christoph (Gast)


Lesenswert?

mit dem "Sende"-Flag?

von Matthias (Gast)


Lesenswert?

Ich meine eher sowas:

(pseudocode)

while !(UART_sende_register_leer);
uart_senderegister= datum;

von Joe (Gast)


Lesenswert?

void putchar_uart (char c)    {
  while (!TI);                   // Transmitter ready/busy ?
  TI = 0;                        // TI Flag löschen
  SBUF = c;                      // Ausgabe an UART
}

So sollte es aussehen. Dann kannste dir die "zeit ()" sparen.

von christoph (Gast)


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

von christoph (Gast)


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)

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.