PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : I²C Bus Slave Routinen



ACU
03.02.2006, 21:53
Hallo!
Da auf meinem Roboter bereits ein I²C Bus existiert (für SRF10), würde ich gerne auch darüber weitere Co-Controller anbinden.
Da meine C-Control 2 als Master fungiert, müssten die Mega Controller als Slave arbeiten. Soweit ich weiß gibt es dafür aber keine fertigen Routinen.
Wie sieht es aus, existiert so etwas schon?
Wenn nicht, könnte man so etwas ja gemeinsam entwickeln und unter Open Source stellen, da ich denke, dass viele Andere auch an soetwas Interesse haben würden.

MfG ACU

michaelb
03.02.2006, 22:16
Hi,
ich hab nen Atmega32 Slave mit TWI zum laufen gebracht!! I2C = TWI *g*
Ja da gibt es schon Routinen! Am besten Datenblatt lesen!! Da sind Beispiele für C und ASM drinne und da steht wie die Kommunikation ablaufen muss!
Gruß Michi

ACU
04.02.2006, 22:58
Ok danke dir.
Wenn es zufriedenstellend funktioniert und alles ok ist, werde ich die Routinen trotzdem mal veröffentlichen, man muß ja nicht das Rad neu erfinden.


MfG ACU

michaelb
04.02.2006, 23:14
Hi ACU,


Wenn es zufriedenstellend funktioniert und alles ok ist, werde ich die Routinen trotzdem mal veröffentlichen, man muß ja nicht das Rad neu erfinden.

was meinst du damit? Soll ich meinen Code posten? Oder läuft bei dir das ganze schon?
Gruß Michi

gamebeast
27.04.2006, 11:19
Ich würde es schön finden wenn du ihn Veröffentlichst.

Sitz schon 4 Wochen dran und bekomm das einfach nicht gebacken :(

Danke

MfG
Gamebeast

Pascal
27.04.2006, 13:39
Verwende einfach mal die Forensuche, ich hab vor einiger Zeit mal funktionierenden Code für TWI-Kommunikation zwischen zwei AVRs gepostet (Master + Slave).

1980Jan
27.04.2006, 16:01
Ich bekomm das auch nicht gebacken... auch nicht mit den Beispielen von dir, Pascal.

Benutze zwei RNControl Boards... aber das zweite schickt kein ACK zurück.

Sensoren (z.B. I2C Kompassmodul) kann ich ohne Probleme auslesen. Also an der MasterDatei oder an der Strippe usw. kann es schon mal nicht liegen.
Es ist auch egal mit welchem Board ich die Masterfunktion betreibe, die Borads sind also in Ordnung.

Wie gesagt, nur wenn ich beide verbinden möchte mit der Slave.c dann funzt es nicht mehr.

Kann mir jemand helfen?



/************************************************** ******************

I2C-Slave-Routinen

************************************************** *******************


void i2c_slave_init(void); Initialisieren des Slaves mit der Adresse 0xD0


************************************************** ******************/
#include "i2c_slave.h"



void i2c_slave_init(void)
{

TWAR = 0xD0; //Slaveadresse
TWCR = (1<<TWEN)|(1<<TWINT)|(1<<TWEA)|(1<<TWIE);
sei();
}



ISR (TWI_vect)
{
switch (TWSR)
{
case (0x60) :
{
TWCR=(1<<TWEN)|(1<<TWINT)|(1<<TWEA)|(1<<TWIE);
break;
}

case (0x80) :
{
temp = TWDR;

TWCR=(1<<TWEN)|(1<<TWINT)|(1<<TWEA)|(1<<TWIE);
break;
}

case(0xA0) :
{
TWCR=(1<<TWEN)|(1<<TWIE);
break;
}

default:
{
TWCR=(1<<TWEN)|(1<<TWIE);
}
}

}


Gruß,

Jan

Pascal
27.04.2006, 19:52
schau dir mal folgende Zeilen an, die in meinem früheren post zu finden sind, vor allem die letzten Zeilen



//diese 6 Zeilen Code sind für das Initialisieren des TWI-Moduls zuständig, also kommt das Stück
//Code am besten irgendwo in die Mainmethode vor die Endlosschleife

//hier wird die Addresse des µC festgelegt(in den oberen 7 Bit, das LSB(niederwertigstes Bit) steht dafür, ob der µC auf einen general call //reagiert
TWAR = 0xFE;
//TWI Control Register, hier wird der TWI aktiviert, der Interrupt aktiviert und solche Sachen
TWCR = 0b01000101;
//TWI Bitrate Register, für die Frequenz des TWI wichtig
TWBR = 0xC;
//TWI Status Register, die 2 niederwertigsten sind für den Prescaler zur Taktberechnung, aus den
//anderen kann man auslesen, was genau passiert, wenn ein Interrupt ausgelöst wird, es gibt nämlich
//für den TWI nur einen
TWSR &= 0b11111100;
//hier werden Interrupts global aktiviert
sei();
//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
TWCR |= 0b10000000;
[/quote]