www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Wie kann String von EEProm in Byte-Array eingelesen werden?


Autor: Micha R. (michaavr)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Netbird (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hast du es mit READEEPROM probiert? Das ist der dafür vorgesehene 
Befehl.

Autor: Micha R. (michaavr)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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!!!

Autor: Micha R. (michaavr)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

ja hab es mit readeeprom gemacht.
Aber der Befehl liefert in einer Schleife komischerweise immer den 
letzten Wert. Hast du eine Ahnung warum?

Autor: Micha R. (michaavr)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
kann mir denn keiner weiter helfen?
:(

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@  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

Autor: Micha R. (michaavr)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für den Tip.

Aber mit C-Library kann ich in Bascom nichts anfangen.
Sollte ich mich irren, bitte korrigiere mich!

Autor: STK500-Besitzer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Sollte ich mich irren, bitte korrigiere mich!
Du irrst nicht...

Für Bascom gibt es aber ein Handbuch...

Autor: Denny S. (nightstorm99)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ STK500-Besitzer

Hauptsache irgendwas geplappert.
Frag mich, warum du antwortest, wenn du sowieso nicht helfen willst.
Einfach ignorieren ist besser als solche Sprüche.

Autor: Micha R. (michaavr)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ 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...

MfG
Falk

Autor: gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ 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.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ 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

Autor: gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ 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.

Autor: Micha R. (michaavr)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: STK500-Besitzer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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...

Autor: Falk Brunner (falk)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
@ 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

Autor: Micha R. (michaavr)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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!

Autor: gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ 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

Autor: gast (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
- 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

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ 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

Autor: Micha R. (michaavr)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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?

Autor: gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.