Hallo zusammen,
ich versuche mich schon seit paar Tagen das SFR10 Modul zum laufen zu bekommen, aber mehr wie 45cm will das kleine WUnder nicht messen. Ich habe bereits danach gesucht, auch einiges dazu gefunden, jedoch blieb der Erfolg aus.
Hier mal mein Code
Code:
/************************************
* enfernung messen mit einem SFR10 *
* Ultraschallsensor über I²C am *
* Atmega 8 *
* *
* Created: 30.04.2017 19:00:41 *
* Author: Hendrik *
************************************/
/*** !!! Werte im netz gefunden !!! ***
* Verstätkung auf 5 setzen *
* Reichweite auf 140 = 6m / 93 = 4m *
* Standart ist Verstärkung 16 und REichweite 255 beim einschalten *
* !!! Werte müssen bei jedem einschalten neu gesetzt werden !!! */
#define F_CPU 16000000UL // extern Quarz 16MHz
#include <avr/io.h>
#include <util/delay.h>
#include <stdlib.h>
#include "I2C_display.h"
#include "I2CMaster.h"
#define SFR10 0xE0 // Slaveadresse des SFR10 "0xE0" (Lieferzustand)
// *** Variablen ***
int messung = 0;
int version = 0;
int messung_high = 0;
int messung_low = 0;
char str[8];
/*void SRF10_config (void)
{
i2c_start(SFR10); // I2C Salveadresse übergeben
i2c_write(1); // Register 1 auswählen (Verstärkung)
i2c_write(5); // Max Verstärkung 80
i2c_write(93); // Reichweite auf 4m
i2c_rep_start(SFR10); // I2C Slaveadresse übergeben ( Schreibzugriff )
i2c_write(0); // Register 0 auswählen
i2c_write(0x51); // Messung starten in cm
i2c_stop();
}*/
void versSFR10 (void)
{
i2c_start(SFR10); // I2C Slaveadresse übergeben ( Schreibzugriff )
i2c_write(0); // Register 0 wählen ( Befehls_Register )
i2c_start(SFR10+1); // I2C Slaveadresse übergeben ( +1 = Lesezugriff )
version = i2c_readNak(); // Register 0 lesen
i2c_stop();
}
void readSFR10 (void)
{
i2c_start(SFR10); // I2C Slaveadresse übergeben ( Schreibzugriff )
i2c_write(0); // Register 0 wählen ( Befehls_Register )
i2c_write(0x51); // Messung starten in cm
i2c_stop();
_delay_ms(100); // 65ms Wartezeit bis Messung fertig
i2c_start(SFR10); // I2C Slaveadresse übergeben
i2c_write(2); // zum auswählen von Register 2 ( Reichweiten
i2c_start(SFR10+1); // I2C Slaveadresse übergeben ( +1 = Lesezugriff )
messung_high = i2c_readAck(); // Register 2 (high) lesen
messung_low = i2c_readNak(); // Register 3 (low) lesen und stop
messung = (( messung_high << 8) + messung_low);
i2c_stop();
}
int main(void)
{
i2c_init(); // startet I2C BUS
LCD_I2C_Init(); // aktiviert I2C LCD
I2C_ClearDisplay();
// *** DisplayAnzeigen ***
I2C_SetDisplayCursor(1,0);
I2C_WriteDisplayString("SFR10 Ultraschall");
I2C_SetDisplayCursor(2,0);
I2C_WriteDisplayString("Version:");
I2C_SetDisplayCursor(3,0);
I2C_WriteDisplayString("Entfernung:");
I2C_SetDisplayCursor(3,18);
I2C_WriteDisplayString("cm");
_delay_ms(1000); // Wartezeit 1sek test
while(1)
{
readSFR10();
_delay_ms(500); // Wartezeit 500ms ca 2 Messungen / Sek
versSFR10();
I2C_SetDisplayCursor(2,8);
dtostrf(version,5,0,str);
I2C_WriteDisplayString(str);
I2C_SetDisplayCursor(3,12);
dtostrf(messung,5,0,str);
I2C_WriteDisplayString(str);
I2C_SetDisplayCursor(4,0);
dtostrf(messung_high,5,0,str);
I2C_WriteDisplayString(str);
I2C_SetDisplayCursor(4,10);
dtostrf(messung_low,5,0,str);
I2C_WriteDisplayString(str);
}
}
Messung_high und Messung_low lass ich mir nur zur Überprüfung auf LCD anzeigen. Das Proplem ist das ich beim High_bit immer nur 0 angezeigt bekomme, was mir auch der LOGIC Analyzer anzeigt.
hoffe man kann das erkennen auf dem Foto.
Was ich noch nicht probiert habe, ist Verstärkung und Reichweite einzustellen, aber sollte ja auch mit Standartwerte eigeintlich funktionieren .
Ich hoffe ihr könnt mir weiter helfen und mir auf die Sprünge helfen.
LG Hendrik
Lesezeichen