Bascom Bug

Timo

Neues Mitglied
15. Juli 2008
19
0
0
Sprachen
Hallo,

ich will eine Rolladensteuerung in Bascom erstellen. Dazu frage ich u.a. I/O-Ports (PCF8574) ab. Im Rahmen einer Fehlersuche gebe ich eine Variable aus, die entsprechende Zeile lautet:
Code:
     Locate 1 , 1 : Lcd Bin(b_readbackprev_1) ; " " ; Bin(b_readback)
     Strdummy = Bin(rolladenstatus_1_out)
     Locate 2 , 10 : Lcd Strdummy
Es wird angezeigt, was auch erwartet wird.. ;-)

Stelle ich die Reihenfolge um
Code:
       Strdummy = Bin(rolladenstatus_1_out)
     Locate 1 , 1 : Lcd Bin(b_readbackprev_1) ; " " ; Bin(b_readback)
     Locate 2 , 10 : Lcd Strdummy
dann ist das ERgebnis (ohne an der HW irgend etwas zu ändern) kompletter Nonsens. Schreibe ich diese Zeile hinter die obige erste, wird alles richtig angezeigt. Richtig heißt in diesem Fall, beide "Readback"-Variablen sind 255d, im Fehlerfall eine 255d und die zweite 48d
Das ist doch ein Bug und kein Feature???

Problem ist halt, dass ich mich nicht auf den Compiler verlassen kann, wenn er so undefinierbares Zeug macht. Ich arbeite gerade noch mit der Demo-Version 1.11.8.7 und wollte eine Vollversion kaufen. Aber mit solchen Bugs???


Der Vollständigkeithalber hier noch der gesamte Code. Bitte beachten: hier habe ich viel rumprobiert, daher ist die Struktur und Inhalt nicht wirklich schön.

Code:
' 5*2 Taster abfragen, 5*2 Rolladen steuern
' ******************************************************************************
' *** Pins Hardware  tr037-2009-R02
' ***
' ***     M M M M   A1 Z1 A2 Z2  A4 Z4 A3 Z3    A5 Z5 - -  - - RA1 RZ1   RA1 RZ1 RA2 RZ2  RA4 RZ4 RA3 RZ3
' ******************************************************************************
'
' Historie
' V1.1b:    Ansteuersequenz auf Relais geändert

' -------------------------  µC-Setup ------------------------------------------
   $regfile = "m16def.DAT"
   $crystal = 8000000
   $hwstack = 32
   $swstack = 16
   $framesize = 24
   $baud = 38400
' -------------------------  µC-Setup Ende--------------------------------------

' ADC
   Config Adc = Single , Prescaler = Auto
   Start Adc

'I2C-Bus
   Config Sda = Portc.1
   Config Scl = Portc.0
   Config I2cdelay = 200

' LCD
   Config Lcdpin = Pin , Db4 = Portc.4 , Db5 = Portc.5 , Db6 = Portc.6 , Db7 = Portc.7 , E = Portc.3 , Rs = Portc.2
   Config Lcd = 20 * 2
   Cursor Off
   Config Portd.7 = Output                                  'light

'*******************************************************************************
'***   Konstanten                                                            ***
'*******************************************************************************
' Konstanten
Const Adr_rtc_w = &HD0                                      'Adresse schreiben RTC
Const Adr_rtc_r = &HD1                                      'Adresse lesen RTC
'Const Timer0_reload = 240                                   'Wert für 0.5ms => das Timing ist entscheidend!!!!!



'*******************************************************************************
'***   Variablen                                                             ***
'*******************************************************************************

 Dim Hour As Byte , Minute As Byte , Second As Byte         ' für RTC

 Dim Dummy As Byte , Strdummy As String * 2                 ' eine Variable für alles
   Dim I As Byte , B_readback As Byte , Ii As Byte
   Dim Tastenstatus_1 As Byte , Tastenstatus_2 As Byte
   Dim Rolladenstatus_1 As Byte , Rolladenstatus_2 As Byte , Rolladenstatus_1_out As Byte , Rolladenstatus_2_out As Byte
   Dim B_readbackprev_1 As Byte , B_readbackprev_2 As Byte
   Dim W_adc As Word

