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
Moderatorzy:Jacek Bogusz, robertw, k.pawliczak, Moderatorzy
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.
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.
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
)
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
)
Przerwanie obsługujące zegar
a tu procedura L_Czaswprawdzie nie robi miesięcy i lat ale to można dopisać.
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
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
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.
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.
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.
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
HELP
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.
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.
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.
Dzięki za pomoc i proszę o jeszcze.
Kto jest online
Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 2 gości