PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : I²C-Erweiterung auf dem Asuro?



DanielSun
10.12.2006, 13:04
Servus,

für eine Projektarbeit wurde haben wir den Asuro etwas modifiziert. Die beiden Ports SDA und SCL wurden freigeräumt (Batterietest und Kollisionstaster entfallen dadurch). Zwei Ultraschall-Sensoren wurden dann montiert (SRF08). Diese können über I²C-Bus ausgelesen werden, möchte gern die Hardwareschnittstelle benutzen...

:-k Nur wie mache ich das, im Datenblatt der Sensoren steht, die können wie 24xx EEPROM's ausgelesen werden. Das hilft mir aber auch nicht weiter.

Die grundsätzliche Reihenfolge beim Datenverkehr hab ich schon kapiert, glaub ich...

TWEA, TWINT setzen

1. Master sendet START
2. Master sendet 7-bit Slaveadresse+0
3. Slave sendet ACK
4. Master sendet Command Byte
5. Master sendet ACK
6. Master sendet Daten Byte(s)
7. Slave sendet ACK
8. Master sendet STOP

Kann ich wenn ich die Schnittstelle initialisiert habe, einfach sowas schreiben wie im Datenblatt...



TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN) //Start Condition

while (!(TWCR & (1<<TWINT))) //warten bis Start condition raus
;

if ((TWSR & 0xF8) != START) //Kontrolle ob TWI-Status auf Start
ERROR();

TWDR = SLA_W; //Slave Adresse in Datenregister schreiben
TWCR = (1<<TWINT) | (1<<TWEN); //Int-Bit löschen

while (!(TWCR & (1<<TWINT))) //warten bis Adresse raus
;

if ((TWSR & 0xF8) != //Kontrolle ob TWI-Status auf Adressierung
MT_SLA_ACK)
ERROR();
TWDR = COMMAND; //zu sendende Befehle holen
TWCR = (1<<TWINT) | (1<<TWEN); //Int-Bit löschen

while (!(TWCR & (1<<TWINT))) //warten bis Befehle raus
;

if ((TWSR & 0xF8) != //Kontrolle ob TWI-Status auf Datenübertragung
MT_DATA_ACK)
ERROR();

TWDR = DATA; //zu sendende Data holen
TWCR = (1<<TWINT) | (1<<TWEN); //Int-Bit löschen

while (!(TWCR & (1<<TWINT))) //warten bis Daten raus
;

if ((TWSR & 0xF8) != //Kontrolle ob TWI-Status auf Datenübertragung
MT_DATA_ACK)
ERROR();

TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWSTO); //Stop Condition


Würde es so in etwa funktionieren?? Habe noch nicht so riesig viel Erfahrung in µC-Programmierung.
Wer hat denn schon mal sowas gemacht, ich bin doch nicht der Erste??

Grüße,

DanielSun

uwegw
10.12.2006, 13:26
Nein, der erste bist du nicht. Es gibt schon nen Haufen fertige avr-gcc-Bibliotheken dafür.
Die wohl bekannteste I2C-lib ist die von Peter Fleury:
www.jump.to/fleury
Damit kann man sowohl Hardware- als auch Software-I2C implementieren.

PS: Spannungsüberwachung und Tasten könntest du über eine I2C-ADC wieder anschließen.

DanielSun
10.12.2006, 14:19
Ok Danke erst mal genau so etwas habe ich gesucht, werde die lib mal durchstöbern. Da kommen dann bestimmt noch Fragen.

Ja das mit den Tastern und der Spannungsüberwachung hatte ich mir auch so ähnlich gedacht. Über I²C sind ja auch digitale und analoge Porterweiterungen möglich. Aber die US-Sensoren sind erst mal primär unsere Aufgabe. Das Projekt soll ja schließlich bis Mitte Januar fertig sein. Die Kollisionstaster können ja dann als zweite Ebene arbeiten, falls die US-Sensoren was nicht erkennen.

So dann,

DanielSun