Dokładne odmierzanie czasu


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




Portret użytkownika mirley

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.

Portret użytkownika shoter09

jak zwiększę Prescale to

jak zwiększę Prescale to wyświetlacz zaczyna migać. Wiesz dla czego tak się dzieje ?

Portret użytkownika mirley

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.

Portret użytkownika shoter09

no to zobacz na ten kod, on

no to zobacz na ten kod, on jest z twojej strony

'****************************
           'Konfiguracja
'****************************
$regfile = "m8def.dat"
$crystal = 8000000
 
Config Portb = Output
Config Portd = Output
Config Portc.4 = Output
Config Portc.3 = Output
Config Portc.5 = Output
 
Config Timer0 = Timer , Prescale = 256
Enable Timer0 : On Timer0 Przerwanie0
 
 
Enable Interrupts
'****************************
      'Zmienne
'****************************
Dim Dziel(2) As Byte
Dim Wysw As Word , Ww As Byte , W(3) As Byte
Dim Wysw_pomoc As Word
Dim Mux As Byte , I As Byte
 
Dim F1s As Bit , F4ms As Bit , F100ms As Bit
 
Anoda3 Alias Portc.5                                        ' Lewy wyświetlacz
Anoda4 Alias Portb.0
Anoda1 Alias Portc.3
Anoda2 Alias Portc.4                                        ' prawy wyświetlacz
 
'****************************
      'Petla glowna
'****************************
Do
 
If F4ms = 1 Then
  Reset F4ms                                                'co 4ms
  Wysw = 123 'tutaj wartosc wyswietlana,
  Gosub Wyswietl
End If
 
If F100ms = 1 Then
  Reset F100ms                                              'co 100ms
 
  'tu można wykonywac coś co 100ms, np klawiatura albo jakieś obliczenia
 
End If
 
Loop
End
'****************************
      'Przerwanie timer0
'****************************
Przerwanie0:
Timer0 = 131
   Set F4ms
   Incr Dziel(1)
   If Dziel(1) = 25 Then
     Dziel(1) = 0
     Set F100ms
     Incr Dziel(2)
     If Dziel(2) = 10 Then
       Dziel(2) = 0
       Set F1s
     End If
   End If
Return
'****************************
      'wyswietlanie
'****************************
Wyswietl:
  Incr Mux
  If Mux = 3 Then Mux = 0
 
  For I = 1 To 3
    Wysw_pomoc = Wysw Mod 10
    Ww = Wysw_pomoc
    W(i) = Lookup(ww , Tabela)
    Wysw = Wysw / 10
  Next I
 
  Select Case Mux
    Case 0:
      Set Anoda1
      Portd = W(3)
      Reset Anoda3
 
    Case 1:
     Set Anoda2
     Portd = W(2)
     Reset Anoda1
 
    Case 2:
     Set Anoda3
     Portd = W(1)
     Reset Anoda2
 
  End Select
 
Return
 
'*******************************************************************************
                           'Tabele do wyswietlania na wyswietlaczu
'*******************************************************************************
Tabela:
Data 119 , 18 , 110 , 62 , 27 , 61 , 125 , 22 , 127 , 63

gdy Prescale jest ustawione na 256 to miga, a jak na 8 to nie miga. Wiesz dla czego ?

Portret użytkownika mirley

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.

Portret użytkownika shoter09

mam fuse bity ustawione

mam fuse bity ustawione fabrycznie, ale mogę dolutować kwarc tylko powiedź jaki i jak ustawić fusy

Portret użytkownika mirley

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.

Portret użytkownika shoter09

zmieniłem fusy na -U

zmieniłem fusy na -U lfuse:w:0xe4:m -U hfuse:w:0xc9:m i miga tak samo

Portret użytkownika mirley

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.

Portret użytkownika shoter09

ten co wyżej podałem

ten co wyżej podałem

Portret użytkownika mirley

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.

Portret użytkownika shoter09

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

'****************************
           'Konfiguracja
'****************************
$regfile = "m8def.dat"
$crystal = 8000000
 
Config Portb = Output
Config Portd = Output
Config Portc.4 = Output
Config Portc.3 = Output
Config Portc.5 = Output
 
Config Portc.0 = Input
Portc.0 = 1
Dodaj Alias Pinc.0
 
Config Portc.1 = Input
Portc.1 = 1
Ok Alias Pinc.1
 
Config Timer0 = Timer , Prescale = 256
Enable Timer0 : On Timer0 Przerwanie0
 
 
Enable Interrupts
'****************************
      'Zmienne
