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



Teraz jest 20 kwi 2026, o 16:31


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 31 ]  Przejdź na stronę 1, 2  Następna strona
Autor Wiadomość
PostNapisane: 8 sty 2015, o 13:40 
Offline
Użytkownik

Dołączył(a): 10 kwi 2014
Posty: 141
Lokalizacja: 3-miasto
Pomógł: 0

Witam

W ramach ćw. zrobiłem sobie mały programik który wyswietla czas na wyśw. hd 44780 ( zegarek).
Do wyznaczenia czasu uzyłem sprzętwego timera1 w atmeg8 który generuje przerwania co 10 ms.
W procedurze przerwania odpowiednio zliczane są setne sek, sek, min, i godz.
Procesor taktowany 8 Mhz , preskaler 64 , wartośc OCR1A = 1249 co daje przerwanie równo co 10ms

No i problem polega na tym że na kazdej minucie przyspiesza o 2 sek.
Co może być przyczyną? - niedokładnośc sprzetowego kwarca raczej odpada bo odchyłka jest zbyt duża
- błąd w programie, jesli tak to prosiłbym jakiegoś " Zegarmistrza " o przyjzenie sie programowi ;-)
bo ja tego błedu nie widze ;-)

Pozdrawiam Mac

oto 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: 8 sty 2015, o 13:54 
Offline
Użytkownik

Dołączył(a): 15 cze 2013
Posty: 599
Lokalizacja: Lubin
Zbananowany użytkownik

Pomógł: 35

Mac napisał(a):
Co może być przyczyną? - niedokładnośc sprzetowego kwarca

Nie ma czegoś takiego ja sprzętowy kwarc, wewnątrz procka jest wewnętrzny generator RC. Na pewno nie ma on równiutko 8Mhz a jako że generuje na podstawie rezystora i kondensator to zmiana temperatury zmienia częstotliwość.
Jeśli zastosujesz zewnętrzny kwarc 8MHz też może nie mieć dokładnie tyle może wystąpić odchyłka kilku herców, ale jest o wiele stabilniejszy niż generator RC w procku.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 8 sty 2015, o 14:06 
Offline
Użytkownik

Dołączył(a): 22 lut 2014
Posty: 205
Lokalizacja: Poznań
Pomógł: 22

Wydaje mi się, że to jednak nie dokładność wewnętrznego oscylatora. Bo program jest OK.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 8 sty 2015, o 14:25 
Offline
Użytkownik

Dołączył(a): 10 kwi 2014
Posty: 141
Lokalizacja: 3-miasto
Pomógł: 0

Odeon racja z tym sprzetowym kwarcem to przesadziłem ;-)

Gumeni gdzies tam przecztałem ze odchyłka może wyniesc ok 2 sek ale na dobe kurcze teraz juz sam nie wiem



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 8 sty 2015, o 15:21 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 25 lis 2013
Posty: 120
Lokalizacja: Koło
Pomógł: 6

Zastosuj kwarc stosowany w zegarkach dołóż do niego 2 kondensatory po 22pF i będziesz mógł wtedy "prawie" dokładnie odmierzyć 1 sek. Koniecznie muszą być kondensatorki bo bez nich też będziesz miał większą niedokładność 1 sekundy

_________________
Kompleksowa realizacja ogrodów



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 8 sty 2015, o 15:26 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 02 gru 2014
Posty: 53
Pomógł: 2

W drugiej pętli wyłączasz i włączasz przerwanie po mimo iż nie zmieniasz godziny.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 8 sty 2015, o 16:20 
Offline
Użytkownik

Dołączył(a): 10 kwi 2014
Posty: 141
Lokalizacja: 3-miasto
Pomógł: 0

Bodowp - jak to mozliwe że właczam i wyłączam przerwania w 2 pętli skoro w 2 pętli nie ma ani jednej instrukcji włączajacej lub wyłączającej przerwania



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 8 sty 2015, o 16:28 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 17 sie 2013
Posty: 3797
Lokalizacja: Grudziądz
Pomógł: 143

Co obieg pętli blokujesz procesor na 500 ms jest to suma wszystkich _delay_ms(xx);

dodatkowo jak zaczniesz zmieniać nastawy zegarka to kolejne

_delay_ms(xx);

blokuje ci go już na prawie lub ponad sekundę tego nie liczyłem widząc pierwszego delaya na 700 ms


Kolego masz program strasznie blokujący pracę całego procesora.

Wykorzystaj timer zamiast _delay_ms
a będzie już niebo dokładniej

nie mniej dokładnie to nie będzie bo odchyłka pracy timera zależy od temperatury otoczenia w jakiej pracuje procesor.