'*******************************************************************************
'***   HAUPTPROGRAMM                                                         ***
'*******************************************************************************
' Init
   Cls
   Portd.7 = 1                                              'Licht an


' alle Ports abschalten(High)
      I2cstart
      I2cwbyte 64
      I2cwbyte &HFF
      I2cstop

      I2cstart
      I2cwbyte 66
      I2cwbyte &HFF
      I2cstop

      I2cstart
      I2cwbyte 68
      I2cwbyte &H00
      I2cstop

  Rolladenstatus_1 = &H00 : Rolladenstatus_2 = &H00 : B_readbackprev_1 = &H00
 Do
 ' Defaultwerte
'   Tastenstatus_1 = &HFF : Tastenstatus_2 = &HFF


 ' lese Tastenports ein
       I2cstart
      I2cwbyte 65
      I2crbyte B_readback , Nack
      I2cstop

      For I = 0 To 7 Step 2                                 ' erstes Byte auswerten
        Ii = I + 1
        If B_readback.i = 0 And B_readbackprev_1.i = 1 Then
            Toggle Rolladenstatus_1.i
            Rolladenstatus_1.ii = 0                         'Rolladen an
        Elseif B_readback.ii = 0 And B_readbackprev_1.ii = 1 Then
            Toggle Rolladenstatus_1.i                       'Rolladen an
            Rolladenstatus_1.ii = Rolladenstatus_1.i        'Rollanden in andere Richtung
        End If
      Next

      B_readbackprev_1 = B_readback


      Rolladenstatus_1_out = Rolladenstatus_1


     Locate 1 , 1 : Lcd Bin(b_readbackprev_1) ; " " ; Bin(b_readback)
     Strdummy = Bin(rolladenstatus_1_out)
     Locate 2 , 10 : Lcd Strdummy ; " "                     ' ; Bin(rolladenstatus_2)



     Waitms 300
 Loop

Gruß
Timo
 
Hallo,

zuerst ist mir folgendes aufgefallen ...
B_readbackprev_1 = B_readback

Locate 1 , 1 : Lcd Bin(b_readbackprev_1) ; " " ; Bin(b_readback)
einmal ein großes "B" und einmal ein kleines. Ich würde das sicherheitshalber
vereinheitlichen. Unter Linux wären das zwei unterschiedliche Variablen.
Ich weiß ja nicht wie Bascom da drauf reagiert.

zweitens ... Durch das Umstellen der Zeilen veränderst du auch das Timing
für die Hardware. Evtl benötigt das Display an bestimmten Stellen etwas mehr
Zeit die du ihm mit der anderen Anordnung der Ausgabezeilen gibst.

Bei mir waren die schlimmsten Fehler bis jetzt alles Timing-Probleme mit der
Hardware. Das würde ich an deiner Stelle mal überprüfen.

Leider fehlt es bei mir in der Basccom-Programmierung noch "ein wenig" ;)

Gruß
Dino
 
einmal ein großes "B" und einmal ein kleines.

Hallo Dino!

Das ist unter BASCOM schon in Ordnung! ;)
Die Variable bleibt die Selbe!


Ich kann Timos Problem aber auch nicht nachvollziehen.....
von einem BUG würde ich aber nicht sprechen, bevor ich meine eigenen Möglichkeiten nicht abgeklärt habe.

Dinos Ansatz mit dem Timing klingt gar nicht mal soooo falsch. ;)
Ich würde da auch erst mal ansetzen und die Displayanzeige an anderer Stelle einsetzen und aktualisieren.
Ist aber nur meine Meinung dazu....

Gruß,
Cassio
 
Hallo

Ich habe jetzt mal um die Zeile eine Warteschleife eingebaut, am Fehlerbild ändert das aber nichts.
Code:
      B_readbackprev_1 = B_readback


      Rolladenstatus_1_out = Rolladenstatus_1
Waitms 100
     Strdummy = Bin(rolladenstatus_1_out)
