Forum: Mikrocontroller und Digitale Elektronik Problem in Bascom mit Variablen


von Volker Bonge (Gast)


Lesenswert?

Hallo Leute

Ich habe da mal ein kleines Problemchen mit Bascom.
(wer hat das nicht *g)

Ich versuche, seriell übertragene Daten auf einem Display sichtbar zu 
machen. Das klappt nun nach einigen Tagen auch endlich !

Da die Daten alle als Bytes übertragen werden, aber eigendlich 
Word-Variablen sind, wandele ich sie nach dem Empfang mit dem 
"Overlay-Trick" zurück.

Die Variablen dafür habe ich wie folgt angelegt:

Dim Recbuffer(16) As Byte At &H7E            'Sendepuffer

Dim Daten1 As Word At &H7E Overlay           'Timeintervall
Dim Daten2 As Word At &H80 Overlay           'Spannung
Dim Daten3 As Word At &H82 Overlay           'Strom
Dim Daten4 As Word At &H84 Overlay           'Drehzahl
Dim Daten5 As Word At &H86 Overlay           'Temperatur
Dim Daten6 As Word At &H88 Overlay           'Empänger Spannung
Dim Daten7 As Word At &H8A Overlay           'RC
Dim Daten8 As Word At &H8C Overlay           'Höhe

Das funktioniert auch soweit.
Aber nun meine Frage:
Die Adressen (&H7E, ...) habe ich von meinem Minilogger, der auf Basis 
eines Tiny26 läuft, übernommen. Der Controller für das Display ist aber 
ein Mega32.
Welche Adressen sollte ich bei diesem benutzen ? (Werde aus dem 
Datenblatt nicht wirklich schlau)

Und eine zweite Frage hätte ich dann auch noch:
Wenn ich nun einigen Variablen einen festen Speicherbereich zugewiesen 
habe,
kann es dann passieren, dass diese von anderen Variablen die ich dann 
noch normal in Bascom definiere, überschrieben werde ?

Gruss
Volker

von pico (Gast)


Lesenswert?

wenn du 2 variablen auf den gleichen speicherplatz leg's
wird das sicherlich nicht klappen

>Dim Recbuffer(16) As Byte At &H7E            'Sendepuffer
>Dim Daten1 As Word At &H7E Overlay           'Timeintervall

von Volker Bonge (Gast)


Lesenswert?

Doch sicher, das ist ja extra so gewollt !
Das wird ja extra mit dem Befehl "Overlay" gemacht, damit die
8 Word-Variablen als Bytes übertragen (bzw. im meinem Fall empfangen) 
werden können.
(1 Word = 2 Byte)

Das funktioniert ja auch. Mir geht es nur um den Adressraum, den ich 
dafür
beim Mega32 benutzen kann.

Gruss
Volker

von Marko (Gast)


Lesenswert?

Das ist ja das nette an Bascom Overlayvariablen ...
man nehme Bytes, schreibe sie in n Array
und hole sich die Teile davon nach Belieben
wieder raus.
Du kannst den die Speicherstellen für den M32
so lassen. Das passt schon, wenn nciht meckert der
Compiler.
Wenn Du andere Variablen deklarierst ohne
die präzise Speicherstelle anzugeben macht das
Bascom intern beim Compilieren schon selber,
hab bislang noch nie erlebt, dass da noch
andere Variableln tangiert wurden.
Das kommt aber schon mal vor, wenn Stack oder Frame
zu kanpp bemessen wird.

von Rolf I. (for_ro)


Lesenswert?

Volker Bonge wrote:

> Dim Recbuffer(16) As Byte At &H7E            'Sendepuffer
>
> Dim Daten1 As Word At &H7E Overlay           'Timeintervall
> Dim Daten2 As Word At &H80 Overlay           'Spannung
> Dim Daten3 As Word At &H82 Overlay           'Strom
> Dim Daten4 As Word At &H84 Overlay           'Drehzahl
> Dim Daten5 As Word At &H86 Overlay           'Temperatur
> Dim Daten6 As Word At &H88 Overlay           'Empänger Spannung
> Dim Daten7 As Word At &H8A Overlay           'RC
> Dim Daten8 As Word At &H8C Overlay           'Höhe

Auf diese Art ist dein Code nicht so portabel. Mach es so:

Dim Recbuffer(16) As Byte
Dim Daten1 As Word At Recbuffer Overlay        'Timeintervall
Dim Daten2 As Word At Recbuffer + 2 Overlay           'Spannung
Dim Daten3 As Word At Recbuffer + 4 Overlay           'Strom
Dim Daten4 As Word At Recbuffer + 6 Overlay           'Drehzahl
....

Gruß

Rolf

von Volker Bonge (Gast)


Lesenswert?

Hallo Rolf

Die Möglichkeit war mir noch gar nicht bekannt.
So ist das natürlich optimal. Dann brauch ich mich auch
nicht mehr um die Adressen kümmern.

Vielen Dank

Gruss
Volker

von Rolf I. (for_ro)


Lesenswert?

Schade, dass man nicht
Dim Daten2 As Word At Recbuffer + sizeof(word) Overlay
schreiben kann, dann könnten sich sogar C-Puristen mit Bascom 
anfreunden.
Und es wäre super-portabel.

Gruß

Rolf

von pico (Gast)


Lesenswert?

jetzt mal einer aus der asm ecke,

du sparst 16 byte ram und ca. 100 takte,
,na klasse, um 16 stunden fehler zu suchen!!

mein vorschag :

trenne den tx/rx puffer von dem datenbereich deiner anwendung!

wenn der letzte wert (der wichtigste) "geschrieben wird, dann
kopiere es in in den puffer, sende oder empfange etwas",
SO KANNST du in deiner anwendung fehler suchen!! wenn mehr als ein 
prog-schnippel auf ein und den selben ram-bereich zugreift (egal ob 
schreibend oder lesend [oder doch versehendlich schreibend]) finden sich 
bug's ganz schwer.

um fehler zu suchen, kannst du z.b. das kopiern sein lassen und nur
den sende / empang (ermöglichen), ist die macke immer noch da,
liegts an deinem übergeordnetem prog

gruß pico

von Volker Bonge (Gast)


Lesenswert?

Hi pico

genauso mache ich es im Prinzip.

Die oben angegebenen Variablen dienen mir nur dazu aus den empfangenen
Bytes wieder Word-Variablen zu machen.
Zum Einlesen habe ich noch ein extra Array.

Prinzipieller Programmablauf:

ankommende Daten: Header (5 Bytes) + Daten (16 Bytes=8 Word´s)

- jedes ankommende Byte wird in das Einlesearray geschrieben
- danach werden alle Bytes um eine Stelle im Array verschoben
- wenn an den letzten 5 Stellen im Array der Header erscheint
  (natürlich in umgekehrter Reihenfolge, einfache Abfrage mit IF)
  ist ein kompletter Datensatz empfangen
- dieser Datensatz wird dann mit Hilfe der o.a. Variablen wieder
  in Word Variablen umgewandelt, dann noch mit Faktoren multipliziert
  und letztendlich auf dem Display angezeigt.

Das ganze soll übrigens eine Telemetrielösung für meinen Minilogger
am Modell-Hubi werden. Ist eine klasse Möglichkeit, sich in die
Materie einzuarbeiten und zu lernen !

Gruss
Volker

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.