Stránka 5 z 13
Re: Hodiny a časování
Napsal: 16 říj 2016, 19:35
od daton
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í
Napsal: 05 lis 2016, 06:59
od Jirka
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.
Re: Hodiny a časování
Napsal: 05 lis 2016, 13:47
od fulda
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.
Re: Hodiny a časování
Napsal: 05 lis 2016, 17:02
od Jirka
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.
Re: Hodiny a časování
Napsal: 05 lis 2016, 20:50
od daton
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í
Napsal: 05 lis 2016, 21:59
od fulda
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ší.
Re: Hodiny a časování
Napsal: 05 lis 2016, 22:34
od Jirka
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.
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í
Napsal: 06 lis 2016, 06:57
od pgerla
Jirka píše:
if (millis() > (60000 + staryCas))
{
staryCas = millis();
}
Celá tahle podmínka je na 3.14 ...
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í
Napsal: 06 lis 2016, 10:30
od fulda
Jirka píše:uveď příklad pro kontrolu.Teď to zkouším a je za cca 4 hod. rozdíl neúnosný.
To snad nemyslíš vážně?
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
Re: Hodiny a časování
Napsal: 06 lis 2016, 10:51
od Vladimir66
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:
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();
pro spustu veci presnost casovacu staci, pokud ne, tak externi hw je nutny.
-V66