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;
}
}
Lesezeichen