Forum: Mikrocontroller und Digitale Elektronik Bascom: Limit/Probleme an (Bit-)Variablen für Programme?


von Sorhc (Gast)


Lesenswert?

Hallo Gemeinschaft.

Vorab: Ich Programmiere im Auftrag eine Sprachbox per Funkübertragung 
und nutze als Sprache Bascom.

Die Sprachbox funktioniert.
Nun wollte ich diese um einige Funktionalitäten erweitern (externe 
Kommandierung per UART) und habe dafür weitere Variablen eingefügt.

Tue ich dies, ist die Funktionalität nicht mehr gewährleistet.

Ich bin nun durch mühsame Zurückstufung an dem Punkt, dass das 
hinzufügen oder weglassen der simplen Kommandozeile:
Dim Flag_sfs_zero As Bit
über die komplette Funktionalität entscheidet.

Habe beim Compiler bissel experimentiert und verschiedene Optionen 
geprüft
-size waring
-optimize code

Habe auch mal experimental die Stacks angepasst
$hwstack = 150
$swstack = 150
$framesize = 150

stets erfolglos.

Und jetzt das Groteske:
Wenn ich noch eine Bitvariable erstelle (gelich dahinter, in der 
Hoffnung der compilere reiht sie interne aneinander), dann läuft wieder 
alles einwandfrei.

Irgendwie beunrughigend. Wollt nun wissen, ob andere ähnliche 
Erfahrungen gemacht haben. Ich nutze bestimmt ein dutzend Flags. Oder 
sollte lieber der Art:
Dim A As Byte
A.0 Alias Flag_1
A.1 Alias Flag_2
wenn der Compiler scheinbar Probleme hat. Was ic hauch nicht verstehe, 
ist, warum das Simple Dimensionieren, ohne anwendung schon zu Fehlern im 
Programmablauf führt.

Meine Vermutung war kurzzeitig auch, dass eventuell falsche 
Array-Adressierungen dafür verantwortlich sind - habe diese überbrückt, 
der Fehler bleibt. (War auch nachvollziehbar, da die Arrays erst postum 
der Funktionalität zur Anwendung kommen)

Um nochmal andere Fehlerquellen auszuschließen stelle ich mir gerade die 
Frage:
Wenn ich eine Varaible erhöhe (Incr A) und A ist ein Byte, dann folgt 
A=255, Incr A -> A=0 oder muss ich das abfangen? (If A = 255 Then A = 0 
Else Incr A End If)

: Verschoben durch User
von Sorhc (Gast)


Lesenswert?

Sorhc schrieb:
> Wenn ich eine Varaible erhöhe (Incr A) und A ist ein Byte, dann folgt
> A=255, Incr A -> A=0 oder muss ich das abfangen? (If A = 255 Then A = 0
> Else Incr A End If)

Muss man nicht.

von Paul Baumann (Gast)


Lesenswert?

Eine Bitvariable belegt auch 1 Byte. Wenn Du vielleicht schon viele
Variablen definiert hast, wird der Platz knapp und der Kompiler hustet
und spuckt.

>Oder
>sollte lieber der Art:
>Dim A As Byte
>A.0 Alias Flag_1
>A.1 Alias Flag_2
>wenn der Compiler scheinbar Probleme hat.

Ja, mache es so, dann sparst Du viel Platz.

MfG Paul

von MWS (Gast)


Lesenswert?

Paul Baumann schrieb:
> Eine Bitvariable belegt auch 1 Byte.

Eine einzige Bitvariable belegt ein ganzes Byte, jeweils 8 Bitvariablen 
werden vom Compiler in ein einzelnes Byte gepackt.

> Ja, mache es so, dann sparst Du viel Platz.

Unsinn.

von MWS (Gast)


Lesenswert?

Sorhc schrieb:
> hinzufügen oder weglassen der simplen Kommandozeile:
> Dim Flag_sfs_zero As Bit

> Habe auch mal experimental die Stacks angepasst

> der Fehler bleibt. (War auch nachvollziehbar, da die Arrays erst postum
> der Funktionalität zur Anwendung kommen)

Liest sich wie von einem Anfänger der mit lustigen Ausdrücken wie 
Kommandozeile (*Dim*ensionierung), postum der Funktionalität (was soll 
das sein?) um sich wirft.

Gleichzeitig ist das eines der so beliebten "ratet mal meinen 
Code"-Posts, denen allen gemeinsam ist, dass sie jede Menge Text 
enthalten, aber wirklich nützliche Informationen wie Compilerversion 
oder Controllertyp zur Sicherheit gar nicht erst erwähnen.

Der Bascom-Compiler reiht Variablen im SRam in der Reihenfolge der 
Dimensionierung auf. Über die Adresse, auch die der Bits, gibt der 
Report Auskunft. Damit ist's ein Leichtes Änderungen in der 
Speichervergabe bei einer zusätzlichen Bitvariable festzustellen und 
darüber könnte man auf die mögliche Fehlerursache schließen.

Auch könnte man mit Hilfe des Reports feststellen, dass der Compiler für 
jeweils acht Bits die gleiche Adresse ausgibt, d.h. er packt sie in ein 
Byte.

von Sorhc (Gast)


Lesenswert?

