Hallo Experten,

die bisher abgehandelten Beiträge habe ich alle interessiert gelesen, leider brachten sie mich nicht weiter...

Ich habe Probleme mit dem Ultraschallsensor SRF10.

Hardware: Mega16, 16 MHZ, Sensor an I2C, Pullups 10k, I2C
Clock 111kHz. Adresse SRF10: 0xE0

Software: WinAVR, AVR Studio 4, twimaster.c und I2Cmaster.h von P. Fleury

Problembeschreibung:
Die Distance D wird über UART ausgegeben. Er gibt für das Lowbyte L und das highbyte H immer 244 aus. Dies tut er auch, wenn ich ein anderes Register auslese. Sogar, wenn ich Register 0 (Softwareregister) auslesen möchte. Irgend etwas ist da prinzipiell verkehrt. Der Sensor blinkt bei jeder Messung. Jenachdem, wieviel Zeit ich ihm in der loop lasse, blinkt er mal schneller, mal langsamer. Ein echtes Knacken kann ich nicht wirklich wahrnehmen.

Wegen meiner mittlerweile eingetretenen Betriebsblindheit bitte ich euch, mal einen Blick auf den verkürzten Code zu werfen. Einbnen aller Libs funktioniert, Compilieren usw. auch.

Code:
// Testprogrmm SRF10 am ATMega16
// Crystal: 16.000Mhz
// Software: winAVR, AVR Studio4,GCC


#include <avr/io.h>
#include <avr/interrupt.h>
#include <stdio.h>
#include <util/twi.h>
#include <......h> //UART, I2C libs usw

unsigned int Firmware;
char Puffer [10];
double D;
int H, L;

#define SRF10_ADR 0xE0
 


void read_Firmware(void)
{
 i2c_start_wait(SRF10_ADR+TW_WRITE);     // set device address and write mode
 i2c_write(0x00);
 i2c_stop();                        // write address = 0
 i2c_rep_start(SRF10_ADR+TW_READ);       // set device address and read mode
 Firmware = i2c_readNak();
 i2c_stop();

 //Ausgabe
 sendUART(utoa(Firmware, Puffer, 10));
 sendUART(" ; ");
}



void Messung(void)
{
//Verstärkung setzen,sende START Condition, Verstärkungsregister wählen, beschreiben mit 7
 i2c_start(SRF10_ADR + TW_WRITE);
 i2c_write(0x01);
 i2c_write(0x07);
 i2c_stop();
 
 //Reichweite setzen, sende START Condition, Reichweitenregister wählen, beschreiben für 1m
 i2c_start_wait(SRF10_ADR + TW_WRITE);
 i2c_write(0x02);
 i2c_write(0x18);
 i2c_stop(); 

 //Messung starten, sende START Condition, Befehlsregister wählen, messen in cm
 i2c_start_wait(SRF10_ADR + TW_WRITE);
 i2c_write(0x00);
 i2c_write(0x51);
 i2c_stop();

 //warten
 Delay_ms(200);

 //Daten auslesen, sende START Condition, Leseregister wählen
 i2c_start(SRF10_ADR + TW_WRITE);
 i2c_write(0x02);               

 //wechseln in Lesemodus, high byte lesen, low byte lesen, Berechnung Distance
 i2c_start_wait(SRF10_ADR+TW_READ);
 H = i2c_readAck();
 L = i2c_readNak();
 
 D = (H << 8) + L;
 
 //Ausgabe UART
 sendUART(utoa(D, Puffer, 10));
}

void main (void)
{
  ....
 Messung();
 Delay_ms(1000);
 ...
}
Ich bin für jeden Tipp unheimlich dankbar.
Danke für Eure Zeit und Mühe

Andreas