Vítejte na Elektro Bastlírn?
Nuke - Elektro Bastlirna
  Vytvořit účet Hlavní · Fórum · DDump · Profil · Zprávy · Hledat na fóru · Příspěvky na provoz EB

Vlákno na téma KORONAVIRUS - nutná registrace


Nuke - Elektro Bastlirna: Diskuzní fórum

 FAQFAQ   HledatHledat   Uživatelské skupinyUživatelské skupiny   ProfilProfil   Soukromé zprávySoukromé zprávy   PřihlášeníPřihlášení 

Atmega16 - přesnost hodin

 
Přidat nové téma   Zaslat odpověď       Obsah fóra Diskuzní fórum Elektro Bastlírny -> Programování PIC, ATMEL, EEPROM a dalších obvodů
Zobrazit předchozí téma :: Zobrazit následující téma  
Autor Zpráva
vasek125



Založen: Oct 13, 2005
Příspěvky: 132

PříspěvekZaslal: so leden 16 2010, 15:14    Předmět: Atmega16 - přesnost hodin Citovat

Potřeboval bych, aby mi v mega16 běžely hodiny. Abych zjistil přesnost, dal jsem si výstupy na ledky. Vteřiny připočítávám pomocí přerušení INT0. Hodinový signál je řízen externím krystalem. Problém je, že po 3 hodinách se hodiny předcházejí už o 1 sekundu. Čím dosáhnu větší přesnosti?
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Zmije



Založen: Jun 30, 2005
Příspěvky: 1571
Bydliště: Pardubický kraj

PříspěvekZaslal: so leden 16 2010, 15:37    Předmět: Citovat

Jednak může být nepřesný krystal a potom může být i chyba v algoritmu, třeba chyba ve výpočtu při nastavení čítače, nebo v následujícím čítání. Bez zdrojáku to půjde těžko rozluštit.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Odeslat e-mail
Andrea



Založen: Sep 07, 2007
Příspěvky: 9340

PříspěvekZaslal: so leden 16 2010, 15:43    Předmět: Citovat

No chtělo by to blíže (lépe) popsat. Nějak mi není jasné to připočítávání sekund přes INT0, INT0 je externí přerušení.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
vasek125



Založen: Oct 13, 2005
Příspěvky: 132

PříspěvekZaslal: so leden 16 2010, 17:10    Předmět: Citovat

To int0 jsem myslel jako přerušení č.0 od TIMER0. Kód je myslím dobře:

#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>
#include <stdlib.h>
#include <string.h>

#define bitSet(var, mask) ((var) |= (1 << (mask)))
#define bitClear(var, mask) ((var) &= ~(1 << (mask)))

#define F_CPU 14745600UL // 14.7456 MHz
#include <util/delay.h>
void m_delay_ms(unsigned int ms) {
unsigned int i;
for ( i=0; i<ms; i++) { _delay_ms(1); }
}
void m_delay_s(unsigned int s) {
unsigned int i, i2;
for ( i=0; i<s; i++) { for ( i2=0; i2<100; i2++) { _delay_ms(10); } }
}


unsigned int hodiny=23,minuty=59,sekundy=50;

unsigned int ir0count=0, ir0=0; // signalizace interrupt 0


void setled(void){
int pomProm=0, pomProm2=0, pomProm3=0;

pomProm = hodiny/10;
pomProm3 = pomProm;

for (pomProm2=4; pomProm2>=3; pomProm2--) {
if(pomProm3 % 2) bitSet(PORTB, pomProm2); else bitClear(PORTB, pomProm2);
pomProm3 /= 2;
}

pomProm3 = hodiny-(10*pomProm);
pomProm2=0;

for (pomProm2=2; pomProm2>=-1; pomProm2--) {
if (pomProm2>=0) {
if(pomProm3 % 2) bitSet(PORTB, pomProm2); else bitClear(PORTB, pomProm2);
} else {
if(pomProm3 % 2) bitSet(PORTA, 7); else bitClear(PORTA, 7);
}
pomProm3 /= 2;
}

pomProm2=0;
pomProm=minuty/10;
pomProm3 = pomProm;

for (pomProm2=4; pomProm2<=6; pomProm2++) {
if(pomProm3 % 2) bitSet(PORTC, pomProm2); else bitClear(PORTC, pomProm2);
pomProm3 /= 2;
}

pomProm3 = minuty-(10*pomProm);
pomProm2=0;

for (pomProm2=0; pomProm2<=3; pomProm2++) {
if(pomProm3 % 2) bitSet(PORTC, pomProm2); else bitClear(PORTC, pomProm2);
pomProm3 /= 2;
}

pomProm2=0;
pomProm=sekundy/10;
pomProm3 = pomProm;

for (pomProm2=2; pomProm2>=0; pomProm2--) {
if(pomProm3 % 2) bitSet(PORTA, pomProm2); else bitClear(PORTA, pomProm2);
pomProm3 /= 2;
}

pomProm3 = sekundy-(10*pomProm);
pomProm2=0;

for (pomProm2=6; pomProm2>=3; pomProm2--) {
if(pomProm3 % 2) bitSet(PORTA, pomProm2); else bitClear(PORTA, pomProm2);
pomProm3 /= 2;
}

}

