Kanał - ATNEL tech-forum
Wszystkie działy
Najnowsze wątki



Teraz jest 29 kwi 2026, o 10:48


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 12 ] 
Autor Wiadomość
PostNapisane: 23 lip 2015, o 16:47 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 31 sty 2015
Posty: 182
Pomógł: 0

Witam
Zamieszczam moje pytanie w tym dziale, ponieważ domyślam się, że problem leży w błędnie przeze mnie napisanym programie ;)
Moim celem jest obsługa czujnika ultradźwiękowego HC-SR04 za pomocą Atmegi8 oraz dwóch timerów (timer0 oraz timer2). Od razu zaznaczam, że trybów CTC zamierzałem użyć dopiero na dalszym etapie czyli wtedy jeżeli opanuję programowo działanie tego czujnika na timerach w trybie normalnym.
Poniżej zamieszczę kod tego co wymyśliłem, jednak jeszcze kilka słów moich wyjaśnień.
Program działa w 100% jak należy i dobrze odmierza odległość zapalając różne diody. Dzieje się to jednak tylko wtedy, kiedy widzi "przeszkodę". Kiedy usunę przeszkodę a wysłane impulsy nie wracają do czujnika zaczyna się problem i mimo np. przyłożenie dłoni 5cm od czujnika nie umie już on wejść w przerwanie INT0. Pomaga dopiero przysunięcie dłoni na odległość około 1 cm - wtedy wszystko zaczyna działać i mogę poruszać dłonią a świecące diody zmieniają się jak widać w kodzie kiedy dłoń jest przed lub za 20 cm.
Uwagi:
a)Timer0 odlicza co 40 us (większą dokładność będę próbował robić dopiero gdy wszystko zadziała)
b) Wiem że timery można zatrzymać szybciej ale po prostu próbuję już wszystkiego, bo nie mogę zauważyć błędu
c) Wejście PD2 jest podciągnięte rezystorem 1 kilo om do GND.

Dodam że taktowanie Atmegi8 zostało ustawione na 8 MHz dzięki MKAvrCalculator

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Będę wdzięczny za wskazówki i wytknięcie błędów ;)

Pozdrawiam
Maciek



Ostatnio edytowano 23 lip 2015, o 19:34 przez Maciek_L, łącznie edytowano 1 raz

Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 23 lip 2015, o 19:18 
Offline
Moderator zasłużony dla forum.atnel.pl
Avatar użytkownika

Dołączył(a): 18 lip 2012
Posty: 3230
Lokalizacja: Kraków - obok FAB5 ATMEL'a
Pomógł: 91

Najpierw poprawka: topic7402.html

_________________
http://www.jaglarz.info



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 23 lip 2015, o 19:35 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 31 sty 2015
Posty: 182
Pomógł: 0

Poprawione i przepraszam za nieuwagę.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 24 lip 2015, o 07:10 
Offline
Użytkownik

Dołączył(a): 01 sty 2014
Posty: 116
Pomógł: 14

Spróbuj podczas wyzwalania timera ustawiać przerwanie na zbocze narastajace i zmienna zbocze na 1



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 24 lip 2015, o 17:59 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 31 sty 2015
Posty: 182
Pomógł: 0

Witam ponownie.
Próbowałem już także takich sposobów, bo uważałem że problem może być w tym, że właśnie gubi się gdzieś ta reakcja na zbocze narastające lub zbocze równe 1. Nic jednak nie pomagało a odkryłem jedną ciekawą rzecz:
- kiedy program znajduje się w pętli while i co te 60 ms wysyła stan wysoki przez 10 us na trigger nie można wejść do INT0 - natomiast jeśli podepnę sobie wtedy kabelek od vcc i na moment dotknę pinu trigger (trzymając rękę załóżmy w odległości 10 czy 30 cm) to nagle program ożywa i wszystko działa jak należy do momentu aż czujnik ponownie straci sygnał (czyli kiedy nie wraca do niego żaden sygnał bo od niczego się nie odbija).



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 24 lip 2015, o 18:11 
Offline
Użytkownik

Dołączył(a): 01 sty 2014
Posty: 116
Pomógł: 14

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Zastanów się co ta linijka robi;)

