Idő és dátum kezelése 32khz-es kristály nélkül

Hogyan programozzak AVR chipet? Programozók beállításai...
Bascom nyelvű programok...
Válasz küldése
Avatar
CsendesJ
Biztosítékgyilkos
Hozzászólások: 57
Csatlakozott: 2008. augusztus 31. vasárnap, 6:00

Idő és dátum kezelése 32khz-es kristály nélkül

Hozzászólás Szerző: CsendesJ »

Sziasztok,

Atmega 168/328-ra kellene írnom egy olyan programot, ami az időt, valamint a dátumot is nyilvántartja. A legegyszerűbb megoldás persze a 32khz-es kristály alkalmazása lenne (time$, date$), azonban ebben az esetben nem tudnám külső, stabil órajelről járatni a kapcsolást, ami viszont fontos lenne a nagy mennyiségű adat soros vonalon történő átküldésére.

Amennyiben definiálok egy eltelt másodperc változót, és ennek az értékét növelem másodpercenként (timer1 egy másodpercre állítva), akkor azt visszaalakítva megkapom a pillanatnyi időt.

Kód: Egész kijelölése

Strtime = "23:59:55"
Lsecofday = Secofday(strtime) 
.
.
Incr Lsecofday 
Strtime = Time(lsecofday)
Hasonló módon ezt meg tudom tenni a dátummal is (egyel növelve a változó értékét éjfélkor).
A kérdésem az, hogy szerintetek hosszabb távon mennyire megbízható, pontos ez a módszer, valamint az, hogy esetleg van-e ennél egyszerűbb megoldás?
(napi 1-2 mp természetesen belefér)
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Re: Idő és dátum kezelése 332khz-es kristály nélkül

Hozzászólás Szerző: Robert »

Tipp:
A dateTime esetén:
Config Clock=soft nem játszik?

De ha a belsőt járatod, akkor annak stabilnak kell lennie, hogy az óra relatív pontos legyen.
Külső 16-os quartz.
http://avrhelp.mcselec.com/index.html?config_clock.htm

Itt a mintaprogival lekezeled az órát:)

Kód: Egész kijelölése

$regfile = "m16def.dat"
 $crystal = 12000000
 $hwstack = 80
 $swstack = 80
 $framesize = 80
 $baud = 19200
 $sim                                                       'ONLY FOR SIMULATOR MODE !!!!
  
 Dim second_tick As Long
  
 Config Clock = User                                         'Use USER to write/use your own code
 Config Date = Dmy , Separator = .                           'Day.Month.Year
 Config Timer1 = Timer , Prescale = 256
 On Timer1 Timer_irq
 Const Timer_preload = 18661                                 'Timervorgabe für Sekunden Takt
  
 Enable Timer1
 Enable Interrupts
  
 Date$ = "01.09.09"
 Time$ = "00:00:00"
  
 Print Date$
  
 Do
        !NOP
 Loop
  
 End                   'end program
  
 Timer_irq:                                                 'Timer1 IRQ (once per second)
 Incr Second_tick
 Time$ = Time(second_tick)
 Timer1 = Timer_preload
  
 Print Time$                                               'only for Bascom-Simulator
 Return
  
 Settime:
 Return
  
 Getdatetime:
 Return
  
 Setdate:
 Return
Avatar
CsendesJ
Biztosítékgyilkos
Hozzászólások: 57
Csatlakozott: 2008. augusztus 31. vasárnap, 6:00

Re: Idő és dátum kezelése 332khz-es kristály nélkül

Hozzászólás Szerző: CsendesJ »

Természetesen a config clock = soft játszik, valamint külső 16MHz-es quartz-ot használok.
Köszi a mintát, kipróbálom.
Avatar
CsendesJ
Biztosítékgyilkos
Hozzászólások: 57
Csatlakozott: 2008. augusztus 31. vasárnap, 6:00

Re: Idő és dátum kezelése 332khz-es kristály nélkül

Hozzászólás Szerző: CsendesJ »

Kicsit át kellett írnom a programot, mivel a "second_tick" változónak a program elején át kell adni az indulási idő értékét, majd ezt szükséges növelni másodpercenként. Ugyanezt kellett eljátszani a date függvénnyel is. Az alábbi kód így szintén működik, de így gyakorlatilag csak a változók nevei kerültek módosításra.
Külső 16MHz-es kristállyal 20 óra alatt ~2mp volt a pontatlanság (~21 fokon).

Kód: Egész kijelölése

$regfile = "m168def.dat"
$crystal = 16000000
$hwstack = 50
$swstack = 50
$framesize = 50


Config Com1 = 19200 , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
Open "comd.6:19200,8,n,1" For Output As #2

Config Portb.5 = Output
Config Clock = User
Config Date = Ymd , Separator = -
Config Timer1 = Timer , Prescale = 1024
On Timer1 Timer_irq
Const Timer_preload = 49911

Dim Second_tick As Long
Dim Wsysday As Word

Enable Timer1
Enable Interrupts


Time$ = "23:59:50"
Second_tick = Secofday(time$)

Date$ = "15-11-10"
Wsysday = Sysday(Date$)


Print Date$

Do
 Loop
End

Timer_irq:
 Toggle Portb.5
 Incr Second_tick
 Time$ = Time(second_tick)
 Timer1 = Timer_preload
 If Time$ = "00:00:00" Then Incr Wsysday
 Date$ = Date(wsysday)
 Print #2 , Time$ ; " " ; Date$
Return
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Re: Idő és dátum kezelése 32khz-es kristály nélkül

Hozzászólás Szerző: Robert »

20 óra - 2 mp oka:
Const Timer_preload = 49911

Ugyanis már benne van a rutinban, amikor ezt állítod!
Az INT belpés órajele: 25 db, plusz ami a elején még molyolsz...
Az IN belépésed első sora legyen: Timer1 = Timer_preload
Avatar
CsendesJ
Biztosítékgyilkos
Hozzászólások: 57
Csatlakozott: 2008. augusztus 31. vasárnap, 6:00

Re: Idő és dátum kezelése 32khz-es kristály nélkül

Hozzászólás Szerző: CsendesJ »

Köszi Robi,

Erre nem is gondoltam :)
Válasz küldése