MWS schrieb:
> Eine einzige Bitvariable belegt ein ganzes Byte, jeweils 8 Bitvariablen
> werden vom Compiler in ein einzelnes Byte gepackt.

Gelöst!

Genau, deshalb habe ich mir mal den Simulator angeworfen und mir Byte 
für Byte den Memory(SRAM) angesehen. Problem gefunden! Lag doch an einem 
Array, das 1 zu weit adressiert wurde und so das folgende Byte 
fälschlicherweise überschrieb. In diesem war zwar nicht das obrige Bit 
(es war ja funktionslos), allerdings enthielt es das Flag zur 
Synchronisation -> BÄM Failure.
So, funktioniert nun einwandfrei. (Btw: zuvor lag dort nicht das Flag, 
sondern der CRC-Wert, durch hinzufügen eines weiteren Bits wurde halt 
ein neues BitByte X angelegt, wo nun das Flag zur Synchronisation lag - 
welches nun als nicht Synchron galt und so die verbindung recht schnell 
beendete).

Trotzdem danke für die Aufmerksamkeit/Hilfe

von Sorhc (Gast)


Lesenswert?

MWS schrieb:
> Liest sich wie von einem Anfänger der mit lustigen Ausdrücken wie
> Kommandozeile (*Dim*ensionierung), postum der Funktionalität (was soll
> das sein?) um sich wirft.

Stimmt.
Der Grad der Verzweiflung ist auch in Schrift, Form und Vollständigkeit 
zu erkennen!
Ich übe mich, sehe Bascom seit ein paar Wochen und nein, ich bin nicht 
Elektro-, Geräte-, Informatik-Student oder sonstwie Akademiker.

von MWS (Gast)


Lesenswert?

Sorhc schrieb:
> Ich übe mich, sehe Bascom seit ein paar Wochen und nein, ich bin nicht
> Elektro-, Geräte-, Informatik-Student oder sonstwie Akademiker.

Dann ist das mutig: :D

> Vorab: Ich Programmiere im Auftrag eine Sprachbox

von Paul B. (paul_baumann)


Lesenswert?

MWS schrub:
>Unsinn


Aha. Dann bin nicht nur ich, sondern auch Claus Kühnel in seinem Buch
"Programmieren der AVR-Risc-Controller mit Bascom-AVR" dem gleichen
Irrtum aufgesessen:
Zitat:
"Bits werden imer im internen Speicher deklariert und in Bytes 
zusammengefasst. Wird nur ein Bit deklariert, wird trotzdem das ganze
Byte eingesetzt." Zitat Ende.

http://books.google.de/books?id=ccbAR1MQa9wC&pg=PA73&lpg=PA73&dq=speicherbedarf+Bit%2Bbascom&source=bl&ots=vMpsqv3qKC&sig=hZsCKaigw-HGCkf-5prPYKXwN5I&hl=de&sa=X&ei=xMY0UaKrF9HIswajpIGoDA&ved=0CDcQ6AEwAQ#v=onepage&q=speicherbedarf%20Bit%2Bbascom&f=false

Seite 7

weiterhin schrob MWS:
>Eine einzige Bitvariable belegt ein ganzes Byte, jeweils 8 Bitvariablen
>werden vom Compiler in ein einzelnes Byte gepackt.

Habe ich etwas Anderes behauptet?

Paul

von MWS (Gast)


Lesenswert?

Paul Baumann schrieb:
> Habe ich etwas Anderes behauptet?

Ja, hier:

Paul Baumann schrieb:
>>Oder
>>sollte lieber der Art:
>>Dim A As Byte
>>A.0 Alias Flag_1
>>A.1 Alias Flag_2
>>wenn der Compiler scheinbar Probleme hat.
>
> Ja, mache es so, dann sparst Du viel Platz.

Die manuelle Belegung der Bits spart gegenüber der Compiler-Automatik 
keinerlei Platz. Das sagt genauso das von Dir angeführte Kühnel-Zitat.

Du behauptest dagegen, es spart viel Platz und ich sag' Dir, dass das 
Unsinn ist. Und das verstehst Du jetzt irgendwie nicht.
Hmmm....

von Paul B. (paul_baumann)


Lesenswert?

MWS schrub:
>Du behauptest dagegen, es spart viel Platz und ich sag' Dir, dass das
>Unsinn ist. Und das verstehst Du jetzt irgendwie nicht.
>Hmmm....


Ich lasse mir die Worte nicht im Mund herumdrehen und hake das als
Mißverständnis ab.

Ich finde es nach wie vor übersichtlicher, wenn man im Quelltext 
erkennt,
daß sich (wenn es <= 8 Bit-Variablen sind) alle Mann im
gleichen Byte befinden. So habe ich das gemeint.

Da dem TO hinreichend geholfen ist und alles Weitere nichts mehr
zur Lösung beiträgt, zittere ich jetzt hier ab.

MfG Paul

von MWS (Gast)


Lesenswert?

Paul Baumann schrieb:
> Ich lasse mir die Worte nicht im Mund herumdrehen und hake das als
> Mißverständnis ab.

Ich drehe da gar nichts, ich wende nur normale Logik an ;-)
Aber wenn Du glauben willst, dass Du missverstanden wurdest, bitte, 
jedem sein Himmelreich. Aber pass' auf, nicht dass Dich Dein µC das 
nächste Mal auch noch missversteht :D

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.