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 23 gości