Forum: Compiler & IDEs Fragen zu UART Protokoll EEPROM


von Stephan W. (stipo)


Lesenswert?

Hallo zusammen,

im moment habe ich irgendwie einen dicken Knoten in meinem Kopf.
Schreibe am besten erstmal hin, was ich erreichen möchte.

Ich möchte einen Atmega8 über USB mit Settings Werten füttern, die dann 
im EEPROM agelegt werden sollen. Genauso sollen die Settings über UART 
auslesbar sein und auch ein paar Daten µC -> PC transferiert werden 
können.
Das ganze schreibe ich in C, welches ich auch noch nebenher am lernen 
bin (Soll nun aber nicht das Thema hier sein. Denn ich weiß selbst, das 
ich noch lücken in C habe).

Das mit dem UART habe ich soweit drauf, lediglich einen Ringpuffer muss 
ich noch realisieren, aber allgemein kann ich UART selbst lösen. Mir 
geht es eher um das Thema Protokoll und EEPROM nutzung im Bezug auf 
UART.
Wobei das wohl teilweise auch nur Wissenslücken sein dürften und 
eventuell ein bisschen unordnung in meinem Kopf. Also suche ich hier 
Hilfe um mein Oberstübchen zu richten :-)

So nun zu dem dicken Knoten.

EEPROM:
Ich möchte die Daten im EEPROM über eine direkte Speicheradresse 
speichern und lesen können. So bräuchte ich am Anfang ja nur mittels 
#define mir die Adressen auf sprechende Namen mappen und bin dann 
flexibel. Der Atmega8 hat laut Datenblatt 512Byte EEPROM Speicher, aber 
ich kann im Datenblatt nirgends finden, an welchen Speicherstellen die 
abgelegt sind. Das müssten dann ja irgendwelche Werte zwischen 0x0000 
und 0xXXX (X ist das was ich suche) gespeichert werden, also Word Werte.

Ich habe da nun schon viel im Forum gelesen zu dem Thema. Unter anderem 
wird da auch gesagt, man solle Structs nehmen. Wobei sich dann die frage 
wieder aufwerfen würde, wie ich bei einem Struct die Speicherstelle im 
Protokoll ansprechen kann.

Daher die Frage. Was ist da die beste Methode, wenn ich wie oben schon 
geschrieben über UART Settings ablegen und lesen möchte.
Dann kann mir sicher auch jemand mit den Speicherstellen weiter helfen.
Muss gestehen, das ich mit dem Bytes schaukeln noch meine probleme habe.

PROTOKOLL:
Dann hab ich noch ein paar fragen zu der eigentlichen Kommunikation über 
UART. UART kann ja immer nur 8Bit in einem rutsch übertragen. Somit muss 
ich mir ja ein Protokoll ausdenken, das dann regelt was für eine 
Funktion ich haben möchte.

Beispiele:
Funktion 1: Schreibe Setting in EEPROM.
Funktion 2: Lese Setting in EEPROM.
Funktion 3: Lese Variablen Wert aus RAM.
usw...

Dazu habe ich mir überlegt das Protokoll in etwas so aufzubauen: ([xxx] 
sollen immer 8 Bit Pakete sein)

[Startcondition] [Funktion] [Speicherstelle] [1..n Datenpakete] 
[Stopcondition]

So ein Datenbündel soll dann erst in ein Buffer geschrieben werden und 
bei erreichen der Stopcondition ein Flag gesetzt werden, das dem 
Hauptprogramm dann signalisiert, hier sind neue Daten zum bearbeiten. 
Das ganze RX UART will ich dann im Interrupt machen.
Soweit denke ich mal, dürften meine Gedanken auf wenig Gegenwehr stoßen. 
Ansonsten bin ich immer offen für Kritik.

So nun aber zu dem was mich bedrückt.
Was nimmt man da als Start- und Stoppcondition für Zeichen?
Jedes Zeichen kann, bzw Zeichenfolge kann ja durchaus auch in einem 
Datenpaket enthalten sein. Oder ist es besser die Startcondition gleich 
ganz weg zu lassen (Da im Interrupt verarbeitet und der sowieso erst 
nach empfang der Daten ausgelöst wird) und für die Stopcondition dann 
den Carrier \r (Wagenrücklauf) zu nehmen?

Fragen über fragen.
Deshalb bin ich froh, wenn jemand mir da jemand helfen kann, sauberes 
wissen zu erlangen. So ein richtiges Beispiel kann ich auch nicht 
finden, wo ich mir das ansehen kann, wie man das am besten macht.
Andersrum möchte ich aber auch nicht einfach irgendwas kopieren, ein 
bisschen drin rum hacken und dann hoffen und freuen, wenn es 
funktioniert hat. Das wiederspricht sich mir, denn ich möchte schon 
gerne wissen, was die kleine µC da auf meinen Platinen macht.