'****************************
Dim Dziel(2) As Byte
Dim Wysw As Word , Ww As Byte , W(4) As Byte
Dim Wysw_pomoc As Word
Dim Mux As Byte , I As Byte
 
Dim F1s As Bit , F4ms As Bit , F100ms As Bit
 
Anoda3 Alias Portc.5                                        ' Lewy wyświetlacz
Anoda4 Alias Portb.0
Anoda1 Alias Portc.3
Anoda2 Alias Portc.4                                        ' prawy wyświetlacz
 
Dim M As Long
Dim S As Long
Dim S2 As Long
Dim Z As Long
Dim W2 As Long
 
'****************************
      'Petla glowna
'****************************
Do
 
If F4ms = 1 Then
  Reset F4ms                                                'co 4ms
  Wysw = 1234                                               'tutaj wartosc wyswietlana,
  Gosub Wyswietl
End If
 
If F100ms = 1 Then
  Reset F100ms                                              'co 100ms
 
  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
 
      W2 = M * 100
      W2 = W2 + S
 
      Wysw = W2
 
 
   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 W2 > 0 Then
      Toggle Portb.2
      Else
      Portb.2 = 0
      End If
 
      W2 = M * 100
      W2 = W2 + S
      Wysw = W2
 
 
 
If W2 < 0 Then
wysw = 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
 
  'tu można wykonywac coś co 100ms, np klawiatura albo jakieś obliczenia
 
End If
 
Loop
End
'****************************
      'Przerwanie timer0
'****************************
Przerwanie0:
Timer0 = 131
   Set F4ms
   Incr Dziel(1)
   If Dziel(1) = 25 Then
     Dziel(1) = 0
     Set F100ms
     Incr Dziel(2)
     If Dziel(2) = 10 Then
       Dziel(2) = 0
       Set F1s
     End If
   End If
Return
'****************************
      'wyswietlanie
'****************************
Wyswietl:
  Incr Mux
  If Mux = 4 Then Mux = 0
 
  For I = 1 To 4
    Wysw_pomoc = Wysw Mod 10
    Ww = Wysw_pomoc
    W(i) = Lookup(ww , Tabela)
    Wysw = Wysw / 10
  Next I
 
  Select Case Mux
    Case 0:
      Set Anoda1
      Portd = W(4)
      Reset Anoda4
 
    Case 1:
     Set Anoda2
     Portd = W(3)
     Reset Anoda1
 
    Case 2:
     Set Anoda3
     Portd = W(2)
     Reset Anoda2
 
    Case 3:
     Set Anoda4
     Portd = W(1)
     Reset Anoda3
 
  End Select
 
Return
 
'*******************************************************************************
                           'Tabele do wyswietlania na wyswietlaczu
'*******************************************************************************
Tabela:
Data 119 , 18 , 110 , 62 , 27 , 61 , 125 , 22 , 127 , 63

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 ?

Portret użytkownika mirley

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.

Portret użytkownika shoter09

to powiedz jakiej funkcji mam

to powiedz jakiej funkcji mam użyć ?

Portret użytkownika mirley

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:

if pin =0 then
  incr licz
  if licz = 10 then
    licz = 0
    'polecenia które się wykonują po zadzaiłaniu przycisku
  end if
else
  licz = 8
end if

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.

Portret użytkownika shoter09

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

'****************************
           'Konfiguracja
'****************************
$regfile = "m8def.dat"
$crystal = 8000000
 
Config Portb = Output
Config Portd = Output
Config Portc.4 = Output
Config Portc.3 = Output
Config Portc.5 = Output
 
Config Portc.0 = Input
Portc.0 = 1
Dodaj Alias Pinc.0
 
Config Portc.1 = Input
Portc.1 = 1
Ok Alias Pinc.1
 
Config Timer0 = Timer , Prescale = 256
Enable Timer0 : On Timer0 Przerwanie0
 
 
Enable Interrupts
'****************************
      'Zmienne
'****************************
Dim Dziel(2) As Byte
Dim Wysw As Word , Wysw2 As Word , Ww As Byte , W(4) As Byte
Dim Wysw_pomoc As Word
Dim Mux As Byte , I As Byte
 
Dim F1s As Bit , F4ms As Bit , F100ms As Bit
 
Dim M As Long
Dim S As Long
Dim S2 As Long
Dim Z As Long
Dim W2 As Long
 
M = 0
S = 0
S2 = 0
Z = 0
W2 = 0
 
Anoda3 Alias Portc.5                                        ' Lewy wyświetlacz
Anoda4 Alias Portb.0
Anoda1 Alias Portc.3
Anoda2 Alias Portc.4                                        ' prawy wyświetlacz
 
