PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Daten aus EEProm löschen über Bascom



m@rkus33
25.12.2005, 18:29
Hallo zusammen,

mal wieder eine Anfängerproblem.

Ich habe ein Prog mit einer Subroutine zum Setup. In der Subroutine kann ich zwei Zahlenwerte festlegen die in das EEprom geschrieben werden. Das Mainprog arbeitet dann immer mit diesen Werten.

So weit alles klar und es funktioniert. Nur wenn ich das Setup erneut aufrufe und neue Werte eingebe dann werden die Daten im EEprom nicht überschrieben.

Hier ein Auszug:


'*** Setuproutine Setup für Übernahme Tankinhalt***
Setuproutine:
Print "Bin im Setupmodus"
Tankeeprom = Waitkey() 'Warte auf die Eingabe des Tankinhaltes
If Tankeeprom > 0 Then
Writeeeprom Tankeeprom , 1
Print Tankeeprom
End If
Testwert = Waitkey()
If Testwert <> 0 Then
Writeeeprom Testwert , 10
Print Testwert 'Nur für das Terminalprogramm ob Wert OK
End If


Wait 1
Return

Was kann ich denn dort vor dem Writeeprom eingeben, damit die alten Daten komplett aus dem Eeprom gelöscht werden bevor neue geschrieben werden?

Die Variable "Tankeeprom" ist Long. Die Werte für die Varable können von 0 - 10.000 (hier ml) gehen. Die Variable "Testwert" ist Byte.

Die Variable "Tankeeprom" wird im Hauptteil dann später bei der Initialisierung ausgelesen und die Berechnungen starten. Das funktioniert auch wunderbar.

Komisch ist auch, das im Terminalprogramm (von Br@y) nicht gewartet wird bis ich was bei Waitkey eingebe. Das rauscht nach ca. 8 sec. automitsch weiter und die Subroutine kehrt zurück.

Was kann das denn sein?

Gruß
Markus

m@rkus33
25.12.2005, 18:38
... Komisch. Ich habe If Then rausgeschmissen. Habe aber immer noch das Problem, das das Setup auch ohne Datenempfang bei Waitkey() einfach nach einer kurzen Zeit weitermacht und über Return ins Hauptprogramm zurückgeht.

Das mit dem EEProm und den neuen Werten habe ich auch noch nicht hinbekommen.

Also immer noch Probleme. :-k

Ratber
26.12.2005, 01:09
Hi

Hab das jetzt nur kurz überflogen aber ich verstehe nicht ganz was für ein Problem du hast.

Die Routine warte auf ein Zeichen
Ko0mmt eins dann wird geprüft ob es größer 0 ist und wenn ja dann wirds an Adresse 1 geschrieben und auf dem Terminal ausgegeben.

wenn nicht dann gehts weiter zur Zweiten Eingabe und das gleiche spiel mit Adresse 10.

Womit du den Inhlat überprüfst kann ich nicht erkennen.

Gib doch zum testen einfach den EEprominhalt aus anstatt der Variable oder beides in der gleichen Zeile dann haste sofort die kontrolle ob es stimmt.(Readeeprom = Variable vor der ausgabe)




Zu Waitkey () :

Normalerweise sollte der Controller solange warten bis was kommt.
Was passiert denn wenn an der Seriellen nix hängt ?
Rauscht er dann immernoch nach einigen Sekunden durch ?

m@rkus33
26.12.2005, 01:23
Hallo Ratber,

na Du Nachtschwärmer!

Also das ist so.

Wenn über RS232 ein bestimmtes Zeichen gesendet wird, dann wird in die Setuproutine gesprungen.

Dann sollen von einem zweiten Controller zwei Werte übermittelt werden und in die Adresse 1 und 10 geschrieben werden.

Ich habe das ganze mit dem Simulator von Bascom laufen lassen. Da wartet die Simulation schön auf die beiden Werte. In der Ansicht des EEProms sehe ich auch die Werte in den Adressen.

So dann brenne ich. Hab den Controller auf einem STK500 und kontroliere mit dem Terminalprogramm. Da sehe ich auch den Sprung in die Subroutine. Mache ich aber nichts dann läuft er einfach nach kurzer Zeit weiter. Ich sehe wie die Routine verlassen wird. Kann es sein das die Terminalprogramme ständig was senden?

