Hallo, ich bin gerade dabei mich mal mit dem Hardware I2C im ATMega8 zu beschäftigen (die Software-I2C habe ich schon am laufen). Als einstieg habe ich das Beispiel im Datenblatt herangezogen. Ich will einen LM75 auslesen. Jetzt bin ich schon einen Tag dran dies hinzubekommen. Doch ich konnte noch nichts auslesen. Laut dem TWSR Register ist alles richtig angekommen. Doch ich bekomme aus dem TWDR Register keine Daten aus dem LM75. Es steht dort immer noch die Addresse (145) drin. Ich weiß einfach nicht mehr weiter. Durch Googeln habe ich auch nichts rausbekommen, da ich nur was für C gefunden habe, oder alles per Software I2C gemacht wird. Ich bin aber nur am Assembler programmieren (sollte vielleicht doch mal auf C umsteigen). Im Anhang ist mein Quellcode. Was mache ich da falsch? Oder hat jemand einen funktionierenden Code in Assmebler für mich. Danke und Gruß PatrickHH
Hallo "(die Software-I2C habe ich schon am laufen)" mit dem LM 75 ? kann ich das programm mal sehen ? ich bekomme bei meinem programm (arv 1200) nur immer das 1. byte im 2. byte steht immer nur 0 (bit 7 - 0,5 Grad) also habe ich nur ganze grad z.b. 21 grad ber nie 21,5 das nevt mich..............
Hallo Patrick, ich versuche mit dem Hardware I²C Interface eine PCF8583 RTC anzusteuern. Per Software I²C funktioniert es, aber über TWI bekomme ich kein ACK nach dem senden der Baustein-Adresse. Ich bin für jedes funktionierende TWI Beispiel dankbar ! (Slave und Programmiersprache sind egal) Hier mein Code: TWBR=18;// 16MHz / 16 + 2(TWBR) * 4 TWSR=0; TWCR=_BV(TWINT) | _BV(TWSTA) | _BV(TWEN);//Start-Konditionen while(!(TWCR & _BV(TWINT)));//warten auf Start - ende if((TWSR & 0xF8) != 0x08)goto I2C_Error; TWDR=0xA2;// Slave-Adresse TWCR=_BV(TWINT) | _BV(TWEN);// Adresse senden while(!(TWCR & _BV(TWINT)));//warten auf ende if((TWSR & 0xF8) != 0x18)goto I2C_Error; TWDR=0xC0;//Ram - Adresse while(!(TWCR & _BV(TWINT)));//warten auf ende if((TWSR & 0xF8) != 0x28)goto I2C_Error; TWDR=0x55;// Daten while(!(TWCR & _BV(TWINT)));//warten auf ende if((TWSR & 0xF8) != 0x28)goto I2C_Error; TWCR=_BV(TWINT) | _BV(TWEN) | _BV(TWSTO);// Stop Gruß Fiffi
Hi, hier der Quellcode von einem Test, der bei mir vor einiger Zeit funktionierte...
Hallo, danke für die Beispiele ! @Hagen: Mit welcher WinAVR Version hast du die i2c.S kompiliert ? Ich habe es mit WinAVR 20040720 versucht, und bekomme folgende Fehler: Assembling: i2c.S avr-gcc -c -mmcu=atmega128 -I. -x assembler-with-cpp -Wa,-adhlns=i2c.lst,-gstabs i2c.S -o i2c.o i2c.S: Assembler messages: i2c.S:42: Error: number must be less than 64 i2c.S:44: Error: number must be less than 64 i2c.S:48: Error: number must be less than 64 i2c.S:54: Error: number must be less than 64 i2c.S:59: Error: number must be less than 64 i2c.S:63: Error: number must be less than 64 i2c.S:70: Error: number must be less than 64 i2c.S:72: Error: number must be less than 64 make.exe: *** [i2c.o] Error 1 Als makefile verwende ich das Beispiel makefile aus dem sample Ordner von WinAVR. (nur auf "DEBUG = dwarf-2" umgestellt.) Gruß Fiffi
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.