Aktyw Forum

Zarejestruj się na forum.ep.com.pl i zgłoś swój akces do Aktywu Forum. Jeśli jesteś już zarejestrowany wystarczy, że się zalogujesz.

Sprawdź punkty Zarejestruj się

Mam do zrobienia dziwny zegar

Awatar użytkownika
Woycek
-
-
Posty:62
Rejestracja:30 sty 2005, o 09:51
Lokalizacja:Ostrów Wielkopolski
Kontaktowanie:
Mam do zrobienia dziwny zegar

Postautor: Woycek » 21 wrz 2005, o 07:56

Witam!!
Mam do rozwiązania taki problem: ma to być zegar z dwoma wyświetlaczami o funkcji ;godziny minuty dzień miesiąc i rok.Dotego momentu nie mam problemu....ale takie wyświetlacze mają być dwa...i tu też nie ma problemu...klocki zaczynają się w momencie gdy wyjaśnie zasadę pracy tego"cosia"...Pierwszy wyświetlacz ma pokazywać bieżący czas i datę(i to jest w miarę proste)natomiast drugi wyświetlacz ma pokazywać czas "wirtualny"...Czyli zegar musi mieć możliwość zapamiętania pewnych "punktów czasowych"w ciągu dnia(lub paru dni)kiedy czas "wirtualny" zmieni sie w stosunku do czasu realnego..A tak całkiem prosto....np.dziś do godziny 9.00 zegary mają pracować synchronicznie(czyli pokazywać te same wskazania)o 9.00 na wyświetlaczu "wirtualnym" godzina ma zmienić się na 11.30 i zegary mają nadal pracować,o godzinie 10.00 na wyświetlaczu "wirtualnym" godzina ma zmienić się na 7.00 i data na dzień następny..itd.. takich punktów czasowych będzie około 20.Proszę o wsparcie...na początek jeśli ktoś wykumałby ideę jak się do tego zabrać..Myślę że małą przeszkodą jest fakt że potrafię "coś niecoś czyli rodzina 8051"zaprogramować tylko w asemblerze.Proszę więc nie piszcie postów typu:AVR nadaje sie do tego lepiej,czy Bascom poradzi sobie z tym bez problemu...
Ja chciałbym zrobić to na 8051 i w asemblerze...bo na dzień dzisiejszy takie mam możliwości..Pozdrawiam i czekam na ewentualną pomoc.
Ostatnio zmieniony 27 mar 2007, o 14:18 przez Woycek, łącznie zmieniany 1 raz.

Gienek1
-
-
Posty:56
Rejestracja:8 wrz 2003, o 16:27
Lokalizacja:Tarn-Góry

Postautor: Gienek1 » 21 wrz 2005, o 09:50

Z tego co zrozumiałem to jeden zegar cały czas idzie normalnie tylko ten "wirtualny" ma "fiksować". Wydaje mi się że nic prostrzego. Poprostu względem tego pierwszego trzeba przestawiać a raczej ustawiać ten drugi na żądany czas i po kłopocie. Chyba że coś nie zrozumiałem.

Guru
-
-
Posty:250
Rejestracja:30 cze 2003, o 13:26
Lokalizacja:Kraków

Postautor: Guru » 21 wrz 2005, o 10:03

Koncepcja jest taka:
przerwanie które co pewien czas (np. 1s) skacze do procedury która wykonuje następujące operacje:
- uaktualnia zegar1(czyli inkrementuje odpowiednie liczniki dni1, godzin1, minut1, sekund1)
- sprawdza czy jest to punkt (czasowy) do zmiany zawrtości liczników zegara2
jeżeli tak to
-- ustawia odpowiednie liczniki zegara2 (dni2, godzin2, minut2, sekund2)
jeżeli nie to:
-- uaktualnia zegar2(czyli inkrementuje odpowiednie liczniki dni2, godzin2, minut2, sekund2)
- aktualizuje wyświetlacz
)

Awatar użytkownika
Woycek
-
-
Posty:62
Rejestracja:30 sty 2005, o 09:51
Lokalizacja:Ostrów Wielkopolski
Kontaktowanie:

