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

Sonar 'po swojem' na atmega128, kod nie działa

rozwielitka 22 Lut 2011 01:17 1095 0
REKLAMA
  • #1 9185766
    rozwielitka
    Poziom 10  
    Witam

    Wiem, że jest tu dużo tematów związanych z sonarami niemniej ostatnio kombinuję nad własnym czujnikiem ultradźwiękowym, który próbuję zrobić "po swojemu" i jak można się było spodziewać - nie działa.
    Bardzo możliwe, że powinienem dopisać post do istniejących tematów niemej mam wrażenie, że kod jest na tyle inny od reszty, że można się pokusić o jakąś osobność (i przy okazji może uda się też dostać szybszą odpowiedź a na takiej mi zależy :) )

    Założenie jest proste - mam nadajnik i odbiornik ultradźwiękowy (T,R) wpięte bezpośrednio w uC (atmega128 taktowany 8MHz) i jedną diodę która ma sygnalizować, że sonar coś "widzi" (w planach jest dołożenie jeszcze kilku LEDów co by przybliżyć działanie do często przytaczanego 'wątku sonarowego' .

    Do rzeczy:
    Nadajnik jest wpięty w piny PA:
    + w PA0 ; - w PA1
    Odbiornik w piny PE:
    + w PE3 ; - w PE2 (odpowiednio AIN1 i AIN0 czyli w komparator 128'mki)
    LED do PB2.

    A oto kod odmawiający współpracy


    
    #define F_CPU 8000000L
    #include <avr/io.h>
    #include <util/delay.h>
    #include <stdlib.h>
    
    int echo;
    
    
    //______________________________IMPULS
    void impuls (void)
    {
    	int i;
    	for (i=0;i<4;i++)   							//cztery impulsy po 26us - nadawanie sygnału przez ~100us  
    	{
    		PORTA=0x01; DDRA=0x03;						//impuls na +nadajnika
    		_delay_us(13);
    		PORTA=0x00; DDRA=0x03;						//wytłumienie nadajnika
    		_delay_us(13);
    	}
    }
    //_____________________________/IMPULS
    
    
    
    //______________________________POMIAR
    int pomiar (void)
    {
    	int flaga = 0;
    	TCCR1B |= (1 << CS10);  						//timer włączony
    	for ( echo=0 ; echo<14 ; echo++ )				// 14 taktów po ~15 us -> 210 us czyli zasięg ~35cm w te i wefte
    		{											//----FOR
    			TCNT1 = 0;							    //zerownia timera
    			while (TCNT1 < 64)  					//64 taktów / ~15us ustawia dokładność do ~5 cm
    			{										//----WHILE
    				if (bit_is_set(ACSR,ACO))
    					{ flaga++; break; } 			// sygnał z odbiornika = wypad z pętli
    					
    			}										//---/WHILE
    			if (flaga != 0) {break;}				//wypad z for
    		}											//---/FOR
    	TCCR1B &= ~(1 << CS10);							//wyłączenie timera
    	return (echo);									//zwracamy "odległość"
    }
    //_____________________________/POMIAR
    
    
    int main()
    {
    	_delay_ms(2000);	
    	TIMSK |= (1<<TOIE0);  							// ustawienia komparatora analogowego
    for (;;)	
    {
    	PORTE=0x04; DDRE=0x0c;							//tłumienie odbiornika (zwarcie + do masy O,o)
    	PORTA=0x00; DDRA=0x03;							//nadajnik off
    	_delay_ms(5);
    	
    	PORTE=0x00; DDRE=0x0c;							//włączenie odbionika
    		
    	impuls();
    	pomiar();
    
    	if ( echo!=0 )									//jak coś wykryło to świecimy diode
    	{ DDRB=0x04; PORTB=0x04;}
    	else
    	{ DDRB=0x04; PORTB=0x00;}
    }
    }
    


    no i nie świeci
    IMPULS śle pare sygnałów mających imitować sinusoidę o częstotliwości +/- 38,5 kHz. Jak się przyłoży ucho to słychać ledwie słyszalne "brzęczenie" przez ułamek sekundy więc zakładam, że to akurat działa.

    POMIAR to moje radosna twórczość mając mierzyć odległość. Nie mam pojęcia czy działa ale pewnie nie skoro dioda ani myśli mrugnąć :/ W założeniu ma przez około 200 us czekać na sygnał z komparatora (przez 200us dźwięk przebywa około 70cm więc teoretycznie powinien wykryć przedmiot znajdujący się około 35 cm od nadajnika. Zliczanie czasu wziąłem ze strony http://www.wkretak.pl/ W samy naliczaniu opóźnień chyba się nie walnąłem więc pewnie coś jest nie tak z komparatorem.

    No i właśnie komparator to moja największa bolączka. Do tej pory trzymałem się z dala od sprzętu a mikrokontrolerów nie ruszałem nawet kijem i przyznam szczerze, że nie bardzo jeszcze łapię jak powinno się tym sterować :| (tak, czytam dokumentacje; nie, wciąż nie czaję).

    Teoretycznie kiedy coś pojawiłoby się przed czujnikiem lampka powinna zacząć wesoło się jarzyć uspakajającym, zielonym światełkiem, niestety nic takiego się nie dzieje w związku z czym wołam POMOCY!

    (ps. temat umieszczony też na dioda.com.pl)

    EDIT: problem rozwiązany
    niedługo powinienem zamieścić opis całego projektu :)

    EDIT2: przepraszam za opóźnienia niemniej częściej mnie nie ma niż jestem a mam jeszcze trochę na głowie
    opisy powinienem niemniej zamieścić w ciągu góra dwóch tygodni
  • REKLAMA
REKLAMA