Hallo, ich habe nach etwas Suche eine nette Implementation eines TWI Slaves in C gefunden. Scheint bis jetzt nach ein paar Tests auch zu funktionieren. Meine Frage ist nun, ich habe auch schon die Software Lösung von Peter gesehen, die ja recht schick ist, aber eben leider nur ein Master.. Kann ich irgendwo einfach die Pins ändern, um meinem AtMega8535 beizubringen, nicht Pin0 und 1 von PortC zu nutzen, sondern z.B. Pin4 und 5 von PortD Oder braucht es dazu jede Menge Code, ähnlich wie die Software C Lösung von Peter, dann lass ich es lieber.. (Hätte nur aus schaltungstechnischen Gründen lieber den C Port frei gehalten..) Bzw kennt jemand eine Software C Slave I2C bzw TWI Lösung.. Danke PS: Ich poste mal hier, weil ich einige Zeit gebraucht hab, folgende einfache Codezeilen zu finden, und wenn wieder jemand mal nach TWI, i2C oder Slave sucht, dann kann er sicher etwas hiermit anfangen: #include <avr/io.h> #include <avr/signal.h> #include <avr/interrupt.h> #include <stdlib.h> #define ms 10 #define SYSCLK 4190000 int main(void) { // INIT TWI TWAR = 0xFE; // Adress set, general call reaction set TWCR = 0b01000101; //TWI Control Register, enable, interrupt TWBR = 0xC; //TWI Bitrate Register, für die Frequenz des TWI wichtig TWSR &= 0b11111100; //TWI Status Register, sei(); //hier werden Interrupts global aktiviert DDRD = 0xFF; PORTD = 0x00; DDRC = 0xFC; TWCR |= 0b10000000; //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 for (;;) { } } //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 PORTC |= (1<<DDB3); if((TWSR & 0b11111000) == 0x60){ PORTC |= (1<<DDB4); } if((TWSR & 0b11111000) == 0x80){ PORTC |= (1<<DDB5); PORTD = 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; } QUELLE::: http://www.roboternetz.de/phpBB2/viewtopic.php?t=4168&postdays=0&postorder=asc&start=0
Das Code-Beispiel benutzt den Hardware-TWI, und der ist Pin-mäßig festgelegt. Wenn Du die TWI-Funktionalität auf einen anderen Port legen möchtest, mußt Du es komplett zu Fuß machen - Multi Master ist da sehr kompliziert. Also: Jede Menge Code.
Na dann lieber net.. Danke dennoch, dann werd ich halt ein paar Kabel mehr löten müssen, schade.. Dabei lag der A und der C Port so praktisch auf einer Seite.. Christian
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.