PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : SRF10 Sensor mit Peter Fleurys I2c Bibliothek auslesen



Analog
16.05.2008, 09:43
Hallo

Ich habe einen SRF10 an einen ATMEGA32 angeschlossen und möchte den Sensor nun mit Hilfe von Peter Fleurys i2c Bibliothek auslesen.
Mir ist aber nicht ganz klar wie man das macht. Bei normalen Datenblättern stehen nämlich Diagramme drinn auf denen zu sehen ist, wie man den entsprechenden Baustein über i2c zu handhaben hat. Wie kann ich auf die Internen register des SRF10 zugreifen ?

hat vielleicht jemand einen Beispiel code in c ?

Danke für eure Hilfe.

Gruß Analog

uffi
16.05.2008, 10:33
Hier ein Beispielcode für den SRF02. SRF10 ist fast gleich. Das erste Register für die I2C Operation wird z.B. durch ein i2c_write(0x02) {=Auswahl Register 0x02} ausgewählt. Danach kann auf dieses und alle folgenden Register zugegriffen werden.


#include <inttypes.h>
#include <avr/eeprom.h>
#include <avr/interrupt.h>
#include <avr/sleep.h>
#include <math.h>

#include <avr/io.h>
#include "i2cmaster.h"
#define SRF 0xE0
#define F_CPU 8000000UL
#include <util/delay.h>
#define BAUD 9600L
#include <avr/iom8515.h>
#include <avr/sfr_defs.h>
#define SDA 0 // SDA Port E, Pin 0
#define SCL 1 // SCL Port E, Pin 1
#define SDA_PORT PORTE // SDA Port E
#define SCL_PORT PORTE // SCL Port E

unsigned int distance EEMEM; // reserve storage space in EEPROM

// USART_INIT--
void initusart(void) // Hauptfunktion
{
unsigned char x; //Hilfsvariable
// #idef UBRRL //USART-Schnittstelle
UBRRL = (F_CPU / (16L*BAUD)) -1; //Baudrate mit TAKT und Baud
UCSRB |= (1<<TXEN) | (1<<RXEN); //Sender und Empfänger ein
UCSRC |= (1<< URSEL) | (1<< UCSZ1) | (1<<UCSZ0); //ansync 8bit
x = UDR;
}

void sendeusart(int x)
{
while (!(UCSRA & (1<<UDRE))); // warten bis Senden moeglich

UDR = x;
}

int main(void)
{
i2c_init();
initusart();
sendeusart(distance);
unsigned char Lbyte,Hbyte;

DDRE = 0xff;
PORTE = 0xff;

while(1)
{
i2c_init(); muss ein sonst blinkt der sensor nicht

i2c_start(SRF);
i2c_write(0x00);
i2c_write(0x51);
i2c_stop();

_delay_ms(75);

i2c_start(SRF);
i2c_write(0x02);
i2c_stop();

i2c_start(0xE1);

Hbyte=i2c_readAck();
Lbyte=i2c_readNak();
i2c_stop();
distance=(Hbyte*256)+Lbyte;

eeprom_write_word(&distance,distance); //save to EEPROM

sendeusart(distance);
}
}

Gruß, uffi.

Analog
16.05.2008, 10:40
danke uffie

ist echt nett das es hier Leute gibt die einem mit Rat und Tat zur seite stehen.
Ich werde das ganze heute abend mal ausprobieren.

Danke schön

Gruß Analog

andy999
22.05.2008, 20:03
hat es funktioniert bei dir funktioniert?
Ich habe das Problem, dass mein Ultraschall zwar angesprochen wird, aber
er blinkt viel, viel zu schnell, wenn ich mit beiden Fingern den Ultraschall abdecke blinkt er mit der richtigen Geschwindigkeit beim Lesen...WEiß vielleicht jemand woran das liegen könnte. Anbei ist mein Quellcode



Gruß Andy

uffi
12.06.2008, 10:46
In diesem Program hast Du einen Fehler beim Lesen drin:

i2c_start_wait(0xE4);
//_delay_ms(65);
Hbyte=i2c_readAck();
Lbyte=i2c_readNak();
i2c_stop();

Richtig muss es heißen:
i2c_start_wait(0xE4 + 0x01);
//_delay_ms(65);
Hbyte=i2c_readAck();
Lbyte=i2c_readNak();
i2c_stop();

Wahrscheinlich ist auch die Addresse mit 0xE4 falsch, da der Sensor default-mäßig auf 0xE0 eingestellt ist.

Gruß, uffi.