Forum: Mikrocontroller und Digitale Elektronik AT24C ReadByte Aufruf


von Johannes (Gast)


Lesenswert?

Hi,

hab mal eine kleine C-Frage an euch.  Ich spiele gerade mit einem Eeprom 
von Atmel At24C04 herum und hab mir eine typedef struct angelegt, die im 
Eeprom abgespeichert wird.

Jetzt möchte ich gern anhand dieser struct gezielt dessen Werte auslesen 
können.
1
//mein typedef struct fürs eeprom 
2
typedef struct {
3
  unsigned char   Update;
4
  unsigned char   VersionNbr[4];
5
  unsigned char    Reserved[3]; 
6
  unsigned int    Size; 
7
8
} AT24C_FirmWare;
9
10
char AT24C_ReadByte (unsigned int Address, unsigned int size)
11
{
12
/*
13
   Address: Startaddresse bei der das Auslesen des Eeproms startn 
14
            soll      
15
   size: wieviele Bytes ausgehend von der Address ausgelesen werden sollen
16
*/
17
}
18
19
//z.B. versionsnbr auslesen 
20
BOOL calOk = AT24C_ReadByte (AT24C_FirmWare.VersionNbr[0], sizeof(AT24C_FirmWare.VersionNbr));

Im obigen Aufruf von AT24C_ReadByte möchte ich gern die VersionsNbr 
auslesen. Ich weiß so wie ich es geschrieben habe geht es noch nicht, 
aber es soll nur mal das Ziel zeigen, wo ich gerne hin möchte.

Wie kann man das so bzw. so ähnlich realisieren, dass (unsigned int 
Address) den richtigen Wert erhält, den es benötigt? Oder gibt es eine 
bessere Möglichkeit (lauter Defines mit den entsprechdnen sizeof())? Ich 
möchte aus dem Code heraus sofort sehen können, welchen Wert ich gerade 
auslese.

Gruß
Johannes

von Johannes (Gast)


Lesenswert?

ok habs jetzt gelöst...

allerdings hab ich noch eine kleine Frage an euch. Am Anfang meiner 
Write/Read Methode von I2C überprüfe ich ob das Busy-Bit gesetzt ist und 
somit der I2C-Bus nicht verwendet werden kann.

Sollte dieses einmal aus irgendeinem Grund gesetzt sein, wie sollte sich 
dann mein Programm verhalten? Kann man den I2C Bus in diesem Fall 
resetten, damit dieser nicht mehr busy ist???

von Stephan W. (sir_wedeck)


Lesenswert?

Hi
>ok habs jetzt gelöst...
wie hast du es nun gemacht?

es gibt mehrere Möglichkeiten dafür:

- alles in eine define Tabelle packen
- define Tabelle nach Datentype aufteilen
- eigene Section (siehe AVR EEPROM Macro)

Die 1. Methode habe ich schon nach 1 Tag wieder verworfen, hab mich 
immer wieder verzählt ;-)

Die 2. benutze ich noch öfters. (wenn der Compiler nicht anderes zur 
Verfügung stellt)

Die 3. ist die einfachste, denn hier Zählt der "Compiler" für einen und 
man kann sich getrost um andere Sachen kümmern.
( geht aber halt nicht mit allen Compilern, und man unterliegt den 
Launen (Versionen) des "Compilers" -> Daten können verrutschen 1x 
passiert!)

Kannst du mal deine Lese / Schreibe Funktionen zeigen, vielleicht kann 
man noch was verbessern.

>Kann man den I2C Bus in diesem Fall resetten, damit dieser nicht mehr
>busy ist???
Ja, sollte man auch tun. sonst gehts nicht weiter! ;-)
Das gilt auch für Daten die nicht gelesen / geschrieben werden konnten!

Stephan

von Johannes (Gast)


Lesenswert?

Stephan W. schrieb:
> Ja, sollte man auch tun. sonst gehts nicht weiter! ;-)
> Das gilt auch für Daten die nicht gelesen / geschrieben werden konnten!