Waitms 100
     Locate 1 , 1 : Lcd Bin(b_readbackprev_1) ; " " ; Bin(b_readback)

Mittlerweile habe ich auch die neueste BASCOM Variante heruntergeladen, ohne Lösung meines Problems. :(
 
Habe die Warteschleifen wieder rausgeschmissen und mir die Variablendefinition genauer angesehen. Verschiebe ich dort die Definition von Strdummy, dann wird auch der richtige Wert angezeigt. Ursache liegt dann wohl darin, wobei ich es noch nicht verstanden habe....
Code:
   Dim I As Byte , B_readback As Byte , Ii As Byte
   Dim Tastenstatus_1 As Byte , Tastenstatus_2 As Byte
   Dim Rolladenstatus_1 As Byte , Rolladenstatus_2 As Byte , Rolladenstatus_1_out As Byte , Rolladenstatus_2_out As Byte
   Dim B_readbackprev_1 As Byte , B_readbackprev_2 As Byte
   Dim W_adc As Word
 Dim Dummy As Byte , Strdummy As String * 2                 ' eine Variable für alles


Welche einfache Regeln missachte ich den hier??


PS: Nehme "Bug" zurück, aber "bulletproof" ist das auch nicht..:D
 
Hi Timo!

Sorry, aber ich habe momentan keine Zeit dein Programm genau durchzusehen... :eek:

Bin hier gerade seit Tagen das erste Mal wieder online.... und das auch nur "nebenbei".

Es ist aber nicht ungewöhnlich, dass man manchmal die "richtige" Reihenfolge nicht sofort erkennt und man mit falschen Werten "weiterarbeitet". ;)


Ich kann dich aber beruhigen..... es gibt bei BASCOM technisch keine Unterschiede zwischen der aktuellen DEMO-Version und der aktuellen Vollversion.
Irgendwann reichen aber die 4kB der Demo-Version einfach nicht mehr aus. ;)


Wünsche erst mal noch viel Erfolg bei der "Fehlersuche"! :)

Gruß,
Cassio
 
Hallo Timo!

Code:
Dim Dummy As Byte , Strdummy As String * 2                 ' eine Variable für alles

Alsoooo,

1. bin ich immer vorsichtig mit mehreren Variablendeklarationen hinter einem DIM am Stück. Ich würde Dir prinzipiell dazu raten, jede Deklaration in einer eigenen Zeile zu machen.

Code:
Dim Dummy As Byte
Dim Strdummy As String * 2

Soweit mir bekannt funktioniert es zwar irgendwie aber in der BASCOM-Hilfe wird darauf nicht explizit hingewiesen und ich würde mich nicht darauf verlassen, dass es in jedem Fall funktioniert

Aber.....

ein Fehler ist weit schwerwiegender!!!

Du definierst den String mit zwei Zeichen und ballerst aber ein BIN mit 8 Zeichen hinein. Nach den 8 Zeichen kommt noch die NULL als Stringterminator.
Bedeutet, meiner Meinung nach überschreibst Du Dir sauber aber gewiss den Speicher in dem Du den String stehen hast. Wenn Du den String am Anfang hast dann kommt Müll raus wel er wild durch den Speicher rennt und irgendwas versucht als String zu erkennen bis eine NULL kommt. Wenn Du es am Ende stehen hast so ist genug Platz im Datenbereich und es fällt einfach nicht auf. Definier Dir den String doch mal mit mehr Stellen.

z.B. so oder mit mehr Zeichen:
Code:
Dim Strdummy As String * 9

Grüße,
Markus
 
Aaah! Ich hab momentan den String erst am Ende des Definitionsblock stehen und seither keine Probleme. Mit Deiner Beschreibung würde es das wohl auch erklären!

Danke
Timo
 
Hi Timo,

mach den String mal größer und stelle ihn an den Anfang und geb Bescheid! Der String muss auf jeden Fall größer werden da er aktuell nur zwei Zeichen aufnehmen kann und das reicht vorne und hinten nicht!

Grüße,
Ma
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)