void uptime(void){

sekundy++;
if (sekundy >= 60) {
if (minuty >= 59) {
if (hodiny >= 23) hodiny = 0; else hodiny++;
minuty = 0;
}
else {
minuty++;
}
sekundy = 0;
}

setled();
}

ISR(TIMER0_OVF_vect) {
TCNT0=16; // 14.7456MHz/1024/240=60 preruseni/sec

ir0count++;
if (ir0count>=60) {
ir0count=0;
ir0=1;
}

if (bit_is_clear(PIND, 6)) {
hodiny=12;
minuty=40;
sekundy=0;
setled();
}

}


int main() {

// Nastaveni pinu jako vstupnich
bitClear (DDRD, 6);
bitSet (PORTD, 6);


// Nastaveni pinu jako vystupnich
bitSet (DDRB, 0);
bitSet (DDRB, 1);
bitSet (DDRB, 2);
bitSet (DDRB, 3);
bitSet (DDRB, 4);
bitSet (DDRA, 0);
bitSet (DDRA, 1);
bitSet (DDRA, 2);
bitSet (DDRA, 3);
bitSet (DDRA, 4);
bitSet (DDRA, 5);
bitSet (DDRA, 6);
bitSet (DDRA, 7);
bitSet (DDRC, 0);
bitSet (DDRC, 1);
bitSet (DDRC, 2);
bitSet (DDRC, 3);
bitSet (DDRC, 4);
bitSet (DDRC, 5);
bitSet (DDRC, 6);

bitSet(TCCR0, CS00); // Clock prescaler (/ 1024) 1. cast
bitSet(TCCR0, CS02); // Clock prescaler (/ 1024) 2. cast
bitSet(TIMSK, TOIE0); // povoleni preruseni od casovace

sei(); // povoleni preruseni globalne

while(1) {
if(ir0) {
ir0=0;
uptime();
}
m_delay_ms(0);

}
return 0;
}
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Atlan



Založen: May 10, 2004
Příspěvky: 4513
Bydliště: Košice

PříspěvekZaslal: so leden 16 2010, 23:49    Předmět: Citovat

to bude radosti to odladit v Cku...hlavne popocitat instrukcie..
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Zmije



Založen: Jun 30, 2005
Příspěvky: 1571
Bydliště: Pardubický kraj

PříspěvekZaslal: ne leden 17 2010, 0:55    Předmět: Citovat

Na první pohled mi připadá, že program je správně, tak zbývá přesnost krystalu, pokud je za 3h odchylka 1s, potom za každou s. bude odchylka 1/(3x60x60)=92,5926us, převedeno na kmitočet 1/(92,5926us)=~10,8kHz, relativní odchylka krystalu od jmenovité hodnoty 14745,6kHz bude 100x10,8/14745,6= 0,073%, pokud počítám správně, tak ta odchylka bude ve výrobní toleranci běžného krystalu.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Odeslat e-mail
mtajovsky



Založen: Sep 19, 2007
Příspěvky: 3698
Bydliště: Praha

PříspěvekZaslal: ne leden 17 2010, 1:00    Předmět: Citovat

V okamžiku vzniku přerušení trvá nějakou dobu, než je řízení předáno na servisní rutinu. Také naplnění čítače nějakou dobu trvá a teprve od této chvíe začíná další čítání až k dalšímu interruptu. Tohle se bude dít 60 x za sekundu a 3600 x za hodinu, tudíž 216 000 x za hodinu. Je-li chyba za hodinu 1s, připadá na 1 interrupt časová chyba 1/216000s = 4,63 us. Proveďte si analýzu kódu v assembleru, kolik instrukčních cyklů připadá na činnosti, které jsem napsal, jestli je tím možné.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Odeslat e-mail
vasek125



Založen: Oct 13, 2005
Příspěvky: 132

PříspěvekZaslal: ne leden 17 2010, 1:03    Předmět: Citovat

No tolerance tohohle krystalu je 50ppm(0,00005%). Teď když jsem se na to koukal znovu, tak je tam pořád ta 1 sekunda, takže se to někde zpozdilo během prvních 3 hodin a pak je to dobrý, což je docela zvláštní.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Andrea



Založen: Sep 07, 2007
Příspěvky: 9340

PříspěvekZaslal: ne leden 17 2010, 9:32    Předmět: Citovat

vasek125 napsal(a):
No tolerance tohohle krystalu je 50ppm(0,00005%).

To jsi s těma nulama trošku přestřelil, 50ppm je 0,005%.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
LordFus



Založen: Sep 20, 2009
Příspěvky: 39

PříspěvekZaslal: ne leden 17 2010, 9:54    Předmět: Citovat

no pokud chceš přesné hodiny, tak toho lze (kor v céčku) docela těžko docílit. Nicméně používáš mega16, ten má extra vstupy pro krystal 32.768kHz přímo do čítače2, se správným nastavením předděličky ti bude nastávat přerušení každou vteřinu. Zkoušel sem to na mega8 a jede to vcelku přesně, za 24hodin se to viditelně ani nehlo co se odchylky týče, ovšem ne vždy se mi krystal podaří rozkmitat.
_________________
..::Darovanému čipu na křemík nehleď::..
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovy WWW stránky
vasek125



Založen: Oct 13, 2005
Příspěvky: 132

PříspěvekZaslal: ne leden 17 2010, 12:39    Předmět: Citovat

A ve chvíli, kdy běží ta obsluha přerušení, čítá čítač znovu nebo začne čítat až když ta obsluha přerušení doběhne?
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
LordFus



Založen: Sep 20, 2009
Příspěvky: 39

PříspěvekZaslal: ne leden 17 2010, 12:42    Předmět: Citovat

začne čítat ihned po přetečení, respektive se nezastaví
_________________
..::Darovanému čipu na křemík nehleď::..
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovy WWW stránky
Zobrazit příspěvky z předchozích:   
Přidat nové téma   Zaslat odpověď       Obsah fóra Diskuzní fórum Elektro Bastlírny -> Programování PIC, ATMEL, EEPROM a dalších obvodů Časy uváděny v GMT + 1 hodina
Strana 1 z 1

 
Přejdi na:  
Nemůžete odesílat nové téma do tohoto fóra.
Nemůžete odpovídat na témata v tomto fóru.
Nemůžete upravovat své příspěvky v tomto fóru.
Nemůžete mazat své příspěvky v tomto fóru.
Nemůžete hlasovat v tomto fóru.
Nemůžete připojovat soubory k příspěvkům
Můžete stahovat a prohlížet přiložené soubory

Powered by phpBB © 2001, 2005 phpBB Group
Forums ©
Nuke - Elektro Bastlirna

Informace na portálu Elektro bastlírny jsou prezentovány za účelem vzdělání čtenářů a rozšíření zájmu o elektroniku. Autoři článků na serveru neberou žádnou zodpovědnost za škody vzniklé těmito zapojeními. Rovněž neberou žádnou odpovědnost za případnou újmu na zdraví vzniklou úrazem elektrickým proudem. Autoři a správci těchto stránek nepřejímají záruku za správnost zveřejněných materiálů. Předkládané informace a zapojení jsou zveřejněny bez ohledu na případné patenty třetích osob. Nároky na odškodnění na základě změn, chyb nebo vynechání jsou zásadně vyloučeny. Všechny registrované nebo jiné obchodní známky zde použité jsou majetkem jejich vlastníků. Uvedením nejsou zpochybněna z toho vyplývající vlastnická práva. Použití konstrukcí v rozporu se zákonem je přísně zakázáno. Vzhledem k tomu, že původ předkládaných materiálů nelze žádným způsobem dohledat, nelze je použít pro komerční účely! Tento nekomerční server nemá z uvedených zapojení či konstrukcí žádný zisk. Nezodpovídáme za pravost předkládaných materiálů třetími osobami a jejich původ. V případě, že zjistíte porušení autorského práva či jiné nesrovnalosti, kontaktujte administrátory na diskuzním fóru EB.


PHP-Nuke Copyright © 2005 by Francisco Burzi. This is free software, and you may redistribute it under the GPL. PHP-Nuke comes with absolutely no warranty, for details, see the license.
Čas potřebný ke zpracování stránky 0.19 sekund