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!
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.
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!
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".
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!
Lesezeichen