TWI Slave C anderer Pin (I2C)

Gast #151433
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
Gast
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.
Gast
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

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 21 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.