icebreaker
02.08.2013, 19:35
Hallo Community! :D
Ich möchte einen HC-SR04 mit einem Atmega8 auslesen
es gibt ja ein paar programme dazu im Internet, die ich allerdings nicht zum laufen bekomme.
nun meine Frage: Warum geht das nicht so einfach wie im folgenden Code probiert?
also es lässt sich ohne Fehler Compilieren, danach leuchtet die LED allerdings nur rot.
das Programm soll die LED einschalten wenn etwas näher als 5 cm am Ultraschallsensor ist.
Trigger: PC0
Echo: PC1
LED: PC3
#define F_CPU 16000000UL
#include <avr/io.h>
#include <util/delay.h>
#define ps 1024 //prescaler
#define ss 343.2 //sound speed
volatile uint16_t value;
void timer_init(void){
TCCR0|=(1<<CS02)|(1<<CS00);//prescale for timer 1024 @16MHz
}
uint8_t HC_SR04(void)
{
//generate a trigger signal
PORTC &= ~(1<<PC0);
_delay_us(1);
PORTC |= (1<<PC0);
_delay_us(10);
PORTC &= ~(1<<PC0);
while(!(PINC & (1<<PC1)))
{
}
//wait until echo pin be high
TCNT0=0;
while(PINC & (1<<PC1))
{
}
//count until echo pin be low
return TCNT0*ps*(1/F_CPU)*ss*100;
}
void motorInit(void)
{
DDRD |= (1<<7) | (1<<6) | (1<<5);
DDRB |= (1<<0);
PORTD |= (1<<7);
PORTB |= (1<<0);
PORTD &= ~((1<<6) | (1<<5));
}
int main(void)
{
motorInit(); //muss aufgrund der gegebenen Platine ausgeführt werden
uint16_t y;
DDRC |= (1<<3) | (1<<0);
DDRC &= ~(1<<1);
PORTC &= ~(1<<1);
timer_init();
while(1)
{
y=HC_SR04();
if(y<5)
{
PORTC |= (1<<3);
}
else
{
PORTC &= ~(1<<3);
}
_delay_ms(1000);
}
}
Ich hab denk ich alles durchprobiert und da schon einige Stunden dran geschwitzt ^^
würde mich sehr freuen, wenn mir jemand helfen kann!
Lukas
Ich möchte einen HC-SR04 mit einem Atmega8 auslesen
es gibt ja ein paar programme dazu im Internet, die ich allerdings nicht zum laufen bekomme.
nun meine Frage: Warum geht das nicht so einfach wie im folgenden Code probiert?
also es lässt sich ohne Fehler Compilieren, danach leuchtet die LED allerdings nur rot.
das Programm soll die LED einschalten wenn etwas näher als 5 cm am Ultraschallsensor ist.
Trigger: PC0
Echo: PC1
LED: PC3
#define F_CPU 16000000UL
#include <avr/io.h>
#include <util/delay.h>
#define ps 1024 //prescaler
#define ss 343.2 //sound speed
volatile uint16_t value;
void timer_init(void){
TCCR0|=(1<<CS02)|(1<<CS00);//prescale for timer 1024 @16MHz
}
uint8_t HC_SR04(void)
{
//generate a trigger signal
PORTC &= ~(1<<PC0);
_delay_us(1);
PORTC |= (1<<PC0);
_delay_us(10);
PORTC &= ~(1<<PC0);
while(!(PINC & (1<<PC1)))
{
}
//wait until echo pin be high
TCNT0=0;
while(PINC & (1<<PC1))
{
}
//count until echo pin be low
return TCNT0*ps*(1/F_CPU)*ss*100;
}
void motorInit(void)
{
DDRD |= (1<<7) | (1<<6) | (1<<5);
DDRB |= (1<<0);
PORTD |= (1<<7);
PORTB |= (1<<0);
PORTD &= ~((1<<6) | (1<<5));
}
int main(void)
{
motorInit(); //muss aufgrund der gegebenen Platine ausgeführt werden
uint16_t y;
DDRC |= (1<<3) | (1<<0);
DDRC &= ~(1<<1);
PORTC &= ~(1<<1);
timer_init();
while(1)
{
y=HC_SR04();
if(y<5)
{
PORTC |= (1<<3);
}
else
{
PORTC &= ~(1<<3);
}
_delay_ms(1000);
}
}
Ich hab denk ich alles durchprobiert und da schon einige Stunden dran geschwitzt ^^
würde mich sehr freuen, wenn mir jemand helfen kann!
Lukas