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.