logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[atmega8][C] Problem (?) z komparatorem...

bartekb3 10 Wrz 2008 19:57 845 0
REKLAMA
  • #1 5523224
    bartekb3
    Poziom 10  
    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
    #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
  • REKLAMA
REKLAMA