Dim Licz As Byte, Licz2 As Byte
 
Portb.2 = 1
Portb.5 = 0
 
'****************************
      'Petla glowna
'****************************
Do
 
If F4ms = 1 Then
  Reset F4ms                                                'co 4ms
                                                 'tutaj wartosc wyswietlana,
  Gosub Wyswietl_first
End If
 
If F100ms = 1 Then
  Reset F100ms                                              'co 100ms
  'tu można wykonywac coś co 100ms, np klawiatura albo jakieś obliczenia
 
  If Dodaj = 0 Then
  Incr Licz
  If Licz = 10 Then
    Licz = 0
    'Portb.1 = 1
 
    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
 
      W2 = M * 100
      W2 = W2 + S
 
      Wysw2 = W2
 
  End If
 
Else
   'Portb.1 = 0
  Licz = 8
End If
 
 
If Ok = 0 Then
  Incr Licz2
  If Licz2 = 10 Then
    Licz2 = 0
    'Portb.1 = 1
    Do
    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 W2 > 0 Then
      Toggle Portb.2
      Else
      Portb.2 = 0
      End If
 
      W2 = M * 100
      W2 = W2 + S
      Wysw2 = W2
 
 
 
If W2 < 0 Then
Wysw2 = 0
Portb.5 = 1                                                 'przekaznik
Portb.1 = 1                                                 'led
Else
Portb.5 = 0
'Lcd "KONIEC PROGRAMU"
End If
Wait 1
Loop
 
  End If
Else
   'Portb.1 = 0
  Licz2 = 8
End If
 
 
End If
 
Loop
End
 
Wyswietl_first:
Wysw = Wysw2
Gosub Wyswietl
Return
 
'****************************
      'Przerwanie timer0
'****************************
Przerwanie0:
Timer0 = 131
   Set F4ms
   Incr Dziel(1)
   If Dziel(1) = 25 Then
     Dziel(1) = 0
     Set F100ms
     Incr Dziel(2)
     If Dziel(2) = 10 Then
       Dziel(2) = 0
       Set F1s
     End If
   End If
Return
'****************************
      'wyswietlanie
'****************************
Wyswietl:
  Incr Mux
  If Mux = 4 Then Mux = 0
 
  For I = 1 To 4
    Wysw_pomoc = Wysw Mod 10
    Ww = Wysw_pomoc
    W(i) = Lookup(ww , Tabela)
    Wysw = Wysw / 10
  Next I
 
  Select Case Mux
    Case 0:
      Set Anoda1
      Portd = W(4)
      Reset Anoda4
 
    Case 1:
     Set Anoda2
     Portd = W(3)
     Reset Anoda1
 
    Case 2:
     Set Anoda3
     Portd = W(2)
     Reset Anoda2
 
    Case 3:
     Set Anoda4
     Portd = W(1)
     Reset Anoda3
 
  End Select
 
Return
 
'*******************************************************************************
                           'Tabele do wyswietlania na wyswietlaczu
'*******************************************************************************
Tabela:
Data 119 , 18 , 110 , 62 , 27 , 61 , 125 , 22 , 127 , 63

Portret użytkownika mirley

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.

Portret użytkownika shoter09

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 ?

'****************************
           'Konfiguracja
'****************************
$regfile = "m8def.dat"
$crystal = 8000000
 
Config Portb = Output
Config Portd = Output
Config Portc.4 = Output
Config Portc.3 = Output
Config Portc.5 = Output
 
Config Portc.0 = Input
Portc.0 = 1
Dodaj Alias Pinc.0
 
Config Portc.1 = Input
Portc.1 = 1
Ok Alias Pinc.1
 
Config Timer0 = Timer , Prescale = 256
Enable Timer0 : On Timer0 Przerwanie0
 
 
Enable Interrupts
'****************************
      'Zmienne
'****************************
Dim Dziel(2) As Byte
Dim Wysw As Word , Wysw2 As Word , Ww As Byte , W(4) As Byte
Dim Wysw_pomoc As Word
Dim Mux As Byte , I As Byte
 
Dim F1s As Bit , F4ms As Bit , F100ms As Bit
 
Dim M As Long
Dim S As Long
Dim S2 As Long
Dim Z As Long
Dim W2 As Long
Dim W3 As Long
Dim R As Byte
M = 0
S = 0
S2 = 0
Z = 0
W2 = 0
 
Anoda3 Alias Portc.5                                        ' Lewy wyświetlacz
Anoda4 Alias Portb.0
Anoda1 Alias Portc.3
Anoda2 Alias Portc.4                                        ' prawy wyświetlacz
 
