-
-
Erfahrener Benutzer
Fleißiges Mitglied
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.
Berechtigungen
- Neue Themen erstellen: Nein
- Themen beantworten: Nein
- Anhänge hochladen: Nein
- Beiträge bearbeiten: Nein
-
Foren-Regeln
Lesezeichen