jak zrobic w bascomie na atmedze32 z kwarcem 4MHz pomiar czasu rozpoczynany po spelnieniu jakiegos warunku i wyswietlany w formacie HH:MM:SS (moze byc tez bez sekund) na lcd ?? jesli to ma znaczenie to dlugos pomiaru nie bedzie raczej nigdy wieksza niz 12h. 
pozdrawiam
			 
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ępomiar czasu czyli taki stoper
Moderatorzy:Jacek Bogusz, robertw, k.pawliczak, Moderatorzy
Długość mierzonego czasu to 256 godzin, które można zwiększyć deklarując Hour jako Word.
			Kod: Zaznacz cały
$regfile = "m32def.dat"
$crystal = 4000000
Dim Exception As Bit                                        'Warunek
Dim Hour As Byte
Dim Minute As Byte
Dim Second As Byte
Dim Msec As Byte
Dim _100ms As Bit
Dim Settim As Bit
Dim Tim1t As Byte
Config Timer1 = Timer , Prescale = 1
Tccr1b = Tccr1b And &B11111000                              'Stop Timer
On Timer1 T1_int
Enable Timer1
Enable Interrupts
Do
  If Exception = 1 Then
    If Settim = 0 Then
      Load Timer1 , 6690
      Tccr1b = Tccr1b Or &B00000001                         'Start Timer1, Prescale = 1
      Settim = 1
    End If
  End If
  If _100ms = 1 Then
    _100ms = 0
    'tutaj kod odpowiedzialny za
    'aktualizację i formatowanie
    'czasu
  End If
  'Lcd "HH:MM:SS:MS"
Loop
T1_int:
  Incr Tim1t
  If Tim1t = 7 Then
    Load Timer1 , 6690
    Set _100ms                                              'ustaw flagę - minęło 100 ms
    Tim1t = 0
  End If
Return
narazie zrobilem liczenie z dokladnoscia co do sek ale mam problem z timerami. w kodzie sa ustawione i wystartowane na samym poczatku takie dwa timery:
Config Timer0 = Counter , Edge = Rising
Config Timer1 = Timer , Prescale = 64
dopisalem do programu funkcje prostego "stopera" liczacego sekundy:
Dim Sekunda As Byte
Incr Sekunda
ale wynik jest niedokladny - na 100 spoznia sie o 11 sekund - dlaczego tak sie dzieje??
a moze cos mam zle fusebity ustawione i to jest powodem?? -> FUSEBITY
mam jeszce jedno pytanie - jesli bym uruchomil timer2 jako:
Config Timer2 = Timer , Prescale = 1
to jaka komenda korzystac z jego funkcji?? b tej chwili mam gotowy program i jest tam tylko config timerow, start timer i odrazu procedura liczenia Incr - nigdzie nie jest napisane ktory timer ma liczyc...
			Config Timer0 = Counter , Edge = Rising
Config Timer1 = Timer , Prescale = 64
dopisalem do programu funkcje prostego "stopera" liczacego sekundy:
Dim Sekunda As Byte
Incr Sekunda
ale wynik jest niedokladny - na 100 spoznia sie o 11 sekund - dlaczego tak sie dzieje??
a moze cos mam zle fusebity ustawione i to jest powodem?? -> FUSEBITY
mam jeszce jedno pytanie - jesli bym uruchomil timer2 jako:
Config Timer2 = Timer , Prescale = 1
to jaka komenda korzystac z jego funkcji?? b tej chwili mam gotowy program i jest tam tylko config timerow, start timer i odrazu procedura liczenia Incr - nigdzie nie jest napisane ktory timer ma liczyc...
Ja zaproponuję Ci takie "ustrojstwo"...ale wynik jest niedokladny - na 100 spoznia sie o 11 sekund - dlaczego tak sie dzieje??...
 
Kod: Zaznacz cały
$regfile = "m32def.dat"
$crystal = 11059200
$hwstack = 50
$swstack = 32
$framesize = 32
#if _xtal < 4000000
   Const Presc = 64
#else
   Const Presc = 256
#endif
Const Count_top =(_xtal / Presc) - 1
Const Up = 1       'kompiluj dla zliczania w górę
Const Down = 0       '  w dół
Const Count = Up 
'Config Lcd = 20 * 4
'Config Lcdpin = Pin , Db4 = Portc.4 , Db5 = Portc.5 , Db6 = Portd.7
'Config Lcdpin = Pin , Db7 = Porta.7 , E = Portc.3 , Rs = Portc.2
Dim S As Byte , M As Byte , H As Byte
On Oc1a Sekunda
Enable Oc1a
Enable Interrupts
Pwm1a = Count_top
Cursor Off
Cls
Do
'If Warunek_start Then Gosub Start_t1
'If Warunek_stop Then Gosub Stop_t1
Loop
Start_t1:
'start timer1 - CTC mode
   S = 0
   M = 0
   H = 0
#if Presc = 64
   Tccr1b = &B00001011
#else
   Tccr1b = &B00001100
#endif
Return
Stop_t1:
   Tccr1b = 0
Return
Sekunda:
#if Count = Up       '**********************'
Incr S
If S = 59 Then
   S = 0
   Incr M
   If M = 59 Then
      M = 0
      Incr H
      If H = 24 Then H = 0
   End If
End If
#elseif Count = Down       '********************'
If S > 0 Then
   Decr S
Else
   S = 59
   If M > 0 Then
      Decr M
   Else
      M = 59
      If H > 0 Then
         Decr H
      Else
         H = 23
      End If
   End If
End If
#endif       '***********************'
'Locate 1 , 1 : Lcd Hex(makebcd(h)) ; ":" ; Hex(makebcd(m)) ; ":" ; Hex(makebcd(s));
Return
Dokładność zależy od stabilności oscylatora/rezonatora , oraz od tego , czy jego częstotliwość jest wielokrotnością 64 dla częstotliwości <4MHz lub 256 dla częstotliwości => 4MHz .
Piotrek
Kto jest online
Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 0 gości