Do tego celu najlepiej użyć zewnętrzne przerwanie np na pinie INT0 i pobierać idealne tyknięcia z układu PCF8583
wystarczy mu podać zasilanie, kwarc zegarkowyi już zacznie scalaczek generować przerwanie.

No ale jak już mamy scalaczek to warto iść dalej i komunikować się z nim po I2C i z niego czytać czas i date wtedy będzie bardzo idealnie :)


Taką drogę polecam obrać przy zabawie z idealnym zegarkiem

------------------------ [ Dodano po: 10 minutach ]

Mac napisał(a):
gdzies tam przecztałem ze odchyłka może wyniesc ok 2 sek ale na dobe kurcze teraz juz sam nie wiem


Odchyłka może wynieść i więcej niż 2 sek zależy jak program napiszesz co już przytoczyłem wyżej.

Nie mniej nie załamuj się postaramy ci się pomóc ...

jak nie masz układu rtc to możesz użyć pinów gdzie podepniesz kwarc zegarkowy też to przechodziłem pamiętam że Antystatyczny mi pomógł rozwiązać problem na testy ale nie mogę znaleźć tematu ... jak tylko znajdę to go tu podepnę.

_________________
Usługi druku przestrzennego - www.drumik.pl



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 8 sty 2015, o 16:57 
Offline
Użytkownik

Dołączył(a): 22 lut 2014
Posty: 205
Lokalizacja: Poznań
Pomógł: 22

Od kiedy _delay_ms() ma wpływ na wywoływanie się przerwania?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 8 sty 2015, o 19:39 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 17 sie 2013
Posty: 3797
Lokalizacja: Grudziądz
Pomógł: 143

Nie piszę że ma wpływ na wywoływanie się timera ba piszę wyraźnie że blokuje on pętlę główną a w przypadku tego kodu to to wystarczy np też i fakt że kolega ma 2x pętlę while no i fakt że kolega ustawia bity w tccr1b a pozniej skacze do ocr1a.

Pozniej zamiast utworzyc zmienna temp do ustawiania czasu to wylacza przerwanie na czas peli 2 while

Wogole po co tam tyle petli while.

Namazane ze smarta.

_________________
Usługi druku przestrzennego - www.drumik.pl



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 8 sty 2015, o 20:30 
Offline
Użytkownik

Dołączył(a): 10 kwi 2014
Posty: 141
Lokalizacja: 3-miasto
Pomógł: 0

Majster to jak wtedy napisac program aby wycisnąć największą dokładnośc z wew. oscylatora i nie blokowac programu głownego?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 8 sty 2015, o 20:40 
Offline
Użytkownik

Dołączył(a): 27 lut 2013
Posty: 230
Pomógł: 4

Proponuję obejrzeć filmik Mirka :
http://mirekk36.blogspot.com/2013/11/rtc-ds3231-najdokadniejszy-zegarek-na.html

Nie chodzi mi oto żebyś od razu zaopatrywał się w ten układ, ale Mirek tam Ci wytłumaczy dlaczego masz takie odchyłki i nie będziesz miał już żadnych wątpliwości , że gdzieś tam doczytałeś o 2s. itp.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 8 sty 2015, o 20:46 
Offline
Użytkownik

Dołączył(a): 10 kwi 2014
Posty: 141
Lokalizacja: 3-miasto
Pomógł: 0

Dzięki Michał



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 9 sty 2015, o 13:02 
Offline
Użytkownik

Dołączył(a): 10 kwi 2014
Posty: 141
Lokalizacja: 3-miasto
Pomógł: 0

W poradniku odchyłki są dobrze wytłumaczone, ale komunikacji I2C jeszcze nie przerabiałem

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

Cytuj:
Kolego masz program strasznie blokujący pracę całego procesora.

Wykorzystaj timer zamiast _delay_ms
a będzie już niebo dokładniej


Tzn. jakby to miało wygladać?- delay_ms stosowane są do redukcji drgań styku i stabilizacji wyświetlacza - nie wiem jak to sie robi w oparciu o Timery.

Zaopatrze się w kwarc i kondensatorki i zobacze czy coś sie zmieni.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 9 sty 2015, o 13:13 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 02 gru 2014
Posty: 53
Pomógł: 2

W poradnikach Mirka czy też na blogu najlepiej poszukaj po prawej stronie drgania styku. Cały poradnik jak to zrobić nie używając dalay 'ów ;-)

Dmuchnięte z pąpki od materaca.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 9 sty 2015, o 13:20 
Offline
Użytkownik

Dołączył(a): 22 gru 2012
Posty: 256
Lokalizacja: Rumia
Pomógł: 22

Jacie kręcę, w kółko to samo ;) Mirka blog się kłania, a dokładnie to tu http://mirekk36.blogspot.com/2012/10/dr ... ak-to.html