Danke schonmal an alle, fürs helfen.
Grüße
Stephan

von Daniel V. (danvet)


Lesenswert?

Zum Protokoll, als Idee:
http://www.ibrtses.com/embedded/shortmsgprotocol.html

Zum EEPROM:
Welchen Compiler verwendest du? Zum Lesen/Schreiben des EEPROMs gibt es 
meistens eine kleine Bibliothek oder Funktionen die das bewerkstelligen. 
Im Datenblatt sind auch Beispiele vorhanden.

von Oliver (Gast)


Lesenswert?

Stephan W. schrieb:
> Ich habe da nun schon viel im Forum gelesen zu dem Thema.

Da hast do wohl irgendwie das falsche gelesen.
Das EEPROM im Mega8 ist byteweise organisiert, beginnt bei Null, und 
wird mit speziellen Befehlen des AVR-Befehlssatzes angesprochen.

Wie das in C geht, steht hier:

http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#EEPROM

Oliver

von Daniel V. (danvet)


Lesenswert?

Oliver schrieb:
> Stephan W. schrieb:
>> Ich habe da nun schon viel im Forum gelesen zu dem Thema.
>
> Da hast do wohl irgendwie das falsche gelesen.
> Das EEPROM im Mega8 ist byteweise organisiert, beginnt bei Null, und
> wird mit speziellen Befehlen des AVR-Befehlssatzes angesprochen.
>
> Wie das in C geht, steht hier:
>
> http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#EEPROM
>
> Oliver

Nuja, das kommt eben auf den Compiler an...

von Karl H. (kbuchegg)


Lesenswert?

Stephan W. schrieb:

> Fragen über fragen.

Die wichtigste Frage hast du dir nicht gestellt.

Textuelle Übertragung oder Binäre Raw Daten

Wie schnell muss die Übertragung gehen bzw. (was damit zusammenhängt) 
wie oft muss eine Übertragung gemacht werden.

Wenn das selten passiert (und selten bedeutet in Zeitabständen größer 1 
bis 2 Sekunden), dann würde ich immer einer textuelle Übertragung den 
Vorzug geben.

Vorteil:
* Start und Stopcondition sind kein Problem, weil eben nicht mehr jeder
  Bytewert in den Daten vorkommen kann
* leicht zu beschreiben und leicht zu programmieren
* Ich bin nicht darauf angewiesen, auf der Gegenstelle ein Programm
  zu haben, welches Daten zb vom Benutzer abfrägt und die binär
  auf die Reise bringt. Ein simples Terminalprogramm reicht im
  einfachsten Fall.
* keine Probleme bei Erweiterungen, neue Kommandos sind ein Kinderspiel
* keine Probleme bei Erweiterungen, andere Datentypen sind ein
  Kinderspiel
* Im Falle eines Falles kann man mit Portsniffern leicht mitlesen
  und findet so raus, wo in den Übertragungen etwas schief geht, weil
  der Sender ein falsches Datenformat generiert.
* Sender/Empfänger Synchronisierung ist leicht durchführbar

Nachteil:
* textuell ist etwas geschwätziger als rein binäre Übertragung
* was damit einhergeht: es ist etwas langsamer
* ein kleiner Codeaufwand um die auf der Leitung laufenden
  textuellen Repräsentierungen wieder in verwertbare Binärdaten
  zu formen.

von Oliver (Gast)


Lesenswert?

Daniel V. schrieb:
> Nuja, das kommt eben auf den Compiler an...

Nun ja, es geht um einen ATMega, und das hier ist das Forum "gcc". Wie 
viele verschiedenen Compiler kommen da in Frage?

Oliver
P.S: Die EEPROM-lib steckt sowoieso nicht im Compiler, sondern in der 
clib. Auch da ist die Auswahl sehr übersichtlich...

von Daniel V. (danvet)


Lesenswert?

Oliver schrieb:
> Daniel V. schrieb:
>> Nuja, das kommt eben auf den Compiler an...
>
> Nun ja, es geht um einen ATMega, und das hier ist das Forum "gcc". Wie
> viele verschiedenen Compiler kommen da in Frage?
>
> Oliver
> P.S: Die EEPROM-lib steckt sowoieso nicht im Compiler, sondern in der
> clib. Auch da ist die Auswahl sehr übersichtlich...

Hmmm....
http://de.wikipedia.org/wiki/Atmel_AVR#Software

Ich habe bisher mit 3 verschiedenen Compilern gearbeitet. Jeder macht es 
zugegebenermaßen ähnlich, aber eben nicht gleich.

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
Noch kein Account? Hier anmelden.