So mittlerweile hat sich das mit dem Slave erübrigt.
Jetzt stehe ich vor einem neuen Problem. Nachdem ich das Start-Signal und danach die Adresse gesendet habe, hängt er an der Überprüfung der Übertragung nach dem Daten-Byte, sprich an dem
while (!(TWCR & (1<<TWINT)));
Weiß jemand woran das liegen kann?
Hier noch der Slave-Code
Code:/*Zeitanzeigetafel - hierrein soll nur der Code der den per TWI übergebenen TWI-Minuten und Sekundenwert angezeigt werden */ #include <avr/io.h> #include <avr/interrupt.h> #include <avr/signal.h> volatile uint8_t sekunden; //Interruptroutine des TWI SIGNAL (SIG_2WIRE_SERIAL){ PORTD = (1<<PD7); //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 sekunden = TWDR; } //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; } int main(void){ DDRD = 0xFF; //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 = 0x02; //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; PORTD = (1<<PD6); for (;;){ PORTD |= sekunden; } }





Zitieren
Lesezeichen