- 12V Akku mit 280 Ah bauen         
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 12

Thema: 49=120 ? Wie bitte geht das denn?

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    01.01.2008
    Alter
    43
    Beiträge
    48

    49=120 ? Wie bitte geht das denn?

    Anzeige

    E-Bike
    Hallo liebe Leute,

    ich versuche eine Laufschrift zu bauen. Auf der Laufschrift soll (wenn fertig) mittels SPI kommuniziert werden. Da mein Programm nicht funktionierte und nur falsche Werte lieferte bin ich auf etwas ganz Seltsames gestoßen: 49=120. Wie geht das denn?

    Die wichtigen Code-Teile:
    Code:
    Dim A(7) As Byte
    Dim Temp As Byte , Temp0 As Byte
    A(1) = 15
    A(2) = 120
    A(3) = 15
    A(4) = 120
    A(5) = 42
    A(6) = 85
    A(7) = 127
    ...
       For X = 1 To 7
          Temp0 = A(x)
    ...
    Bei z.B. X=2 kommt dann heraus, dass Temp0=49 ist obwohl A(2)=120 ist. Auch der Bascom-Simulator scheint meiner Meinung zu sein. Habe ich vielleicht ein Grundsatzproblem mit dem Array? Kann jemand helfen? Ich verstehe die Welt nicht mehr.

    Bild hier  

    Hier mal mein Code.
    Die Stacks sind schon künstlich erhöht worden weil ich erst dort den Fehler vermutet habe.

    Code:
    $regfile = "m8def.dat"
    $crystal = 8000000
    $swstack = 140
    $hwstack = 140
    $framesize = 100
    
    $sim
    Config Portb.0 = Output
    Config Portb.1 = Output
    Config Portb.6 = Output
    Config Portb.7 = Output
    
    Config Portc.0 = Output
    Config Portc.1 = Output
    Config Portc.2 = Output
    Config Portc.3 = Output
    Config Portc.4 = Output
    Config Portc.5 = Output
    
    Config Portd.4 = Output
    Config Portd.5 = Output
    Config Portd.6 = Output
    Config Portd.7 = Output
    
    Const San = 1
    Const Saus = 0
    Const Zan = 0
    Const Zaus = 1
    
    Z1 Alias Portc.5
    Z2 Alias Portc.4
    Z3 Alias Portc.3
    Z4 Alias Portc.2
    Z5 Alias Portc.1
    Z6 Alias Portc.0
    Z7 Alias Portb.1
    
    S1 Alias Portd.4
    S2 Alias Portb.6
    S3 Alias Portb.7
    S4 Alias Portd.5
    S5 Alias Portd.6
    S6 Alias Portd.7
    S7 Alias Portb.0
    
    
    Config Spi = Hard , Interrupt = On , Data Order = Msb , Master = No , Polarity = Low , Phase = 0 , Clockrate = 128
    
    Dim A(7) As Byte
    Dim B(7) As String * 7
    Dim X As Byte , Y As Byte
    Dim Temp As Byte , Temp0 As Byte
    Dim Temp2 As String * 7
    
    Spiinit
    
    A(1) = 15
    A(2) = 120
    A(3) = 15
    A(4) = 120
    A(5) = 42
    A(6) = 85
    A(7) = 127
    
    
    
    Do
       'spaltenweise eingabe
    '   Spiin A(1) , 7
    
       B(1) = ""
       B(2) = ""
       B(3) = ""
       B(4) = ""
       B(5) = ""
       B(6) = ""
       B(7) = ""
    
    
    
       For X = 1 To 7
          Temp0 = A(x)
          Temp = Bin(temp0)
          Temp2 = Str(temp)
          B(1) = B(1) + Mid(temp2 , 1 , 1)
          B(2) = B(2) + Mid(temp2 , 2 , 1)
          B(3) = B(3) + Mid(temp2 , 3 , 1)
          B(4) = B(4) + Mid(temp2 , 4 , 1)
          B(5) = B(5) + Mid(temp2 , 5 , 1)
          B(6) = B(6) + Mid(temp2 , 6 , 1)
          B(7) = B(7) + Mid(temp2 , 7 , 1)
       Next X
    
       'zeilenweise ausgabe
       For X = 1 To 7
          If X = 1 Then Z1 = Zan
          If X = 2 Then Z2 = Zan
          If X = 3 Then Z3 = Zan
          If X = 4 Then Z4 = Zan
          If X = 5 Then Z5 = Zan
          If X = 6 Then Z6 = Zan
          If X = 7 Then Z7 = Zan
    
          If Mid(b(x) , 1 , 1) = "1" Then S1 = San
          If Mid(b(x) , 2 , 1) = "1" Then S2 = San
          If Mid(b(x) , 3 , 1) = "1" Then S3 = San
          If Mid(b(x) , 4 , 1) = "1" Then S4 = San
          If Mid(b(x) , 5 , 1) = "1" Then S5 = San
          If Mid(b(x) , 6 , 1) = "1" Then S6 = San
          If Mid(b(x) , 7 , 1) = "1" Then S7 = San
    
          If X = 1 Then Z1 = Zaus
          If X = 2 Then Z2 = Zaus
          If X = 3 Then Z3 = Zaus
          If X = 4 Then Z4 = Zaus
          If X = 5 Then Z5 = Zaus
          If X = 6 Then Z6 = Zaus
          If X = 7 Then Z7 = Zaus
       Next X
    Loop
    
    End

  2. #2
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    22.05.2005
    Ort
    12°29´ O, 48°38´ N
    Beiträge
    2.731
    Hallo,

    hast du auch genau geschaut was Bin macht, aus der Zeile
    Temp = Bin(temp0)
    ??
    Zitat Zitat von Bascom-Hilfe
    Bin():
    Convert a numeric variable into the binary string representation.
    weiter hab ich noch ned geschaut..

  3. #3
    Benutzer Stammmitglied
    Registriert seit
    01.01.2008
    Alter
    43
    Beiträge
    48
    Hallo Linux_80 (sehr sympatischer Username \/ ),

    danke, dass Du Dir die Zeit nimmst. Das mit der Umwandlung in einen String ist okay, das brauche ich für die weitere Berechnung. Das Problem geht ja schon eine Zeile höher los, bei temp0.

  4. #4
    Erfahrener Benutzer Robotik Einstein Avatar von Jaecko
    Registriert seit
    16.10.2006
    Ort
    Lkr. Rottal/Inn
    Alter
    42
    Beiträge
    2.009
    Sind die Stacks für nen Mega8 nicht doch etwas sehr hoch?
    Nicht, dass der dann da beim Reservieren schon von woanders Speicher frisst. (Standardwerte bei mir beim Mega8 waren bisher immer
    hwstack = 32, swstack = 16, framesize = 40)

    Ansonsten: Kannst du mal alle 7 X durchlaufen lassen und schauen ob bei jedem der gleiche falsche Wert rauskommt?
    #ifndef MfG
    #define MfG

  5. #5
    Erfahrener Benutzer Roboter Experte Avatar von ikarus_177
    Registriert seit
    31.12.2007
    Ort
    Grein
    Alter
    31
    Beiträge
    601
    @Jaecko: was sind denn die empfohlenen Stack-Werte (auch für komplexe Programme)? Gibts da eine "Daumenregel"?

    Ich hab schon sehr negative Erfahrungen mit zu kleinem Stack gemacht, seit dem mache ich ihn stets (um einiges) größer, als die Richtlinien erfordern (z.B.: 2Byte pro 'gosub' usw.). Gibts da sowas wie eine "obere Schmerzgrenze"?

    Viele Grüße

  6. #6
    Erfahrener Benutzer Robotik Einstein Avatar von Jaecko
    Registriert seit
    16.10.2006
    Ort
    Lkr. Rottal/Inn
    Alter
    42
    Beiträge
    2.009
    Meine letzten Bascom-Programme sind schon ne zeitlang her; in C gibts ja diese Aufteilung eigentlich nicht mehr.

    Ne Daumenregel wüsst ich da jetzt nicht. Hab da immer die Standard-Werte von Bascom verwendet; Wenns zu wenig war, wurds halt dann erhöht, bis es gereicht hat.

    Die max. Grösse dürfte wohl mit der Grösse des SRAM zusammenfallen.
    Also theoretisch könnten der Stack so gross sein wie der SRAM, dann bleibt halt nix mehr für Variablen etc.
    #ifndef MfG
    #define MfG

  7. #7
    Erfahrener Benutzer Roboter Experte Avatar von ikarus_177
    Registriert seit
    31.12.2007
    Ort
    Grein
    Alter
    31
    Beiträge
    601
    Hi Jaecko,

    ich hab mich an diese Quelle (https://www.roboternetz.de/wissen/in...acks_.26_Frame) gehalten. Jetzt verwende ich meist Werte von 256-512 Byte.

    Viele Grüße

  8. #8
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    Chefe:
    du definierst "temp" als byte,
    Dim Temp As Byte , Temp0 As Byte

    schreibst aber dann 9 Byte rein
    Temp = Bin(temp0)
    bin (120) = "01111000"

    und "str(temp)" ist ja dann überhaupt ein Brimsen

    Bin () ergibt ja schon eine String
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  9. #9
    Benutzer Stammmitglied
    Registriert seit
    01.01.2008
    Alter
    43
    Beiträge
    48
    Zitat Zitat von PicNick
    Chefe:
    du definierst "temp" als byte,
    Dim Temp As Byte , Temp0 As Byte

    schreibst aber dann 9 Byte rein
    Temp = Bin(temp0)
    bin (120) = "01111000"

    und "str(temp)" ist ja dann überhaupt ein Brimsen

    Bin () ergibt ja schon eine String

    bin ergibt einen string? dann kann ich da schonmal was weglassen. danke.
    mein hauptproblem jedoch scheint zu bleiben:
    Temp0 = A(x) oder (s. Screenshot) 49 = 120. Beide Variablen sind Byte.

    Mit kleineren Stacks kann ich erst wieder heute Abend probieren, da ich noch auf der Arbeit bin.

  10. #10
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.02.2006
    Beiträge
    1.113
    Hallo Mathias,
    schau dir lieber noch einmal die Antwort von Linux_80 an.
    Sie gab dir gleich den Hinweis auf dein Problem.
    Geh mal in den Simulator und stoppe sofort nach dem Befehl
    Temp0=A(x)
    Schau dir die beiden Werte an.
    Jetzt führe nur den nächsten Befehl aus.
    Temp=bin(temp0)
    Schau dir jetzt wieder die beiden Werte an.
    Sie sind nicht mehr gleich. Überleg mal, woran das liegt.
    Der Mist ist, das man eine solche Zuweisung überhaupt durchführen kann und der Compiler nicht meckert.

    Gruß

    Rolf

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Labornetzteil AliExpress