Archiv verlassen und diese Seite im Standarddesign anzeigen : SRF10 Sensor mit Peter Fleurys I2c Bibliothek auslesen
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
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.
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
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
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.
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.