Postautor: Woycek » 21 wrz 2005, o 11:09

Dzięki za rady...A co myślicie o zastosowaniu RTC do "poganiania" zegara realnego...bo to chyba uprości sprawę...mam wyświetlać godziny minuty dzień miesiąc i rok?Chyba że ktoś podrzuci mi gotową procedurkę(oczywiście w asemblerze)takiego programiku który "robiłby" za RTC.

Gienek1
-
-
Posty:56
Rejestracja:8 wrz 2003, o 16:27
Lokalizacja:Tarn-Góry

Postautor: Gienek1 » 24 wrz 2005, o 08:13

Przerwanie obsługujące zegar

Kod: Zaznacz cały

;------------------ OBTF0: ; Przerwanie co 250 us napedzajace dzielnik 1/40 ; a ten Licznik Stopera co 0.01 sek ; oraz dzielnik 1/100 ktory napedza Licznik Czasu co 1 sek ; czyta klawiature push psw push acc ;dzielnik przerwan do 0.01 sekundy inc Dz40 mov a,Dz40 cjne a,#40,K_TF0 mov Dz40,#0 ;pobranie stanu klawiatury mov a,p3 cpl a anl a,#0fh mov NEWK,a ;KEY ;dzielnik przerwan do 1 sekundy inc Dz100 mov a,Dz100 cjne a,#100,Nie100 mov Dz100,#0 ;dodanie sekundy do Licznika Czasu setb C_Termo ;Odczytaj temperature call L_Czasu Nie100: jnb StartStop,K_TF0 ;dodanie setki do Licznika Stopera call L_Stoper K_TF0: pop acc pop psw reti
a tu procedura L_Czas

Kod: Zaznacz cały

;----------------------------- ;Licznik czasu 23-59-59 L_Czasu: push 0 push 1 mov a,L_SEK jnz Nie0 mov r0,#Disp2 mov r1,#8 L_C_Loop: mov @r0,#0 ;zerowanie kolejnego bajtu sekundnika inc r0 djnz r1,L_C_Loop Nie0: mov r0,#Disp2 mov r1,#8 setb c L_C_Loop1: mov a,@r0 rlc a ;zapalenie nastepnej diody sekundnika mov @r0,a inc r0 djnz r1,L_C_Loop1 ;odczyt temperatury ; call Czyt_Termo ;robi blad ???? ; nalerzy przenies do programu glownego (zbyt dluga) pop 1 pop 0 ;korekta sekund PSek: inc L_SEK mov a,L_SEK clr c clr psw.6 ;przeniesienie polowkowe da a mov L_SEK,a ;sprawdzenie czy 0 lub 5 jnb Scan_CT,PSek1 anl a,#0fh jnz Czy5 mov Rodzaj,#R_Termo Czy5: cjne a,#5,PSek1 mov Rodzaj,#R_Czas PSek1: mov a,L_SEK cjne a,#60h,NIE_01 mov L_SEK,#0 ;korekta minut PMin: inc L_MIN mov a,L_MIN clr c da a mov L_MIN,a cjne a,#60h,WSJO_01 mov L_MIN,#0 ;korekta godzin PGodz: inc L_GODZ mov a,L_GODZ clr c da a mov L_GODZ,a cjne a,#24h,WSJO_01 mov L_GODZ,#0 NIE_01: WSJO_01: ret
wprawdzie nie robi miesięcy i lat ale to można dopisać.

Awatar użytkownika
Woycek
-
-
Posty:62
Rejestracja:30 sty 2005, o 09:51
Lokalizacja:Ostrów Wielkopolski
Kontaktowanie:

Postautor: Woycek » 28 wrz 2005, o 12:34

A tak na poważnie to zatkałem sie na (pewnie dla fachowców)śmiesznym problemie...a mianowicie podczas pracy programu jeden z rejestrów zmienia swoją wartość a konkretnie zwiększa się.Ja nie mogę znaleźć prostej metody aby porównać zawartość rejestru...ale z wieloma stałymi...To znaczy np.R0=5 a ja muszę w danej chwili sprawdzić czy R0=1,3,5,7,9..potrafię to zrobić ciągiem komend typu CJNE a może ktoś podpowie mi prostszy sposób???????????????
Ostatnio zmieniony 29 wrz 2005, o 09:14 przez Woycek, łącznie zmieniany 1 raz.

