mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik UART Programmierung


Autor: christoph (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Rahul Der trollige (rahul)
Datum:

Bewertung
0 lesenswert
nicht 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).

Autor: christoph (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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;
}      */

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: christoph (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: christoph (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: christoph (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
mit dem "Sende"-Flag?

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich meine eher sowas:

(pseudocode)

while !(UART_sende_register_leer);
uart_senderegister= datum;

Autor: Joe (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: christoph (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: christoph (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.