_________________
http://www.marcingibas.pl



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 9 sty 2015, o 18:22 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 17 sie 2013
Posty: 3797
Lokalizacja: Grudziądz
Pomógł: 143

Mac napisał(a):
W poradniku odchyłki są dobrze wytłumaczone, ale komunikacji I2C jeszcze nie przerabiałem

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

Cytuj:
Kolego masz program strasznie blokujący pracę całego procesora.

Wykorzystaj timer zamiast _delay_ms
a będzie już niebo dokładniej


Tzn. jakby to miało wygladać?- delay_ms stosowane są do redukcji drgań styku i stabilizacji wyświetlacza - nie wiem jak to sie robi w oparciu o Timery.

Zaopatrze się w kwarc i kondensatorki i zobacze czy coś sie zmieni.

Skoro zostałem wywołany o delay. To zapytam czy ma kolega ksiazke bb?

Namazane ze smarta.

_________________
Usługi druku przestrzennego - www.drumik.pl



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 9 sty 2015, o 20:41 
Offline
Użytkownik

Dołączył(a): 01 mar 2014
Posty: 117
Lokalizacja: Kraków
Zbananowany użytkownik

Pomógł: 1

Szanowni Państwo! Choćby zastosować najdokładniejszy na świecie generator 8 MHz to i tak zegarek będzie niedokładny. Ba! Nawet na 16 Mhz będzie niewiele lepiej. Policzcie sobie 8000000/2^23. A teraz wynik *3600. Wychodzi, że na godzinę składają się 3433,2... sekundy. A teraz weźcie kwarc zegarkowy 32768/2^15. I co?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 9 sty 2015, o 20:46 
Offline
Użytkownik

Dołączył(a): 01 mar 2014
Posty: 117
Lokalizacja: Kraków
Zbananowany użytkownik

Pomógł: 1

Poza tym już gdzieś pisałem, że jak komuś 32,768kHz dla głównego programu mało, to np w mega88 można podłączyć kwarc zegarkowy do wejść TOSC i generować przerwanie od Timera2, jak dobrze pamiętam.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 9 sty 2015, o 21:01 
Offline
Użytkownik

Dołączył(a): 01 mar 2014
Posty: 117
Lokalizacja: Kraków
Zbananowany użytkownik

Pomógł: 1

Zapomniałem o OCR;) 8000000/64/1250=100 Mój błąd. Ale drugi post pdtrzymuję:)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 9 sty 2015, o 21:02 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 29 sty 2012
Posty: 777
Lokalizacja: Karpicko k. Wolsztyna
Pomógł: 197

Można też procesor puścić na np. 8MHz z wewnętrznego oscylatora a do odmierzania jednej sekundy użyć Timera2 w trybie asynchronicznym taktowanym kwarcem 32768Hz podłączonym do pinów TOSC1 i TOSC2.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 9 sty 2015, o 21:03 
Offline
Użytkownik

Dołączył(a): 01 mar 2014
Posty: 117
Lokalizacja: Kraków
Zbananowany użytkownik

Pomógł: 1

Malowałem łazienkę i się rozpuszczalnika do flalowych nawąchałem...



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 9 sty 2015, o 21:15 
Offline
Użytkownik

Dołączył(a): 01 mar 2014
Posty: 117
Lokalizacja: Kraków
Zbananowany użytkownik

Pomógł: 1

jacekk232 napisał(a):
Można też procesor puścić na np. 8MHz z wewnętrznego oscylatora a do odmierzania jednej sekundy użyć Timera2 w trybie asynchronicznym taktowanym kwarcem 32768Hz podłączonym do pinów TOSC1 i TOSC2.


Zdublowałeś mnie;)



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

Dołączył(a): 10 kwi 2014
Posty: 141
Lokalizacja: 3-miasto
Pomógł: 0

Zacząłem studiować poradnik Mirka Obsługa klawiszy - zwłoka czasowa
http://mirekk36.blogspot.com/2012/10/ob ... a-cd3.html

i prosiłbym o pomoc w zrozumieniiu tego wyrażenia : register uint8_t key_press = (*btn->KPIN & btn->key_mask);
wyrażenie znajduje sie w definicji funkcji key_press()
bo ja to rozumiem tak; :-)
*btn->KPIN jest to wskaźnik do struktury TBUTTON tyle że w definicji klawisza TBUTTON button KPIN = &PINC
czyli mozemy podstawic ( &PINC & btn -> key-mask) dlaczego do PINC jest dołączony operator pobierania adresu skoro przy wskaźniku jest gwiazdka?
Teraz druga część: & btn-> key_mask dlaczegu tu z kolei nie ma gwiazdki przy wskaźniku ?



