www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik I²C EEPROM am AVR


Autor: Marco Vogt (Gast)
Datum:

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

Autor: Marco Vogt (Gast)
Datum:

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

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

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

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.