- LiTime Speicher und Akkus         
Ergebnis 1 bis 5 von 5

Thema: UART Ausgabe blockiert AVR?

  1. #1
    Erfahrener Benutzer Roboter Genie Avatar von malthy
    Registriert seit
    19.04.2004
    Ort
    Oldenburg
    Beiträge
    1.379

    UART Ausgabe blockiert AVR?

    Anzeige

    LiFePo4 Akku selber bauen - Video
    Hallo!

    Sehe ich es richtig, dass das Senden von zB einem Byte per UART den Controller während des Sendens komplett blockiert? Bei 9600 Baud würde das Senden von einem Byte dementsprechend ca 1 ms dauern, währenddessen nichts anderes vom Controller getan werden kann? In Bascom stellt es sich zumindest so dar. Andererseits müssen in dieser Millisekunde doch nur 10 Bit erzeugt werden, da sollten doch einige Prozessortakte für anderes übrig sein... Kann mir jemand erklären was da low-level passiert? Vielen Dank!

    Gruß
    Malte

  2. #2
    Erfahrener Benutzer Robotik Visionär
    Registriert seit
    26.11.2005
    Ort
    bei Uelzen (Niedersachsen)
    Beiträge
    7.942
    Von der hardware ist der µC natürlich nicht blockiert wenn es etwas per UART gesendet wird. Das ist wenn überhaupt ein Problem von Bascom - wenn man das senden nicht gerade in einer ISR macht, sollten Interrupts auch weiter möglich sein - zumindest bei einer Hardware UART.

    So lange nur 1 Byte gesendet werden soll, müsste auch Bascom das noch ohne merkliche Verzögerung schaffen, zumindest wenn es die Hardware UART ist. Für 1 Byte hat die Hardware UART einen Puffer. Vor dem Senden wird geprüft ob der Puffer leer ist. Wenn nicht, wird gewartet bis er leer ist. Dann wird das Byte an die HW UART übergeben und das war es dann für das Programm auch schon. Das eigentliche Senden macht die UART in Hardware.

  3. #3
    Erfahrener Benutzer Roboter Genie Avatar von malthy
    Registriert seit
    19.04.2004
    Ort
    Oldenburg
    Beiträge
    1.379
    Hallo,

    ich hatte mir das ursprünglich auch so vorgestellt, dass die UART Hardware die Daten schnell rübergeschoben bekommt und sich dann um das Verschicken kümmert, der Prozessor dann aber wieder frei ist. Tatsächlich ist es bei Bascom Code so, dass ein PRINT Befehl genau so lange dauert, wie wie das Senden. Allerdings habe ich das noch nicht mit dem Senden von nur einem Byte probiert, ich habe nur geguckt, wie lange PRINT bei Ketten mit Länge > 1 braucht. Danke soweit!

    Malte

  4. #4
    Erfahrener Benutzer Robotik Einstein Avatar von Jaecko
    Registriert seit
    16.10.2006
    Ort
    Lkr. Rottal/Inn
    Alter
    41
    Beiträge
    2.009
    Bei Bascom gibts doch irgendwie die Anweisung, UART "buffered" zu verwenden. Evtl. gehts damit schneller.
    Ansonsten könnt ich mir schon vorstellen, dass in der Funktion fürs aktuelle Senden sowas drinsteht wie "Sende das Zeichen und warte bis es raus ist".
    #ifndef MfG
    #define MfG

  5. #5
    Erfahrener Benutzer Roboter Genie Avatar von malthy
    Registriert seit
    19.04.2004
    Ort
    Oldenburg
    Beiträge
    1.379
    Hallo!

    Um das Thema dann mal abzuschließen: es ist so wie Jeacko gesagt hat, man kann bei Bascom mit "Config Serialout = Buffered , Size = x" einen Puffer aktivieren und dimensionieren. Man darf dabei nicht vergessen, die Interrupts anzuschalten ("Enable Interrupts") weil UDRE verwendet wird um anzuzeigen, dass die UART-Hardware ein Byte entgegennehmen kann.

    Mich hat interessiert wie schnell das ganze mit Puffer ist, das Attachment zeigt das mal als Diagramm. Ab >4 Bytes wird's ziemlich linear mit 3.8 µs/Byte langsamer. Ich hab einen M644 mit 20 MHz verwendet.

    Also Danke nochmal! Eure Hinweise haben mir wiedermal sehr geholfen!

    Gruß
    Malte
    Miniaturansichten angehängter Grafiken Miniaturansichten angehängter Grafiken uarttempo.png  

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

LiTime Speicher und Akkus