------------------------ [ Dodano po: 4 minutach ]

Poza tym ta linijka:

Maciek_L napisał(a):
TCNT2 = 0; // zatrzymanie timer2


nie zatrzymmuje Timera;)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 24 lip 2015, o 19:26 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 31 sty 2015
Posty: 182
Pomógł: 0

Oczywiście że TCNT2 =0 nie zatrzymuje timera ale pisałem w pierwszym poście, że po prostu próbuję już wszystkiego:)
Co do TCCR2 |= 0 to oczywiście była pomyłka i już poprawiłem
Poniżej mój obecny kod po małych zmianach jednak dalej nie działa tak jak powinno. Działa tylko jeżeli w momencie włączenia zasilania przeszkoda jest na drodze czujnika. Jeżeli jej nie ma lub zniknie w trakcie to albo trzeba przyłożyć dłoń na odległość około 1 cm od czujnika lub ręcznie podać na ułamek sekundy napięcie na pin trigger.

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 lip 2015, o 12:33 
Offline
Użytkownik

Dołączył(a): 01 sty 2014
Posty: 116
Pomógł: 14

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Moze nie najladniejsze rozwiazanie ale wedlug mnie program nie moze wygenerowac sygnalu Triger.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 lip 2015, o 16:52 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 31 sty 2015
Posty: 182
Pomógł: 0

Niestety ale dodanie delaya przed dokonaniem pomiaru nie rozwiązuje problemu. Dodatkowo kiedy widziana jest przeszkoda to poprzez to dodatkowe opóźnienie diody wolniej się przełączają. Więc chyba nie tędy droga ale prawdą jest że wygląda na to, że program nie wywołuje stanu wysokiego na trigger jeżeli wpadnie do pętli, w której "znika przeszkoda". Kiedy przeszkoda jest to wszystko ładnie wchodzi do INT0 a sygnały na trigger przecież również wysyłane są z pętli while. Trochę tego nie ogarniam:)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 lip 2015, o 17:26 
Offline
Użytkownik

Dołączył(a): 01 sty 2014
Posty: 116
Pomógł: 14

W takim razie spróbuj ustawić przerwanie zarówno na zbocze opadające jak i narastajace i w funkcji obsługi przerwania sprawdzać stan pinu ECHO. Jeśli Echo=1 to było zbocze narastajace, jeśli echo=0 to było zbocze opadające. Małe uproszczenie ale powinieneś rozpocząć właśnie od takich bardziej prymitywnych programów i stopniowo je ulepszać;)


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 26 lip 2015, o 19:45 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 31 sty 2015
Posty: 182
Pomógł: 0

Myślę, że miałeś na myśli coś takiego jak przedstawiam poniżej. Ustawiłem dowolne zbocze dla przerwania INT0 i wewnątrz niego sprawdzam jaki stan jest na pinie PD2.
Efekt jest taki, że program działa identycznie jak wcześniejsze wersje - czyli jak widzi przeszkodę działa wyśmienicie a jak nagle usuniemy przeszkodę to ponowne jej przyłożenie przed czujnikiem nie daje już żadnych rezultatów:(
W nowym kodzie chyba błędów nie zrobiłem, bo dobrze się kompiluje i po wgraniu do mikrokontrolera działa tak jak wcześniejsze wersje.

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 lip 2015, o 16:04 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 31 sty 2015
Posty: 182
Pomógł: 0

Wygląda na to, że po próbie eliminacji potencjalnych błędów sprawa wyjaśniła się:) Kiedy nie miałem już pomysłów dlaczego napisany przeze mnie program nie działa postanowiłem zakupić kolejny czujnik. Włożyłem go, wgrałem wsad i wszystko działa jak należy:) Dla Ciebie Danielu daję plusa za poświęcony czas i chęć pomocy. Pozdrawiam serdecznie.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
Wyświetl posty nie starsze niż:  Sortuj wg  
Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 12 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Google Adsense [Bot] i 5 gości


Nie możesz rozpoczynać nowych wątków
Nie możesz odpowiadać w wątkach
Nie możesz edytować swoich postów
Nie możesz usuwać swoich postów
Nie możesz dodawać załączników

Szukaj:
Skocz do:  
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO