Forum: Mikrocontroller und Digitale Elektronik MSP430-Über USART(SPI) mehre Bytes ohne Zeitverlust senden


von Wolfgang (Gast)


Lesenswert?

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

von Florian (Gast)


Lesenswert?

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

von Holger Menges (Gast)


Lesenswert?

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

von Sebastian (Gast)


Lesenswert?

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

von Wolfgang (Gast)


Lesenswert?

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

von Sebastian (Gast)


Lesenswert?

Hi,

den Link zu der Library usart.c findest du hier (erster Absatz):

http://mathar.com/msp_thermo2.html

Eine Erklärung, wie das mit den USART-Flags funktioniert, habe ich
hier:

http://mathar.com/msp_funk2.html

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.