PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : I²C bus testen.



dark_flash01
26.02.2006, 10:30
Hallo und Guten Morgen,
ich habe vor heute den I²C-bus auf meinem Mega32 µController zu implementieren. Habe aber im Augenblick das Problem, dass ich keinen hier habe. Das Programm soll aber morgen dann laufen... Findet sich vllt jemand, der/die es heute für mich testen könnte und mir anschliessend sagt ob ich das so lassen kann? Wäre wirklich unheimlich freundlich. Programm kommt in den nächsten Stunden. Für Tips zur implementierung von I²C bin ich auch immer dankbar... Ich will eigentlich nur einen Ultraschallentfernungsmesser SRF10 damit steuern und auslesen. Hat das schon einmal jemand gemacht und ist bereit mir sein Programm zu zeigen?

Grüße dark_flash01

dark_flash01
26.02.2006, 12:42
Soo ich denk ich hab das Programm fertig^^.
Könnte das funktionieren oder hab ich was grundlegendes verpeilt?!?


#include <avr/twi.h>
#include <avr/delay.h>
#define MESSUNG 0x51
#define SRF10_1 0xE0
#define AUSGABE 0xFF

void i2c_start(void)
{
TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN); //Sende START Bedingung
while(!(TWCR&(1<<TWINT))) //Warte bis Übertragung beendet ist
;
}

void i2c_stop(void)
{
TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWSTO); //STOP signal (kann jederzeit benutzt werden)
}

int i2c_read(int adresse,int anweisung)
{
i2c_start();
TWDR = adresse; //Byte in Daten-Register schreiben + LESEN
TWCR = (1<<TWINT)|(1<<TWEN); //Starte Übertragung
while(!(TWCR&(1<<TWINT))) //Warte bis Übertragung beendet ist
;

TWDR = anweisung; //Byte in Daten-Register schreiben
TWCR = (1<<TWINT)|(1<<TWEN); //Starte Übertragung
while(!(TWCR&(1<<TWINT))) //Warte bis Übertragung beendet ist
;

TWCR = (1<<TWINT)|(1<<TWEN); //Byte von Slave empfangen
while(!(TWCR&(1<<TWINT))) //Warte bis Übertragung beendet ist
;
int byte = TWDR;
i2c_stop();
return byte;
}

void i2c_send(int adresse,int anweisung)
{
i2c_start();
TWDR = adresse + 1; //Byte in Daten-Register schreiben + SCHREIBEN
TWCR = (1<<TWINT)|(1<<TWEN); //Starte Übertragung
while(!(TWCR&(1<<TWINT))) //Warte bis Übertragung beendet ist
;

TWDR = anweisung; //Byte in Daten-Register schreiben
TWCR = (1<<TWINT)|(1<<TWEN); //Starte Übertragung
while(!(TWCR&(1<<TWINT))) //Warte bis Übertragung beendet ist
;
i2c_stop();
}


void main(void)
{
int value;
initLcdUart();
rprintf("init done!");
while(1)
{
i2c_send(SRF10_1,MESSUNG);
delay_ms(100);
value = i2c_read(SRF10_1;AUSGABE);
rprintf("value: %i", value);
delay_ms(500);
}
}