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



Teraz jest 10 gru 2024, o 20:23


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 11 ] 
Autor Wiadomość
PostNapisane: 20 sie 2015, o 18:08 
Offline
Użytkownik

Dołączył(a): 15 lut 2012
Posty: 224
Lokalizacja: Opole
Pomógł: 24

Witajcie

Mam problem z czujnikami modHCS-SR04.Gdy próbuję odczytać odległość czujnika od przeszkody dostaję mocno zaniżoną wartość lub wartość całkowicie losową.

Finalnie muszę obsłużyć 4 czujniki więc tryb ICP odpada - wybrałem przerwania PCINT. Procek to ATmega 644PA, taktowanie 8 Mhz wewn. zegar (Zestaw ATB ;) )

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: 20 sie 2015, o 20:53 
Offline
Uzytkownik zasłużony dla forum.atnel.pl
Avatar użytkownika

Dołączył(a): 16 lip 2012
Posty: 2088
Lokalizacja: Leżajsk / Kraków
Pomógł: 411

Preskaler 1 i mała wartość porównania sprawia, że nie działa to dokładnie. Od momentu zgłoszenia przerwania do pierwszej instrukcji w funkcji obsługi przerwania minie więcej czasu. Spróbuj podejść inaczej do tematu. Przykładowo po wysłaniu impulsu zapamiętujesz wartość timera, który działa normalnie i bez swoich przerwań, a w przerwaniu od zmiany stanu odejmujesz aktualną i starą wartość. W książkach Mirka można było wyczytać, że nie jest ważne która z wartości jest większa, bo wynik i tak będzie poprawny dla obliczeń na liczbach 16-bitowych.

W pętli głównej rozbuduj sprawdzanie w jakim aktualnie stanie znajduje się pomiar (teraz masz 2 stany dodaj jeszcze 1), a to pozwoli pozbyć się _delay_ms(60);


Autor postu otrzymał pochwałę

_________________
Dragonus Cracovus: Biomagia



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 22 sie 2015, o 23:16 
Offline
Użytkownik

Dołączył(a): 15 lut 2012
Posty: 224
Lokalizacja: Opole
Pomógł: 24

Dzięki Krauser, teraz obliczanie odległości działa poprawnie (sensor1), ale tylko dla jednego czujnika - od reszty cały czas dostaję zero, nawet przy włączeniu pomiaru tylko dla jednego czujnika (w skrócie: działa tylko sensor1, od reszty dostaję 0).

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


Krauser napisał(a):
W pętli głównej rozbuduj sprawdzanie w jakim aktualnie stanie znajduje się pomiar (teraz masz 2 stany dodaj jeszcze 1), a to pozwoli pozbyć się _delay_ms(60);

To zrobiłem w przerwaniu bo, nie do końca wiem o jaki stan chodzi.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 23 sie 2015, o 12:14 
Offline
Uzytkownik zasłużony dla forum.atnel.pl
Avatar użytkownika

Dołączył(a): 16 lip 2012
Posty: 2088
Lokalizacja: Leżajsk / Kraków
Pomógł: 411

Generalnie chodziło mi o to, żeby nie zerować nigdzie TCNT1. Timer po prostu sobie liczy. Zerowanie TCNT1 jest błędem ponieważ jest to licznik wspólny i wtedy jeden pomiar psuje drugi. Jak wystąpi przerwanie to należy w zależności od aktualnego stanu tylko zapamiętać wartość TCNT1, albo obliczyć różnicę:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Na razie to przetestuj. Przydałoby się wyrzucić to _delay_us(10) z przerwania. Tak się nie ucz. Mimo, że 10 us to niby nic, ale nabierzesz złych nawyków. Powinno to wyglądać tak:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Autor postu otrzymał pochwałę

_________________
Dragonus Cracovus: Biomagia



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 23 sie 2015, o 14:14 
Offline
Użytkownik

Dołączył(a): 15 lut 2012
Posty: 224
Lokalizacja: Opole
Pomógł: 24

Działa, tylko że problem z zerem na reszcie czujników pozostał.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 23 sie 2015, o 16:16 
Offline
Uzytkownik zasłużony dla forum.atnel.pl
Avatar użytkownika

Dołączył(a): 16 lip 2012
Posty: 2088
Lokalizacja: Leżajsk / Kraków
Pomógł: 411

Niby używasz przerwań INT0 (PD2), INT1 (PD3) i INT2 (PB3), a w kodzie masz:
ps19 napisał(a):
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Sprawdź to na spokojnie.

_________________
Dragonus Cracovus: Biomagia



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 23 sie 2015, o 16:23 
Offline
Użytkownik

Dołączył(a): 15 lut 2012
Posty: 224
Lokalizacja: Opole
Pomógł: 24

Aktualny kod:

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: 23 sie 2015, o 17:25 
Offline
Uzytkownik zasłużony dla forum.atnel.pl
Avatar użytkownika

Dołączył(a): 16 lip 2012
Posty: 2088
Lokalizacja: Leżajsk / Kraków
Pomógł: 411

Niesłusznie zakładasz, że jak tylko wykona się linia sensor1.stan_pomiaru = 1; to pomiar jest już w kolejnej instrukcji wykonany i gotowy.

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


Autor postu otrzymał pochwałę

_________________
Dragonus Cracovus: Biomagia



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 23 sie 2015, o 19:45 
Offline
Użytkownik

Dołączył(a): 15 lut 2012
Posty: 224
Lokalizacja: Opole
Pomógł: 24

Krauser napisał(a):
Niesłusznie zakładasz, że jak tylko wykona się linia sensor1.stan_pomiaru = 1; to pomiar jest już w kolejnej instrukcji wykonany i gotowy.


Faktycznie :o

Niestety to nie to - osobno działa, ale jak podłączone jest więcej niż jeden czujnik to dostaję odczyt tylko z jednego czujnika



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 23 sie 2015, o 22:22 
Offline
Uzytkownik zasłużony dla forum.atnel.pl
Avatar użytkownika

Dołączył(a): 16 lip 2012
Posty: 2088
Lokalizacja: Leżajsk / Kraków
Pomógł: 411

Chcesz powiedzieć, że jak w powyższym przykładzie na starcie ustawisz:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

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

to masz odczyt z sensora 1, a dla sensor_nr = 1 z sensora 2.

Możesz jeszcze spróbować inaczej wyłączać/włączać te przerwania, nie poprzez PCMSKx tylko przez rejestr PCICR

_________________
Dragonus Cracovus: Biomagia



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 23 sie 2015, o 22:52 
Offline
Użytkownik

Dołączył(a): 15 lut 2012
Posty: 224
Lokalizacja: Opole
Pomógł: 24

Już działa, zmieniłem czujniki na nowe i zaczęło działać normalnie.

Działa zarówno z wyłączaniem przerwań przez rejestr PCICR oraz PCMSKx.
Dziękuję za pomoc.



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: 11 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 0 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