Hab noch so ein paar kleine Bugs die mich schon öfter geärgert haben. Die anderen Sachen die nicht ging sind schon in den neuen 1.11.9.X version schon weg.
Der erste wurde hier schon mal gepostet und ist immer noch in der 1.11.9.3 vorhanden.
Dim Cnt1 as Byte
Dim Testvar as Word
Testvar = &B1100100111100011 'Beliebig definieren
Print Bin(Testvar) 'Druckt: 1100100111100011
Cnt1 = 0 'Druckt: 1100100111100011
While 16 > Cnt1
Print Testvar.cnt1;
Incr Cnt1
Wend
Print
Print Testvar.0; 'Druckt: 1110010011100100
Print Testvar.1; 'Statt Bit 8 druckt es Bit 0,
Print Testvar.2; 'Statt Bit 9 druckt es Bit 1, usw
Print Testvar.3; 'Statt Bit 16 käme wieder Bit 0
Print Testvar.4;
Print Testvar.5;
Print Testvar.6;
Print Testvar.7;
Print Testvar.8;
Print Testvar.9;
Print Testvar.10;
Print Testvar.11;
Print Testvar.12;
Print Testvar.13;
Print Testvar.14;
Print Testvar.15;
-----------------------------------------------------------------------------------
Hatte noch ein Problem mit Konstanten
Const xy = "Hello " 'Normaler const
Const xz = xy 'Diese Zuweisung geht nicht
Const yz = xy + "Welt!" 'Diese Wiederrum doch
Const az = xy + "" 'Diese geht auch
Hatte das bei so ein ähnlichen Fall:
Const Version_short = "Version:1.0"
#If Beta = 1
Const Version_long = Version_short + "Beta"
#endif
#If Beta = 0
Const Version_long = Version_short
#endif
Print Version_long
------------------------------------------------------------------------------
Und ein weiteren Bug den ich gefunden hatte war auch bei Arrays
Ich wollte in ein Bytearray ein Wert speichern der ein Bitwert speichert.
Dim Arraymultiausgang(
as Byte 'Mehrere Ausgänge gespeichert
Dim Tmpausgang as Byte
Dim Ausgangaktiv as Byte
Dim Ausgangbit as Byte
Arraymultiausgang(1) = 2
Arraymultiausgang(2) = 7
Arraymultiausgang(3) = 1
Arraymultiausgang(4) = 3
Arraymultiausgang(5) = 6
Arraymultiausgang(6) = 5
Arraymultiausgang(7) = 4
Arraymultiausgang(
= 0
Tmpausgang.Arraymultiausgang(1) = 1 'Dieses ging nicht
'Fehler Tmpausgang ist kein Array
Ausgangbit = 2
Tmpausgang.ausgangbit = 1 'Selber Befehl
Tmpausgang.2 = 1 'Selber Befehl
Diese Probleme hatte ich mit Atmega16, Atmega32 und Atmega644 mit der Bascom Version 1.11.8.9 - 1.11.9.3.
Diese Beispielprogramme sind sehr vereinfacht worden um die Problematik zu erläutern und nicht die anwendungsbeispiel zu erklären wo ich solche Probleme bekommen habe.
Ein weiteren Fehler den ich jetzt nicht Beweisen kann, aber der mich schon genug geärgert hat ist und den ich mittlerweile umgehen kann ist folgender:
Wenn man eine Hardware UART und eine Software UART benutzt, und man auf den Flag Ucsr0a.txc0 = 1 wartet (Wenn der Hardware UART fertig ist mit senden und der Buffer leer sein 'SOLL'). Dummerweise hat der Inkey(#2) Befehl wohl ab und zu diesen Flag auch gesetzt oder eine ähnliche Handlung vorgenommen, da auf einmal angeblich das Senden fertig war. Dieser Fehler kam aber nur dann vor wenn auch wirklich etwas an #2 eingelesen wurde, sonst hat alles funktioniert.
Mit der Prüfung _rs_bufcountw0 = 0 und eine Warteschleife von 1ms habe ich diesen Bug umgangen (Falls der Ucsr0a.txc0 gesetzt wird beim senden vom Letzten Byte musste ich die 1ms warten). Das Programm aktiviert andere MCs der reihe nach und schickt diesen einzeln Befehle, wenn der Befehl raus ist soll es zum nächsten wechseln, das Problem war immer das es vor der Beendung des Befehls schon umgeschaltet hatte, und das ist immer nur dann passiert wenn etwas auf dem Software UART eingelesen wurde, in Beispiel #2. Sobald der Software UART entfernt wurde oder nicht benutzt wurde Funktioniert alles einwandfrei. Naja ich hoffe es lässt sich so ein Problem mit den Software UARTs beheben und das dann die Software Uarts wieder normal benutzt werden können.
Gekürzter Codebeispiel:
----------------
Code:
$regfile = "m644def.dat" ' specify the used micro
'$crystal = 14745600 ' used crystal frequency
$crystal = 18432000 ' used crystal frequency
$baud = 9600 ' use baud rate
$hwstack = 64 ' default use 32 for the hardware stack
$swstack = 20 ' default use 10 for the SW stack
$framesize = 80 ' default use 40 for the frame space
Config Serialout = Buffered , Size = 128 ' Speichert 128 Bytes im Seriellen Buffer
Open "COMA.7:9600,8,n,1" For Input As #2 'TR_RxD (Transponderleser) Pin PortA.7
...
If Ucsr0a.txc0 = 1 Then 'Hier springt das Programm auch bei Software Uarts rein.
Readcheck:
If _rs_bufcountw0 = 0 Then 'Prüft Zusätzlich ob Hardware UART wirklich leer ist oder ob Software UART wieder Flag gesetzt hat.
If Readingtran = 0 Then
Readtranok = 0
If Sendreaddata <> "" Then
Errorcnt = 0
Gosub Sendread
Else
If 2 > Progstatus Or Progstatus > 13 And Hudset.hdtrans = 1 And Tr_voll = 0 Then Readtranok = 1
End If
End If
Else
Ucsr0a.txc0 = 1
End If
...
If Readtranok = 1 Then
C_sw = Inkey(#2)
If C_sw > 0 Then
...
Ich hoffe ich habe euch wieder mal interessante Sachen zum Suchen gegeben wie beim letzten mal ^^. Diese Fehler sind zwar schon einmal geschickt worden aber entweder ist die Mail nicht angekommen oder wurde nicht gelesen, ich hatte darauf keine Antwort bekommen und die Fehler sind ja noch immer drin.
Lesezeichen