Zum zweiten Problem:

Ich habe es geschafft über das Terminalprogramm die Daten zu senden. Mache ich das gleiche mit anderen Werten nach einem Reset, sehe ich an den Daten die ich aus der Hauptroutine mit dem Terminal empfange, dass es sich noch offensichtlich um die alten EEProm Daten handelt.

Gruß
Markus

Ratber
26.12.2005, 01:53
Hi Markus



na Du Nachtschwärmer!

Yo,hatte heut Besuch vonner Buckligen Verwandschaft zwecks Weihnachtsessen.
Kann aber irgendwie nicht pennen also Tipper ich mich müde :D




ch habe das ganze mit dem Simulator von Bascom laufen lassen.

Yo,der ist zwar ganz nett aber eben nicht perfekt.
Ich teste lieber in der Schaltung.
Bei weit über 10k Programierzyklen ist das kein akt *gg*



Kann es sein das die Terminalprogramme ständig was senden?
eigentlich sollten sie das nicht tun.
Häng doch einfach mal ne Low-Current-LED oder ne normale mit Transe an die Empfangsleitung.
Dann kannste sehen ob sich was tut.
Ich hab dafür noch einen alten Schnittstellentester damit kann man schön sehen ob und was läuft.




Ich habe es geschafft über das Terminalprogramm die Daten zu senden. Mache ich das gleiche mit anderen Werten nach einem Reset, sehe ich an den Daten die ich aus der Hauptroutine mit dem Terminal empfange, dass es sich noch offensichtlich um die alten EEProm Daten handelt.
Hmm,ja,könnte mit dem ersten Problem zusammenhängen.
Wenn er unaufgefordert Zeichen sendet dann kann er vieleicht auch welche schlucken.
Hatte mal was ähnliches mit den Puffern im System.
Alles was an HD,Stick,USB oder sonstwo geschickt wurde ist irgrgendwohin umgeleitet worden und hing manchmal.
Hab nie rausgefunden was es war und neuinstalliert.

Passiert das auch wenn du nach dem reset das Terminal neu startest ?

m@rkus33
26.12.2005, 10:14
Hi Ratber,


hatte heut Besuch vonner Buckligen Verwandschaft zwecks Weihnachtsessen.
Kann aber irgendwie nicht pennen also Tipper ich mich müde

HaHa :D geht mir genauso, hab aber dann doch um 02:30 die Kist mit Decke vorgezogen.

Hmm, werd mal mein Oszi ausgraben und mal checken ob da was läuft.

Is scho komisch. Freut man sich wenn der Sim. so funzt wie man das will und die real Hardware dann nicht. Wo kann ich eigentlich mal was grundsätzliches über die gesamte RS232 Thematik nachlesen?

Was mir noch nicht ganz klar ist: Wenn ich z.B über Print A;B;C eine Kette sende werden die drei Werte ja direkt aneinander gehängt. Wie kann ich am Empfänger die drei Werte wieder auseinanderhalten damit dann jeweisl getrennt weitergearbeitet werden kann?

