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



Teraz jest 10 mar 2025, o 20:47


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 15 ] 
Autor Wiadomość
PostNapisane: 11 paź 2016, o 10:47 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 20 paź 2013
Posty: 143
Lokalizacja: Zamość
Pomógł: 0

Witajcie.

Mam mały problem ze zmienną "zmienna" która jest typu int. Otóż warunek While chciałbym zmodyfikować tak, żeby zmienna mogła być mniejsza od 60000 a nie tylko od 20000. Jak ustawiam zmienną większą niż 30000 to program się zawiesza a przecież int spokojnie powinien "wystarczyć" do reprezentacji zmiennej o wartości 30000. Modyfikowałem typ zmiennej z int na unsigned int ale to również nic nie daje. Procesor się zatrzymuje i wisi. Dla warunku zmienna<30000 wszystko działa prawidłowo.



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: 11 paź 2016, o 11:10 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 19 cze 2014
Posty: 820
Lokalizacja: Tam gdzie PYRY są
Pomógł: 64

A z uint16_t próbowałeś?
Co robisz po wyjściu z pętli? Wtwolujesz funkcję jeszcze raz? Może procek się nie zawiesza tylko program się kończy albo wpada w martwą pętle?

_________________
IntegraMETEO
WordCLOCK
IntegraTOUCH



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 11 paź 2016, o 11:24 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 20 paź 2013
Posty: 143
Lokalizacja: Zamość
Pomógł: 0

typ uint16_t próbowałem i nic nie dało. Po wyjściu z tej funkcji program powinien wejść do innej, niezależnej od tej. I wchodzi ale tylko wtedy gdy warunek while (zmienna jest mniejsza od mniej więcej 32400 i nie wiem dokładnie jaka wartość bo badanie tej granicy byłoby czasochłonne)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 11 paź 2016, o 11:28 
Offline
Użytkownik

Dołączył(a): 07 cze 2016
Posty: 563
Pomógł: 143

Ja bym spojrzał na to z innej strony, bo być może zakres zmiennej nie jest tutaj problemem.
Jeden obieg pętli while może trwać powiedzmy ok. 30 taktów zegara. W tym czasie timer 0 z preskalerem 8 zliczy ok. 3 do 4 impulsy. Zmienna 'zmienna' jest inkrementowana tylko, gdy TCNT0==255. Jakie jest prawdopodobieństwo, że w momencie porównania TCNT0 będzie miał wartość dokładnie 255? A jeśli pętla nie trafi w taką wartość, to licznik musi zrobić cały następny obieg (być może kilka razy, zanim trafi), i to może dawać wrażenie wieszania się.

Spróbowałbym testowo zmienić warunek np. na TCNT0>=240. Wtedy zwiększy się margines błędu i przy każdym osiągnięciu przez timer 0 wartości większej od 240, zmienna 'zmienna' będzie inkrementowana.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 11 paź 2016, o 11:37 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 09 gru 2014
Posty: 1540
Pomógł: 269

Dodam tylko...
Cytuj:
(zmienna jest mniejsza od mniej więcej 32400 i nie wiem dokładnie jaka wartość bo badanie tej granicy byłoby czasochłonne)

Będzie to dokładnie 32767, ponieważ int przyjmuje wartości od -32768 do 32767.
Musisz zadeklarować zmienną zmienna tak:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Wtedy przyjmie wartości od 0 do 65535.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 11 paź 2016, o 11:56 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 20 paź 2013
Posty: 143
Lokalizacja: Zamość
Pomógł: 0

Zmieniłem typ zmiennej na uint16_t jak również zmieniłem warunek zgodnie ze wskazówkami kolegi andrews ale nadal to samo.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 11 paź 2016, o 12:01 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 09 gru 2014
Posty: 1540
Pomógł: 269

Jeśli to nie tajemnica to pokaż cały kod. Może coś poradzimy. ;)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 11 paź 2016, o 12:19 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 20 paź 2013
Posty: 143
Lokalizacja: Zamość
Pomógł: 0

