Skocz do zawartości

Atmega328p w połączeniu z czujnikiem HC-SR04


kobustm

Pomocna odpowiedź

Witam Wszystkich

Napisałem program wyświetlający na LCD odległość od przeszkody, lecz na wyświetlaczu widnieje jedynie 0. Jako, że jestem początkujący to program jest napisany w jak najprostszy sposób. Atmega 328p połączona z czujnikiem HC-SR04 ma być częścią większego projektu. Atmega posiada zewnętrzny rezonator 20 mHz lecz przy takiej deklaracji w ogolę nie wyświetla wartość.

#define F_CPU 1000000UL
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include "LCD/HD44780.h"

void signal(void);
void external_interrupt(void);
void init_timer1(void);

unsigned char work;
unsigned char edge;
int distance;
uint16_t timer_value;
uint8_t error;

ISR (PCINT2_vect)
{
if(work == 1)
{
	if(edge==0)
			{
				edge=1;
				TCNT1 = 0;
				timer_value = 0;
			}
	else
			{
				edge = 0;
				distance = (timer_value*256 + TCNT1)/58;
				work = 0;
			}

}

}

ISR (TIMER1_OVF_vect)
{
if(edge==1) //Check if there was echo
	{
		timer_value++;
		if(timer_value > 91)
				{
					work = 0;
					edge = 0;
					error = 1;
				}
	}
}




int main(void)
{
external_interrupt();
init_timer1();
 DDRD |= (1 << PIND6);
 DDRD &= ~(1 << PIND7);

  LCD_Initalize();   //inicjalizacja LCD
  LCD_GoTo(1, 0);
  LCD_WriteText("  TEST  ");
  sei();

  	while(1)
  	{
  		_delay_ms(500);
  		signal();
  		LCD_GoTo(1, 1);
  		LCD_WriteText("      ");
  		char value[2];
  		itoa(distance,value,10);
  		LCD_GoTo(1, 1);
  		LCD_WriteText(value);
  		if(error == 1)
  				{
  			LCD_GoTo(1, 1);
  			LCD_WriteText("-------");
  				}


  	}
}

void signal()
{
if(work==0)
{
_delay_ms(50);		//Restart HC-SR04
PORTD &=~ (1 << PIND6);
_delay_us(1);
PORTD |= (1 << PIND6); //Send 10us second pulse
_delay_us(10);
PORTD &=~ (1 << PIND6);
work=1;
error = 0;
}
}
void external_interrupt()
{
PCICR |= (1<<PCIE2);
PCMSK2 |= (1<<PCINT23);
}
void init_timer1()
{
TCCR0B |= (1<<CS00);
TCNT1 = 0;
TIMSK1 |= (1<<TOIE1);
}

Czy mógłby mi ktoś napisać co jest nie tak i dlaczego otrzymuję wartość zero?

Z góry wielkie dzięki

Link do komentarza
Share on other sites

Przede wszystkim, zanim zaczniesz eksperymenty z timerami, pomiarami czasu itp musisz być pewien taktowania swojego procesora i odpowiednich do niego ustawień systemu. Napisz prosty programik mrugający diodą, oparty na prymitywnych opóźnieniach delay_ms(). Jeżeli LED będzie mrugał tak jak jak sobie to wymyśliłeś (np. 1Hz) przy pętli {zapal→0.5s→zgaś→0.5s} to możesz iść dalej. Przy takich pracach bardzo pomocny jest oscyloskop. Masz dostęp do czegoś takiego?

Jeśli nie ogarniasz co może być nie tak w kodzie, zacznij powoli, po kolei od czegoś mniejszego. Nawet jeśli nie masz jakiegoś sensownego sprzętu pomiarowego, korzytsaj z własnego procesora jak z narzędzia. Np. jeśli chcesz na timerze zliczać czas w przerwaniu, to upewnij się, że przerwania w ogóle przychodzą. Spróbuj mrugać w przerwaniu diodą tj. np. odwracać jej stan w każdym przejściu przez ISR. Możesz zacząć od małej częstotliwości aby mieć pewność, że panujesz nad ustawieniami timera. Program nie musi od razu robić wszystkiego. Uruchomienie samej funkcji pomiaru (generacja impulsu wyzwalającego, liczenie czasu powrotu echa) jest zupełnie niezależne od obliczeń i wyświetlania wyniku. Osobno możesz testować np. arytmetykę przez sztuczne wywoływanie funkcji obliczeniowych ze zmyślonymi odczytami czasu, wpisanymi bezpośrednio w kod - oczywiście takimi jakich się spodziewasz. Potem wyświetlanie itd. Jeśli te części będą niezależnie od siebie pracować id obrze przeliczać a potem wyświetlać wyniki dla pełnego zakresu danych wejściowych, możesz przejść do integracji tych funkcji. Jeden problem na raz. Nikt nie odpala kompletnych programów na żywioł, bo duży program jest jak talerz spaghetti - to pociągniesz, a rusza się w kilku odległych miejscach. Jestem pewien, że stosując tą metodę sam sobie poradzisz. Na początek zaplanuj kierunek np. że zaczniesz od samej góry: wyświetlanie. Zadaj sobie pytanie, czy wyświetlanie działa prawidłowo i sprawdź to dla kilku przypadków wpisanej w kod odległości. Potem obliczenia - te będą już korzystały z uruchomionych, pewnych i sprawdzonych funkcji wyświetlających itd.. Na każdym etapie możesz znajdować błędy. A to w zakresach liczb (na małych kontrolerach zwykły int jest tylko 16-bitowy więc łatwo o błędy przepełnienia), a to w koncepcji lub też w niezrozumieniu mechanizmów działania fragmentów sprzętu. Poprawiaj aż dojdziesz do działającego kodu. Masz takie same narzędzia jak my a przewagę dużą, bo masz pod ręką swój system i nieskończone możliwości próbowania 🙂

Link do komentarza
Share on other sites

Dziękuję Ci bardzo za tak obszerną odpowiedź, wziąłem do siebie to co napisałeś i sprawdzałem wszystko po kolei metodą na diodę ucząc się przy okazji wszystkich etapów programowania AVR. Teraz juz działa i robię kolejne etapy projektu. Dzięki wielkie

[ Dodano: 24-11-2015, 14:54 ]

Błędy robiłem już na samym początku czyli przy ustalaniu częstotliwości taktowania i jej deklaracji

Link do komentarza
Share on other sites

O, to dobrze, że się nie zniechęciłeś. Przy okazji napisz w wolnej chwili co robisz. Co to za projekt? Będzie jeździł czy raczej coś stacjonarnego? Do czego ten pomiar odległości? Będziesz unikał przeszkód czy mapował teren? Podglądanie obcych projektów to druga po samodzielnym ich robieniu najfajniejsza rzecz w tej działce 🙂

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

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.