Dim Licz As Byte, Licz2 As Byte
 
Portb.2 = 1
Portb.5 = 0
 
'****************************
      'Petla glowna
'****************************
Do
 
If F4ms = 1 Then
  Reset F4ms                                                'co 4ms
                                                 'tutaj wartosc wyswietlana,
  Gosub Wyswietl_first
End If
 
If F100ms = 1 Then
  Reset F100ms                                              'co 100ms
  'tu można wykonywac coś co 100ms, np klawiatura albo jakieś obliczenia
 
  If Dodaj = 0 Then
  Incr Licz
  If Licz = 10 Then
    Licz = 0
    'Portb.1 = 1
 
    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
 
      W2 = M * 100
      W2 = W2 + S
 
      Wysw2 = W2
 
  End If
 
Else
   'Portb.1 = 0
  Licz = 8
End If
 
 
If Ok = 0 Then
  Incr Licz2
  If Licz2 = 10 Then
    Licz2 = 0
    W3 = M * 60
    W3 = W3 + S
    For R = 0 To W3                                         ' instukcja For (R)
 
    Gosub Odliczaj
    'czekaj 1s
    Next R
 
  End If
Else
   'Portb.1 = 0
  Licz2 = 8
End If
 
 
End If
 
Loop
End
 
Odliczaj:
 
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 W2 > 0 Then
      Toggle Portb.2
      Else
      Portb.2 = 0
      End If
 
      W2 = M * 100
      W2 = W2 + S
      Wysw2 = W2
 
 
 
If W2 < 0 Then
Wysw2 = 0
Portb.5 = 1                                                 'przekaznik
Portb.1 = 1                                                 'led
Else
Portb.5 = 0
'Lcd "KONIEC PROGRAMU"
End If
'Wait 1
 
Return
 
Wyswietl_first:
Wysw = Wysw2
Gosub Wyswietl
Return
 
'****************************
      'Przerwanie timer0
'****************************
Przerwanie0:
Timer0 = 131
   Set F4ms
   Incr Dziel(1)
   If Dziel(1) = 25 Then
     Dziel(1) = 0
     Set F100ms
     Incr Dziel(2)
     If Dziel(2) = 10 Then
       Dziel(2) = 0
       Set F1s
     End If
   End If
Return
'****************************
      'wyswietlanie
'****************************
Wyswietl:
  Incr Mux
  If Mux = 4 Then Mux = 0
 
  For I = 1 To 4
    Wysw_pomoc = Wysw Mod 10
    Ww = Wysw_pomoc
    W(i) = Lookup(ww , Tabela)
    Wysw = Wysw / 10
  Next I
 
  Select Case Mux
    Case 0:
      Set Anoda1
      Portd = W(4)
      Reset Anoda4
 
    Case 1:
     Set Anoda2
     Portd = W(3)
     Reset Anoda1
 
    Case 2:
     Set Anoda3
     Portd = W(2)
     Reset Anoda2
 
    Case 3:
     Set Anoda4
     Portd = W(1)
     Reset Anoda3
 
  End Select
 
Return
 
'*******************************************************************************
                           'Tabele do wyswietlania na wyswietlaczu
'*******************************************************************************
Tabela:
Data 119 , 18 , 110 , 62 , 27 , 61 , 125 , 22 , 127 , 63

Portret użytkownika mirley

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.

Portret użytkownika shoter09

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

Portret użytkownika mirley

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.

Portret użytkownika shoter09

dzięki, już rozumiem o co w

dzięki, już rozumiem o co w tym chodzi :) program działa

'****************************
           'Konfiguracja
'****************************
$regfile = "m8def.dat"
$crystal = 8000000
 
Config Portb = Output
Config Portd = Output
Config Portc.4 = Output
Config Portc.3 = Output
Config Portc.5 = Output
 
Config Portc.0 = Input
Portc.0 = 1
Dodaj Alias Pinc.0
 
Config Portc.1 = Input
Portc.1 = 1
Ok Alias Pinc.1
 
Config Timer0 = Timer , Prescale = 256
Enable Timer0 : On Timer0 Przerwanie0
 
 
Enable Interrupts
'****************************
      'Zmienne
'****************************
Dim Dziel(3) As Byte
Dim Wysw As Word , Wysw2 As Word , Ww As Byte , W(4) As Byte
Dim Wysw_pomoc As Word
Dim Mux As Byte , I As Byte
 
Dim F1s As Bit , F4ms As Bit , F100ms As Bit
 
Dim M As Long
Dim S As Long
Dim S2 As Long
Dim Z As Long
Dim W2 As Long
Dim W3 As Long
Dim R As Byte
M = 0
S = 0
S2 = 0
Z = 0
W2 = 0
 
Anoda3 Alias Portc.5                                        ' Lewy wyświetlacz
Anoda4 Alias Portb.0
Anoda1 Alias Portc.3
Anoda2 Alias Portc.4                                        ' prawy wyświetlacz
 
Dim Licz As Byte , Licz2 As Byte , Odlicz As Byte
 
Dim Zmienna As Byte
Dim Minus As Byte
 
Minus = 0
Zmienna = 0
 
Odlicz = 0
 
Portb.2 = 1
Portb.5 = 0
 
'****************************
      'Petla glowna
'****************************
Do
 
If F4ms = 1 Then
  Reset F4ms                                                'co 4ms
                                                 'tutaj wartosc wyswietlana,
  Gosub Wyswietl_first
End If
 
If F1s = 1 Then
  Reset F1s
  'wykonaj cos co 1 sek
 
  If Odlicz = 2 Then
  Portb.5 = 1                                                 'przekaznik
  Portb.1 = 1
  Minus = 1                                                 'led
  Zmienna = Zmienna + 1
 
  If Zmienna = 5 Then
  Odlicz = 0
  Portb.5 = 0                                               'przekaznik
  Portb.1 = 0
  M = 0
  S = 0
  S2 = 0
  Z = 0
  W2 = 0
  Minus = 0
  End If
 
  End If
 
 
  If Odlicz = 1 Then
 
  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 W2 > 0 Then
      Toggle Portb.2
      Else
      Portb.2 = 0
      End If
 
      W2 = M * 100
      W2 = W2 + S
      Wysw2 = W2
 
 
 
If W2 < 0 Then
Wysw2 = 0
Odlicz = 2
Else
Portb.5 = 0
'Lcd "KONIEC PROGRAMU"
End If
'Wait 1
 
  End If                                                    'co 1s
 
End If
 
If F100ms = 1 Then
  Reset F100ms                                              'co 100ms
  'tu można wykonywac coś co 100ms, np klawiatura albo jakieś obliczenia
 
  If Dodaj = 0 Then
  Incr Licz
  If Licz = 10 Then
    Licz = 0
    'Portb.1 = 1
 
    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
 
      W2 = M * 100
      W2 = W2 + S
 
      Wysw2 = W2
 
  End If
 
Else
   'Portb.1 = 0
  Licz = 8
End If
 
 
If Ok = 0 Then
  Incr Licz2
  If Licz2 = 10 Then
    Licz2 = 0
 
    Odlicz = 1
 
  End If
Else
   'Portb.1 = 0
  Licz2 = 8
End If
 
 
End If
 
Loop
End
 
Wyswietl_first:
Wysw = Wysw2
Gosub Wyswietl
Return
 
'****************************
      'Przerwanie timer0
'****************************
Przerwanie0:
Timer0 = 131
   Set F4ms
   Incr Dziel(1)
   If Dziel(1) = 25 Then
     Dziel(1) = 0
     Set F100ms
     Incr Dziel(2)
     If Dziel(2) = 10 Then
       Dziel(2) = 0
       Set F1s
       Incr Dziel(3)
     If Dziel(3) = 1 Then
       Dziel(3) = 0
     End If
     End If
   End If
Return
'****************************
      'wyswietlanie
'****************************
Wyswietl:
  Incr Mux
  If Mux = 4 Then Mux = 0
 
  For I = 1 To 4
    Wysw_pomoc = Wysw Mod 10
    Ww = Wysw_pomoc
    W(i) = Lookup(ww , Tabela)
    Wysw = Wysw / 10
  Next I
 
  Select Case Mux
    Case 0:
      Set Anoda1
      If Minus = 1 Then
      Portd = &B0001000
      Else
      Portd = W(4)
      End If
      Reset Anoda4
 
    Case 1:
     Set Anoda2
     If Minus = 1 Then
      Portd = &B0001000
      Else
     Portd = W(3)
     End If
     Reset Anoda1
 
    Case 2:
     Set Anoda3
     If Minus = 1 Then
      Portd = &B0001000
      Else
     Portd = W(2)
     End If
     Reset Anoda2
 
    Case 3:
     Set Anoda4
     If Minus = 1 Then
      Portd = &B0001000
      Else
     Portd = W(1)
     End If
     Reset Anoda3
 
  End Select
 
Return
 
'*******************************************************************************
                           'Tabele do wyswietlania na wyswietlaczu
'*******************************************************************************
Tabela:
Data 119 , 18 , 110 , 62 , 27 , 61 , 125 , 22 , 127 , 63 , 8