Proszę o podpowiedź, czy jeśli wpiszę jakieś polecenia w główną pętlę programu to timer1 będzie liczyć w czasie wykonywania tych funkcji?Pytam ponieważ jak do tej pory nie spotkałem się z łączeniem funkcji pracujących w tym samym czasie.
Przykładowy program: $regfile = "m32def.dat" $crystal = 8000000 Config Portd = Output Portd = &B11111111 Config Porta = &B11111111 Porta = &B11111111 Config Portb = &B11111110 Portb = &B00000000 Config Portc = Output Portc = &B11111111 Config Timer1 = Timer , Prescale = 256 On Timer1 Przerwanie Enable Interrupts Enable Timer1 Timer1 = 34286 Dim M As Byte , H As Byte Config Lcdpin = Pin , Db4 = Porta.0 , Db5 = Porta.1 , Db6 = Porta.2 , Db7 = Porta.3 , E = Porta.4 , Rs = Porta.5 Config Lcd = 16 * 2 Do wait 10 toggle portd.0 Loop Przerwanie: Cls Locate 1 , 3 Lcd H Locate 1 , 5 Lcd ":" Locate 1 , 6 Lcd M Timer1 = Timer1 + 34286 Incr M If M = 60 Then Incr H M = 0 End If If H = 24 And M = 60 Then M = 0 H = 0 End If Return
|
|||
Re: Timer1, a inne funkcje?
Nie ma szans żeby timer liczył jak masz instrukcję wait w pętli głównej. Wait zatrzyma działanie całego procka na określony czas.
Moja strona w powijakach
Re: Bascom
Raczej się z tym i zgodzę.... sprawdzałeś to w praktyce. Wait wstrzyma działanie pętli głównej, gdyż jest to po prostu zamieniane na rozkazy asemblera nop lub coś podobnego. Jak najbardziej w środku wykonywania waita powinien następować skok do obsługi timera.... tak na czystą logikę patrząc.... sprawdźcie to w praktyce
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.
Może bez wait 'ów?
A jeśli w pętli głównej nie będzie wait'ów to nieprzerwie liczenia?Jakiej funkcji użyć do "skoku obsługi timera"?Zwykłe gosub wystarczy czy jakieś deklaracje?Czy można zrobić dwa liczniki (timery)-jeden liczy czas bieżący a drugi do np wyłącznika czasowego, a może da się połączyć te dwie funkcje w jednym timerze?
Timery
Ja robię to tak; konfiguruje timer na najmniejszy odcinek czasu jaki jest mi potrzebny, zwykle to 4ms lub 10ms. Następnie w obsłudze timera robię zmienne dzielniki i ustawiam tylko zmienne flagowe, np co 4ms, co 100ms (jak policzy 25 przerwań ) co 1s (jak policzy 10 sekwencji po 25 przerwań) itd. W pętli głównej piszę natomiast:
do
if F_4ms = 1 then
F_4ms = 0
'''jakies instrukcje
end if
if F_100ms = 1 then
F_100ms = 0
'''jakies instrukcje
end if
'itd
loop
program cały czas kręci się w kółko i kiedyś tam następują skoki do przerwania od timera. Jak zostaną policzone odpowiednie ilości przerwań to zmienna np F_100ms zostanie ustawiona na 1 i przy pierwszym lepszym obiegu do loop zostanie wykonany odpowiedni if. Jednocześnie timer znowu będzie liczył jakby w tle impulsy aby po 100ms znowu ustawić flagę F_100ms
generalnie jest to proste. Sama obsługa przerwania timera ma być jak najprostsza i ma zawierać tylko niezbednie potrzebne instrukcje
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.
Pusty lcd
Pomagając sobie trochę projektem "prosty sterownik domowy" z tej strony przerobiłem na coś takiego:
Program odlicza tochę za szybko tzn spieszy 3 sek na min.Mam jeszcze jeden program z użyciem config clock który zaś liczy za szybko o 15sek na min.Kolejny ważny problem to jest zbyt częste odświeżanie lcd przez co nie widać dolnej linii wyświetlacza a gurna to tak średnio i miga.Dzięki za dotychczasowe rady i jednocześnie proszę o wskazanie błędu w moim programie.
Oto drugi program:
Re: Timer1, a inne funkcje?
Biorąc na chłopski rozum działanie programu z wait'em i z przerwaniem to myślę tak:
Nawet jeśli podczas działania instrukcji wait procek skoczy do przerwania to i tak wróci w to samo miejsce skąd skoczył. Wyobraźmy sobie sytuację kiedy procek skacze do przerwania w połowie wait 1. Po powrocie z przerwania odliczy resztę tego waita gdzie skończył czyli pół sekundy.
Moja strona w powijakach
Próbowałem bez wait'ów i to
Próbowałem bez wait'ów i to samo, z tym że w drugim programie (tym z config clock)lepiej jest z waitem bo wyświetlacz ładnie świeci i nie miga.Może to wina ustawień fusebitów?Muszę dodać że procek działa na wbudowanym rezonatorze 8mHz.
Timer1 śpieszy 3sek/min?
Czy może ktoś wie czemu w moim programie timer1 śpieszy 3sek/min?
Oto fragmenty programu:
Re: Timer
Ma to być tak napisane:
teraz powinno działać dobrze z dokłądnością rezonatora wewnętrznego, która jest kiepska. Przełącz się na kwarc 8MHz i porównaj działanie.
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.
timer
Mirley, zmieniłem w programie tak jak pisałeś oraz zmieniłem na zewnętrzny rc 8mhz i dalej śpieszy 3sek/min.Może źle ustawiłem fuse bity?Jak powinny wyglądać odpowiednio ustawione fuse bity?
Sprawdź te
Sprawdź te files/ART_fuseM16_04B.gif. Sprawdzałeś na zewnętrznym kwarcu 8MHz? Wrzuć kod dokładnie ten na którym to testujesz
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.
Mirley, link który podałeś
Mirley, link który podałeś niedziała.Podpięty jest zewnętrzny 8mhz.
A oto dokładny program na którym testuję.Wszystko działa tak jak chciałem tylko ten timer śpieszy więc narazie w ustawieniach zapisane jest zliczanie 63sek zamiast 60 aby wyrównać błąd.
Kwarc 12mhz
Pomyślałem sobie że podepne 12mhz i zarówno na 12 jak i na 8mhz aby układ działał muszę ustawić takie fusebity:
a myślałem że "int.rc.osc" ustawia się dla rc wewnętrznego a "ext.rc osc" dla zewnętrznego.
Jednak gdy ustawiłem fusy tak:
to aby układ działał musiałem skorzystać z schematu:
a licznik dalej śpieszy.
Re: Timer
Internal oscylator dotyczy wewnętrznego oscylatora i nie ma znaczenia co jest podłączone na zewnątrz. External to zewnętrzny oscylator, external RC to dokładnie coś takiego jak podłączyłeś.
Pisząc żebyś spróbował na zewnętrznym taktowaniu nie chodziło mi o zewnętrzny Rc bo to jeszcze gorzej działa niż wewnętrzny. Chodziło mi o kwarca 8Mhz +dwa kondensatory.
Poza tym twój program do testowania jest za bardzo skomplikowany. Poza tym już czas nauczyć się robić wcięcia w programie, bo nie da się tego analizować. Przerwanie timera jest za skomplikowane.
Zrób program testowy, który ma tylko przerwanie od timera i proste wyświetlanie, bez reszty zbędnych rzeczy. Pomiń miesiące i dni i resztę zmiennych, które modyfikują się w przerwaniu
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.
Zrobiłem testowy
Zrobiłem testowy programik:
Fusebity:
Zewnętrzny kwarc 8mhz z kondensatorami:
A na wyświetlaczu nic niema, jakby wogule procka niebyło.
Może złe fusebity?
Re: Timery
Jasne że LCD nic nie pokazuje przeciesz wysyłasz do niego dane jak tylko procek może.... nie da się tak szybko. Napisz opóźnienie,np:
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 i stała się tragedia.Po
No i stała się tragedia.Po ustawieniu fusebitów moja atmega nie kontaktuje.Próbowałem przełączać na wewn. i zewn. kwarc,podpinałem kwarce jakie tylko miałem ( od 8 do 33mhz) ale bascom atmegi nie widzi, a w dodatku at się grzeje.Czy jest inne rozwiązanie czy aby zresetować fusebity muszę robić FUSEBIT DOCTOR?A może to już jego koniec?Może za dużo razy był programowany(ponad 600razy)?Na elektrodzie ktoś opisywał podobny problem i otrzymał taką odpowiedź:
"A czy grzeje Ci się procek, jeżeli podłączasz do niego zasilanie? Bo jeśli padł, to możliwe jest że nastąpiło nieodwracalne zwarcie w środku i powinien się grzać. Przynajmniej ja tak miałem..."
Re: Procek
Szczerze mówiąc to tak nigdy mi się nie stało żeby procek się grzał. Mógł się uszkodzić ale to tylko przypadkiem..... napewno nie za sprawą programowania 600 razy. Jakby to było 5000 razy to może. Może masz zwarcie na którejś linii wejściowej do masy lub zasilania i temu się nagrzewa
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.
Kupiłem nową at32
Kupiłem nową at32 i działa w tym samym programatorze więc o zwarciach niema mowy.Proszę kogoś o podanie dokładnie jak mam ustawić fusebity pod at32 i kwarc 8mhz bo sam niechce już próbować bo zablokuje znowu drógą atmege :(
Re: Fusebity
Fusebity masz w artykule na stronie. Dla M16 i M32 jest tak samo
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.