mikrocontroller.net

Forum: Compiler & IDEs AVR, EEProm, I2C, Fehler in twitest?


Autor: Harald P. (haraldp)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich vermute, daß es etliche AVR-Anwender gibt, die ihren Microcontroller 
durch ein I2C-EEProm ergänzen.
Nun liegt dankenswerterweise jeder WinAVR-Version ein Beispiel für die 
Ansteuerung eines EEProms mittels I2C (twi) bei (z.B. 
...\WinAVR-20100110\doc\avr-libc\examples\twitest). Obwohl ich diese 
c-Implementierung (modifiziert) seit längerem benutze, ist mir erst 
jetzt ein Fehler aufgefallen.
Werden mehr als ein Byte drei Byte vor einer Page-Grenze geschrieben, so 
wird ein Byte zuviel ins EEProm geschrieben.
Der Fehler liegt m.E. in einer falschen Vergleichsabfrage in der 
Funktion int ee24xx_write_page(uint16_t eeaddr, int len, uint8_t *buf).
Falsch:
...
  if (eeaddr + len < (eeaddr | (PAGE_SIZE - 1)))
    endaddr = eeaddr + len;
...
Richtig:
...
  if (eeaddr + len <= (eeaddr | (PAGE_SIZE - 1)))
                   ===
    endaddr = eeaddr + len;
...

Kann jemand aus dem Forum meine Feststellung verifizieren? Das 
twitest-Beispiel wird schon seit vielen Jahren so publiziert. Vielleicht 
ist schon anderen dieses Verhalten aufgefallen - oder habe ich mich 
einfach geirrt?

Harald Peters

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schon möglich, dass da ein Bug drin ist.  Sollte sich das nicht
einfach mit paar experimentellen Daten verifizieren lassen?  Ich
habe nur gerade keinen I²C-EEPROM zu Hause "betriebsbereit".

Wenn's ein Bug ist, dann schreib' bitte einen Bugreport bei
savannah.nongnu.org.

Autor: Harald P. (haraldp)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
An Jörg:
ich bin mir sicher, daß es ein Bug ist. Allerdings ist mir unklar, wo 
ich diese Info bei savannah.nongnu.org loswerden kann.
Harald

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der Code ist ja ziemlich unübersichtlich.
Ich würde modular programmieren:

static void si2c_start( void );
static void si2c_stop( void );
static uint8_t si2c_r( uint8_t nack );
static uint8_t si2c_w( uint8_t val );

Und dann die Schreibfunktion für nen 24C512:

uint8_t eeprom_wr( uint16_t eeaddr, uint8_t *sram, uint16_t len )
{
  do{
    if( !set_addr( eeaddr ))
      return 0;                                         // 0 = failed
    do
      si2c_w( *sram++ );
    while( --len && (++eeaddr & (PAGE_SIZE-1)));        // end or next page
    si2c_stop();
  }while( len );                                        // end
  return 1;                                             // 1 = success
}

Dann ist es auch wurscht, ob man das I2C in HW oder SW macht.


Peter

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Peter Dannegger schrieb:
> Der Code ist ja ziemlich unübersichtlich.
> Ich würde modular programmieren:

Patches welcome. ;-)

Ich wollte damals in erster Linie überhaupt die TWI-Handhabung des
AVR lernen.  Das Teil hat mittlerweile fast 8 Jahre auf dem Buckel.

Autor: Harald P. (haraldp)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich bin wie Peter der Meinung, daß man dieses Teil tatsächlich noch 
einmal sauber programmieren sollte. Mit den vielen GoTos ist das 
Programm doch recht unübersichtlich. Aber wie dem auch sei, es sollte 
wenigstens korrekt sein.
Harald

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Harald P. schrieb:
> Ich bin wie Peter der Meinung, daß man dieses Teil tatsächlich noch
> einmal sauber programmieren sollte.

Bitte, gern, tu's. ;-)  Von "man sollte" entsteht kein Code.  Der
Patchtracker steht auf savannah gleich neben dem Bugtracker...

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.