MSP430-Über USART(SPI) mehre Bytes ohne Zeitverlust senden

Gast #114805
Mit dem MSP430 soll über SPI z.B. in einem MAX 1407 (mit integriertem
Uhrenbaustein) die Uhr gestellt werden.
Dazu habe ich folgendes Programmteil (in C) verwendet:
void Sekunden_stellen(void)
  {
    char sek_schr = 0xA0, sek=00; // in sek die aktuelle Sekunde
eintragen Beispiel: 00
    P2OUT &=~BIT5;                    //mit CS=L --> Freigabe
    TXBUF0 = 0x9C;                     //RTC/AL Steuerregister
beschreiben
    Pause();
    TXBUF0 = 0x80;                      // 1000 0000
    Pause();
    TXBUF0 = sek_schr;
    Pause();
    TXBUF0 = sek;
   Pause();
    TXBUF0 = 0x9C;                     // RTC/AL Steuerregister
schreiben (zurücksetzen)
   Pause();
    TXBUF0 = 0x00;
}
Obwohl das Stellen funktioniert, stören mich die Pauseschleifen, deren
Länge ich durch Probieren ermittelt habe.
Wie könnte man das Programm so schreiben, dass immer nur solange
gewartet wird, bis der Sendevorgang abgeschlossen ist?
Ich hatte es mir so gedacht:

   TXBUF0 = 0x9C;                       //RTC/AL Steuerregister
schreiben  10 01110 0
    while (IFG1&UTXIFG0);
    TXBUF0 = 0x80;                      // 1000 0000
    while (IFG1&UTXIFG0);
     .
  .
Geht leider nicht, (einige Sendepakete werden weggelassen) da ich
vermutlich mit „while (IFG1&UTXIFG0)“ auf dem Holzweg bin

Wie könnte man das Programm ändern, damit immer solange gewartet wird,
bis ein einzelner Sendevorgang abgeschlossen ist?
MfG
Wolfgang
Gast
Hmm vielleicht schafft der ausgangsbaustein solche übertragungsraten
nicht?
(Ich kenn mich mit uart nicht aus aber bei i2c kann das z.b passieren
kann auch sein das der uc die raten nicht schafft ist bei dir aber
unwahrscheinlich da du ja wartest bis der uc fertig ist)
Die while lösung ist auch nicht zu verwenden sondern man sollte besser
mit interrupts arbeiten wenn man sowieso schon welche hat;)
mfg Flo
Gast
Hallo Wolfgang,

soweit ich weiß mußt du das TXEPT - Flag abfragen (Transmitter empty
Flag), d.h. du darst nur Daten laden, wenn dieses gesetzt ist.

Viel Grüße,
Holger
Gast
Nein, der Fehler ist, dass die Bedingung für das Busy-Flag genau falsch
herum ist. Es muss lauten:

while (!(IFG1 & UTXIFG0))

Guck dir mal meine USART-Libary auf www.mathar.com an. Ich habe nach
dem Fehler damals aber auch Stunden gesucht ... ;-)
Gast
Nur gut, dass ich damit nicht Geld verdienen muss und dass es das
Mikrocontrollerforum gibt.
Mit
 while (!(IFG1&UTXIFG0))
funktioniert es bestens. Danke Sebastian!
Wollte mir Deine Software mal ansehen, kann sie aber unter
MSP430/USART1 bzw. USART2 nicht finden.
MfG
Wolfgang

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 22 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.