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)
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.
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
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.
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.
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
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.
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
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....
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
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