Hodiny a časování
Re: Hodiny a časování
Opak je pravdou vše je až moc nóbl. Tak přesný čas jako je z gps opravdu netřeba preferuji jednoduché a nejméně náročné řešení, s přiměřenou přesností. Sondovat jiné metody ale není na škodu.
Re: Hodiny a časování
Zkoušel jsem jít něčím podobným. Má to všam chybu. Ne v milisekundách ale skoro sekuntách za den.
Bez časového mudulu asi nelze dojít k solidnímu výsledku.
Bez časového mudulu asi nelze dojít k solidnímu výsledku.
Re: Hodiny a časování
Vsadím se o korunu, že jsi si tam tu chybu zavedl sám někde v programu.
Jinak podle mého názoru není pravděpodobné, že by se krystal na procesoru rozcházel o takové velké hodnoty.
Dokonce bych řekl že se o vteřinu za den nerozejde ani RC oscilátor, který mají levné procesory rovnou na sobě.
Ale na druhou stranu není problém si čas "stahovat" z DCF třeba každou hodinu.
Jinak podle mého názoru není pravděpodobné, že by se krystal na procesoru rozcházel o takové velké hodnoty.
Dokonce bych řekl že se o vteřinu za den nerozejde ani RC oscilátor, který mají levné procesory rovnou na sobě.
Ale na druhou stranu není problém si čas "stahovat" z DCF třeba každou hodinu.
Za pravopisné chyby v této zprávě může moje učitelka češtiny.
Re: Hodiny a časování
Už je to nějakou dobu. Možná jsem to s těmi sec./ den trochu přehnal.
Ale vím, že to bylo hodně (pro delší doby nepoužitelné).
Přesto to zkusím ještě s novým pohledem. Hodilo by se mi kdybych se mýlil.
Ale vím, že to bylo hodně (pro delší doby nepoužitelné).
Přesto to zkusím ještě s novým pohledem. Hodilo by se mi kdybych se mýlil.
Re: Hodiny a časování
No z mých zkušeností není víc jak sekunda za den nic nenormálního docela bych se právě divil kdyby to bylo přesnější. Tedy pokud tam máš nějaký další kod k vykonávání.
Re: Hodiny a časování
No, takže si to tam zavedeš tím softwarem?
Protože normálně se přece přesný čas počítá tak, jak jsi už odhalil v případě arduina s použitím millis a nebo ještě jejich velkého násobku.
Pochopitelně si dělení zařídíš na nějakém hezkém timeru, který má šikovný preload, aby jsi se o něj nemusel starat.
A nebo si použiješ procesor, který má pro takové hodiny podpůrné prostředky. Třeba PIC16F628 má alternativní funkce na RB6 a RB7 pro připojení druhého krystalu přímo na vstup timer1. Takový druhý krystal se dá použít celkem pomalý - například 32768Hz a pokud na vstupu timeru použiji vhodný prescaller (česky dělič), například 1:8, tak mi k přetečení 8bit čítače dojde právě 16× za vteřinu. Na to si narafičím přerušení a v hlavním programu mohu hledat například odpověď na základní otázku života, vesmíru a vůbec. Uznávám, že jsem tím vlastně použil timer1 stejně, jako by to byl externí RTC obvod, ale takhle je to mnohem elegantnější.
Protože normálně se přece přesný čas počítá tak, jak jsi už odhalil v případě arduina s použitím millis a nebo ještě jejich velkého násobku.
Pochopitelně si dělení zařídíš na nějakém hezkém timeru, který má šikovný preload, aby jsi se o něj nemusel starat.
A nebo si použiješ procesor, který má pro takové hodiny podpůrné prostředky. Třeba PIC16F628 má alternativní funkce na RB6 a RB7 pro připojení druhého krystalu přímo na vstup timer1. Takový druhý krystal se dá použít celkem pomalý - například 32768Hz a pokud na vstupu timeru použiji vhodný prescaller (česky dělič), například 1:8, tak mi k přetečení 8bit čítače dojde právě 16× za vteřinu. Na to si narafičím přerušení a v hlavním programu mohu hledat například odpověď na základní otázku života, vesmíru a vůbec. Uznávám, že jsem tím vlastně použil timer1 stejně, jako by to byl externí RTC obvod, ale takhle je to mnohem elegantnější.
Za pravopisné chyby v této zprávě může moje učitelka češtiny.
Re: Hodiny a časování
Zdravím,
uveď příklad pro kontrolu.Teď to zkouším a je za cca 4 hod. rozdíl neúnosný.
LEDka jen informační (zkouším na NANO).
Poraď kde mám chybu. Předem díky.
uveď příklad pro kontrolu.Teď to zkouším a je za cca 4 hod. rozdíl neúnosný.
LEDka jen informační (zkouším na NANO).
Poraď kde mám chybu. Předem díky.
Kód: Vybrat vše
#include "Arduino.h"
long staryCas;
int LED1 = 13;
void setup()
{
pinMode( 13, OUTPUT);
}
void loop()
{
if (millis() > (60000 + staryCas))
{
staryCas = millis();
digitalWrite(13, HIGH);
delay(10000);
digitalWrite(13, LOW);
}
}
Re: Hodiny a časování
Celá tahle podmínka je na 3.14 ...Jirka píše: if (millis() > (60000 + staryCas))
{
staryCas = millis();
}
Jednak nevíš (ani mě se nechce dohledávat) jak dlouho trvá její zpracování po překladu do asm.
A pak když už je podmínka splněna tak si to ještě posereš tím, že uložíš AKTUÁLNÍ hodnotu millis() + čas co uběhl zpracováním dalších asm instrukcí.
Než budeš měřit čas, nastuduj si jak funguje procesor. Stačí ten nejprimitivnější MC14500.
http://www.webalice.it/giussdp/cpu1bit/
Re: Hodiny a časování
To snad nemyslíš vážně?Jirka píše:uveď příklad pro kontrolu.Teď to zkouším a je za cca 4 hod. rozdíl neúnosný.
Ty jsi v tom programu zopakoval všechny chyby, o kterých jsme se bavili na začátku tohoto vlákna
TADY se podívej jak se takový program píše.
Předpokládám, že ten dlouhý
delay(10000)
představuje dlouhý kód, s tím bych se smířil.Taky si chci myslet, že to že nemáš prvotní inicializaci
staryCas
jenom proto, aby nebyl listing moc dlouhej v konferenci.Tím, že přiřazuješ
staryCas = millis();
si rozmazáváš (zvětšuješ) chybu, ke které došlo protože jsi nestihl přesný okamžik kdy millis() [b]=[/b] (60000 + staryCas)
a tak dále a tak podobně.
Vezmi si tohle vlákno ještě jednou od začátku a pokus se napsat nový program.
P.S. pro pgerla: správně se píše, že ten program je na <|>
P.P.S. pro mladší 18 let, to je obrázek diamantu
Za pravopisné chyby v této zprávě může moje učitelka češtiny.
-
- Příspěvky: 385
- Registrován: 02 dub 2014, 15:30
Re: Hodiny a časování
Ahoj,
zkousel jsem pouzit casovac (Timer2) pro odecet sekund v presruseni.
v loopu vypisuji millis po uplynuti delaye.
cim vic serial.printu, tim vetsi zpozdeni.
vypis serial.printu zpozduje millis o desetiny milisekund. (muzes vyzkouset s kratsim delayem)
pri vypisu kazdou minutu bylo zpozdeni po 4hodinach 138ms. (muzes zkusit udelat jeden vypis po 4hodinach)
ale bez vypisu by to bylo asi +- v poradku.
vypis terminalu:
--------------------------------
inicializace casovacu viz. http://www.8bit-era.cz/arduino-timer-in ... lator.html
kod pro Arduino (zkouseno na Nano)
pro spustu veci presnost casovacu staci, pokud ne, tak externi hw je nutny.
-V66
zkousel jsem pouzit casovac (Timer2) pro odecet sekund v presruseni.
v loopu vypisuji millis po uplynuti delaye.
cim vic serial.printu, tim vetsi zpozdeni.
vypis serial.printu zpozduje millis o desetiny milisekund. (muzes vyzkouset s kratsim delayem)
pri vypisu kazdou minutu bylo zpozdeni po 4hodinach 138ms. (muzes zkusit udelat jeden vypis po 4hodinach)
ale bez vypisu by to bylo asi +- v poradku.
vypis terminalu:
Kód: Vybrat vše
0 time: 0
1 time: 59997
2 time: 119999
3 time: 179997
4 time: 240000
5 time: 299998
6 time: 360000
7 time: 419998
8 time: 480001
9 time: 539999
10 time: 600001
11 time: 660003
12 time: 720002
13 time: 780004
14 time: 840002
15 time: 900004
16 time: 960003
17 time: 1020005
18 time: 1080007
19 time: 1140005
20 time: 1200008
21 time: 1260006
22 time: 1320008
23 time: 1380006
24 time: 1440009
25 time: 1500011
26 time: 1560009
27 time: 1620012
28 time: 1680010
29 time: 1740012
30 time: 1800010
.
.
.
.
.
210 time: 12600118
211 time: 12660120
212 time: 12720122
213 time: 12780121
214 time: 12840123
215 time: 12900121
216 time: 12960123
217 time: 13020126
218 time: 13080124
219 time: 13140126
220 time: 13200124
221 time: 13260127
222 time: 13320129
223 time: 13380127
224 time: 13440130
225 time: 13500128
226 time: 13560130
227 time: 13620132
228 time: 13680131
229 time: 13740133
230 time: 13800131
231 time: 13860133
232 time: 13920136
233 time: 13980134
234 time: 14040136
235 time: 14100134
236 time: 14160137
237 time: 14220139
238 time: 14280137
239 time: 14340140
240 time: 14400138
inicializace casovacu viz. http://www.8bit-era.cz/arduino-timer-in ... lator.html
kod pro Arduino (zkouseno na Nano)
Kód: Vybrat vše
unsigned long Time = 0;
int num = 0;
void setup(){
// TIMER 2 for interrupt frequency 1000 Hz:
cli(); // stop interrupts
TCCR2A = 0; // set entire TCCR2A register to 0
TCCR2B = 0; // same for TCCR2B
TCNT2 = 0; // initialize counter value to 0
// set compare match register for 1000 Hz increments
OCR2A = 249; // = 16000000 / (64 * 1000) - 1 (must be <256)
// turn on CTC mode
TCCR2B |= (1 << WGM21);
// Set CS22, CS21 and CS20 bits for 64 prescaler
TCCR2B |= (1 << CS22) | (0 << CS21) | (0 << CS20);
// enable timer compare interrupt
TIMSK2 |= (1 << OCIE2A);
sei(); // allow interrupts
Serial.begin(9600);
}
//---------------------------
void loop(){
Serial.print(num); //zobrazeni pocet minut
num=num+1;
Serial.print(" time: ");
Serial.println(Time);
delay (60000); //vypis na terminal kazdou minutu viz vypis
//delay (1000); //zpozdeni 20ms za minutu pri vypisu na terminal
//delay (10000); //zpozdeni 20ms za 10minut pri vypisu na terminal
}
//-----------------------------
ISR(TIMER2_COMPA_vect){
//interrupt commands for TIMER 2 here
Time = millis();
-V66