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.