Guru
-
-
Posty:250
Rejestracja:30 cze 2003, o 13:26
Lokalizacja:Kraków

Postautor: Guru » 29 wrz 2005, o 06:35

Woycek o co Ci chodzi z tym wycinaniem i wklejaniem.
Ja tutaj widzę, że gość się sporo napracował pisząc a nawet przepisując tą procedurę,
bo przecież żeby przepisać trzeba mieć też z czego.
A co do porównań to:
np. zakładasz tablicę i w pętli porównujesz zawartość kolejnych elementów tablicy z wartością rejestru (metoda "wytnij-wklej"),
lub
kopiujesz zawartość rejestru, jeśli będziesz go potem wykorzystywał
w kolejnych procedurach dekrementujesz zawartość rejestru i sprawdzasz czy zero (metoda "kopiuj-wklej")
To takie dwie przykładowe metody, bo można ich wymyśleć jeszcze kilka, tylko po co, nie wiadomo co chciałbyś uzyskać z informacją wynikającą z porównania rejestru z czymś tam.

Awatar użytkownika
Woycek
-
-
Posty:62
Rejestracja:30 sty 2005, o 09:51
Lokalizacja:Ostrów Wielkopolski
Kontaktowanie:

Postautor: Woycek » 29 wrz 2005, o 09:13

Poprostu kombinuję jak w kalendarzu prawidłowo wyświetlać liczbę dni lutego...Wiadomo o co chodzi lata przestępne.......Napisałem sobie przerwanie które co 1 sekundę wykonuje pętlę w której z kolei inkrementowane są rejestry.W rejestrach tych mam info o sekundach ,minutach ,godzinach,dniach miesiącach i latach.Sam zegar to betka...miesiące z podziałem na te co mają 30 lub 31 dni też zmatoliłem zablokowało mnie przy lutym...i stąd to moje poprzednie pytanie....W swojej procedurze gdy licznik dni będzie miał wartość 28 chcę sprawdzić czy licznik miesięcy=luty i jeżeli tak to czy licznik lat ma wartość odpowiadającą rokowi przestępnemu...a ponieważ tych lat przestępnych jest "trochę w stuleciu".......
HELP :562:

Guru
-
-
Posty:250
Rejestracja:30 cze 2003, o 13:26
Lokalizacja:Kraków

Postautor: Guru » 29 wrz 2005, o 11:38

O ile się nie mylę to lata przestępne są wtedy gdy równanie rok%4 = 0, czyli gdy reszta z dzielenia liczby lat od narodzin Chrystusa (przyjmujemy 0), będzie równa 0;
zapisać można to tak (wystarczy wziąć pod uwagę tylko stulecie):
jeżeli ((( dl*10) + jl ) % 4) równa się 0 to znaczy że rok jest przestępny
gdzie:
dl - dziesiątki lat
jl - jednostki lat
powyższe równanie można obliczyć przy pomocy tylko dwóch rejestrów ACC i B.

Awatar użytkownika
Woycek
-
-
Posty:62
Rejestracja:30 sty 2005, o 09:51
Lokalizacja:Ostrów Wielkopolski
Kontaktowanie:

Postautor: Woycek » 29 wrz 2005, o 12:54

Jak Historia uczy najlepsze są rozwiązania najprostsze tylko ich znalezienie nie jest sprawą prostą.Guru masz u mnie duże "PYFKO"Powalczę z tematem i jak się znam na "medycynie" jak mi ruszy program zegar+kalendarz to zaczną się problemy z drugą częścią (jak to ktoś napisał "fiksującego zegara").
Dzięki za pomoc i proszę o jeszcze. :D

Wróć do „Projektowanie PCB, programy EDA, CAD, narzędziowe”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 89 gości