Hallo zusammen, ich habe ein kleines Programmier-Problem. Ich möchte einen String, der im EEProm abgelegt ist, in ein Array einlesen, um es seriell über UART mit dem Befehl printbin DataArray(1),<Datenllänge> auszugeben. Ich verwende den ATmega8 mit Bascom 1.11.9.0 Verschiedene Versuche, den String Byteweise auszulesen schlugen fehl. Hat jemand ein Vorschlag, wie sowas gemacht wird? Muss ich das mit Peek/Poke bzw INP und OUT erledigen oder vielleicht über einen Assembler-Befehl? Ich suche eine einfache Lösung. Danke für eure Hilfe im Voraus! Gruß Mitch.
Hast du es mit READEEPROM probiert? Das ist der dafür vorgesehene Befehl.
Habe ein kleines Beispiel vorbereitet, das die Problematik aufzeigt. Besonderes Augenmerk ist hier auf das Label: _ReadFor zu richten. Genau dies funktioniert nicht und ich weis nicht warum. Kann mir jemand helfen? Hier das Beispiel als lauffähiges Programm. (Läuft im Simulator) ' Test ' String-Daten aus EEPROM byteweise auslesen ' und in Byte-Variable speichern ' Standard-Einstellungen $Regfile = "m8def.dat" $Crystal = 3686400 $HWStack = 32 $SWStack = 32 $FrameSize = 32 ' EEProm-Daten $EEPROM _DataString1: Data "Das ist ein String" , 0 _DataString2: Data "Noch ein String" , 0 $Data dim sString as string * 30 ' String-variable dim sByte as Byte ' Byte-Variable dim i as Byte ' Zähle For-Schleife dim Addr1 as word dim Addr2 as word gosub ReadString ' als String auslesen gosub ReadByteByte ' einzelne Bytes auslesen gosub ReadFor ' EEProm in For-Next Schleife auslesen do nop loop END ' Warum funktioniert das nicht? ReadFor: ' Lesen per Schleife readeeprom sByte , _DataString1 print chr(sByte); for i = 1 to 10 ' 10 Zeichen lesen readeeprom sByte print chr(sByte); next Return ' Das funktioniert ReadString: ' Lesen als ganzer String readeeprom sString , _DataString2 print sString Return ' Das funktioniert auch ReadByteByte: ' Lesen Byte für Byte readeeprom sByte , _DataString1 print chr(sByte); readeeprom sByte print chr(sByte); readeeprom sByte print chr(sByte); readeeprom sByte print chr(sByte); readeeprom sByte print chr(sByte); readeeprom sByte print chr(sByte); readeeprom sByte print chr(sByte); readeeprom sByte print chr(sByte); readeeprom sByte print chr(sByte); readeeprom sByte print chr(sByte); readeeprom sByte print chr(sByte); readeeprom sByte print chr(sByte); readeeprom sByte print chr(sByte); readeeprom sByte print chr(sByte); readeeprom sByte print chr(sByte); readeeprom sByte print chr(sByte); readeeprom sByte print chr(sByte); readeeprom sByte print chr(sByte) Return ' ----------------------------------------------------- Einfach Code kopieren und in Bascom Compilieren, dann im Simulator durchsteppen!!!
Hi, ja hab es mit readeeprom gemacht. Aber der Befehl liefert in einer Schleife komischerweise immer den letzten Wert. Hast du eine Ahnung warum?
@ Micha R. (michaavr)
>kann mir denn keiner weiter helfen?
Lies die Doku der libc im WINAVR. Dort steht alles drin. Nutze die
fertigen Routinen für den EEPROM Zugriff und sei glücklich.
MFG
Falk
Danke für den Tip. Aber mit C-Library kann ich in Bascom nichts anfangen. Sollte ich mich irren, bitte korrigiere mich!
>Sollte ich mich irren, bitte korrigiere mich!
Du irrst nicht...
Für Bascom gibt es aber ein Handbuch...
Hallo! @Micha Du liest immer wieder die gleiche Adresse aus und deshalb hast du nur den letzten Wert. Solltest eine kleine For-Schleife machen und damit die Adressen hoch zählen. Und das Array gleich mit hoch zählen. Gruß Denny
@ STK500-Besitzer Hauptsache irgendwas geplappert. Frag mich, warum du antwortest, wenn du sowieso nicht helfen willst. Einfach ignorieren ist besser als solche Sprüche.
Hallo, also nach langem doktern und blättern im Datenblatt habe ich eine Lösung gefunden. Sie ist vielleicht nicht effizient und bestimmt gibt es andere Möglichkeiten, aber diese funktioniert zumindes: (Bin mit dieser Lösung allerdings nicht zufrieden!) ' DAS FUNKTIONIERT ReadTest: i = 1 ' Start-Index des Array ' 1x blind lesen, um Datenzeiger im EEProm zu setzen readeeprom ByteArray(i) , _DataString2 do eecr.eere = 1 ' Bist setzen EEProm lesen ByteArray(i) = eedr ' EEDR enthält gelesene Daten (EEProm-Daten-Register) if ByteArray(i) = 0 then exit do ' Ist String zu ende? print chr(ByteArray(i)); ' Wert zur Kontrolle ausgeben incr eearl ' EEProm-Adress-Register erhöhen if eearl = 0 then incr eearh ' Highbyte Adressregister incr i ' Array-Index erhöhen loop Return Wenn jemand eine bessere Lösung hat, oder weis, wie man das in eine Function verpacken kann, dann her damit! Mitch.
@ Micha R. (michaavr) >also nach langem doktern und blättern im Datenblatt habe ich eine Lösung >gefunden. Du machst der BASCOM Familie mal wieder alle Ehre. Schon mal was von einem BASCOM-Handbuch gehört? >Sie ist vielleicht nicht effizient und bestimmt gibt es andere >Möglichkeiten, aber diese funktioniert zumindes: Es ist der blanke MURKS! >Wenn jemand eine bessere Lösung hat, oder weis, wie man das in eine >Function verpacken kann, dann her damit! RTFM!!!!!! READEEPROM ist dein Freund. http://www.mcselec.com/index.php?option=com_docman&task=doc_download&gid=140&Itemid=54 MfG Falk
@ Falk wer bist du eigentlich, dass du andere Menschen so fies anmachst. Hast du in dem Forum was zu sagen, oder bist du bloß selbsternannter Gott. Halt dich raus, wenn du keine Vorschläge hast und lern mal ein klein bischen Benehmen. Du machst das ganze Forum kaputt mit deiner Scheiß verkorksten Art, und Dampfplauderei.
@ gast (Gast) >Halt dich raus, wenn du keine Vorschläge hast und lern mal ein klein >bischen Benehmen. Du machst das ganze Forum kaputt mit deiner Scheiß >verkorksten Art, und Dampfplauderei. Ich habe Vortschläge. Und wenn es Leute trotz mehrfacher Hinweise absolut nicht verstehen wollen bzw. sich extrem lernresistent zeigen, muss man hin und wieder Tacheles reden. MFG Falk
@ Falk nicht jeder ist technisch so gut drauf wie Du vielleicht, und hat, ob Du es glaubst oder nicht, sogar Anfängerfragen. Darum gibt es Foren. Scheinst Du vergessen zu haben. Wenn es die Foren nicht gäbe, was würdest Du den ganzen Tag machen. Wer gibt dir das Recht mit anderen, unbekannten Tacheles zu reden. Eine Stufe weniger Arroganz wäre echt angebracht. Solltest mal drüber nachdenken. Nix für Ungut - und einen guten Rutsch ins Neue. Kannst ja einen guten Vorsatz draus machen. Wäre schön, wenn man weniger "Gemotze" von Dir liest.
Hallo @ Falk jetzt muß ich auch mal was los werden! Du meinst readeeprom ist mein Freund? Stimmt. Aber in diesem speziellen Fall nicht!!! Readeeprom funktioniert nicht, wenn du Strings, die im EEProm abgelegt sind in ein Array kopieren willst. Bevor du Leute wie mich herabwürdigend als lernresistent bezeichnest, solltest du vielleicht mal am anfang dieses Threds nachschauen. Dort hab ich für Leute wie dich, die immer alles Besser wissen wollen, ein lauffähiges programm aufgezeigt, damit man das ausprobieren kann. Bevor du nun doch wieder herabwürdigende Bemerkungen machst, nimm dir mal dieses Programm und probiere es aus! Dann reden wir weiter. Im übrigen finde ich diese Routine keinen Murks, sondern das Ergebnis einer Problemlösung. Zugegeben ist sie nicht perfekt, aber ReadEEProm ist es auch nicht! So und nun kommst du, wenn du einen besseren Voraschlag hast, dann her damit. Mitch.
Wenn man (im Handbuch) lesen kann, ist man klat im Vorteil: Seite 652 des Hanbuchs im von Falk geposteten Link: When you omit the address label in consecutive reads, you must use a new READEEPROM statement. It will not work in a loop: Readeeprom B , Label1 Print B Do Readeeprom B Print B Loop Until B = 5 This will not work since there is no pointer maintained. The way it will work : ReadEEprom B , Label1 ' specify label ReadEEPROM B ' read next address in EEPROM ReadEEPROM B ' read next address in EEPROM Da würde ich vermuten, dass, wenn man ReadEEPROM auch noch eine (steigende) EEPROM-Adresse übergibt, auch eine Schleife funktioniert. Aber Falk und ich haben ja keine Ahnung und BASCOM ist perfekt...
@ Micha R. (michaavr) So, um mal etwas mehr Substanz in die Diskussion zu bringen hab ich mir mal BASCOM gezogen. Und das ursprüngliche Problem so gelöst. Siehe Anhang. Es ist NOCH einfacher als man denkt. ;-) Man darf nicht zu kompliziert denken und C mit BASCOm mischen. Dann klappts aus mit den Strings. >Ich möchte einen String, der im EEProm abgelegt ist, in ein Array >einlesen, um es seriell über UART mit dem Befehl MFG Falk
Hallo @Falk, ich weis nicht wo in deinem Beispiel das Array dimensioniert ist. Ich sehe keins. Dein Beispiel kenne ich bereits. Das ist die "normale" Anwendung, wie mit ReadEEProm und WriteEEProm umgegangen wird. Das Funktioniert ja auch. Aber was du da verwendest ist ein String bzw. ein Zeiger, aber kein Array. Ich brauche den String in einem Array, weil ich noch eine Summe daraus berechnen muß. Nach deiner Methode müßte ich den ERAM-String zuerst in einen normalen setzen, um mit Mid() und ASC() die Summe zu ermitteln. Außerdem kann ich nicht so verschwenderisch mit den Resourcen umgehen. Deshalb verwende ich ein Array. Und das wird so dimensioniert: DIM MeinArray(64) as Byte Versuch doch mal das: MeinArray(1)=DeinString und dann schau mal, was im Array steht!
Hallo, wie schön, alle wieder in Erdnähe. @ Micha das geht definitiv nicht so. Steht übrigens in der Help: Plus diesmal an Falk und STK500-Besitzer Do Readeeprom B Print B Loop Until B = 5 This will not work since there is no pointer maintained. Schleifen sollten aber mit Setzen einer ERAM Variablen gehen.
@ Micha R. (michaavr) >Ich brauche den String in einem Array, weil ich noch eine Summe daraus >berechnen muß. Nach deiner Methode müßte ich den ERAM-String zuerst in >einen normalen setzen, um mit Mid() und ASC() die Summe zu ermitteln. Dann tu das doch einfach. >Außerdem kann ich nicht so verschwenderisch mit den Resourcen umgehen. >Deshalb verwende ich ein Array. Dein Array spart auch keinen Speicher, wie auch. Warum das Rad neu erfinden? Nimm einen String mit 64 Byte, pack dort alles zusammen rein was gesendet werden soll (Strings zusammenfügen) und sende den String. Fertig. Alles andere ist in BASCOM Unsinn. MFG Falk
- String als ERAM ins EEprom schreiben - In For-Schleife mit reeadeeprom als Byte auslesen - in ein Array - anzeigen - Nächste Schleife zum direkt anzeigen. - Adresse 0 nict verwenden. Hab vergessen wo es steht. Bringt aber Schwierigkeiten
@ gast (Gast) >Dateianhang: DUMMY.RTF (2,4 KB, 2 Downloads) Warum einfach wenns auch umständlich geht. Was spricht dagegen, das einfach als *.bas Datei anzuhängen? >- String als ERAM ins EEprom schreiben >- In For-Schleife mit reeadeeprom als Byte auslesen - in ein Array - >anzeigen >- Nächste Schleife zum direkt anzeigen. Warum willst du die Stringverarbeitung, die BASCOM bereits sehr gut beherrscht, neu erfinden? Wo wird da Speicher gespart? >- Adresse 0 nict verwenden. Hab vergessen wo es steht. Bringt aber >Schwierigkeiten Ist nur bei den alten AVRs so gewesen, Schnee von gestern. MFG Falk
Hallo @Alle Also ich verwende ein Array, weil ich Daten über einen Bus sende und empfange. Hier verwende ich ein eigenes Protokoll. Da macht es keinen Sinn Die Daten jedesmal im String anders zusammen zu bauen. Außerdem ist das Datenpaket im protokoll variable, also unterschiedlich lang. Um Daten zu senden und zu Empfangen habe ich deshalb ein Byte-Array angelegt, das ich unterschiedlich nutzen kann. Wenn ich einen String empfange, muß ich die Daten umständlich in Bytes, Integer und Longs wandeln. Außerden brauche ich dann ja den String zusätzlich. Das Protokoll ist binär, deshalb habe ich ein Array verwendet. So mein protokoll: SYNC FLAGS DEST SCR [DATAS] SUM Alles ist in Byte dimensioniert. Datas ist das Array. Je nach Anwendung kann mal ein String in Datas sein, kann aber auch mal nur 1 oder ein paar Bytes sein. FLAGS regelt hier, ob und wiefiel Daten im Paket vorhanden sind Das per String auseinander zu fuseln ist unsinnig. Warum ich die EEProm-Daten byteweise auslesen möchte ist folgender Grund. Jeder Teilnehmer am Bus hat eine Adresse. Für Bessere Lesbarkeit vergebe ich jedem Teilnehmer Noch einen Namen und eine kurze Beschreibung. Diese Daten liegen im EEProm und möchte ich per Bus lesen und ändern können. Ist es jetzt etwas klarer?
@ Falk > Warum einfach wenns auch umständlich geht. Was spricht dagegen, das > einfach als *.bas Datei anzuhängen? Du kannst es nicht lassen, was; Mister "Format beachten". Die Masche ist doch echt langsam zum Erbrechen langweilig. Wirst Du dafür bezahlt, als Kaspar aufzutreten. Wir leben im 21. Jahrhundert - falls Du das noch nicht mitbekommen hast. Die Datei ist extra für solche wie Dich formatiert ausgegeben. Und da steckt auch die Formatierung vom Bascom Editor drin. Oder bist Du nicht im Stande eine Datei, die schön formatiert ist mit Copy und Paste ins Bascom zu laden. Einen PC mit WordPad wirst ja wohl haben. Du hast das immer noch nicht begriffen, es geht hier darum, Daten aus dem EEprom in ein Array zu bringen. Der Weg funktioniert - wie ist momentan egal. Nochmal für Dich: Das fehlt bei Deinem Vorschlag ganz - Thema Verfehlung. Nach der Leistung brauchst nicht mit Dreck schmeißen. Das ist übrigens auch nicht für Dich geschrieben, sondern für Micha R. (michaavr). Und wenn der motzt, dann versteh ich das eher.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.