- LiFePO4 Speicher Test         
Seite 2 von 2 ErsteErste 12
Ergebnis 11 bis 19 von 19

Thema: Daten aus EEProm löschen über Bascom

  1. #11
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.09.2004
    Ort
    Düsseldorf
    Beiträge
    3.948
    Anzeige

    E-Bike
    Yo,ich arbeite mit vollversion die freie Grenze (Jetzt 4k davor 2k) ist schnell erreicht.


    Zu Trennzeichen:

    aus beiden Sachen kann ich jetzt nix rauslesen.


    Ich weiß ja nicht welche Werte ,Zeichen oder sonstwas rüberkommt.
    Nimm zb. zwei Schlüsselzeichen die sonst nirgend vorkommen können.
    Eins ist für Start das andere für Stopp
    Telegrammbreite ist meinentwegen 5 Zeichen lang.

    Deine Empfangsroutine wartet auf das Startzeichen.
    Danach werden die ankommenden Bytes einsortiert ("Sendepaket(x)")
    ideal kommt nach dem 5. Zeichen das Stoppzeichen.
    Stimmt das alles dann kann der empfang verarbeitet werden.

    Kommt mit dem 6. Zeichen nicht Stopp oder Stopp zufrüh dann wird der Empfang zurückgesetzt und neu gestartet.

    Das ganze läst sich natürlich auch mit einer Checksumme ergänzen.


    Is wie gesagt nur ein Beispiel von vielen.

    Ich kann dir ja auch mal nen kleines Beispiel zusammensetzen wenn willst.
    Gruß
    Ratber

  2. #12
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    14.12.2005
    Beiträge
    161
    ein kleines Beispiel wäre supernett. Irgendwie raffe ich das noch nicht so ganz mit den Start- und Stoppzeichen.

    Gruß
    Markus

  3. #13
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.09.2004
    Ort
    Düsseldorf
    Beiträge
    3.948
    Yo,hat was gedauert.Mußte noch was tun.

    Hier ein gaaaaanz einfaches Beispiel und nicht optimiert.
    Ich weiß das es noch zig andere und bessere Metoden gibt aber wir fangen mal nachvolziehbar an.
    Die Checksumme ist natürlich Einfachst aber da kannste ja reinsetzen was de haben möchstest.
    Ich hab das jetzt mal in 10 Minuten so aussem Ärmel geschüttelt also keine Mosereien von der dritten Seite die sich bis jetzt bedeckt gehalten hat.
    Es geht nur ummes Prinzip.
    Schau mal ob de das verstehst.
    Die vielen If Then Geschichten lassen sich natürlich noch besser darstellen (zb. Case)
    Ich hoff das ich auf die schhnelle keinen dicken Käfer reingeknetet habe.



    Code:
    '-------------------------------------------------------------------------------
    ' Erwartet werden 5 Zeichen Nutzdaten plus checksumme
    ' Startzeichen ist chr 15
    '-------------------------------------------------------------------------------
    $regfile = "m16def.dat"
    $crystal = 16000000
    $baud = 9600
    $hwstack = 32
    
    $swstack = 10
    $framesize = 40
    
    Dim A As Byte                                               'Allgemein
    Dim C As Byte                                               'Für Checksumme
    Dim B(5) As Byte                                            'Nutzdaten
    Dim Z As Byte                                               'Zähler
    Z = 0
    C = 0
    
    Do                                                          'Hauptschleife
    If Ischarwaiting() = 1 Then Gosub Empfang                   'wenn zeichen im Puffer dann "Empfang"
    If Z = 7 Then Gosub Auswertung
    'Hier könnete ihre Werbung stehen
    Loop
    
    Empfang:
    A = Waitkey()
    If Z > 0 Then Goto Empfang2                                 'wenn z schon größer dann weiter bei Empfang2
    If A = 15 Then Incr Z                                       'Wenn Startzeichen dann Z auf Startposition und
    Return                                                      ' zurück zum Hauptprogramm
    Empfang2:
    If Z < 6 Then B(z) = A                                      'Daten einsortieren
    C = C Xor A                                                 'Checksumme bilden.Einfach aber brauchbar.
    Incr Z                                                      'z um eins rauf für den nächsten
    Return
    
    Auswertung:
    If C <> 0 Then
     Z = 0                                                      'Prüfen ob die Checksumme stimmt.wenn nicht dann alles neu.
     C = 0
     Return
    End If
    
    'hier die Verarbeitung
    
    
    Z = 0                                                       'Nach der Verarbeitung alles wieder auf 0 und zurück
    C = 0
    Return
    Gruß
    Ratber

  4. #14
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    14.12.2005
    Beiträge
    161
    ahh.... jetzt bröselt schön langsam der Kalk.

    ist das "z" bei:

    Empfang2:
    If Z < 6 Then B(z) = A

    ein Tippfehler? Ich glaub schon, müsste wenn ich das hier kapiert habe ja

    If Z<6 Then B(5) =A

    Damit werden die 5 Zeichen in A zusammengefasst und die Checksumme durch Xor des gesamten Inhaltes von A gebildet. Richtig?

    Ok was sendet dann der Sender?

    Startzeichen, 5 Zeichen Nutzdaden und auch die Checksumme?

    Ist das dann beim Sender ganz einfach mit:

    Print 15 ;B(1) B(2);B(3).....B(5); C erledigt?

    Beim Sender dann sowas in der Art?

    Code:
    $regfile .... bla bla
    
    Dim A as Byte
    Dim C as Byte
    Dim B(5) as Byte
    Dim Start as Byte
    
    start =15
    B(1) = 'Irgend eine Variable aus dem Programm'
    B(2) = 'eine andere Variable aus dem Programm'
    .
    .
    .
    B(5)= 'noch eine und die Letzte Variable aus dem Programm
    
    
    B(1),5 = A
    C=C xor A 
    
    Print Start; B(1),5 ; C
    Ich tue mich da echt noch recht schwer. Hmm... bin vor 9 Tagen überhaupt in die Materie eingestiegen. Also ein absoluter Anfänger.

    Und auch nimma der jüngste.

    Gruß
    Markus

  5. #15
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.09.2004
    Ort
    Düsseldorf
    Beiträge
    3.948
    st das "z" bei:

    Empfang2:
    If Z < 6 Then B(z) = A

    ein Tippfehler?...........
    Nö das ist so gewollt.

    Die Variable B ist als Array mit 5 Zellen angelegt also B(1) bis B(5).
    Z ist einfach nur der Zähler.
    Wenn ein Zeichen im Puffer ist kann man das mit Ichharwaiting erkennen.
    Im Empfang wird das Zeichen gelesen.
    Wenn das Zeichen chr15 ist dann wird der Empfang gestartet ansonsten tut sich nix und es geht zurück.
    Ist das Zeichen 15 dann werden die folgenden 5 Zeichen in B(1) bis B(5) gespeichert und die Checksumme mit einfachem Xor gebildet.
    am Ende kommt noch die Checksumme vom Sender als 6. Zeichen.
    Wenn die Xorverknüpfung der 5 Bytes korrekt ist dann ergibt ein weiteres Xor mit der Checksumme vom Sender = 0

    In der Auswertung wird das nochmal überprüft.
    Ist die Checksumme verschieden dann wird derEmpfang verworfen.

    Natürlich ist der Empfang noch nicht ganz abgesichert.
    Wie gesagt,eine Möglichkeit.


    Ist das dann beim Sender ganz einfach mit:

    Print 15 ;B(1) B(2);B(3).....B(5); C erledigt?
    Wie du das beim Sender machst ist dir überlassen.
    Hauptsache du schickst Startzeichen,5 Zeichen Nutzdaten und die passende Checksumme.
    Die Zeile funktioniert aber so nicht ganz.
    Print ist mehr für Text gedacht.
    Nimm Printbin dafür.

    Zum Code:

    So einfach gehts nicht mit der Checksumme.

    Hier mal ein hoffentlich nachvollziehbares Beispiel.
    Is im Grunde das gleiche wie beim Empfang.

    Code:
    beispiel:
    Start = 15
    C = 0
    B(1) = 50
    B(2) = 100
    B(3) = 54
    B(4) = 88
    B(5) = 213
    For Z = 1 To 5
     C = C Xor B(Z)
    Next
    Printbin Start ;  B(1) ; C
    Return
    Das "B(1)" sendet das ganze array.
    Schau dir den Befehl mal in der Hilfe an und experimentier damit.

    Ich hab die empfangsroutine so gestaltet das der Empfang nebenher geschehen kann und nicht den Betrieb stört.
    Wenn sicher ist das alle 7 Zeichen im Puffer liegen dann gehts natürlich auch mit einem einfachen Inputbin
    Also Analog zu Prntbin : "Inputbin Start ; B(1) ; C"
    Hier kann man dann nachher kontrollieren ob der Datensatz gültig ist oder nicht.
    Das Problem ist nur nicht schon in der halben Übertragung abzufragen denn damit unterbricht man den Rest des Systems falls Zeichen nicht kommen

    Aber schau dir erstmal das andere an.
    Gruß
    Ratber

  6. #16
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    14.12.2005
    Beiträge
    161
    ...jezt ist der Groschen gefallen!!! \/

    habs kapiert !! Super - Deine Erklärung hier war wirklich für Dummies wie mich. Ich hoffe Dein neues Avatar ist nicht das Foto Deines Gesichtes beim lesen meiner Fragen

  7. #17
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.09.2004
    Ort
    Düsseldorf
    Beiträge
    3.948
    Nö,so sehe ich immer aus wenn ich gerade aufgestanden bin
    Gruß
    Ratber

  8. #18
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    14.12.2005
    Beiträge
    161
    ... ich glaub ich seh morgen früh auch so aus

    Ich habe die RS232 Übertragung für den Sender erfolgreich implementiert \/ und über das Hyperterminal getestet. funzt!!

    Sender ist ja auch net schwer zu kapieren.

    Jetzt muss ich noch die Empgängerroutine anpassen und in den code einbasteln. Ehrlich das mit der Empfängergeschichte krieg ich nicht abschließend in mein Schädel.

    Die 5 Nutzdaten liegen dann in A. richtig? Weil ja bei Empfang2 steht:
    If z<6 then B(z) =A und wenn alles da ist Z auf 7 gesetzt wird und über Gosub in die Auswertung der Checksumme gesprungen wird.

    Wie drönsel ich die Daten wieder auf - also wie kann ich dann die jeweiligen B(1)...B(5) dann gezielt an das Mainprog weitergeben?

    Checkt das Prog wenn ich mit B(1) = Irgendwas, If B(2) wasweisich then haumichblau... weitermache? Ich meine schon da B(z) ja ein Array von den 5 Nutzdaten ist. Richtig?

    Wo ist dann der Platz für die Verarbeitung der Nutzdaten am besten. Bei "Werbung" im Loop oder bei "hier die Verarbeitung". Frage deshalb weil bei meinem Mainprog erst was gemacht werden soll, wenn die Empfangen Daten vom Wert her größer sind als die alten vorangegangen Daten. Ich hätte das in den Loop eingebaut. Also auch die Abrfage ob die neuen Daten größer sind, und wenn ja mit Gosub in die jeweiligen Subroutinen der LCD Visualisierung. Sonst flackert das LCD wenn ständig akutalisiert wird aber keine neue Anzeige nötig ist. Diesen Teil habe ich schon fertig. Bisher habe ich mit Inkey() gearbeitet.

    Hier der Auszug aus meinem Code:
    boah.... mein Schädel raucht - Programmier Crashkurs in einer Woche!

    Code:
    '------------------------------------------------------
    '*** Hauptschleife ***
    '------------------------------------------------------
    
    'Enable Interrupts
    
    Tankalt = 0
    Eualt = 1023
    Signal = 2                                                  'Signalqualität 0=sehr gut bis 5=schlecht
    
    
    Gosub Visualisierung
    
    Do
    
          Tankneu = Inkey()
          If Tank >= Schwelle Then
       Sound Portd.7 , 400 , 400
       Sound Portd.7 , 400 , 250
       End If
       If Tankneu > Tank Then
          Tankalt = Tankneu
          Gosub Visualisierung
          End If
       Euneu = Inkey()
         If Euneu < Eu Then
       Eualt = Euneu
       Gosub Visualisierung
       End If
    
    
    Loop
    '------------------------------------------------
    'Subroutine Visualisierung
    '------------------------------------------------

  9. #19
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.09.2004
    Ort
    Düsseldorf
    Beiträge
    3.948
    wird schon.


    Die 5 Nutzdaten liegen dann in A. richtig? Weil ja bei Empfang2 steht:
    If z<6 then B(z) =A und wenn alles da ist Z auf 7 gesetzt wird und über Gosub in die Auswertung der Checksumme gesprungen wird.
    Ja der Grund für diese Version ist das die Daten nur nebenbei empfangen werden sollen so daß das Hauptprogramm weiterlaufen kann.
    Ist also einfach zu integrieren.

    Geh einfach mal mit einem Beispieldatensatz die Routine in Gedanken mehrmals durch.
    Sieht etwas wirr aus aber funktioniert.

    Leider bin ich Gedanklich nicht so in deinem Projekt drinne als das ich gleich sagen könnte "Na klar,mach so und so und fertig" .
    Ich kann dir nur Ideen liefern.

    Wie du deine Daten in die Bytes verpackst und wieder auspackst dürfte nicht schwer sein.
    Ich nehme mal an es ist das was ich bis jetzt weiß.
    Tankinhalt bzw. Verbrauchszahlen,Spannung,Temperatur usw.

    Es sollte ein Leichtes sein die Daten in den Datensatz zu bekommen und im Intervall zu senden.
    Da der Empfänger einen Puffer hat geht ja nix flöten ausser bei Empfangsproblemen.

    Also in Kurzform:

    Modell:
    Daten Sammeln
    Alle X Sekunden (Millisekunden) senden
    Fertig.

    Emnpfänger:
    Daten bei empfang nach und nach aus dem Puffer fischen und bei gültigkeit ins Programm übernehmen.

    Wenn die Sende und Empfangsroutinen stehen dann ist das eigentlich kein Akt mehr.

    Oder hast du deine Berechnung nicht so sehr auf ...ja,sagen wir mal so....Intervallbetrieb ausgelegt ?
    Gruß
    Ratber

Seite 2 von 2 ErsteErste 12

Berechtigungen

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

12V Akku bauen