I²C EEPROM am AVR

Gast #24403
Schon seit ein paar Tagen suche ich verzweifelt nach einem Programm für 
den AVR (oder nur ein paar Routinen) um ein serielles EEPROM 
anzusteuern. Ich habe je einen 24C02,04,08.
Ich hab gelesen, dass man SCL und SDA per Pull-Up Widerstand auf 5V 
zieht und am AVR zwischen Output(low) und Input(hochohmig) umschalten 
muss, um Daten zu übertragen, damit nicht z.B. das EEPROM die SDA 
Leitung nach high zieht und der AVR gleichzeitig auf low... aber wenn 
ich doch nur ein einziges EEPROM anschließe, sollte es doch auch ein 
Widerstand zwischen EEPROM und AVR tun, oder? Dann wäre ja die 
Ansteuerung einfacher...

Wie damals auch bei meinem T6393C Display bin ich auf einen C Code 
gestoßen, den ich nun versuche in Asm zu konvertieren. Das ist aber 
gerade einfach, vor allem weil ich mehrere Wochen Pause gemacht habe und 
mich erst mal wieder ein bisschen reinarbeiten muss :).
Bisher hab ich nur Start und Stop umgebastelt (PortD1=SDA, PortD2=SLC:

i2c_start:
  sbi PORTD, 1
  sbi PORTD, 2
   rjmp pause
        cbi PORTD, 1
   rjmp pause
        cbi PORTD, 2
   rjmp pause


i2c_stop:
  cbi PORTD, 1
  sbi PORTD, 2
   rjmp pause
        sbi PORTD, 1
   rjmp pause
        cbi PORTD, 2
   rjmp pause

Ist das schon mal so korrekt? Und vor allem ist mein Ansatz mit der 
Beschaltung ok?
Gast #24404
Ich habe es jetzt doch mal so gemacht, wie es sein sollte:

i2c_start:
  cbi DDRD,SDA
  cbi DDRD,SCL
   rcall pause
        sbi DDRD,SDA
   rcall pause
        sbi DDRD,SCL
   rcall pause


i2c_stop:
  sbi DDRD,SDA
  cbi DDRD,SCL
   rcall pause
        cbi DDRD,SDA
   rcall pause
        sbi DDRD,SCL
   rcall pause
Gast #24405
Hi,

auf der Atmel Homepage unter den Application Notes gibt es eine Note 
"AVR 300: Software TWI Master Interface".
TWI (Two Wire Interface) entspricht dem I²C. Laut der Doku vom avr-gcc 
liegt der Grund der unterschiedlichen Namen an den Namensrechten von I²C 
(Phillips)
Den asm-Code hab ich dir attached.

Noch was zu den Pullups:
 - Es geht auch ohne die externen Pullups. Dazu musst wie im deinem 
ersten Beitrag den Port direkt setzen/löschen. Ist vielleicht nicht die 
feine I²C Art aber es geht. Während das EEProm Daten sendet muss der 
interne Pullup des AVRs (SDA reicht) aber unbedingt eingeschaltet sein, 
da das EEProm selbst keine high schickt (open-drain).
 - Möchlich ist auch immer die internen Pullups des AVRs zu benutzen. Da 
ist aber etwas aufwändiger, weil immer DDR und PORT wechseln musst. 
(sorry, Nachfolgendes Bsp. ist in C)
   #define SDA_0 cbi(PORTD,1); sbi(DDRD,1);  // Ausgabemode und Port 0 
--> Bus ist low
   #define SDA_1 sbi(PORTD,1); cbi(DDRD,1);  // Pullup active, 
Eingabemod --> Bus ist high


Gruss Martin.
Angehängte Dateien:

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 23 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.