Mit
Dim
reservierst Du in Bascom Speicherplatz für Variablen. Wenn nicht anders angegeben im SRAM.
Natürlich mußt Du der Variable einen Namen geben, und bei Hochsprachen auch den Variablentypen festlegen.
CodeBox BascomAVR
Dim Zeichen As String * 5
Es wird Platz für fünf (aufeinanderfolgende) Characters im SRAM reserviert (sogar sechs, der sechste ist die ASCII-Null, die den String terminiert).
Jeder Character "verbraucht" im SRAM ein Byte.
Unter
Zeichen
(das ist nur ein Name, den ich willkürlich vergeben habe) merkt sich Bascom die Startadresse dieser sechs Adressen. (Der Controller selbst kennt keine Variablen, nur Speicheradressen. Statt
Zeichen
müßtest Du jedesmal mit konkreten Adressen jonglieren - Bascom nimmt Dir das als Compiler ab.
Füge mal testhalber folgendes ein:
CodeBox BascomAVR
$regfile = "m8def.dat"
$crystal = 8000000
$hwstack = 40
$swstack = 16
$framesize = 32
$baud = 19200
Dim Zeichen As String * 5
Zeichen = "A"
Zeichen = Zeichen + "Y"
Do
Input Zeichen
Print Zeichen
Loop
In Zeile 7 wird also der Platz für einen 5 + ASCII-Null - Zeichen langen String reserviert. Bascom Initialisiert den (genaugenommen den ganzen (ungenutzten) SRAM) mit 0x00 (=ASCII-Null).
In Zeile 8 Wird dem String jetzt "A" zugewiesen, im SRAM landet dann das entsprechende Byte (also der ASCII-Code).
In Zeile 9 wird an das "A" jetzt ein "Y" angehängt, es landet also in der Speicherzelle hinter dem "A".
Starte das Programm nach dem Compilieren im Simulator.
Bei "1" aktivierst Du die Ansicht der Speicher.
Uns Interessiert der SRAM (also der Reiter bei "2")
Die ganzen "Nullen" sind der, von Bascom genullte SRAM. Er beginnt beim Mega8 bei Adresse 0x0060, dann 0x0061 und so weiter. Klickst Du so eine Zelle an, wird unten angezeigt, welche Variable diese Zelle "besetzt" (occupy).
Unsere 5+1 Bytes von Zeichen landen (da sie als erste und einzige Variable angelegt wurden also in den Adressen 0x0060..0x0065 (erstmal alles Nullen)
Jedesmal wenn Du auf "4" klickst, wird ein Bascom-Befehl ausgeführt
Der Hellblaue Pfeil unten am Code zeigt Dir den nächsten Befehl (ich hab also schon ein paar mal geklickt).
Simuliere mal die paar Zeilen, und beobachte die Speicheransicht rechts.
Wenn Du in der Input-Zeile angekommen bist, mußt Du noch ein weiteres mal auf die "4" klicken (unten steht in meiner Statuszeile "Pause", da muß dann "running" erscheinen. Dann kannst Du im UART0-Fenster (Dunkelblau) bis zu fünf Zeichen eingeben. Das simuliert den zeichenweisen Empfang vom UART, und ist im Speicherabbild nachvollziehbar.
Input wird erst mit einem
Enter
abgeschlossen, danach kannst Du das Programm mit "4" weitersimulieren...
Im UART0-Fenster werden Dir die eingetippten Zeichen angezeigt, das ist aber eigentlich nur das Echo von Input. Der simulierte Controller sendet jedes empfangene Zeichen zurück.
Hast Du die Engabe mit
Enter
abgeschlossen, gibt Print als nächster Befehl den ganzen String aus.
Ergänze jetzt mal in Zeile 11 das "Noecho" (
Input Zeichen , Noecho
), und simuliere das ganze nochmal.
Jetzt mußt Du die Zeichen im UART-Fenster "blind" eingeben (naja, im Speicherabbild kannst Du den Empfang ja verfolgen).
Nach dem Abschließen (mit Enter) erscheint der eingegebene Befehl im nächsten Schritt dann mit Print.
Noch Fragen? Ansonsten zurück zum zweiten Codeblock aus #48. Echo unterdrückt, klar - und der String Zeichen nimmt jetzt nur noch ein ASCII auf, und das NullByte dahinter (also die Adressen 0x0060 mit dem eigentlichen Zeichen, und 0x0061 mit 'ner ASCII-Null für das Stringende).
Ran an die Aufgabe!