oto cały kod programu:

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: 12 sty 2015, o 20:12 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 29 sty 2012
Posty: 777
Lokalizacja: Karpicko k. Wolsztyna
Pomógł: 197

Zmienna KPIN w strukturze to wskaźnik na zmienną uint8_t. W tym przypadku będzie to jeden z rejestrów PINx procka.
Natomiast zmienna key_mask to zwykła zmienna uint8_t.

Aby dostać się do pola struktury poprzez wskaźnik należy użyć operatora strzałki. Przy użyciu strzałki od razu wiadomo że chodzi o wartość zmiennej na którą wskazuje wskaźnik.

W tym zapisie *btn->KPIN jest gwiazdka bo poprzez wskaźnik (operator strzałki) dostajemy się do pola struktury, które jest wskaźnikiem na zmienną uint8_t.
Natomiast w tym zapisie btn-> key_mask poprzez wskaźnik dostajemy się do pola struktury które jest zwykłą zmienną.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 sty 2015, o 13:57 
Offline
Użytkownik

Dołączył(a): 10 kwi 2014
Posty: 141
Lokalizacja: 3-miasto
Pomógł: 0

Dzieki Jacek
zaczynam łapać jak się uzywa wskaźników w strukturach
czyli :
wskaźnik na wskaźnik w strukturze dajemy gwiazdkę
wskaźnik na zwykła zmienną w strukturze - nie dajemy gwiazdki
wskaźnik na funkcję która też jest wskaźnikiem - również nie dajmy gwiazdki

Pozdrawiam Mac



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 15 sty 2015, o 10:37 
Offline
Użytkownik

Dołączył(a): 10 kwi 2014
Posty: 141
Lokalizacja: 3-miasto
Pomógł: 0

Cytuj:
kolega ustawia bity w tccr1b a pozniej skacze do ocr1a.


Z tego co udało mi się rozszyfrować to myslałem że mam dobrze - jak wpisze ocr1b to dzieja sie "dziwne " rzeczy więc jak to powinno byc poprawnie? tak aby wszystko było z jednego typu.

Cytuj:
Pozniej zamiast utworzyc zmienna temp do ustawiania czasu to wylacza przerwanie na czas peli 2 while

O jaką zmienną temp chodzi?

Z góry dzieki za wszelką pomoc
Majster oczywiście ze mam BB

Pozdrawiam Mac



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

Dołączył(a): 17 sie 2013
Posty: 3797
Lokalizacja: Grudziądz
Pomógł: 143

Delkarujesz sobie zmienna np tempmenu.

A w petli sprawdzasz czy jest 0 czy 1 i np jezeli tempmenu = 0 wtedy obiczasz wyswietlasz itp. Jezeli zmienna tempmenu = 1 to realizujesz menu i ustawienia itp.

Wchodzac np w ustawienia godziny przypisujesz ja np do tempgodzina tak samo robisz z minutami i mozesz spokojnie ustawiac czas.

Jak juz ustawisz to wpisujesz do zmiennych czasu wartosci z temp zerujesz zmienna tempmenu i zegar dalej wyswietla to co liczyl w przerwaniu.

W ten sposob nie blokujesz programu.

Namazane ze smarta.


Autor postu otrzymał pochwałę

_________________
Usługi druku przestrzennego - www.drumik.pl



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 15 sty 2015, o 20:07 
Offline
Użytkownik

Dołączył(a): 10 kwi 2014
Posty: 141
Lokalizacja: 3-miasto
Pomógł: 0

Witam

Ciekawostka właśnie podłączyłem kwarc 8Mhz i 2 kondesatorki i po 10 minutach wg stoperu nie widze różnicy :-), ale i tak zamierzam napisac program nieblokujący procka

------------------------ [ Dodano po: 26 minutach ]

Dzięki Majster przerobie ten program wg twoich rad



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 20 sty 2015, o 15:16 
Offline
Użytkownik

Dołączył(a): 10 kwi 2014
Posty: 141
Lokalizacja: 3-miasto
Pomógł: 0

Witam ponownie
udało mi sie wkońcu program który nie blokuje tak procesora niestety jednak dokładnośc jest taka sama jak przy poprzedniej wersji z kwarcem zewnetrznym czyli ok 1 sek spoźnienia na 1,5h
zastanawiam sie nad jakąś dodatkową kalibracją.
albo jak tutaj kolega poradzil
Cytuj:
Można też procesor puścić na np. 8MHz z wewnętrznego oscylatora a do odmierzania jednej sekundy użyć Timera2 w trybie asynchronicznym taktowanym kwarcem 32768Hz podłączonym do pinów TOSC1 i TOSC2.

oto 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  
Wyświetl posty nie starsze niż:  Sortuj wg  
Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 31 ]  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 2 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