To jest funkcja w której wywoływana zostaje funkcja fun1(); natomiast fun4() wywoływana jest w main.

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


------------------------ [ Dodano po: 16 minutach ]

Próbowałem jeszcze pominąć licznik i zrobić to na delayach, ale to również nic nie pomaga.

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



Ostatnio edytowano 11 paź 2016, o 13:11 przez matej1410, łącznie edytowano 1 raz

Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 11 paź 2016, o 12:52 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 01 lis 2015
Posty: 1448
Lokalizacja: okolice Warszawa
Pomógł: 149

Tak na marginesie.
Mylący jest zapis ustawiający na porcie D pin PA3.

------------------------ [ Dodano po: 2 minutach ]

Ustawiasz PD3.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 11 paź 2016, o 13:12 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 20 paź 2013
Posty: 143
Lokalizacja: Zamość
Pomógł: 0

Oczywiście racja. Edytowałem ten kod przed wrzuceniem go tu po prostu i umknęła mi edycja tej jednej literki. Dziękuję za tę uwagę.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 11 paź 2016, o 13:32 
Offline
Użytkownik

Dołączył(a): 25 lip 2015
Posty: 140
Zbananowany użytkownik

Pomógł: 18

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

Komentarze w kodzie. Jak zacząłeś używać _delay_ms(), to zdefiniowałeś F_CPU? Na jakim uP to robisz? Co podajesz na te 2 kanały z ADC?



Ostatnio edytowano 11 paź 2016, o 14:00 przez Sparrow-hawk, łącznie edytowano 2 razy

Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 11 paź 2016, o 13:33 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 19 cze 2014
Posty: 820
Lokalizacja: Tam gdzie PYRY są
Pomógł: 64

Wiesz co??
Coraz mniej czytelnie się robi. Ja już się zgubiłem w którym miejscu masz problem. Zrób sobie pułapkę z LEDem (https://youtu.be/yVFf22JxuEs)
i zobacz w którym miejscu program się gubi. może nie tu gie myślisz a po prostu adc coś nie tak i warunki, wogóle się nie spełniają i nie wchodzi w pętlę, z którą teoretycznie masz problem.
Ja bym na początek pozbył się adc i podstawił nawet liczby stałe aby zobaczyć po kolei czy warunki działają jak założyłeś, ew wywal poiary na ekran lub terminal

_________________
IntegraMETEO
WordCLOCK
IntegraTOUCH



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 11 paź 2016, o 14:28 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 01 lis 2015
Posty: 1448
Lokalizacja: okolice Warszawa
Pomógł: 149

Hmm... Przy wklejaniu poprzestawialy się sredniki i klamry.:(



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 11 paź 2016, o 17:05 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 01 lis 2015
Posty: 1448
Lokalizacja: okolice Warszawa
Pomógł: 149

Tak jak kolega Sparrow-hawk zaznaczył.

polecenia od linijki 29 nigdy się nie wykonają,
bo jeżeli (ADC_0 oraz ADC_1 są mniejsze od 100),
to nie będzie żadna z nich większa od 100 by spełnić jednocześnie warunek kolejnej funkcji :
gdy (ADC_0 lub ADC_1 jest wieksze od 100).



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 paź 2016, o 09:06 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 20 paź 2013
Posty: 143
Lokalizacja: Zamość
Pomógł: 0

anshar napisał(a):
Dodam tylko...
Cytuj:
(zmienna jest mniejsza od mniej więcej 32400 i nie wiem dokładnie jaka wartość bo badanie tej granicy byłoby czasochłonne)

Będzie to dokładnie 32767, ponieważ int przyjmuje wartości od -32768 do 32767.
Musisz zadeklarować zmienną zmienna tak:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Wtedy przyjmie wartości od 0 do 65535.


Panowie witajcie ponownie. Przepraszam za taki poślizg i opieszałość w odpisywaniu. Udało mi się ustalić wartość zmiennej, powyżej której program leci w maliny: 26989. Od tej wartości zaczyna się zawieszać.



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

Strefa czasowa: UTC + 1


Kto przegląda forum

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