#include <avr/io.h> #define Takt 3686400UL #define AUSAD 0x70 #define EINAD 0x71 #define FAKTOR 44 #define TEILER 1 void init(unsigned char faktor, unsigned char teiler) { TWBR = faktor; TWSR = teiler; } void send(unsigned char adres, unsigned char daten) { TWCR =(1<<TWINT)|(1<<TWSTA)|(1<<TWEN); loop_until_bit_is_set(TWCR, TWINT); TWDR =adres; TWCR =(1<<TWINT)|(1<<TWEN); loop_until_bit_is_set(TWCR, TWINT); TWDR =daten; TWCR =(1<<TWINT)|(1<<TWEN); loop_until_bit_is_set(TWCR, TWINT); TWCR =(1<<TWINT)|(1<<TWSTO)|(1<<TWEN); } unsigned char empf(unsigned char adres) { unsigned char daten; TWCR =(1<<TWINT)|(1<<TWSTA)|(1<<TWEN); loop_until_bit_is_set(TWCR, TWINT); TWDR =adres; TWCR =(1<<TWINT)|(1<<TWEN); loop_until_bit_is_set(TWCR, TWINT); TWCR =(1<<TWINT)|(1<<TWEN); loop_until_bit_is_set(TWCR, TWINT); daten =TWDR; TWCR =(1<<TWINT)|(1<<TWEA)|(1<<TWEN); loop_until_bit_is_set(TWCR, TWINT); TWCR =(1<<TWINT)|(1<<TWSTO)|(1<<TWEN); return daten; } void main (void) { unsigned char awert, ewert; DDRB = 0xff; init(FAKTOR, TEILER); while(1); { awert = PIND; send (AUSAD, ~awert); ewert = empf(EINAD); PORTB = ewert; } } hi ich hab den quell text einfach mal aus nem buch abgetippt...und keine funktion, mim oskar mal geschaut da tut sich weder auf daten noch auf der takt leitung was, pull up's mit 2mal 10k sind drinne, hat wer noch ne idee? fuse bits für den I²C muss man nicht setzten oder?
Wenn man davon absieht, dass der Code in der völlig optimistischen Annahme gezimmert ist, dass auf dem Bus nie was schief gehen kann (keinerlei Fehlerbehandlung), sollte er wohl funktionieren. Du arbeitest mit einer sagenhaft hohen Taktrate von 10 kHz. Üblich sind 100 kHz oder 400 kHz für high-speed I²C.
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.