DanielSun
10.12.2006, 14: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
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