Hi Pascal,
wäre gut wenn du einen Quelltext mal posten würdest!
Die Adresse wird doch im TWAR gesetzt, oder?
Gruß Michi
Druckbare Version
Hi Pascal,
wäre gut wenn du einen Quelltext mal posten würdest!
Die Adresse wird doch im TWAR gesetzt, oder?
Gruß Michi
ja, die Addresse wird in TWAR gesetzt
hier eine init-Methode:
dann eine zum starten:Code:void TWI_init(uchar ownaddr)
{
TWAR = ownaddr;
TWCR = 0x45;
TWSR &= 0xFC;
TWBR = 0xA;
}
zum senden:Code:uchar TWI_start(uchar ndevaddr)
{
uchar errcounter;
errcounter = 0;
TWCR = (1<<TWINT) | (1<<TWSTA) | (1<<TWEN);
while(!(TWCR & (1<<TWINT))); {
if(errcounter==10) {
errcounter = 0;
return 1;
}
errcounter++;
}
TWDR = ndevaddr;
TWCR = (1<<TWINT) | (1<<TWEN);
while(!(TWCR & (1<<TWINT)));
for(unsigned char i = 0; i < 20; i++)
asm("nop");
if( !((TWSR & 0xf8) == 0x18 ) ) {
return 1;
}
return 0;
}
und schließlich zum stoppen:Code:void TWI_sendbyte(uchar nbyte)
{
TWDR = nbyte;
TWCR = (1<<TWINT) | (1<<TWEN);
while(!(TWCR & (1<<TWINT)));
}
ob meine ganzen nops wirklich nötig sind, hab ich noch nicht ausprobiert, schaden wirds aber nichtCode:void TWI_stop(void)
{
TWCR = (1<<TWINT) | (1<<TWSTO) | (1<<TWEN);
for(unsigned char i = 0; i < 40; i++)
asm("nop");
TWCR |= 0x45;
for(unsigned char i = 0; i < 40; i++)
asm("nop");
}
Hi Pascal,
danke für die Codes!!
Wie sieht dann so ein Slave aus?
Gruß Michi
meinst du, wie der Code für einen Slave aussehen kann?
das kannst du alles in die ISR(Interrupt Service Routine) vom TWI reinschreiben, also besser wärs natürlich, wenn du in der ISR nur ein bestimmtes Bit setzt, worauf hin dann in der Hauptschleife die entsprechende Funktion aufgerufen wird
in der ISR vom TWI kannst du mithilfe des TWSR abfragen, was grad passiert is, also zB, ob Daten empfangen wurden
mir fällt grad auf, was ich vergessen hab...du musst am Anfang im Programm des Slaves noch Interrupts global aktivieren und "TWCR |= 0x80;" ausführen, sonst wirds nicht gehn
Hi Pascal,
ok! Danke! Welche Bits im TWCR entscheiden ob ein Atmega Master oder Slave wird?
Gruß Michi
so direkt ein Master- oder Slave-Bit gibts net
zum Master wird ein µC, wenn er START macht und der Bus frei ist, ansonsten muss er es nochmal versuchen, den Bus gibt er mi STOP wieder frei
ein Slave ist ja im Prinzip ein µC, der auf Signale aufm TWI-Bus reagiert und dafür gibts das Bit TWEN und damit der Interrupt ausgelöst wird noch das TWIE, damit er Acknowledges sendet das TWEA und zu guter Letzt noch das TWINT, wenn das nicht gesetzt ist, reagiert er nicht auf den TWI-Bus
ich hoffe mal, ich hab jetzt nichts durcheinander gebracht... :-)