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
>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).
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; } */
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?
...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...
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...
Ich meine eher sowas: (pseudocode) while !(UART_sende_register_leer); uart_senderegister= datum;
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.
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...
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.