Witam, przechodząc od razu do sedna:
Pisze sterownik do robota, chce żeby wykrywał przeszkody ultradźwiękami -jako że znalazłem w internecie (http://www.patron.ehost.pl/patron/artykuly/vinavr/AVR_tutorial.htm) instrukcje jak wykorzystując komparator to wykonać zabrałem się do pracy i wyskrobałem cos takiego
i teraz problem: funkcja ping zawsze zwraca zero, a chyba nie powinna...
co ciekawe gdy odłącze przetwornik czyli zostawie piny wiszące funkcja również zwróci 0 ..
proszę o pomoc
Pisze sterownik do robota, chce żeby wykrywał przeszkody ultradźwiękami -jako że znalazłem w internecie (http://www.patron.ehost.pl/patron/artykuly/vinavr/AVR_tutorial.htm) instrukcje jak wykorzystując komparator to wykonać zabrałem się do pracy i wyskrobałem cos takiego
#include "ultrasonic.h"
int ping(void)
{
// procedura wysyłająca paczkę ultradźwięków
int echo=0; // tutaj zanotujemy opóźnienie powrotu echa
SET(DDR(ULTRASONIC_PORT),7);
RESET(ULTRASONIC_PORT,7);
sinus_40_khz();
sinus_40_khz();
sinus_40_khz();
sinus_40_khz();
sinus_40_khz();
sinus_40_khz();
sinus_40_khz();
sinus_40_khz();
sinus_40_khz();
sinus_40_khz();
//zwieramy do masy przetwornik wyjsciowy żeby wytłumić
RESET(ULTRASONIC_PORT,ULTRASONIC_PINA);
RESET(ULTRASONIC_PORT,ULTRASONIC_PINB);
_delay_us(8);
//zwieramy do masy przetwornik wejsciowy żeby wytłumić
SET(DDR(ULTRASONIC_PORT),6);
RESET(ULTRASONIC_PORT,6);
_delay_us(8);
// włączamy wejście
RESET(DDR(ULTRASONIC_PORT),6);
RESET(ULTRASONIC_PORT,6);
// teraz czekamy na powrót echa
for(echo=0;echo<201;echo++) {
if(bit_is_set(ACSR,ACO))
{
break;
}
}
return echo;
}
void sinus_40_khz(void)
{
DDR(ULTRASONIC_PORT)|=_BV(ULTRASONIC_PINA)||_BV(ULTRASONIC_PINB);
SET(ULTRASONIC_PORT,ULTRASONIC_PINA);
RESET(ULTRASONIC_PORT,ULTRASONIC_PINB);
// teraz czekamy połowę okresu sinosoidy
_delay_us(12.5);
SET(ULTRASONIC_PORT,ULTRASONIC_PINB);
RESET(ULTRASONIC_PORT,ULTRASONIC_PINA);
// teraz czekamy nieco krócej jak okres połowy sinusoidy
// bo procesor potrzebuje nieco czasu na powrót z tej procedury
// i ponowne do niej wejście - dopiero wtedy rozpocznie kolejną
// sinusoidę
_delay_us(6.25);
}i teraz problem: funkcja ping zawsze zwraca zero, a chyba nie powinna...
co ciekawe gdy odłącze przetwornik czyli zostawie piny wiszące funkcja również zwróci 0 ..
proszę o pomoc