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



Teraz jest 28 kwi 2026, o 01:43


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 33 ]  Przejdź na stronę 1, 2  Następna strona
Autor Wiadomość
PostNapisane: 25 paź 2013, o 09:03 
Offline
Użytkownik

Dołączył(a): 23 lip 2013
Posty: 83
Pomógł: 0

Prosiłbym o sprawdzenie kodu w C. Jest to stoper dokonujący pojedynczego pomiaru lub wyciągający średnią z 5 pomiarów. Chodzi mi głownie o to, czy przeliczanie czasu jest dobre, wolałbym się upewnić. Zamontowany jest kwarc 16MHz.
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 paź 2013, o 09:57 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27460
Lokalizacja: Szczecin
Pomógł: 1045

erykko --> wszędzie, prawie w co drugim poście na tym forum i chyba w co trzecim na każdym innym podobnym forum, WSZĘDZIE ci którzy już coś wiedzą o programowaniu podpowiadają początkującym, żeby za diabła nie używali powolnych operacji jak delaye ale także wyświetlanie na LCD !!! w przerwaniach !!!

a ty proszę - toż sam zobacz co zrobiłeś :( ... już z tego powodu ten program jest absolutnie niedopuszczalny - jako chociaż w minimalnym stopniu poprawny :( ....

usuń to wszystko z przerwań i wrzuć do pętli głównej - wtedy będzie można analizować ok ?

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 paź 2013, o 10:36 
Offline
Użytkownik

Dołączył(a): 23 lip 2013
Posty: 83
Pomógł: 0

Wiem o tym i czytałem o tych uwagach, ale warto zauważyć, że te opóźnienia są dopiero na zakończenie działania, gdy ma się wyświetlić wynik. Dlatego je zastosowałem. Ciężko w inny sposób też jest to zrealizować, gdyż chciałbym by jednym sposobem czas był zliczany w pętli głównej programu, a drugi przerwaniem, jak to zresztą widać.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 paź 2013, o 10:53 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27460
Lokalizacja: Szczecin
Pomógł: 1045

A co ma wspólnego fakt że stosujesz wyświetlanie na LCD pod koniec przerwania czy na początku czy w środku - z zasadnością użycia tego w przerwaniu ? NIC :( ... kompletnie nic :( W każdym z przypadków wychodzi z tego jednakowa kicha niestety :( ... a to pokazuje że jeszcze nie rozumiesz przerwań ... ale ok jak chcesz się tego nauczyć to nie tłumacz dalej że tego nie da się inaczej zrobić albo że ciężko to zrobić bo to już kompletnie nieuzasadnione stwierdzenie

jeśli widziałeś te uwagi na forum to pewnie też widziałeś uwagi o tzw FLAGACH i to ciebie powinno zainteresować bo przeniesienie tego wyświetlania do pętli głównej z przerwań jest dzięki nim BANALNIE proste - po prostu BANALNIE proste.

Masz bluebooka ? to zajrzyj proszę do rozdziału o TWI i zobacz jak działa flaga do obsługi RTC PCF8583 ..... no już prościej nie da się wyjaśnić i pokazać flag - ale zrozumiałbym gdybyś tego nie zrozumiał ;) i dopytał ... tymczasem wydaje mi się, że po prostu w ogóle nie zajrzałeś do tego rozdziału - zgadza się ?

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



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

Dołączył(a): 05 sie 2013
Posty: 1154
Lokalizacja: Lublin / Kraków
Pomógł: 72

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


U mnie tak wygląda obsługa przerwania

Następnie w pętli głównej jest robione takie coś:
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 paź 2013, o 13:37 
Offline
Użytkownik

Dołączył(a): 23 lip 2013
Posty: 83
Pomógł: 0

mirekk36 napisał(a):
A co ma wspólnego fakt że stosujesz wyświetlanie na LCD pod koniec przerwania czy na początku czy w środku - z zasadnością użycia tego w przerwaniu ? NIC :( ... kompletnie nic :( W każdym z przypadków wychodzi z tego jednakowa kicha niestety :( ... a to pokazuje że jeszcze nie rozumiesz przerwań ... ale ok jak chcesz się tego nauczyć to nie tłumacz dalej że tego nie da się inaczej zrobić albo że ciężko to zrobić bo to już kompletnie nieuzasadnione stwierdzenie

jeśli widziałeś te uwagi na forum to pewnie też widziałeś uwagi o tzw FLAGACH i to ciebie powinno zainteresować bo przeniesienie tego wyświetlania do pętli głównej z przerwań jest dzięki nim BANALNIE proste - po prostu BANALNIE proste.

Masz bluebooka ? to zajrzyj proszę do rozdziału o TWI i zobacz jak działa flaga do obsługi RTC PCF8583 ..... no już prościej nie da się wyjaśnić i pokazać flag - ale zrozumiałbym gdybyś tego nie zrozumiał ;) i dopytał ... tymczasem wydaje mi się, że po prostu w ogóle nie zajrzałeś do tego rozdziału - zgadza się ?

Czytałem z tej książki jednak wszystkich rzeczy nie przerabiałem dogłębnie, gdyż zależy mi konkretnie na jednym projekcie i zrealizowałem go w powyższy sposób. Zobaczę jak wyglądają te flagi, bo koniecznie chciałbym ten stoper zrealizować w powyższy sposób, tzn.jeden pomiar wykonywać przez przerwanie, a drugi bez niego.

W każdym razie byłem pewien, że wysłanie czegoś na wyświetlacz nie jest konieczne przy każdym przerwaniu, a jest wykonywane w jednym konkretnym momencie, na koniec działania, to w żaden sposób nie wpływa na wynik działania, gdyż program już wcześniej wszystko zrealizował bez tej obsługi.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 paź 2013, o 13:47 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 05 sie 2013
Posty: 1154
Lokalizacja: Lublin / Kraków
Pomógł: 72

Być może w takim prostym programie tego nie zauważysz. Ale istotą procedur obsługi przerwania jest to by były wykonywane jak najszybciej. Czemu? Dlatego, że przerwanie zatrzymuje wykonywanie WSZYSTKICH innych czynności które wykonuje procesor, nawet czegoś tak banalnego jak _delay_ms(). Jeśli np. multipleksujesz wyświetlacz i jakieś przerwanie np. INT0 trwa zbyt długo to zobaczysz przygaśniecie wyświetlacza.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 paź 2013, o 15:01 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27460
Lokalizacja: Szczecin
Pomógł: 1045

Cytuj:
Czytałem z tej książki jednak wszystkich rzeczy nie przerabiałem dogłębnie


No i właśnie to co robisz to TYPOWY objaw - jak się czyta na wyrywki i pomija niestety ISTOTNE rzeczy. Najgorzej gdy czytelnik traktuje rozdziały praktyczne tak jakbym namawiał go na siłę do napisania własnych bibliotek czy użycia omawianych tam układów i czyta na wyrywki ... Wtedy ma właśnie taką masakrę ... bo to właśnie na tych przykładach pokazuję techniki programowania ... a nie zachęcam do używania takich czy innych wyświetlaczy czy układów. A zatem czytanie tej książki na wyrywki szczególnie jak się jest takim początkującym to kompletny nonsens - bo ty nawet niestety nie wiesz co ci jest potrzebne a co nie .... :(

erykko napisał(a):
W każdym razie byłem pewien, że wysłanie czegoś na wyświetlacz nie jest konieczne przy każdym przerwaniu, a jest wykonywane w jednym konkretnym momencie, na koniec działania, to w żaden sposób nie wpływa na wynik działania, gdyż program już wcześniej wszystko zrealizował bez tej obsługi


Posłuchaj - założyłeś ten wątek na tym forum żeby się o coś zapytać ? czy żeby wytłumaczyć wszystkim JAK SIĘ PROGRAMUJE bo "coś tam" nie przeszkadza. Sorki ale ucinam takie bezsensowne wywody ponieważ - mogą na nie trafić inni początkujący, którzy zaczną popełniać TAKIE SAME BABOLE - a później powiedzą że tak wyczytali na forum atnelowskim.

Jeszcze raz podkreślam - masz MEGA BABOLE - podałem ci jakie - więc albo zrób z nimi porządek jeśli chcesz dalej pytać czy kod jest ok - albo zamykam ten wątek bo widzę, że próbujesz tłumaczyć że masz wszystko dobrze ...

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 26 paź 2013, o 10:15 
Offline
Użytkownik

Dołączył(a): 23 lip 2013
Posty: 83
Pomógł: 0

A gdybym jedno przerwanie zrealizował w następujący sposób? A więc dodałem nową zmienną "z", która podwyższa się co jeden przy każdym przerwaniu, ale wyświetlacz ma dostawać komunikaty dopiero w pętli głównej programu. W tej chwili to jeszcze nie działa poprawnie (wyświetlacz nic nie wyświetla, ale pracuję nad tym :) ).
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Nadal myślę jak zrealizować to pierwsze przerwanie pochodzące od timera i wywołujące komunikat na wyświetlaczu po osiągnięciu pewnego stanu licznika.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 26 paź 2013, o 12:29 
Offline
Użytkownik

Dołączył(a): 23 lip 2013
Posty: 83
Pomógł: 0

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

Jednak jest z tym mały problem, bo wyświetlacz wyświetla te flagi tak jakby nie miał ustawionego kontrastu. Ledwo można coś dostrzec.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 26 paź 2013, o 12:53 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 11 lut 2013
Posty: 376
Lokalizacja: Kłopoty-Stanisławy
Pomógł: 33

Wydaje mi się, że po ustawieniu flaga1 w Timerze i wywołaniu funkcji obsługującej daną flagę należałoby tą flagę wyzerować, na końcu funkcji na przykład, bo w pętli już po pierwszym wystąpieniu przerwania flaga cały czas jest ustawiona na 1 i cały czas się wykonuje w kółko i lcd_cls i lcd_str co może spowodować takie efekty wizualne.


Autor postu otrzymał pochwałę

_________________
50 znaków Atnela ....



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 26 paź 2013, o 13:51 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 05 sie 2013
Posty: 1154
Lokalizacja: Lublin / Kraków
Pomógł: 72

Tak, po wykonaniu czynności kontrolowanej flagą, musi ona wrócić do stanu poprzedniego, tak by wejście w przerwanie mogło ją ponownie ustawić. Inaczej raz ustawiona w przerwaniu będzie powodować nieustanne wykonywanie tego bloku funkcji związanych z wyświetlaczem. A z tego co pamiętam masz tam cls więc siłą rzeczy wyświetlacz jest cały czas kasowany.


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 26 paź 2013, o 14:29 
Offline
Użytkownik

Dołączył(a): 23 lip 2013
Posty: 83
Pomógł: 0

Dzięki bardzo! Rzeczywiście nie zauważyłem tego błędu.

Jeszcze bardzo bym prosił o to by ktoś sprawdził kod pod względem obliczeń, bo mam wrażenie, że czasami dostaję dziwne wyniki z timera. Mam kwarc 16MHz i włączony preskaler. Przy takich ustawieniach najmniejsza część sekundy jaka może zostać policzona to 0,000064s. Ale czasami stoper potrafi pokazać nieprawdopodobne wyniki w stylu 0,002123 czy 0,0212345. Wydaje mi się, że gdzieś jest błąd, tylko sam nie potrafię go znaleźć. Jakby ktoś coś zauważył byłbym wdzięczny.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 26 paź 2013, o 15:35 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 11 lut 2013
Posty: 376
Lokalizacja: Kłopoty-Stanisławy
Pomógł: 33

erykko napisał(a):
ISR(TIMER1_COMPA_vect) {
        TCCR1B &= ~((1 << CS12) | (1 << CS11) | (1 << CS10));
        TCNT1 = 0;
        wylaczenie();
        flaga1 = 1;
 
}


1. myślę, że ustawianie parametrów pracy Timera już w przerwaniu, to trochę za późno
2. Jak piszę jeden z naszych kolegów - Nie pisz komentarzy, dobry kod komentuje się sam - to Twój kod nie jest jeszcze tak dobry (BTW moje też nie są :) ) - gdybyś napisał w komentarzu co chciałeś osiągnąć byłoby trochę łatwiej.
3. Nie doczytałem jaki procek i zasadniczo niewielkie to znaczenie ma, ale za to wiadomo którego odpalić datasheet'a :)
4. Przy ustawianiu Timerów nie potrzebowałem chyba jeszcze nigdy negowania rejestrów (komentarze)
5. TCNT z tego co wiem nie odpowiada za COMPARE MATCH i tu chyba kolega powinien dać OCR - ale w sumie to nie wiem co kolega chciał osiągnąć (komentarze :) ) więc mogę się mylić i jest dobrze ...
6. znowu wywołanie funkcji wylaczenie() w Timerze - a nie lepiej byłoby flaga_wylacz ...
6a. po co, co kilka milisekund ( chyba, że rzadziej albo częściej - komentarze ) wywoływać funkcję która gasi diody ?


Autor postu otrzymał pochwałę

_________________
50 znaków Atnela ....



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 30 paź 2013, o 12:27 
Offline
Użytkownik

Dołączył(a): 23 lip 2013
Posty: 83
Pomógł: 0

Jeśli chodzi o przerwanie i ustawienie w nim timera to jest to wyłącznie jego zatrzymanie, a następnie wyzerowanie. Już tłumaczę o co chodzi, otóż jest to stoper, który ma za zadanie mierzyć czas reakcji odpowiednio diodą bądź buzzerem. Mam 2 opcje, pierwsza stosuje pojedynczy pomiar, z kolei kolejna to 5 pomiarów, z których wyciągana jest średnia. Przeniosłem za Twoją radą także funkcję wyłączenia do pętli głównej programu. Ale nadal byłbym wdzięczny, gdyby ktoś mi pomógł z problemem:) W tej chwili kod 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.

Aha, mikrokontroler to Atmega32. A komentarze sobie pozostawię dla samego siebie.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 31 paź 2013, o 19:59 
Offline
Użytkownik

Dołączył(a): 23 lip 2013
Posty: 83
Pomógł: 0

Dodam jeszcze kilka informacji w pigułce. Otóż mikrokontroler to Atmega32, kwarc to 16MHZ. Stosuję timer 16-bitowy w trybie CTC, a prescaler 1024, więc w ciągu sekundy mam 15625 impulsów. W związku z tym mnożę otrzymaną wartość razy 64, dzięki czemu po podzieleniu przez milion mogę otrzymać część całkowitą i tą ułamkową po przecinku. Gdzieś musi być jakiś błąd, z tym że nie potrafię go zauważyć. Cały kod przedstawia się tak:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Jednak błędu należałoby szukać gdzieś tutaj:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Analogiczny kod jest dla pomiaru 5-krotnego, więc tam występuje ten sam babol. Tylko, że za nic nie potrafię go znaleźć.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 31 paź 2013, o 20:47 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 11 lut 2013
Posty: 376
Lokalizacja: Kłopoty-Stanisławy
Pomógł: 33

Erykko - dalej nie mam pojęcia jak ma działać Twój układ i nikt chyba nie wie i nie rozumie jak objawia się błąd. Napisz więc proszę jak ma działać (w miarę dokładnie), dodaj schemat żeby ew. ktoś mógł sobie zbudować układ u siebie i przetestować. Napisz jak objawia się błąd i dlaczego uważasz go za błąd ( możliwe że program działa właściwie ale niezgodnie z Twoimi oczekiwaniami). Musisz napisać coś więcej.

------------------------ [ Dodano po: 1 minucie ]

Jakiej biblioteki LCD używasz ?

_________________
50 znaków Atnela ....



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 31 paź 2013, o 21:25 
Offline
Użytkownik

Dołączył(a): 23 lip 2013
Posty: 83
Pomógł: 0

Obrazek
Tak wygląda schemat, korzystam ze standardowej biblioteki p. Mirka, dodałem tylko możliwość wyświetlania dłuższych liczb (long int). Czym objawia się złe działanie, otóż układ wyświetla wynik w postaci 0,012345s czy 0,001234s, który jest niemożliwy fizycznie do uzyskania. Czasami też wynik potrafi wynosić 0,000000s.

KEY1_PIN startuje timer, KEY2 go zatrzymuje, zeruje, wyświetla wynik. KEY3_PIN startuje 5 kolejnych pomiarów, z których wyciągana jest średnia. Pomiary odbywają się przy użyciu przerwania ISR(INT0_vect). Jak widać jest to licznik mierzący czas reakcji, z tym że ma dosyć dużą dokładność.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 31 paź 2013, o 23:13 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 11 lut 2013
Posty: 376
Lokalizacja: Kłopoty-Stanisławy
Pomógł: 33

Napisz jeszcze proszę o jakiej dokładności mówisz, jaka jest Ci potrzebna, a jaką ustawiłeś w swoim programie ?

Próbowałem zanalizować Twój kod ale naprawdę wymiękłem w pewnym momencie... :(



PS. Zacząłem pisać swój własny stoper i może będzie działał trochę inaczej niż napisałeś ale może jakoś Ci pomoże. Niestety nie mogę obiecać na kiedy będzie, ale postaram się jak najszybciej. Ja założyłem, że 1/100 sek jest wystarczająco dokładne, więc przerwanie będzie co 10 ms.

_________________
50 znaków Atnela ....



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 1 lis 2013, o 07:40 
Offline
Użytkownik

Dołączył(a): 23 lip 2013
Posty: 83
Pomógł: 0

Wycisnąłem z tego najwięcej, tzn. dokładność 6 miejsc po przecinku (mikrosekundy). A dokładnie najmniejszą częścią sekundy jaką potrafię zmierzyć jest 0,000064s.

W moim przykładzie są 2 przerwania, pierwsze jest używane do wysłania komunikatu na wyświetlacz, a drugie do zatrzymania stopera i wykonania obliczeń. Nie są one uruchamiane cyklicznie. Timer jest uruchomiony w trybie CTC, więc w każdej sekundzie pojawia się określona liczba impulsów. Po wciśnięciu przycisku następuje zatrzymanie timera, odczytanie stanu liczby impulsów zliczonych przez timer, a następnie obliczenia.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 1 lis 2013, o 08:40 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 11 lut 2013
Posty: 376
Lokalizacja: Kłopoty-Stanisławy
Pomógł: 33

To tak mniej więcej jesli się nie mylę to powinieneś odjąć jeszcze przynajmniej 80ms do wyniku bo tracisz je na drgania styków. A tak na gorąco - to chyba nie możliwe jest policzenie każdego impulsu zegara AtMegi ... ale muszę się jeszcze nad tym zastanowić :)

------------------------ [ Dodano po: 7 minutach ]

no dobra 1us to 16 instrukcji uP więc powinno się dać ... ( ale po co ? )

------------------------ [ Dodano po: 19 minutach ]

Napisałeś, że jesteś w stanie zmierzyć
erykko napisał(a):
0,000064s.
... Jak ?
O ile mnie wzrok nie myli (o tak wczesnej porze :) ) to jest 64 us ....

Jeden cykl zegara przy 16Mhz wykonywany jest co 62,5 ns .... więc po 16 cyklach masz dokładnie 1 us ( pod warunkiem, że nie będziesz używał delay, lcd, działań arytmetycznych, itp )

_________________
50 znaków Atnela ....



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 1 lis 2013, o 13:10 
Offline
Użytkownik

Dołączył(a): 23 lip 2013
Posty: 83
Pomógł: 0

Mam 16MHz, ale prescaler 1024, więc impulsów w ciągu sekundy mam 15625, stąd ten wynik. Ale spróbuję dodać jeszcze 80ms do wyniku, z tym że to nie wyjaśnia skąd czasami pojawia się rezultat 0,000000s. Nie wiem czy dobrze rozumuję, poprawcie mnie jeśli się mylę. W każdym razie kwarc jest 16MHz, ale 2-bitowy timer nie liczy do takiej wartości, więc używam prescalera, tak by spokojnie doliczyć do tych kilku sekund.

A po co mi tak duża dokładność? Akurat ma to być możliwie najdokładniejszy stoper, więc dlatego tak dużo miejsc po przecinku.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 1 lis 2013, o 14:22 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 11 lut 2013
Posty: 376
Lokalizacja: Kłopoty-Stanisławy
Pomógł: 33

erykko, zerknij

https://www.youtube.com/watch?v=BGTkkmNs_oE


Autor postu otrzymał pochwałę

_________________
50 znaków Atnela ....



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 1 lis 2013, o 20:51 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 11 lut 2013
Posty: 376
Lokalizacja: Kłopoty-Stanisławy
Pomógł: 33

Właśnie sprawdzałem jak się uC zachowa przy 1us ... nie ogarnia się , nawet przy kwarcu 20Mhz

_________________
50 znaków Atnela ....



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 1 lis 2013, o 21:07 
Offline
Użytkownik

Dołączył(a): 23 lip 2013
Posty: 83
Pomógł: 0

Aha, czyli tu może być pies pogrzebany...



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 1 lis 2013, o 21:09 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 11 lut 2013
Posty: 376
Lokalizacja: Kłopoty-Stanisławy
Pomógł: 33

właśnie testuję dla 10us i 20MHZ i w ogóle czasy się nie zgadzają

_________________
50 znaków Atnela ....



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 2 lis 2013, o 11:15 
Offline
Użytkownik

Dołączył(a): 23 lip 2013
Posty: 83
Pomógł: 0

Poprawiłem nieco kod, tak by liczenie odbywało się w ms, a nie us (jak było wcześniej). Uruchomiłem dodatkowo timer 8-bitowy, który zlicza milisekundy. Tak przedstawia się kod:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


O ile pomiar jednokrotny działa w porządku (służy do tego KEY1_PIN oraz KEY2_PIN), o tyle pomiar 5-krotny nie pokazuje prawidłowego wyniku, tak jakby nie dzielił przez 5 i mam wynik 1200-1500ms zamiast 200-300ms. Czy ktoś widzi tu może jakiś błąd? Do pomiaru 5-krotnego służy KEY3_PIN oraz przerwanie zewnętrzne ISR(INT0_vect).



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 2 lis 2013, o 12:43 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 11 lut 2013
Posty: 376
Lokalizacja: Kłopoty-Stanisławy
Pomógł: 33

A w którym miejscu kolega napisał że to ma być podzielone przez 5 ? ( jakoś nie mogę tego dopatrzyć )

PS. 80 ms to raczej trzeba odjąć a nie dodać, bo dodajesz już przy "debouncingu" więc 2 razy oszukujesz kolesia któr się sprawdza, a to już jest 160 ms ( ~1/6 sekundy ... ) więc już całkiem sporo, zwłaszcza że wcześniej chciałeś walczyć o 1us ....

_________________
50 znaków Atnela ....



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 2 lis 2013, o 12:50 
Offline
Użytkownik

Dołączył(a): 23 lip 2013
Posty: 83
Pomógł: 0

Usunąłem w ogóle ten fragment z dodawaniem czy odejmowaniem 80s, bo też wyniki są wtedy zbyt niskie. A dzielenie następuje przy fragmencie "if (flaga2)". Teraz kod przedstawia się mniej więcej tak:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Pojedynczy pomiar pokazuje mi czas od 200 do 300ms, czyli mniej więcej poprawny. Natomiast 5-krotny pokazuje mi na przemian raz kilka tysięcy ms, innym razem 400-700ms, czyli tez niepopranie.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 2 lis 2013, o 13:12 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 11 lut 2013
Posty: 376
Lokalizacja: Kłopoty-Stanisławy
Pomógł: 33

Czy mógłbyś mi opisać w którym miejscu robisz obliczenia ?

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

Ew. mam ten kod który widziałeś na filmiku i jak chcesz to moge go wrzucić... Bo nie bardzo już rozumiem Twój kod i Twój tok myślenia i dlaczego tak bardzo upierasz się przy pewnych rzeczach.

_________________
50 znaków Atnela ....



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: 33 ]  Przejdź na stronę 1, 2  Następna strona

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 4 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:  
cron
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO