PIC jedne sekunde Algoritam iz rimskog Black

B

BlackOps

Guest
Pozdrav, Mislim da je većina od vas vjerojatno vidio ovu web-stranicu:
http://romanblack.com/one_sec.htm

je o tome kako bi točno 1 sekunde kašnjenja na Pics koristeći prekida.

ali moj problem je ja dont shvatiti apsolutno srce ovog algoritma.
ovdje je fragment koda:

izjavljuje tri varijable, a dodjeljuje ih vrijednosti:
(u decimalnom) bres_hi = 15, bres_mid = 66 1, bres_lo = 64ovo je učinjeno u postava rutina koja prometuje samo jednom:
Šifra:movlw 0x0F

movwf bres_himovlw 0x42 1

movwf bres_midmovlw 0x40

movwf bres_lo

 
Ja sumnjate da se koristi brojač 0 do generiranje prekida.Timer 0 je binarni brojač, sa ili bez prescaler.Bez prescaler to prirasta pouku svaki ciklus, koji je na 1 / 4 oscilatora frekvencije.To izgleda kao da se ne učitava TMR0 ničim.
Tako da ćete dobiti prekidati svakih 256 instrukcija ciklusa.Ovisno o stvarnim oscilator frekvencija, to može značiti različitim vremenskim intervalima.Na taj način zatim te potreba za smanjenje odgovarajući izabran kako bi se postigla konstantna 1 sekunde.

Na primjer, neka je pretpostaviti oscilatora je 4MHz.To znači da TMR0 sat 1MHz, ili je svaki nas koracima 1.To onda prelijeva i generira prekid svakih 256 nas.Zatim, da biste dobili 1 sekunde, trebate vidjeti 1s / 256us = 3.906,25 TMR0 prekida.Zatim u 4MHz, koji će biti vaš konstanta, 3.096.
Ali ako oscilator radi na, recimo, 3,6864 MHz, onda trebate namjestiti konstanta u skladu s tim.

Osobno, kad god trebam nešto ovako, ja se unaprijed učitati TMR0 s nekim brojem tako da dobijete lijepi okrugli broj, kažu prekidati svaki 250us.Zatim tvoj konstanta je oko 4.000.Čak i ako to nije tako lijep broj, barem vam svibanj biti u mogućnosti to maknuti ili smanjiti dio razlomka.Imajte na umu da originalni konstanta je 3096,25.Vi zaista izgubiti ,25 ako konstanta je 3.096, što znači da ne dobijete TOČNO 1s kao što vi tvrdite.

Za 4MHz slučaju te bi trebao pre-load TMR0 sa 6, jer želite to maknuti 6 točaka iz nje (zapamtite, to prirasta i uzrokuje prekid kada role preko 255-00, koji je 256 broji, tako da ćete želite gubiti 6 i tako unaprijed učitati brojač sa 6).
Međutim, TMR0 ne uvećava za dva ciklusa nakon što ste napisali da je i od pre-loading to znači pisanje na njega, te će "dobiti" dodatne 2 računa.Dakle, ti bi trebao pr-to sa 8 opterećenja, nego 6.
U additon, budući da se unaprijed učitati brojač u prekinuti rutinu, neko vrijeme će biti izgubljen dok ne dođete do stvarne movwf TMR0 nastava (kontekst spremanje, itd.), tako da broj mora biti prilagođen uzeti u obzir one upute .

Ako koristite pre-djelitelj, koja se može koristiti bilo TMR0 ili WDT, onda izračun promjena, na temelju pre-djelitelj šestar omjer, što možete odabrati u S / W.

Normalno, mogu koristiti samo ravno binarnih brojeva za konstante, jer možete jednostavno koristiti decfsz upute za smanjenje konstanta.A ako vam treba više od 1s, a zatim napraviti konstanta veća.

Nadam se da ovo pomaže.

 
VVV nego ur pošta pomogao mi malo.... i stvarno se taj program 1 sek.ok, ali problem nije to.

želim učiniti ručno EXACT jedne sekunde kašnjenja programa na PIC16F88 čipu.koristeći TMR0 podešavanja.

ja napisao kod.ali Internet se funkcionirati ispravno.ovdje je moj obračun:Delay = (4 * 2 * 100 * 100 * 50) / 4 000 000 = 1.000 000 drugi
1 second

na taj način kao u vidjeti ovdje moram dobiti točnu
1 sekunde

pa kao što vidite sada, ja postaviti Prescaler na 1:2, da TMR0 računati na svakih 100 puta.i stvaranje dviju varijabli, count = 100, a count2 = 50
Sada se mora dobiti 1 sekunde ....ALI, moj broj doesnt posao dobro, i ja dobiti: 0.076510 sekundi
Nije tacno ...može bilo tko reći mene zašto ja dobiti takve vrijednosti?gdje je moja greška?
kako moram preurediti moj broj za 1 sec?

dobro, a ovdje je moj broj koji daje pogrešan rezultat

Šifra:;************************************************* **********************************

;

;

;

;

;************************************************* **********************************# include <p16F88.inc>__CONFIG _CONFIG1, _CP_OFF & _CCP1_RB0 & _DEBUG_ON & _WRT_PROTECT_OFF & _CPD_OFF & _LVP_OFF & _BODEN_OFF & _MCLR_ON & _PWRTE_ON & _WDT_OFF & _INTRC_IO
RESET_ADDR EQU 0x00

ISR_ADDR EQU 0x04

COMRAM_ADDR EQU 0x70CBLOCK COMRAM_ADDR

status_temp

w_temp

računati najprije računati varijabla

count2; drugi count varijabla

ENDCORG RESET_ADDRSTART

goto SETUP

ORG ISR_ADDR;************************************************* **********************************

; POČETAK prekid USLUGA SVAKODNEVNA RUTINA

;************************************************* **********************************

Prekid
movwf w_temp

swapf STATUS, w

movwf status_temp;
movf računati, w; premjestiti brojati do w

xorlw b'00000000 '; XOR doslovno s wbtfss STATUS, 2; ako se računati iz nula, tada preskočite sljedeća instrukcija

decfsz računati, f; smanjenje računati, ako se računati ISR izlaz iz nula

goto count2dec

goto INTEXITcount2dec:

movf računati, w; premjestiti brojati do w

xorlw b'00000000 '; XOR doslovno s wbtfsc STATUS, 2; preskočite sljedeći instrukcija računati ako nije 0

decfsz count2, f; smanjenje count2, uključivanje / isključivanje LED ako je nula

goto INTEXIT
movlw b'10000000 '

xorwf PORTB, fmovlw ,100

movwf count

movlw ,50

movwf count2movlw ,158; TMR0 mora računati 100 puta, tako da mora imati 156 početku

movwf TMR0; to traje 2 ciklusa nastave da pišu za TMR0, pa sam stavio tamo 158INTEXIT

Bcf STATUS, 2; kliring Z zalogaj u STATUS, mislim da sam ga mora učiniti?

Bcf INTCON, TMR0IFswapf status_temp, w

movwf STATUS

swapf w_temp, f

swapf w_temp, w
retfie

;************************************************* **********************************

; KRAJ prekid USLUGA SVAKODNEVNA RUTINA

;************************************************* **********************************;************************************************* **********************************

; POČETAK SETUP SVAKODNEVNA RUTINA (prometuje samo jednom)

;************************************************* **********************************

SETUP

banksel OPTION_REG

; Movlw 0xc7

movlw 0xc0; prescaler je 1:2

movwf OPTION_REGbanksel TRISB

movlw b'00000000 '

movwf TRISBbanksel PORTB

clrf PORTBbanksel OSCCON

movlw b'01100000 '; bi trebao biti 4 MHz

movwf OSCCONbanksel INTCON

clrf INTCONmovlw ,100

movwf count

movlw ,50

movwf count2movlw 0xe0

movwf INTCONmovlw ,158; TMR0 mora računati 100 puta, tako da mora imati 156 početku

movwf TMR0; to traje 2 ciklusa nastave da pišu za TMR0, pa sam stavio tamo 158;************************************************* **********************************

; KRAJ SETUP SVAKODNEVNA RUTINA

;************************************************* **********************************;################################################# ##################################

; GLAVNI PROGRAM START

;################################################# ##################################

MAINLOOP

NOP

NOP

NOP

goto MAINLOOP

;################################################# ##################################

; GLAVNI PROGRAM END

;################################################# ##################################END
 
Prije svega 4MHz INTOSC nije točno 4MHz.To nije dobro za Real Time Clock ali je dovoljno dobar za serijsku komunikaciju.
To je 1% kalibriran na sobnoj temperaturi 23 ° C i da će promijeniti svoje brzine, ovisno o temperaturi.

Trebat ćete kristal da se bilo gdje u blizini sata točnost.

Također pogledati na korištenje TMR2 ili CCP1 posebne prekinuti jer su oni mnogo više nego svestran TMR0

 
Prije svega, ako trebate testirati registar, ako je nula, samo trebate učiniti movf reg, f, a zatim testirati Z zastavu, ne morate se xor sa w.Ali zašto to učiniti na sve, Ince decfsz to radi za vas?

Mislim da je problem sa kôd je da ne ponovno učitati brojač 1 kad dosegne nulu.Ovo je kako bih to učiniti:
Šifra:decfsz računati, f

goto intexitmovlw xxxx; reload count ovdje

movwf count

decfsz count2, f

goto intexitmovlw xxxx; reload count2 ovdje

movwf count2, a ovdje možete ponovno učitati TMR0, učiniti ono što trebate učiniti, itd. jer je 1 sec je proteklo.

 
: i was measuring time in MPLAB SIM.

blueroomelectronics:
ja je mjerenje vremena u MPLAB SIM.no thanx za savjet ću ga odvesti u obavijesti za buduće dizajne.
: well that was much more helpful!

VVV:
dobro da je bio mnogo više od pomoći!hvala!ali ja pa ipak imati neki malo problema.
imam remaked ISR code fragment kao što si rekao (na putu u mom rutina sam imao 100 50, ne 100 * 50 formula ...).i onda ja isto invaliditetom krčenje INTCON registrirati u SETUP rutina ...jer uz ovaj komad koda ja je uvijek 0 u TMR0.

Dakle ... u svakom slučaju, sad ja dobiti broj 1.279999 sekundi ...još uvijek nisu 1,000 000 sekundi.

zatim moj računati i count2 varijable su OK ...onda ...?što može biti drugi problem?

možda nešto pogrešno TMR0 pisanje?(kao u vidi ja obaviti unos od 158, cuz gubitka od 2 ciklusa tijekom pisati TMR0 ... kao što je rekao u Midrange priručnik)

provjerite da ja sam to radiš pravilno?i da li je normalno da se jasno TMR0IF bit u INTEXIT kod?

ovdje je pun kôd:
Šifra:;************************************************* **********************************

;

;

;

;

;************************************************* **********************************# include <p16F88.inc>__CONFIG _CONFIG1, _CP_OFF & _CCP1_RB0 & _DEBUG_ON & _WRT_PROTECT_OFF & _CPD_OFF & _LVP_OFF & _BODEN_OFF & _MCLR_ON & _PWRTE_ON & _WDT_OFF & _INTRC_IO
RESET_ADDR EQU 0x00

ISR_ADDR EQU 0x04

COMRAM_ADDR EQU 0x70CBLOCK COMRAM_ADDR

status_temp

w_temp

računati najprije računati varijabla

count2; drugi count varijabla

ENDCORG RESET_ADDRSTART

goto SETUP

ORG ISR_ADDR;************************************************* **********************************

; POČETAK prekid USLUGA SVAKODNEVNA RUTINA

;************************************************* **********************************

Prekidmovwf w_temp

swapf STATUS, w

movwf status_temp;decfsz računati, f; smanjenje računati, ako se računati ISR izlaz iz nula

goto INTEXITmovlw ,100

movwf countdecfsz count2, f; smanjenje count2, uključivanje / isključivanje LED ako je nula

goto INTEXITmovlw ,50

movwf count2movlw ,158; TMR0 mora računati 100 puta, tako da mora imati 156 početku

movwf TMR0; to traje 2 ciklusa nastave da pišu za TMR0, pa sam stavio tamo 158movlw b'10000000 '

xorwf PORTB, fINTEXITBcf INTCON, TMR0IFswapf status_temp, w

movwf STATUS

swapf w_temp, f

swapf w_temp, wretfie

;************************************************* **********************************

; KRAJ prekid USLUGA SVAKODNEVNA RUTINA

;************************************************* **********************************;************************************************* **********************************

; POČETAK SETUP SVAKODNEVNA RUTINA (prometuje samo jednom)

;************************************************* **********************************

SETUP

banksel OPTION_REG

; Movlw 0xc7

movlw 0xc0; prescaler je 1:2

movwf OPTION_REGbanksel TRISB

movlw b'00000000 '

movwf TRISBbanksel PORTB

clrf PORTBbanksel OSCCON

movlw b'01100000 '; bi trebao biti 4 MHz

movwf OSCCON; Banksel INTCON

; Clrf INTCONmovlw ,100

movwf count

movlw ,50

movwf count2movlw 0xe0

movwf INTCONmovlw ,158; TMR0 mora računati 100 puta, tako da mora imati 156 početku

movwf TMR0; to traje 2 ciklusa nastave da pišu za TMR0, pa sam stavio tamo 158;************************************************* **********************************

; KRAJ SETUP SVAKODNEVNA RUTINA

;************************************************* **********************************;################################################# ##################################

; GLAVNI PROGRAM START

;################################################# ##################################

MAINLOOP

NOP

NOP

NOP

goto MAINLOOP

;################################################# ##################################

; GLAVNI PROGRAM END

;################################################# ##################################END

 
Ja sam ne siguran zašto, ali problem u simulatoru čini se da je neuspjeh pri pisanju 158 do TMR0 unutar prekidom službe rutinskom.

pozdravi

 
narccizzo ... NE, MPLAB SIM prekida, ali se može nositi u vožnji način, a ne u debug modu, a ja mogu vidjeti RBx izlaze čip na dijagramu ..ja isto tako test ovaj na PROTEUS.isti rezultat.

tako da je problem negdje u pretovar TMR0 ...ali što točno nije u redu ...?

 
Vidim problem s TMR0: trebate ponovno učitati ga prije nego što smanjenje brojila, drugo, ona će jednostavno nastaviti prebrojavanje, prebaciti na nulu, itd. To će samo doći jednom prekrcan svaki put brojila do nule, što nije ono što ste želeti.

Sada je stvar JA pokušao trčanje kod u simulator, ali iz nekog razloga TMR0 ne bi naprćen i Internet incrments svaki ciklus instrukcija, umjesto svake druge.Mislim da je ovo samo simulator problem.Ako premjestite TMR0 pretovara kod neposredno prije decrementing brojila, to bi trebalo raditi.

I da, morate jasnu TMR0IF prije nego što izađete iz HRV, inače možete odmah će ga unijeti ponovo, jer mikro samo testovi zastavu i djeluje u skladu s tim.

Još jedna stvar koju trebate provjeriti: što se sjećam, TMR0 ne dobiti incremented za 2 ciklusa nastave samo ako prescaler je postavljen na 1 ili dodijeljena WDT.Mislim da je izjava odnosi se na cijeli 16-bitni brojač, TMR0 prescaler, tako da ne trebate ponovno učitati TMR0 sa 158, nego 157, jer tvoj prescaler je 1:2, pa izgubio dva ciklusa nastave znači 1 izgubio računati u TMR0.

 
,thanks for reply again.

VVV,
hvala za odgovor opet.ali opet doesnt funkcionirati ...

na taj način što JA je je, preselio sam ovaj dio koda:
movlw ,157
movwf TMR0

prije decrementing računati varijabla u HRV.

i ja isto ,157 dodijeljena na TMR0 u SETUP rutina ...

Zanimljivo je, rezultat je bio jednak 1.279999 sekundi ...Internet nije stvar jesam li učitati ,157 ili ,158 u TMR0 kako u SETUP i ISR ...ili je ja opterećenja ih oboje s ,157, rezultat je bio isti 1,279999 ZAŠTO?svojim vrlo čudno ...i moj broj stil doesnt funkcionirati ja licemjerje dobiti jednu sekundu.

vam reći da mi je potrebno učitati TMR0 sa N 1 ..Ne N 2, ali u mid range priručnik Microchip, u dijelu Timer0 oni kažu da moram ga učitati s N 2 ...

ali kao što sam rekao prije sada, to nije stvar učinio sam to teret s n 1 ili n 2 imao sam isti rezultat krivo ...hmm ... čudno, bilo koji ideja?

ps ja je mjerenje vremena, kako u PROTEUS i MPLAB SIM.dvije stvari ne mogu biti u krivu

<img src="http://www.edaboard.com/images/smiles/icon_smile.gif" alt="Osmjeh" border="0" />

Dodano nakon 1 sata 22 minuta:dobro dobro ...

sad sam primjetio zanimljivih stvari.in front of every operation with TMR0.

imam baciti banksel TMR0
ispred svake operacije s TMR0.
i ja je teret TMR0 s ,156 kako u HRV i postava.

rezultat je bio: 1,055 000 secondsonda sam odlučio napraviti obrnuti obračun i saznati koji broj TMR0 ne računajući na.1,055 000 = (4 * 2 * X * 5000) / 4 000 000 ===> X = 105,5Pitam se zašto nije ja dobiti cijeli broj?
pa ... TMR0 je brojenje na 105,5 ...onda, znači ja sam gubi 5,5 ciklusa ..
onda to znači da moram ponovno učitati TMR0 sa 156 5,5?čini tako, ali nije moguće.
onda ja pokušao to ponovno učitati TMR0 sa 156 6, ili 162 ...

i ja nije dobiti rezultat: 0.995000 sekundi.OK, bilo koji ideja sada?

<img src="http://www.edaboard.com/images/smiles/icon_biggrin.gif" alt="Very Happy" border="0" />
 
Ja objasniti u kratkom članku teorije i 4 načina za napraviti precizni RTC koristeći PIC-a i vanjski oscilator.Ja također uključena zero-sum/zero rimski Crno kumulativne pogreške metode ...koja radi jako dobro.

4 Metode Precision PIC RTC koristeći Swordfish Basic

4 Metode Precision PIC RTC koristeći mikroBasic

 
OK, tek sad sam obavijest da ne rade u banci nula u glavnoj petlji
U svakom slučaju, moja greška: dodaj clrf STATUS, neposredno nakon spremanja kontekst.To će Vas odvesti do banke 0.

Kao za učitavanje TMR0, trebate uzeti u obzir prekid kašnjenje (2 ciklusa mislim), plus kontekstu ušteda (3 ciklusa) plus clrf STATUS, plus TMR0 reload upute (2 ciklusa), plus kašnjenje je potrebno TMR0 na prirast (2 ciklusa).
To je ukupno 10 ciklusa.JA naprćen TMR0 sa 166 i prekida se javljaju u 100us.

Stvar sa 0,5 ciklusa može se riješiti dodavanjem NOP prije pretovar TMR0.Budući da koristite 1:2 prescaler, ekstra poduka će se računati kao 1 / 2 ciklusa.U ovom slučaju clrf STATUS nije posao.

Šifra:prekidmovwf w_temp

swapf STATUS, w

movwf status_temp;clrf STATUS

movlw ,166; TMR0 mora računati 100 puta, tako da mora imati 156 početku

movwf TMR0; to traje 2 ciklusa nastave da pišu za TMR0, pa sam stavio tamo 158decfsz računati, f; smanjenje računati, ako se računati ISR izlaz iz nula

goto INTEXITmovlw ,100

movwf countdecfsz count2, f; smanjenje count2, uključivanje / isključivanje LED ako je nula

goto INTEXITmovlw ,50

movwf count2
movlw b'10000000 '

xorwf PORTB, fINTEXITBcf INTCON, TMR0IFswapf status_temp, w

movwf STATUS

swapf w_temp, f

swapf w_temp, wretfie

 
Korištenje prescaler će sigurno uvesti točnost i vrijeme pogreške.Morate održavati 1:1 brojač operacija kako bi se postigla RTC točnost.

 
, thank you, every your reply helps.

VVV,
hvala, svaki tvoj odgovor pomaže.ali opet ja nije dobiti 1.000.000 seconds with ur novi kod isto ...
ja dont dobiti 0,955 sekundi!I ja labav 45000us, gdje i zašto?

ja preloaded TMR0 s ,176 u SETUP rutina, a ISR je kao u mene je pokazao ...i ja je dobio zaostatkom od 0,955 sekundi!još nešto nije u redu!

ali to se pitanje što sada činim preload TMR0 u SETUP rutina sa ...isti 955000us kašnjenje ...gdje svi obaviti ja labav 45000us?

ugoditi pomoć meneDodano nakon 2 sata 4 minute:Dobro dobro ..
napokon sam to učinio.neka me prvi post moj konačan broj koji daje točno jednu sekundu, prema MPLAB SIM.ovdje je:RADNO KODEKSA EXACT 1 sekunde kašnjenja KORISTEĆI Timer0 MODUL I preloading OF TMR0Šifra:;************************************************* **********************************

; Program:

; Autor:

; Procesor: PIC16F88

; Opis:

; Ovo je program za demonstraciju točno jednu sekundu kašnjenja korištenjem

; Prekida i Timer0 modul.
Opći formula za izračunavanje kašnjenje je:

; ************************************************* **************************

; * Delay = (4 * Prescaler * (256 - TMR0) * count * count2) / Crystal Frekv.
*

; ************************************************* **************************

; U našem slučaju smo preload TMR sa vrijednosti koja čini brojati do 100.

; Odaberite prescaler 1:2

; I dodijeliti vrijednosti od 100 i 50 računati i count2 odnosno

Nakon toga smo točno jednoj sekundi:

; 1 sekunde = (4 * 2 * (256 - 156) * 100 * 50) / 4 000 000

;************************************************* **********************************
# include <p16F88.inc>__CONFIG _CONFIG1, _CP_OFF & _CCP1_RB0 & _DEBUG_ON & _WRT_PROTECT_OFF & _CPD_OFF & _LVP_OFF & _BODEN_OFF & _MCLR_ON & _PWRTE_ON & _WDT_OFF & _INTRC_IO
RESET_ADDR EQU 0x00

ISR_ADDR EQU 0x04

COMRAM_ADDR EQU 0x70CBLOCK COMRAM_ADDR

status_temp

w_temp

računati najprije računati varijabla

count2; drugi count varijabla

ENDCORG RESET_ADDRSTART

goto SETUP

ORG ISR_ADDR;************************************************* **********************************

; POČETAK prekid USLUGA SVAKODNEVNA RUTINA

;************************************************* **********************************Prekidmovwf w_temp; Spremanje konteksta

swapf STATUS, w

movwf status_temp;NOP, možemo ga koristiti za otpad 0,005 sekundi, inače ćemo dobiti zaostatkom od 0,995 sekunde

banksel TMR0

movlw ,162; TMR0 mora računati 100 puta, tako da mora imati 156 početku

movwf TMR0, ali mi isto tako imati još jedan ciklusa koji smo slobodno pa smo ih morate dodati TMR0 također

; Tih ciklusa su:

; Kontekstu spas - 3

; TMR0 utovar - 2

; Banksel naredba - 1decfsz računati, f; smanjenje računati, izlaz ISR računati ako nije nula

goto INTEXIT, ako je nula count INTEXIT preskočiti, i ponovno učitati sa ,100 opet

movlw ,100

movwf countdecfsz count2, f, a zatim smanjenje count2, izlaz ISR ako count2 nije nula

goto INTEXIT, ako count2 je nula, INTEXIT preskočiti i tovariti ponovo sa ,50 opet

movlw ,50

movwf count2movlw b'10000000 '; prekidač PORTB pin

xorwf PORTB, fINTEXITBcf INTCON, TMR0IF; kliring TMR0IF nakon izlaska iz ISRswapf status_temp, w; Obnavljanje kontekst

movwf STATUS

swapf w_temp, f

swapf w_temp, wretfie

;************************************************* **********************************

; KRAJ prekid USLUGA SVAKODNEVNA RUTINA

;************************************************* **********************************
;************************************************* **********************************

; POČETAK SETUP SVAKODNEVNA RUTINA (prometuje samo jednom)

;************************************************* **********************************SETUP

banksel OPTION_REG

movlw 0xc0; Prescaler je 1:2

movwf OPTION_REGbanksel TRISB; PORTB je sve postavljeno na izlaz

movlw b'00000000 '

movwf TRISBbanksel PORTB; kliring PORTB

clrf PORTBbanksel OSCCON

movlw b'01100000 '; 4Mhz frekvencija oscilator odaberite

movwf OSCCONmovlw ,100; assing računati vrijednosti varijabli

movwf count

movlw ,50

movwf count2movlw 0xe0; GIE = 1, PEIE = 1, TMR0IE = 1

movwf INTCONbanksel TMR0; u početku jasno TMR0, iako njegova nisu potrebne

clrf TMR0;************************************************* **********************************

; KRAJ SETUP SVAKODNEVNA RUTINA

;************************************************* **********************************;################################################# ##################################

; GLAVNI PROGRAM START

;################################################# ##################################MAINLOOP

NOP

NOP

NOP

goto MAINLOOP;################################################# ##################################

; GLAVNI PROGRAM END

;################################################# ##################################END

 
i još jedna stvar!VVV li je bio u pravu!Roman Crnac nisu dobili točnu jedne sekunde!ja mjereno njegova kašnjenja koristeći MPLAB SIM, i pokazao mi je kašnjenje 1.000192 sekundi!dont znati ako je netko drugi učinio isto?onda ja mjereno moj konačan plan i to daje 1.000.000 kašnjenja.

 
i još jedno pitanje o mom konačnom programu, kao što znate ja ću biti odgođeno 1.000.000 sekundi u MPLAB SIM.ali u PROTEUS, koristeći alat COUNTER ja ću biti odgode od 1.005.000 sekundi, ZAŠTO?

međutim, ako ja maknuti NOP iz HRV prije TMR0 preloading, ja ću biti drugi 1.000.000 kašnjenje u PROTEUS, ali onda ja ne dobiti 0.995.000 sekunde u MPLAB SIM.heh ...zašto je to tako?bilo koji ideja?

 
On svibanj se da MPLAB ne simuliraju 2-ciklus odlaganja potrebna za grane na prekidni vektor.Nisam 100% siguran o tome, ipak.
Kada izgradite stvarni sklop te će se moći mjeriti kašnjenje na pin.Uostalom, krajnji cilj je dobiti pravo vrijeme u stvarnom svijetu.Ako svoj 'ne exaclty ono što ste očekivali, barem znate što učiniti kako biste ispravili problem.

 
Kada ste prescaler brojač postavljen na nešto drugo nego 1:1 te će predstaviti neke pogreške koje ne može nadomjestiti, čak i korištenjem rimski Black metoda.

have a 1:1 Timer to Tosc ratio to build an accurate time base.

Morate
imati 1:1 Odbrojavanje do Tosc omjer za izgradnju baze točnog vremena.

 
Problem s pisanjem 'teško' vrijednost TMR0 registrirati da postoji svibanj biti od 1 ciklus 'podrhtavanje' ulaska ISR kada Timer 0 'prelijevanja' prekid se događa za vrijeme od 1 ili 2 ciklusa ciklus instrukcija u glavnom programu.

your 'reload' value to TMR0.

Bolji pristup bi dodati
svoje "reload" vrijednost za TMR0.

Još jedan caveat je da je pisanje za TMR0 će jasno prescaler koja bi mogla zabrljati tvoj vremena tako da ćete vjerojatno želite zadržati 1:1 prescaler postavljanje.To vam ograničava na prilično kratko prekinuti intervalima, ali siguran sam da još uvijek može doći gore sa djelatan rješenje.

Ako sam bio prisiljen koristiti Timer 0 za RTC "srca" umjesto Timer 2, ja mogu učiniti nešto ovako (neprovjeren code);

Sretno sa projektom.Mike

Šifra:

;************************************************* *****************org 0x0004

;

; Spremanje glavni program kontekst

;

ISR_Proc

movwf W_ISR; ste W-reg | B?

swapf STATUS, W; ne mijenja STATUS bitovi | B?

movwf S_ISR; ste STANJE reg | B?

clrf status; banka 0 | B0

movf PCLATH, W; dobiti PCLATH | B0

movwf P_ISR; ste PCLATH | B0

clrf PCLATH; ISR je u banci 0 | B0

;

; Prep TMR0 za sljedeći prekinuti ciklus i kvrga od 1 sekunde counters

;

movlw-d '250 ' 2; vrijednost za 250-usec prekida | B0

addwf TMR0, F; reload TMR0 za sljedeći prekid | B0

decfsz RTCL, F; evo counter 0?
da, preskočiti, ostalo | B0

goto ISR_Exit; izlaz HRV | B0

decfsz RTCH, F; hi counter 0?
da, preskočiti, ostalo | B0

goto ISR_Exit; izlaz HRV | B0

;

; Reload 1 sekunde counters

;

movlw niske (d'4.000 '); reload 1-naš drugi pult | B0

movwf RTCL; | B0

movlw visoka (4.000 d' ') 1; | B0

movwf RTCH; | B0

;

; Izvoditi naš jednom u sekundi rutine ovdje

;

NOP; | B0

;

; Vratiti glavni kontekst programa

;

ISR_Exit

Bcf INTCON, TMR0IF; jasno TMR0 prekinuti zastava bit | B0

movf P_ISR, W; | B0

movwf PCLATH; vratiti PCLATH | B0

swapf S_ISR, W; | B0

movwf status; vratiti status | B0

swapf W_ISR, f; ne zeznuti status | B0

swapf W_ISR, W; vratiti W-reg | B0

retfie                  ; return from interrupt           |B0

;******************************************************************
 

Welcome to EDABoard.com

Sponsor

Back
Top