Strzala86 napisał: Znaczy się chciałem dać Load Timer1 = 58594, wtedy chyba działałoby to przepełnienie o którym mówię?
Do przycisków daje Debounce, więc myślę, że starczy
Nie, to nie wystarczy.
Jednym z głównych błędow jaki większość popełnia to zaczynanie projektu od doraźnego, szablonowego wypełniania formuły;
$regfile = ..........
$crystal = .........
...........
z zaniechaniem /pominięciem opracowania przynajmniej ramowego przebiegu procesu; od początku do końca.
Ideałem byłoby skorzystanie z takiego 'wynalazku' jakim jest flowchart.
Jeżeli zachodzi w programie potrzeba liczenia czasu, nie w sensie 'delay' (waitms) kilku lub kilkudziesięciu milisec., wtedy absolutnie musisz użyć timera. Na ogół timery odliczają czas bez pomocy processora, lecz z pewnym zachowaniem warunków. Ten ktory wybrałeś akurat najprostszy i najbardziej prymitywny tryb pracy "Normal" wymaga ciągle pomocy processora dla zmiany rozdzielczosci. Każdorazowo po przepełnieniu w naturze timera jest zacząć liczenie od zera i tak właśnie sie to dzieje. Timer policzy 'trochę impulsów' a ty w przerwaniu ovf1 mówsz: wyrzuć to, będziemy liczyć impulsy inaczej:
Load Timer1,xxx
Błąd spowodowany ciągłą korektą rozdzielczości timera (zależny od taktowania processora oraz prescalera) w tym trybie pracy nie jest wielki i naczęściej go sobie darujemy.
Jeżeli juz zechcesz pozostać w takiej konfiguracji to przynajmniej powinieneś zadbać o prawidłowy dobór parametrów tego timera aby liczone przedziały czasu miały jakis sens.
Powiedzmy że chcesz odliczyć czas 5 min (ok 300 sec) od chwili naciśnięcia przycisku 4.
Jednym z prostszych rozwiązań byłoby np. (przy crystal = 1000000) skonfigurować timer1 aby zliczał czas 1 sec.
const Timer1Reload = 15625
config timer1=timer,prescale = 64
load timer1 , Timer1Reload
on ovf1 Timer1_isr
enable timer1
start timer1
enable interrupts
' tu wpisz twój program
..............
Timer1_ISR:
load timer1, Timer1Reload
'Add your ISR code here (tu zwiększenie zmiennej sekund)
return
Te 1-sekundowe przedziały zliczasz do jakiejś zmiennej, zadeklarowanej na początku listingu. Tam też deklarujesz Flage również jako zmienną.
Ten process ustawiasz na poczatku programu, najczęściej przed 'Do...Loop' i niech on biegnie. W tym momencie nie interesuje cie ilośc zliczonych sekund.
Masz w programie odwołanie do subrutyny przycisku 4.
Tam właśnie w pierwszej kolejności zerujesz tą zmienną sekund i stawiasz flagę że naciśnięto przycisk 4, oraz dodatkowo cokolwiek masz zamiar zrobic natychmiast.
W pętli głównej "Do....Loop"
dajesz warunek: jezeli twoja zmienna sekund osiągnęła oczekiwana wartość (300) i jednocześnie jest postawiona flaga to program ma coś do wykonania z tym 5-minutowym opóźnieniem.
W dalszej części programu zwyczajnie wyzerujesz tą flage, aby ewentualne kolejne naliczenia po przepełnienich zmiennej sekund (300) nie powodowały jakichś nie oczekiwanych czynności processora.
Myśle że to wystarczy...
e marcus