www.mikrocontroller.net

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


Autor: Christian (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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=4...

Autor: thkais (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Christian (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.