Forum: Mikrocontroller und Digitale Elektronik USART gepufferter Empfang mit BASCOM


von Alfred K. (Gast)


Lesenswert?

Mit BASCOM habe ich nur minimale Erfahrung. Die Suche im Netz liefert 
viel "Beiwerk" aber kaum Substanz.
Daher meine Frage: Hat jemand einen Link auf eine gepufferte 
Empfangsroutine für einen ATmega32, die per Interrupt unter BASCOM 
läuft? Ein Ringpuffer mit 16 Bytes wäre ausreichend, damit auch höhere 
Baudraten nicht zu Zeichenverlust führen.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Sieh Dir mal die Dokumentation zu "CONFIG SERIALIN" an. So, wie ich das 
interpretiere, kann die eingebaute UART-Unterstützung von BASCOM das von 
Hause aus.

von Alfred K. (Gast)


Lesenswert?

"CONFIG SERIALIN" sieht schon mal gut aus!
Da wird wohl mit Interrupt gearbeitet.

Beitrag #5512532 wurde von einem Moderator gelöscht.
von Osca (Gast)


Lesenswert?

Buch Walter Rowalt:


Wer das Vorgehen String=String+Zeichen nicht mag, kann mit einem kleinen 
Trick optimal vorgehen: In Bascom ist es möglich, ein und denselben 
SRAM-Platz mit mehreren Variablen zu belegen. Wir können z.B. anweisen, 
daß unsere String-Variable auf Adresse &H60 gesetzt werden soll. 
Gleichzeitig können wir ein Feld mit 11 Bytes dimensionieren, das auf 
der gleichen Adresse liegen soll (ein 10 Byte langer String benötigt 11 
Bytes Platz). Damit können wir ganz einfach und effizient über völlig 
verschiedene Methoden auf denselben Speicher zugreifen. Schauen Sie sich 
bitte das folgende Listing an.
'0011.BAS: Optimierter String-Empfang
$Regfile = "2313def.dat"
$Crystal = 3686400
$Baud    = 9600

Dim s As String*10 At &H60
Dim b(11) As Byte At &H60 Overlay
Dim n As Byte

On URXC OnRxD
Enable URXC
Enable Interrupts

Main:
  If n > 9 Then
    Print s
    n = 0
  End If
Goto Main

OnRxD:
  Incr n
  b(n) = UDR
Return
Der String wird auf Adresse &H60 im AVR abgelegt. Dies ist die Adresse 
des ersten Bytes im SRAM (da der AT90S2313 über 128 Bytes SRAM vefügt, 
ist die höchste SRAM-Adresse &HDF). Quasi "darüber", also auf die selbe 
Adresse, legen wir ein Feld, das genauso lang wie der String ist. Das 
ist alles. Der Trick ist nur, daß wir beim Füllen des Strings in unserem 
Anwendungsfall am effizientesten mit einem Feld arbeiten können, während 
in anderen Fällen die Arbeit mit einem String günstiger sein kann. 
Welche Wege man in der Praxis gehen will, hängt natürlich immer von der 
Anwendung ab. Die Anwendung des Overlay-Tricks kostet weder zusätzlichen 
Code, noch SRAM. Es ist vielleicht eher wie die Auswahl zwischen 
Buddelschippe, Schaufel und Bagger bei ein und dem selben Haufen Sand.

Und noch ein drittes UART-Mißverständnis trat wiederholt auf: Der 
UART-Empfangs-Interrupt meldet, daß ein Zeichen empfangen wurde. In der 
Interrupt-Routine kann man deshalb auch immer nur ein Zeichen auslesen. 
Zum Beispiel macht es daher keinen Sinn, in der Interrupt-Routine den 
Bascom-Befehl Input einzusetzen, um doch mehrere Zeichen empfangen zu 
können.

Jetzt aber endlich zur Fortsetzung der Serie. Die letzte Folge schloß 
mit dem 8-Bit-Timer ab. Wie angekündigt soll jetzt der 16-Bit-Timer 
beschrieben werden.

von Alfred K. (Gast)


Lesenswert?

Osca schrieb:
> Wer das Vorgehen String=String+Zeichen nicht mag,

Ich mag es nicht, aber das ist wohl BASIC ;-)
Mit Overlays zu agieren, kann schnell in die Hose gehen. Es muß ja auch 
kein RAM gespart werden.

> OnRxD:
>   Incr n
>   b(n) = UDR
> Return

Das ist doch schon mal ein Ansatz, wie man es zu Fuß angehen kann. Die 
BASCOM internen Routinen sind wohl nicht quelloffen, weshalb deren 
genauer Ablauf im Dunkeln bleibt.

Zur Anwendung: Im Grunde sollen per RS232 eintreffende Strings auf einem 
LCD angezeigt werden. Die Baudrate soll 115,2 kBd betragen und der 
String abhängig von der Vorgeschichte in der 1. oder 2. Zeile angezeigt 
werden. Mit INKEY() ist das Empfangen zu lahm.

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.