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


von Marco Vogt (Gast)


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?

von Marco Vogt (Gast)


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

von Martin (Gast)


Angehängte Dateien:

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.

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.