Sobald der Bus aus irgendeinem Grund hängt muss man dann BitBangigang 
anwenden? Wie muss ich hierfür den SDA schalten? GPIO, Output ohne 
Pullup?

von Stephan W. (sir_wedeck)


Lesenswert?

Hi
>...muss man dann BitBangigang anwenden?
nein, warum?

Ich hatte bis jetzt nur einmal ein Problem damit.
Eine Platine hatte von 10C bis -20C Probleme mit einem FRAM.

Ich versuche 3x einen Wert zu lesen / schreiben, funktioniert dies 
nicht, gib ich eine Meldung aus. (RS232, Ereignis-Logger, LED) und lass 
die SW gegen den Watchdog laufen. Wenn das Gerät wieder gestartet wird, 
wird sowie so die HW getestet und sollte es hier ebenfalls zu Ausfall 
kommen, wird wieder die Message ausgegeben und gegen den Watchdog 
gelaufen.
Das Gerät stellt dann sozusagen den Dienst ein.

Du musst bei einem Fehler im Programm / HW, dafür sorgen das du das 
Gerät in einen sicheren Zustand fährst.

Stephan

von Johannes (Gast)


Lesenswert?

Stephan W. schrieb:
> Du musst bei einem Fehler im Programm / HW, dafür sorgen das du das
> Gerät in einen sicheren Zustand fährst.

die einzige Möglichkeit, die ich momentan sehe warum so ein Deadlock 
passieren kann, ist wenn der User während des Schreib/Lesezugriffs auf 
das Eeprom den Reset-Schalter betätigt...

Hab gelesen, dass auch durch die Neuinitialisierung des I2C Busses es 
sein kann, dass dieser nicht wieder freigegeben wird, weil sich z.B. das 
Eeprom aufgehängt hat. Und deren Lösung war immer ein Bitbanging, so 
dass man dem Eeprom mitteilt, dass ein STOPP gesendet worden ist und 
somit die Kommunikation auf dem I2C Bus eingestellt wird, so dass eine 
neue wieder gestartet werden kann.

Johannes

Stephan W. schrieb:
> Ich versuche 3x einen Wert zu lesen / schreiben, funktioniert dies
> nicht, gib ich eine Meldung aus.

Stephan W. schrieb:
> Das Gerät stellt dann sozusagen den Dienst ein.

Das möchte ich halt auf jeden Fall vermeiden. Als einzige Alternative 
zur Problembehebung gibt es ja dann nur noch das Ausschalten des 
Gerätes.

von Stephan W. (sir_wedeck)


Lesenswert?

Johannes schrieb:
> den Reset-Schalter betätigt...
gibs bei mir nicht.

Johannes schrieb:
> Das möchte ich halt auf jeden Fall vermeiden. Als einzige Alternative
> zur Problembehebung gibt es ja dann nur noch das Ausschalten des
> Gerätes.

Das geht aber nicht immer, denn wenn die Daten im Betrieb benötigt 
werden, dann darf ich darauf nicht einfach verzichten und weiter machen 
als ob nichts wäre.

Selbst wenn der Fehler-Logger nicht mehr läuft, macht das Gerät einen
Watchdog-Reset!
Erst bei einem Neustart und dem Testen der HW, kann bei bestimmten 
Geräten, nicht bei allen, der Logger deaktiviert werden! Der Kunde 
bekommt aber eine Meldung (RS232, LED) das ein Fehler vorliegt!

Ausschalten hatte damals auch nichts gebracht! Das macht der Kunde meist 
von alleine, als erstes "Stecker ziehen". Erst dann ruft er den 
Kundendienst.

Das mit dem Bitbanging kannst du gerne machen, aber dann hast du immer 
noch das Problem, wenn du es damit nicht lösen konntest. was dann???

Stephan

PS: Wenn du eine Lösung mit dem Bitbanging hast, kannst du die dann 
Posten?

von Stephan W. (sir_wedeck)


Lesenswert?

Johannes schrieb:
> ok habs jetzt gelöst...

was haste hier gemacht? würde mich noch interessieren....
Stephan

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.