Forum: Mikrocontroller und Digitale Elektronik TWI Slave C anderer Pin (I2C)


von Christian (Gast)


Lesenswert?

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

von thkais (Gast)


Lesenswert?

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.

von Christian (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.