Zusätzlich muss ich mich nocht mit Manchester und Checksum beschäftigen. Da hab ich einiges an Lernerei vor mir. :(

Gruß Markus

Ratber
26.12.2005, 13:26
HaHa Very Happy geht mir genauso, hab aber dann doch um 02:30 die Kist mit Decke vorgezogen.

Ja,eigentlich war ich am ende der Feier müde (Voller Magen....)aber nach dem abräumen gings einfach nicht.
Hab noch bis fast fünfe gemacht.
Maja,jetzt hab ich wenigstens wieder ne saubere Ätzküvette :D




Is scho komisch. Freut man sich wenn der Sim. so funzt wie man das will und die real Hardware dann nicht. Wo kann ich eigentlich mal was grundsätzliches über die gesamte RS232 Thematik nachlesen?

Gute Frage.
Ich hab mir das im Laufe der Zeit alles zusammengelesen und experimentiert.
Im Web sollte sich aber genug darüber finden.
Goggle mal etwas.



Was mir noch nicht ganz klar ist: Wenn ich z.B über Print A;B;C eine Kette sende werden die drei Werte ja direkt aneinander gehängt. Wie kann ich am Empfänger die drei Werte wieder auseinanderhalten damit dann jeweisl getrennt weitergearbeitet werden kann?

Da gibt es einige möglichkeiten.
-Sende feste strukturen (Feste länge pro wert) damit du am anderen ende weißt "wo" du trennen mußt.
-Sende einzeln mit CR
-Füge Trennzeichen ein die vorher definiert werden müssen.
Wenn es Zahlen sind reicht schon ein leerzeichen.


Zusätzlich muss ich mich nocht mit Manchester und Checksum beschäftigen. Da hab ich einiges an Lernerei vor mir.

Zu Manchester:

Ich weiß nicht an welcher stelle du ihn brauchst aber Bin2Gray,Gray2bin nd Encoder könnten dir vieleicht helfen.

Zu Checksum:

Auch da bietet Bascom was an.
Schau mal unter Checksum,CRC8/16/32

Ansonsten was eigenes basteln.
zb.die Werte per xor verknüpfen und das Ergebnis am ende der Übertragung ebenfalls übertragen.
DerEmpfänger kann dann vergleichen.
(Wenn du per inkey arbeitest mit aufaddierter 1 am Ende um den Wert 0 als Zeichen zu vermeiden)
War natürlich nur ein ganz simples Beispiel.
der Aufwand steigt mit der sicherheit.

m@rkus33
27.12.2005, 16:17
Hallo Ratber,

meine Jet-Tankuhr mit Telemetrie ist fast fertig. Die RS232 Thematik hab ich so einigermaßen im Griff. Manchester wollte wg. der Datenqualität bei der Funkübertragung machen. Ich habe zwar die wirklich guten Funkmodule von HM-Radio, wollte aber da wirklich auf Nummer sicher gehen.

Ich hab aber nun ein riesiges Problem. Bin mit dem Code beim Empfänger schon an der 4k - Grenze des Bascom Demos.

Jetzt kann ich keine Manchester Codierung mehr ausprobieren geschweige die restlichen nötigen RS232 Übertragungsmodi.

Gibt es eine Möglichkeit den Code zu "stückeln" und danach wieder irgendwie zusammenzubringen?

Ich dachte daran einige Routinen die zusammenhängen als AVR Studio Objektfile zu compilern und in AVR Studio dann als komplette Datei zu "hexen".

Ginge so was?

Gruß
Markus

Ratber
27.12.2005, 16:38
Da ist mir nix bekannt und ich kann mir das auch nicht vorstellen das es ginge.

Ich würde sagen es ist soweit an eine Vollversion zu denken.

m@rkus33
27.12.2005, 23:16
Hallo Ratber,

...hmm scheint so. Arbeitest Du mit der Vollversion?

Ich habe nochmal wg. der RS232 Thematik nachgedacht. Die Geschichte mit der Trennung der Zeichen.

Würde das funktionieren?


Sender:

DIM Sendepaket(5) as byte
Sendepaket(1) = 2
Sendepaket(2) = 50
Sendepaket(3) = 0
Sendepaket(4) = 32
Sendepaket(5) = 32


PRINT Sendepaket(1), 5


Empfänger:


Sendepaket(1), 5 =Inkey()
if Sendepaket(2) = 2 then "tue irgendwas"
..... und so weiter.


Funktioniert das?

Gruß
Markus

Ratber
27.12.2005, 23:45
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.

m@rkus33
28.12.2005, 09:43
ein kleines Beispiel wäre supernett. Irgendwie raffe ich das noch nicht so ganz mit den Start- und Stoppzeichen.

Gruß
Markus

Ratber
29.12.2005, 00:04
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. :wink:
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.





'-------------------------------------------------------------------------------
' 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

m@rkus33
29.12.2005, 10:15
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?




$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

Ratber
29.12.2005, 13:13
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.



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.

m@rkus33
29.12.2005, 13:29
...jezt ist der Groschen gefallen!!! \:D/

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 :mrgreen: :mrgreen: :mrgreen:

Ratber
29.12.2005, 13:36
Nö,so sehe ich immer aus wenn ich gerade aufgestanden bin :mrgreen:

m@rkus33
30.12.2005, 02:12
... ich glaub ich seh morgen früh auch so aus :mrgreen:

Ich habe die Rs232 Übertragung für den Sender erfolgreich implementiert \:D/ 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!




'------------------------------------------------------
'*** 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
'------------------------------------------------

Ratber
30.12.2005, 03:08
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 ?