Hodiny a časování

Odpovědět
daton
Příspěvky: 664
Registrován: 16 bře 2013, 16:12

Re: Hodiny a časování

Příspěvek 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.
Jirka
Příspěvky: 55
Registrován: 18 lis 2015, 12:06

Re: Hodiny a časování

Příspěvek 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.
Uživatelský avatar
fulda
Příspěvky: 1359
Registrován: 04 led 2016, 17:18

Re: Hodiny a časování

Příspěvek 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.
Za pravopisné chyby v této zprávě může moje učitelka češtiny.
Jirka
Příspěvky: 55
Registrován: 18 lis 2015, 12:06

Re: Hodiny a časování

Příspěvek 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.
daton
Příspěvky: 664
Registrován: 16 bře 2013, 16:12

Re: Hodiny a časování

Příspěvek 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í.
Uživatelský avatar
fulda
Příspěvky: 1359
Registrován: 04 led 2016, 17:18

Re: Hodiny a časování

Příspěvek 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ší.
Za pravopisné chyby v této zprávě může moje učitelka češtiny.
Jirka
Příspěvky: 55
Registrován: 18 lis 2015, 12:06

Re: Hodiny a časování

Příspěvek 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);
   }    
}
pgerla
Příspěvky: 400
Registrován: 11 dub 2013, 00:17

Re: Hodiny a časování

Příspěvek 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/
Obrázek
Uživatelský avatar
fulda
Příspěvky: 1359
Registrován: 04 led 2016, 17:18

Re: Hodiny a časování

Příspěvek 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 Obrázek
Za pravopisné chyby v této zprávě může moje učitelka češtiny.
Vladimir66
Příspěvky: 385
Registrován: 02 dub 2014, 15:30

Re: Hodiny a časování

Příspěvek 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
Odpovědět