Skocz do zawartości

[C] HC SR04 nie działa poprawnie po ponownym podłączeniu zasilania


FantaZy

Pomocna odpowiedź

Układ zasilam przez programator - 5V

Problem polega na tym, że wkładam USB - wysyłam do Atmegi8(do pamięci FLASH) program.

Wszystko działa.

Wyciągam USB - nie ma zasilania - układ nie działa

Podpinam USB - jest zasilanie - układ działa ale niepoprawnie!

Przesyłam do niego jeszcze raz ten sam program i... zaczyna działać poprawnie!

bardzo dobrze widać to na filmiku:

mój kod programu:

//częstotliwość zegara
#define F_CPU 1000000L

#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>


//definicja LED1 (do którego pinu podłączony LED1)
#define LED1 PC5

//definicja LED2 (do którego pinu podłączony LED2)
#define LED2 PC4

//definicja portu PC1 do którego podłączony jest TRIG z czujnika
#define TRIG PC1

//definicja portu PD2 do którego podłączony jest ECHO z czujnika
#define ECHO PD2
int  echo_flag =0;
int  odleglosc =0;







// Pętla główna
void main(void)
{

DDRC |= (1<<4) | (1<<5) | (1<<1); //led jako wyjscie
DDRD = 0x00; // ustawienie portu D jako wejscia
DDRB |= (1<<PB2) | (1<<PB1) | (1<<PB0);
PORTD = 0xFF;

TCCR1B |= (1 << CS10); //Ustawia timer(zlicza impulsy równolegle względem procesora)
TCNT1 = 0;

GICR |= (1<<INT0); // włączenie przerwania dla INT0
MCUCR |= (1<<ISC00); //Zmiana stanu na INT0 generuje przerwanie
sei(); // włączenie globalnego systemu przerwań



while (1) //Pętla główna
{	

	_delay_ms(100);		

		PORTC |= (1 << TRIG);
		_delay_us(10);
		PORTC &= ~(1 << TRIG);	




}
}





ISR(INT0_vect)
{
if(echo_flag == 0)
{
	TCNT1 = 0; // Zeruje wartość timera
	echo_flag = 1;

}
else if(echo_flag == 1)	
{

	int time = 0;
	time = TCNT1;
	odleglosc = (time/58);
	echo_flag = 0;

	if(odleglosc <= 10)
	{
		PORTC &= ~(1<<LED1);
		PORTC |= (1<<LED2);
		 //wyłączamy silnik
		PORTB |=   (1<<PB1);
		PORTB |= (1<<PB0);

	}else
	{
		PORTC &= ~(1<<LED2);

		PORTC |= (1<<LED1);
		 PORTB &=   ~(1<<PB1);//włączamy silnik
		 PORTB &=   ~(1<<PB0);

	}

}





}

(wiem, że w kodzie nie wszystkie rzeczy dotyczą czujnika, bo to kawałek mojego projektu ale myślę, że raczej nikt się nie pogubi - a jeśli będzie potrzeba to mogę pousuwać zbędne fragmenty)

Jestem przekonany, że coś źle jest z czujnikiem, bo to on źle działa. Odpalałem ten sam kod na innej atmedze8 i było to samo. Dodam, że jestem początkujący i nie mam pojęcia gdzie szukać przyczyny.

Link do komentarza
Share on other sites

udało się rozwiązać problem

wystarczyło dodać echo_flag = 0; w pętli while

//częstotliwość zegara
#define F_CPU 1000000L

#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>


//definicja LED1 (do którego pinu podłączony LED1)
#define LED1 PC5

//definicja LED2 (do którego pinu podłączony LED2)
#define LED2 PC4

//definicja portu PC1 do którego podłączony jest TRIG z czujnika
#define TRIG PC1

//definicja portu PD2 do którego podłączony jest ECHO z czujnika
#define ECHO PD2

volatile int  echo_flag =0;
volatile int  odleglosc =0;







// Pętla główna
void main(void)
{

DDRC |= (1<<4) | (1<<5) | (1<<1); //led jako wyjscie
DDRD = 0x00; // ustawienie portu D jako wejscia
DDRB |= (1<<PB2) | (1<<PB1) | (1<<PB0);
PORTD = 0xFF;

TCCR1B |= (1 << CS10); //Ustawia timer(zlicza impulsy równolegle względem procesora)
TCNT1 = 0;

GICR |= (1<<INT0); // włączenie przerwania dla INT0
MCUCR |= (1<<ISC00); //Zmiana stanu na INT0 generuje przerwanie
sei(); // włączenie globalnego systemu przerwań





while (1) //Pętla główna
{	

	_delay_ms(30);		

		PORTC |= (1 << TRIG);
		_delay_us(10);
		PORTC &= ~(1 << TRIG);	
		echo_flag = 0;						//wprowadzona poprawka!!



}
}





ISR(INT0_vect)
{
if(echo_flag == 0)
{
	TCNT1 = 0; // Zeruje wartość timera
	echo_flag = 1;

}
else if(echo_flag == 1)	
{

	int time = 0;
	time = TCNT1;
	odleglosc = (time/58);
	echo_flag = 0;

	if(odleglosc <= 10)
	{
		PORTC &= ~(1<<LED1);
		PORTC |= (1<<LED2);
		 //wyłączamy silnik
		PORTB |=   (1<<PB1);
		PORTB |= (1<<PB0);

	}else
	{
		PORTC &= ~(1<<LED2);

		PORTC |= (1<<LED1);
		 PORTB &=   ~(1<<PB1);//włączamy silnik
		 PORTB &=   ~(1<<PB0);

	}

}





}

Jeżeli ten temat ma jakąś wartość edukacyjno merytoryczną to niech zostanie, jeśli nie to może wędrować do kosza. Fajnie by było, gdyby ktoś mógł jakoś fachowo wyjaśnić dlaczego wystąpiło takie zachowanie, bo ja sam do końca nie rozumiem.

Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.