Witam
Zrobiłem sobie włącznik czasowy, ale nie odmierza on mi dokładnie czasu. Co zrobić, żeby dokładnie odmierzał czas ? Jaki dać rezonator kwarcowy i jak zmienić program?
' Fuse bity ustawione fabrycznie
$regfile = "m8def.dat"
$crystal = 480000
Config Portb = Output 'sterowanie segmentów LED
Config Portd = Output 'sterowanie segmentów LED
Config Portc.4 = Output
Config Portc.3 = Output
Config Portc.0 = Input
Portc.0 = 1
Dodaj Alias Pinc.0
Config Portc.1 = Input
Portc.1 = 1
Ok Alias Pinc.1
Anoda3 Alias Portb.3 ' Lewy wyświetlacz
Anoda4 Alias Portb.0
Anoda1 Alias Portc.3
Anoda2 Alias Portc.4 ' prawy wyświetlacz
Dim Nr_wysw As Byte
Dim Liczba As Long
Dim Liczba1 As Long
Dim Temp_liczba_1 As Word
Dim Temp_liczba_2 As Word
Dim Temp_liczba_3 As Word
Dim Temp_liczba_4 As Word
Config Timer0 = Timer , Prescale = 8
Enable Timer0
Enable Interrupts
On Timer0 Timint
Start Timer0
Dim M As Long
Dim S As Long
Dim S2 As Long
Dim Z As Long
Dim W As Long
Liczba = 0000
Portb.2 = 1
Portb.5 = 0
Do
If Dodaj = 0 Then
Portb.2 = 0
Waitms 30
If Dodaj = 0 Then
While Dodaj = 0
Wend
S2 = S2 + 5
S = S + 5
If S2 >= 60 Then
M = S2 / 60
M = M Mod 99
End If
If S >= 60 Then
S = 0
End If
W = M * 100
W = W + S
Liczba = W
End If
Else
Portb.2 = 1
End If
If Ok = 0 Then
Waitms 30
If Ok = 0 Then
While Ok = 0
Wend
Do
'Cls
S2 = S2 - 1
S = S - 1
If S2 >= 60 Then
M = S2 / 60
M = M Mod 99
End If
If S <= 0 Then
S = 59
M = M - 1
End If
If W > 0 Then
Toggle Portb.2
Else
Portb.2 = 0
End If
W = M * 100
W = W + S
Liczba = W
If W < 0 Then
Liczba = 0
Portb.5 = 1 'przekaznik
Portb.1 = 1 'led
Else
Portb.5 = 0
'Lcd "KONIEC PROGRAMU"
End If
Wait 1
Loop
End If
End If
Loop
Timint:
Stop Timer0
Timer0 = 0
Temp_liczba_4 = Liczba Mod 10
Temp_liczba_3 = Liczba / 10
Temp_liczba_3 = Temp_liczba_3 Mod 10
Temp_liczba_2 = Liczba / 100
Temp_liczba_2 = Temp_liczba_2 Mod 10
Temp_liczba_1 = Liczba / 1000
Start Timer0
Gosub Mult_wysw
Return
Mult_wysw:
Reset Anoda1
Reset Anoda2
Reset Anoda3
Reset Anoda4
Select Case Nr_wysw
Case 0:
Portd = Lookup(temp_liczba_1 , Kody7seg)
Set Anoda1
Case 1:
Portd = Lookup(temp_liczba_2 , Kody7seg)
Set Anoda2
Case 2:
Portd = Lookup(temp_liczba_3 , Kody7seg)
Set Anoda3
Case 3:
Portd = Lookup(temp_liczba_4 , Kody7seg)
Set Anoda4
End Select
Incr Nr_wysw
If Nr_wysw = 4 Then
Nr_wysw = 0
End If
Timer1 = 100000
Return
Kody7seg:
Data 119 , 18 , 110 , 62 , 27 , 61 , 125 , 22 , 127 , 63
Re: Odmierzanie czasu
Zrób prosty program testowy w którym będzie tylko timer i licznik. Wskazania podawaj na LCD. Sprawdź jaka jest zgodność czasu z fabrycznym zegarkiem
W przerwaniu broń boże nie wyłaczaj timera, po co to robisz. Timer to rzecz święta w takim programie ma działać cały czas. Po co go resetujesz jak po wsytąpieniu przerwania ma wartośc dokładnie równą 0. Po co w przerwaniu robisz jakieś obliczenia z dzieleniem modulo, zajmuja dużo czasu.
W przerwaniu ma być tylko licznik do odmierzania czasu, ewentualnie kilka liczników i ustawianie flag taktujących pracę reszty programu. Częstotliwość taktowania zwiększ, przyspieszy to wykonywanie kodu i będzie ci się łatwiej w czasie zmieścić. Pracuj na większych podzielnikach timera niż 8, np 256.
UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.
jak zwiększę Prescale to
jak zwiększę Prescale to wyświetlacz zaczyna migać. Wiesz dla czego tak się dzieje ?
Re: Zegar
Program jest źle napisany i nie masz żadnej kontroli nad tym co się dzieje. Poza tym masz podłaczyć do procka szybszego kwarca aby rozkazy były wykonywane szybko a timer miał co dzielić. Jak tylko zwiększysz preskalar to za wiele nie uzyskasz. Co to za częstotliwość 480kHz czym taktujesz procka?
UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.
no to zobacz na ten kod, on
no to zobacz na ten kod, on jest z twojej strony
gdy Prescale jest ustawione na 256 to miga, a jak na 8 to nie miga. Wiesz dla czego ?
RE: Czas
A czym taktujesz procka i jak masz ustawione fusebity?
Na stronę wrzucam rzeczy po uprzednim sprawdzeniu, więc działa na pewno dobrze
UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.
mam fuse bity ustawione
mam fuse bity ustawione fabrycznie, ale mogę dolutować kwarc tylko powiedź jaki i jak ustawić fusy
Re: Fusebity
No to nie dziwne że ci miga, bo procesor działa na 1MHZ, a w programie masz zadeklarowany kwarc 8MHz. Wszystkie fusebity opisałem na stronie w artykułach tutaj. Ustaw się na wewnętrzny oscylator 8MHz tak na początek i będzie działać.
UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.
zmieniłem fusy na -U
zmieniłem fusy na -U lfuse:w:0xe4:m -U hfuse:w:0xc9:m i miga tak samo
Re: Program
Masz wgrany mój program, co wyżej podałeś czy jakiś inny?
UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.
ten co wyżej podałem
ten co wyżej podałem
Re: czas
W takim razie zrób odczyt fusebitów, czy napewno się ustawiły. Użyj burn-o-mata
UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.
miałeś rację, fusy się nie
miałeś rację, fusy się nie zmieniły. Już zmieniłem je przez burn-o-mat i nie miga.
Zobacz zrobiłem coś takiego
i to nie działa tak jak chcę bo na wyświetlaczu jest ciągle 1234 a nie to co ustawiam, a jak nacisnę OK to wtedy pokazują się jakieś liczby. Wiesz czemu ?
Re: Program
Masz dwie pętle do loop jedna w drugiej, po co? poza tym po kliknięciu przycisku OK wszystko się zatrzyma łącznie z wyświetlaniem aż nie puścisz przycisku co jest poważnym błędem. Nie używa się instrukcji wait ani żadnych wend itp jak chcesz mieć program działający dobrze, chyba że wiesz co robisz a tu ewidentnie nie jest tak jak powinno być.
UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.
to powiedz jakiej funkcji mam
to powiedz jakiej funkcji mam użyć ?
Re: Czas i timery
TO co mas w timerze jest najwazniejsze, timer ustawia flagi co określony czas i na tym kończy się jego działanie. Petla główna chodzi sobie jakoś tam cały czas sprawdzając czy flagi się ustawiły. Jesli się coś ustawiło to wykonywany jest fragment kodu...... Ten fragment kodu w fladze może zostać w każdej chwili przerwany timerem i tak to ma działać.
Przyciski możesz sprawdzić w prosty sposób, we wszystkich programach tak mam:
Taki przycisk jak będzie wstawiony wewnętrz obsługi flagi 100ms to sprawdzi czy jest nacisniety klawisz, jeśli jest to poczeka do następnego cyklu (w sumie 200ms) i zareaguje przycisk. Jakbys cały czas trzymał to co 1s nastąpi reakcja. Licz jest zmienna pomocniczą typu byte
Wymyśliłem jeszcze podobną konstrukcję dla wielu przycisków i klawiatury matrycowej, wszystko jest w kodach źródłowych, wystarczy poczytać
UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.
Jak zamienić wait na timer
Mam taki problem mały, bo jak używam opcji wait to wtedy wyświetlacz staje, co mogę zrobić żeby zamienić tą opcje wait na jakiś timer czy coś
wait 1 linijka 143
Re: Program
Popraw najpierw wcięcia w programie żebym widział gdzie się który if kończy. Poza tym widze dwa polecenia loop w programie.... niby do czego ma to służyć.... poza tym po to pisałem tyle o flagach i timerze żeby teraz tego używać. Po co ci ten wait tam
UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.
to zobacz teraz, tam gdzie
to zobacz teraz, tam gdzie jest
'czekaj 1s
114 linijka
Co tam muszę wstawić, żeby odliczało mi 1 sekundę i żeby nie zatrzymywało mi wyświetlacza ?
Re: Program
Nie rozumiem do czego Ci tam opóźnienie i co to ma robić ale musi to działać następująco:
Albo dodajesz do timera kolejną flagę taktującą co 1s albo robisz zmienną licznik, która będzie liczyła 10 wystąpień flagi 100ms i potem wykona odpowiedni fragment kodu. Do loop musi się wykoanywać cały czas. Nie możesz w jakikolwiek sposób zatrzymać działania pęli głównej bo wszystko się posypie.
Napisz co dokładnie to robi bo przez ten czas jakoś zapomniałem głównych założeń. Może uda mi się napisac kilka wytycznych odnośnie tego jakie bloki gdzie umieścić w kodzie aby dobrze działały.
UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.
to jest włącznik czasowy
to jest włącznik czasowy przyciskiem "Dodaj" dodaje się +5 sekund, a przyciskiem OK włącza się odliczanie i właśnie mi potrzebne dodanie tego opóźnienia 1 sekund
Re: Timer
No to nie widzę problemu.....
Dodajesz w timerze flagę co 1s i tam robisz wszystkie odliczania. Pod flagą 100ms dajesz obsługę wszystkich przycisków.
jednak
Zmienna "Odliczanie" lub coś podobnego mówi o tym w jakim trybie pracuje timer. Na początku odliczanie=0 a po kliknięciu start ustawia się na 1.
W obsłudze flagi dajesz ifa który sprawdza w jakim stanie jest odliczanie i zmniejsza zmienną licznikową albo nic nie robi jak odliczanie = 0.
Można zrobić 3 stany zmiennej odliczanie. 0-stop, 1-czekanie, 2-odliczanie.
Mam coś podobnego napisane w moim timerze kuchennym i fotograficznym
UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.
dzięki, już rozumiem o co w
dzięki, już rozumiem o co w tym chodzi :) program działa