- 12V Akku mit 280 Ah bauen         
Seite 2 von 3 ErsteErste 123 LetzteLetzte
Ergebnis 11 bis 20 von 24

Thema: Zusammensetzen von Bytes zu einem Single-Datentyp

  1. #11
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    Anzeige

    LiFePo4 Akku selber bauen - Video
    Lieber Jörg, klingt ja verlockend, hoffentlich macht sich der Compiler nicht trotzdem ins halstuch, wenn er verschiedene datentypen mit der selben adresse (location, Overlay) kriegt.
    Aber was red' ich herum, sowas probiert man einfach.
    C ist ja da ein Dödi, wenn man nur lang genug casted, glaubt er einem alles. (ich glaub, "C" kommt ja eh von "casten")

    Trotzdem, einmal zu Fuß ein Float aufmischen gehört zum Leben dazu.

    Alf_wuffi wird uns berichten, bin neugierig mfg robert

  2. #12
    Gast
    habe momentan Schwierigkeiten, das zu testen. Blicke noch nicht ganz durch, was da abläuft. Print Testzahl, überhaupt print oder input??? Wo innerhalb do loop, oder am Anfang. Irgendwie werden die Bytes nicht richtig von diesem URXC Register wahrgenommen. Ich bleib am Ball, beiß mich da rein.

  3. #13
    Administrator Robotik Visionär Avatar von Frank
    Registriert seit
    30.10.2003
    Beiträge
    5.116
    Blog-Einträge
    1
    Hi PickNick,
    das mit Overlay funktioniert aber gut, das hab ich des öfteren auch schon gemacht. Du kannst dann Variablen völlig unterschiedlich ansprechen.

    Z.B. so

    Dim Rs_textbuffer As String * 70
    Dim Rs_textbufferbyte As Byte At Rs_textbuffer Overlay

    Hier wurde das erste byte des Strings noch als Bytevariable definiert.
    Duch den Overlay Befehl bist du genauso flexibel wie in C abe res geht noch bequemer als in C.

    Bei Single Variablen dürfte es ähnlich einfach sein, einfach noch ein paar andere Variablen beliebigen Typs auf den Speicherbereich zeigen lassen

  4. #14
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    Hi Frank, ich werd' mich hüten, irgendwelche Bemerkungen über Vor- und Nachteile von CompilerTypen zu machen, daß ergibt nur Religionskriege. Das sind Glaubensdinge mit absolut religösem Charakter.

    Die Overlay Variante entspricht am ehesten dem "REDEFINES" beim Cobol, wenn den noch wer kennt.

    @Wuffi: Jörg & Frank sind sich ihrer Sache sicher, und ich glaube ihnen.
    Vergiß den ganzen Stiefel, den ich dir geschrieben habe *seufz* und mach das so, ist einfacher (solange Sender und receiver die gleiche Plattform haben).

    DIM Ergebnis as single
    DIM recv(4) as Byte at ergebnis overlay
    DIM Counter as Byte

    Init: Counter = 1

    receive Interrupt:
    recv(Counter) = received-byte
    Counter = Counter + 1
    if (counter > 4)
    display (ergebnis) // is auch schon fertig
    Counter = 1 // ready for next float
    return interrupt

    Anm: Das ganze kann natürlich ausser Tritt kommen, der Teulfel und Murphy schlafen nie.
    Auch die Synchronisation mit dem non-Interrupt Level hat so ihre Extravaganzen.
    Für alles gibt's mehrere Möglichkeiten, doch ich denke, für's Erste habe ich dir den Kopf schon ausgiebigst vollgestopft.
    gruss an die Frau Gemahlin, unbekannterweise mfg robert

  5. #15
    Gast
    Alles klar, kein Problem. Werde das auch mal testen. Die bisherige Routine mit inputbin läuft ja. Es kommt nur manchmal zum Hänger im Programm, wenn irgendwas mit den reinkommenden Bytes nicht stimmt. Das tritt aber meist erst nach Stunden auf.

    Es fehlt mir bei dieser Konstruktion mit den Standard-Befehlen wie input, inkey, waitkey und ischarwaiting einfach eine vernünftige Fehlerbehandlung. Die ist in Bascom eher noch rudimentär, meiner Meinung nach. Ich kenne von VB her on error resume.... am Anfang der Sub und ich kann steuern, dass das Hauptprogramm weiterläuft.

    Also Dank für die Hilfe. Ich habe dabei einiges gelernt.

    Wolfgang

  6. #16
    Neuer Benutzer Öfters hier
    Registriert seit
    19.07.2004
    Ort
    Gelsenkirchen
    Alter
    79
    Beiträge
    16
    Eure Hilfestellungen sind vom Erfolg gekrönt!

    Es klappt wunderbar. Seit ca 2 Stunden läuft die Sache fehlerlos. Vor allen Dingen bleibt die Sache nicht mehr hängen. Wenn mal die Bytes aus der Reihe tanzen, entstehen nur unsinnige Zeichen. Beim nächsten Intervall ist wieder alles in Ordnung.

    Code:
    $regfile = "m32def.dat"       ' Mega 32
    
    $baud = 9600
    $crystal = 16000000
    
    '*** alle Stacks und framesize stehen auf 100
    
    Dim Ergebnis As Single
    Dim Fertig As Bit
    Dim Zähler As Byte            '***** Feldzähler
    Dim Zeichen(4) As Byte At Ergebnis Overlay
    Dim Sendeanforderung As String * 1
    Dim Funk_anzeige As String * 7       '*** einige mehr als nötig
    
    Const True = 1
    Const False = 0
    
    Empfangs_led Alias Portc.3
    
    On Urxc Hole_bytes
    
    Enable Interrupts
    
    Enable Urxc
    
    Sendeanforderung = "!"
    Set Empfangs_led              '**** anfangs aus
    Do
      '***** nachfolgendes if in meinem Programm alle 12 sec
      '**** If Interrupt_zähler = Interrupt_intervall Then
         Enable Urxc   '***** Interrupt einschalten, stört sonst andere Interrups
         '**** Aufforderung zum Senden
         Printbin Sendeanforderung   '**** ohne Chr(10) und Chr(13)
         '**** Sender sendet nun
    
         Zähler = 1                  '**** Feldzähler initialisieren
         Reset Empfangs_led          '**** an
         If Fertig = True Then
               Fertig = False
               Waitms 200            '**** wichtig, verzögern
               '**** hier steht Ergebnis zur Verfügung
               Funk_anzeige = Fusing(ergebnis , "##.#" )       '**** um aufzurunden!
               '**** Routine zum Anzeigen
               Set Empfangs_led      '**** aus
         End If
         Disable Urxc
         '**** weiterer Code
      '*** end if
    Loop
    
    End
    
    Hole_bytes:
        Zeichen(zähler) = Udr     '**** ein Byte angekommen
        Incr Zähler
        If Zähler > 4 Then
            Fertig = True
            'Zähler = 1
        End If
    Return
    Ich kannte zwar die Geschichte mit dem Overlay, habe mich aber nicht dran getraut, weil man in den mir vorliegenden Beispielen ne Adresse angeben musste. Da fühlte ich mich doch überfordert. Das mit dem Location wars dann. Toll!

    Nochmals Dank
    Wolfgang

  7. #17
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    04.11.2003
    Ort
    Dresden
    Alter
    61
    Beiträge
    409
    Zitat Zitat von PicNick
    Trotzdem, einmal zu Fuß ein Float aufmischen gehört zum Leben dazu.
    Hallo Robert,

    da hast du vollkommen Recht.

    Je mehr man allerdings in die Materie einsteigt, um so mehr wundert man sich dann auch, dass bei den Berechnungen noch halbwegs sinnvolle Resultate rauskommen können.

    Viele Grüße
    Jörg

  8. #18
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    @Jörg: *schmunzel* ich mach das beruflich, und wenn ich mir ansehe, was da so den ganzen Tag produziert wird (auch von mir), sollten wir vielleicht das "halbwegs sinnvoll" nochmal überdenken, ob man das auch so stehenlassen kann. *resignier*
    Keep coding ! mfg robert

  9. #19
    Erfahrener Benutzer Roboter Experte Avatar von Rage_Empire
    Registriert seit
    10.03.2005
    Ort
    Pforzheim
    Beiträge
    710
    Hallo,

    ich weiß, daß der Thread schon über ein Jahr alt ist, das macht die Sache aber nicht unintresannter. Erstmal:

    RESPEKT!!! an PicNick

    Ich setz auch gleich mal mit meiner Frage ein. Geht das wirklich nur mit overlays, oder kann ich hier auch die high und low -Befehle benutzen? Der Hintergrund ist der: Für viele Single-Variablen muß ich sonst jedesmal overlayen, was mit einem Unterprogramm (Funktion) welches mir die Singles zerlegt einfacher wäre. Der Ansatz von PicNick ist hierfür zwar geeignet, aber geht dies auch einfacher und Resourcensparender? Ich habe bis jetz nur gesehen, das man mit "high" und "low" Word-Variabeln zerlegen kann.

  10. #20
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    Hi, wenn man senden/empfangen mit subroutine gewissermassen allgemein lösen will, kann man die singles (oder sonstwas) auch per adresse übergeben. sagen wir mal senden:
    Code:
    dim einesingle as single 
    dim adr as word 
    
     adr = varptr(einesingle)    ' adresse von der single
     call send4( adr , 4)
    
    sub sendbytes(byval adr as word, byval ln as byte)
    local cnt as byte
    local vll as byte
     for cnt = 1 to len 
         vll = inp (adr)   ' lesen byte aus SRAM
         print chr (vll);  ' weg damit
         Incr Adr           ' address ++ 
     Next
    End Sub
    Analog ginge auch empfang, dann halt mit "OUT addr, val "
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

Seite 2 von 3 ErsteErste 123 LetzteLetzte

Berechtigungen

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

Solar Speicher und Akkus Tests