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?
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.