ich hatte auch vor, den Code noch reinzustellen, in meinem vorherigen Post hat sich das vielleicht nicht so angehört, war aber so gemeint...
beim Mastercode hat sich nichts wichtiges verändert(ich hab nur ein wenig debugging-Code hinzugefügt), der untenstehende Code müsste also funktionieren
hier der Slavecode(mit Kommentaren, ich hab das mal vor einiger Zeit für jemanden geschrieben und glaube, dass es ganz gut ist, wenn die dabeistehen)
Code:
//diese 6 Zeilen Code sind für das Initialisieren des TWI-Moduls zuständig, also kommt das Stück
//Code am besten irgendwo in die Mainmethode vor die Endlosschleife
//hier wird die Addresse des µC festgelegt(in den oberen 7 Bit, das LSB(niederwertigstes Bit) steht dafür, ob der µC auf einen general call //reagiert
TWAR = 0xFE;
//TWI Control Register, hier wird der TWI aktiviert, der Interrupt aktiviert und solche Sachen
TWCR = 0b01000101;
//TWI Bitrate Register, für die Frequenz des TWI wichtig
TWBR = 0xC;
//TWI Status Register, die 2 niederwertigsten sind für den Prescaler zur Taktberechnung, aus den
//anderen kann man auslesen, was genau passiert, wenn ein Interrupt ausgelöst wird, es gibt nämlich
//für den TWI nur einen
TWSR &= 0b11111100;
//hier werden Interrupts global aktiviert
sei();
//hier wird das TWI-Modul aktiv geschalten, ab hier man den µC per TWI ansteuern, den Befehl aber
//auf jeden Fall hinter das "sei();", da es sonst nicht geht
TWCR |= 0b10000000;
//Interruptroutine des TWI
SIGNAL (SIG_2WIRE_SERIAL){
//hier wird das TWSR darauf geprüft, ob 0x80 darin steht, dieser Wert bedeutet, dass Daten
//empfangen wurden, 0x60 würde zB bedeuten, dass er addressiert wurde und dies bestätigt hat
if((TWSR & 0b11111000) == 0x80){
//hier Code einfügen, der bearbeitet werden soll, die empfangenen Daten kann man aus
//TWDR auslesen
}
//wenn der Interrupt ausgelöst wird, wird der TWI des µC blockiert, damit man die Daten
//verarbeiten kann
//um ihn wieder zu aktivieren, muss man eben folgenden Befehl ausführen
TWCR |= 0b10000000;
}
Lesezeichen