PIC vienu sekundi algoritms no romiešu Black

B

BlackOps

Guest
Sveiki, es domāju, ka lielākā daļa no jums droši vien redzēja šo tīmekļa vietni:
http://romanblack.com/one_sec.htm

tas ir par to, kā padarīt tieši 1 sekundi kavēšanās atbildīgās izmantojot pārtrauc.

bet mana problēma ir i absolūti dont saprast sirds šī algoritma.
šeit ir fragments no koda:

viņš deklarē trim mainīgajiem lielumiem, un piešķir tām vērtību:
(Decimālgrādos) bres_hi = 15, bres_mid = 66 1, bres_lo = 64tas tiek darīts setup rutīnas, kas iet tikai vienu reizi:
Kods:movlw 0x0F

movwf bres_himovlw 0x42 1

movwf bres_midmovlw 0x40

movwf bres_lo

 
Man ir aizdomas, viņš, izmantojot taimeri 0, lai radītu pārtrauc.0 Taimeris ir bināro counter, ar vai bez prescaler.Bez prescaler tā pieaugumu ik instrukcija ciklu, tas ir pie 1 / 4 oscilatoru frekvences.Izskatās, ka viņš nav iekraušana TMR0 ar neko.
Tātad jums pārtraukt ik pēc 256 apmācību cikli.Atkarībā no faktiskajiem oscilatoru frekvences tas var nozīmēt dažādos laika intervālos.Tātad jums ir nepieciešams samazināšanās jāizvēlas konstante, lai sasniegtu 1 sekunde.

Piemēram, pieņemsim oscilators ir 4MHz.Tas nozīmē TMR0 pulkstenis ir 1MHz, vai tā pieauguma ik pēc 1 mums.Tad pārplūšanas un rada pārtraukt ik pēc 256 mums.Tad, lai iegūtu 1 sekundes, jums ir nepieciešams, lai redzētu, 1s / 256us = 3906,25 TMR0 pārtrauc.Tad 4MHz, kas varētu būt jūsu nemainīgs, 3096.
Bet, ja oscilatoru iet pie, teiksim, 3,6864 MHz, tad jums ir nepieciešams pielāgot pastāvīgu atbilstoši.

Personīgi, kad man ir nepieciešams kaut kas līdzīgs šim, es pirms slodzes TMR0 ar kādu numuru tā, lai iegūtu jauku vesels skaitlis, ti pārtraukt ik 250us.Tad jūsu konstante ir apaļas 4000.Pat ja tas nav tik jauks numuru, vismaz jūs, iespējams, var novērst vai samazināt frakcionēti daļu.Ņemiet vērā, ka sākotnējais konstante ir 3096,25.Jūs faktiski zaudējat 0,25, ja konstante ir 3096, kas nozīmē, jums nav iegūtu tieši 1s, kā jūs pieprasāt.

Par 4MHz gadījumā jums būtu nepieciešams, lai pirms slodzes TMR0 ar 6, jo jūs vēlaties izņemt 6 skaita no tā (atcerieties, tas soli un izraisa pārtraukt, kad ruļļi pa 255-00, tas ir 256 skaita, tādējādi jūs vēlaties zaudēt 6 un tā pirms slodzes counter 6).
Tomēr TMR0 nav pieaugums par diviem cikliem pēc tam, kad rakstīt, un, jo pirms iekraušanas tas nozīmē rakstiski tā, jūs varētu "iegūt" papildu 2 skaitu.Tāpēc jums būtu nepieciešams, lai pr-load to ar 8, nevis 6.
In additon, jo jūs iepriekš slodze taimeris, kas pārtrauc ikdienas, kādu laiku būs zaudēts, kamēr jums faktisko movwf TMR0 instrukciju (saistībā taupīšanu uc), tāpēc skaits ir jāpielāgo, lai ņemtu vērā šos norādījumus .

Ja izmantojat iepriekš scaler, ko var izmantot vai nu TMR0 vai WDT, tad aprēķins mainās, pamatojoties uz iepriekš scaler dalītāju koeficients, kuru jūs varat izvēlēties S / W.

Parasti, es izmantot tikai taisni bināro numuru konstantes, jo jūs varat izmantot decfsz instrukcijas samazināšanās nemainīga.Un, ja jums ir nepieciešams vairāk nekā 1s, pēc tam veiciet konstantu lielāks.

Es ceru, ka tas palīdz.

 
VVV apakšnodaļa thanx ur post palīdzējis man maz.un ..., ka programma tiešām 1 sek.ok, bet problēma ir ne šo.

Es gribu darīt manuāli EXACT vienu sekundi kavēšanās programmu PIC16F88 mikroshēmā.izmantojot TMR0 regulēšanas.

I wrote kodu.bet tā doesn't darbu pareizi.šeit ir mans aprēķins:Kavēšanās = (4 * 2 * 100 * 100 * 50) / 4 000 000 = 1,000 000 otrajā
1 second

tā kā u skatīt šeit man ir iegūt EXACT
1 sekundes

tā kā jūs redzēt tagad, es noteikti Prescaler līdz 01:02, lai TMR0 skaits 100 reizes.un izveidot divus mainīgos, skaitu = 100, un count2 = 50
Tagad man ir iegūt 1 sekundi ....BET, mans kods doesn't darbu labi, un man: 0.076510 sekundēs
Tā nav pareiza ...var kāds pateikt man, kāpēc es varu saņemt šo vērtību?kur ir mana kļūda?
cik man ir pārtaisīt manu kodu, 1 sec?

labi, un šeit ir mans kods, kas dod nepareizu rezultātu

Kods:;************************************************* **********************************

;

;

;

;

;************************************************* **********************************# Ietvert <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

skaits; pirmais skaita mainīgais lielums

count2; otrais skaits mainīgs

ENDCORG RESET_ADDRSTART

Iet SETUP

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

; Sākums pārtraukt pakalpojumu REGULĀRA

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

Pārtraukt
movwf w_temp

swapf STATUSS, w

movwf status_temp;
movf skaits, w, pārvietot skaits uz w

xorlw b'00000000 "XOR burtiski ar wbtfss STATUSS, 2, ja skaita iz nulle, tad izlaidiet nākamo norādījumu

decfsz skaits, f, samazināšanās skaitu, izejas ISR ja skaits iz nulle

Iet count2dec

Iet INTEXITcount2dec:

movf skaits, w, pārvietot skaits uz w

xorlw b'00000000 "XOR burtiski ar wbtfsc STATUSS, 2, izlaidiet nākamo norādījumu, ja skaits nav 0

decfsz count2, f, samazināšanās count2, ieslēgt / izslēgt gaismas, ja nulle

Iet INTEXIT
movlw b'10000000 "

xorwf PORTB, fmovlw 0,100

movwf skaits

movlw 0,50

movwf count2movlw 0,158; TMR0 ir skaits 100 reizes, tāpēc tam jābūt 156 sākotnēji

movwf TMR0, tā veic 2 apmācību cikli rakstīt TMR0, tāpēc man 158 irINTEXIT

BCF STATUS, 2, klīringa Z bit statuss, es domāju, ka tas jādara?

BCF INTCON, TMR0IFswapf status_temp, w

movwf STATUSS

swapf w_temp, f

swapf w_temp, w
retfie

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

; Beigām pārtraukt pakalpojumu REGULĀRA

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

; Sākums SETUP REGULĀRA (skaitīšana tikai vienu reizi)

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

SETUP

banksel OPTION_REG

; Movlw 0xc7

movlw 0xc0; prescaler ir 01:02

movwf OPTION_REGbanksel TRISB

movlw b'00000000 "

movwf TRISBbanksel PORTB

clrf PORTBbanksel OSCCON

movlw b'01100000 "ir 4 MHz

movwf OSCCONbanksel INTCON

clrf INTCONmovlw 0,100

movwf skaits

movlw 0,50

movwf count2movlw 0xe0

movwf INTCONmovlw 0,158; TMR0 ir skaits 100 reizes, tāpēc tam jābūt 156 sākotnēji

movwf TMR0, tā veic 2 apmācību cikli rakstīt TMR0, tāpēc man 158 ir;************************************************* **********************************

; BEIGAS SETUP REGULĀRA

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

; Galvenais programmu START

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

MAINLOOP

nop

nop

nop

Iet MAINLOOP

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

; Galvenais programmu END

;################################################# ##################################END
 
First off 4MHz INTOSC nav precīzi 4MHz.Tas nav labs reālā laika pulksteņa, taču tas ir pietiekami labs par sērijas komunikāciju.
Tas ir par 1% kalibrēto istabas temperatūrā 23.c un mainīs savu ātrumu atkarībā no temperatūras.

Jums vajadzēs kristāla lai saņemtu jebkur pie pulksteņa precizitāti.

Arī izpētīt, izmantojot TMR2 vai CCP1 īpašā pārtraukt, jo tie ir daudz vairāk universāls, nekā TMR0

 
Pirmkārt, ja jums nepieciešams pārbaudīt reģistru, ja tas ir nulle, jums tikai jādara movf reg, f un pēc tam testa Z karogu, jums nav nepieciešams XOR ar w.Bet kāpēc to visu, Ince decfsz tas jums?

Es domāju, ka kods problēma ar jūsu ir tā, ka jums nav jāpārlādē pret 1, ja tas sasniedz nulli.Tas ir kā es darītu tā:
Kods:decfsz skaits, f

Iet intexitmovlw xxxx; pārlādētu skaits šeit

movwf skaits

decfsz count2, f

Iet intexitmovlw xxxx; pārlādētu count2 šeit

movwf count2Un šeit jūs papildināšanas TMR0, darīt to, kas jums jādara, utt, jo 1 sek ir pagājis.

 
: i was measuring time in MPLAB SIM.

blueroomelectronics:
Es biju mērīšanas laikā MPLab SIM.bet thanx par padomu es ņemšu to paziņojumu par nākotnes dizainu.
: well that was much more helpful!

VVV apakšnodaļa:
labi, ka bija daudz noderīga!paldies!bet es vēl joprojām ir dažas maz problēmas.
Man ir remaked ISR kods fragments, kā jūs teicāt (starp citu manā ikdienas man bija 100 50, nevis 100 * 50 formula ...).un tad es arī invalīdu ieskaita no INTCON reģistra SETUP rutīnas ...jo ar šo gabalu kodu, man bija vienmēr ir 0 TMR0.

Tātad ... anyway, tagad man numurs 1.279999 sekundēs ...vēl nav 1,000 000 sekundes.

tagad mana skaits un count2 mainīgie ir OK ...Pēc tam ...?ko var citu problēmas?

varbūt kaut ko nepareizi TMR0 rakstveidā?(Kā u skatīt man ievadi par 158, cuz zaudēšanas 2 ciklu laikā, rakstiet uz TMR0 ... kā teica midrange rokasgrāmatā)

lūdzu, pārbaudiet, vai es daru pareizi?un tas ir normāli skaidrs TMR0IF bitu INTEXIT kodu?

Šeit ir pilns kods vēlreiz:
Kods:;************************************************* **********************************

;

;

;

;

;************************************************* **********************************# Ietvert <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

skaits; pirmais skaita mainīgais lielums

count2; otrais skaits mainīgs

ENDCORG RESET_ADDRSTART

Iet SETUP

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

; Sākums pārtraukt pakalpojumu REGULĀRA

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

Pārtrauktmovwf w_temp

swapf STATUSS, w

movwf status_temp;decfsz skaits, f, samazināšanās skaitu, izejas ISR ja skaits iz nulle

Iet INTEXITmovlw 0,100

movwf skaitsdecfsz count2, f, samazināšanās count2, ieslēgt / izslēgt gaismas, ja nulle

Iet INTEXITmovlw 0,50

movwf count2movlw 0,158; TMR0 ir skaits 100 reizes, tāpēc tam jābūt 156 sākotnēji

movwf TMR0, tā veic 2 apmācību cikli rakstīt TMR0, tāpēc man 158 irmovlw b'10000000 "

xorwf PORTB, fINTEXITBCF INTCON, TMR0IFswapf status_temp, w

movwf STATUSS

swapf w_temp, f

swapf w_temp, wretfie

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

; Beigām pārtraukt pakalpojumu REGULĀRA

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

; Sākums SETUP REGULĀRA (skaitīšana tikai vienu reizi)

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

SETUP

banksel OPTION_REG

; Movlw 0xc7

movlw 0xc0; prescaler ir 01:02

movwf OPTION_REGbanksel TRISB

movlw b'00000000 "

movwf TRISBbanksel PORTB

clrf PORTBbanksel OSCCON

movlw b'01100000 "ir 4 MHz

movwf OSCCON; Banksel INTCON

; Clrf INTCONmovlw 0,100

movwf skaits

movlw 0,50

movwf count2movlw 0xe0

movwf INTCONmovlw 0,158; TMR0 ir skaits 100 reizes, tāpēc tam jābūt 156 sākotnēji

movwf TMR0, tā veic 2 apmācību cikli rakstīt TMR0, tāpēc man 158 ir;************************************************* **********************************

; BEIGAS SETUP REGULĀRA

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

; Galvenais programmu START

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

MAINLOOP

nop

nop

nop

Iet MAINLOOP

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

; Galvenais programmu END

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

 
Es neesmu pārliecināts, kāpēc, bet simulators problēma, šķiet, ir neveiksmes, rakstot 158 TMR0 iekšpusē pārtraukt pakalpojumu rutīnas.

uz

 
narccizzo ... NO, MPLab SIM var rīkoties pārtrauc, bet darboties režīmā, nav atkļūdošanas režīmā, un es varu redzēt RBx rezultātus no čipa uz diagrammas ..Es arī pārbaudīta šo Proteus.pašu rezultātu.

tā problēma ir kaut kur pārkraušanas TMR0 ...bet to, kas tieši ir nepareizi ...?

 
Es redzu problēmu ar TMR0: jums ir nepieciešams, lai pārlādētu to pirms jums samazināšanās skaitītāji, citādi tā vienkārši turpinās skaitīšanas, apgāšanās nullei, utt Tas tikai iegūt pārkrauts reizi kad skaitītāji sasniedz nulli, kas nav tas, ko jūs vēlaties.

Tagad lieta es centos darbojas kodu simulatorā, bet kādu iemeslu dēļ TMR0 nesaņem piekrauts, un tā incrments ik instrukciju cikla, nevis katru otro.Es domāju, ka tas ir tikai simulators problēmu.Ja jūs pārvietot TMR0 pārkraušanas kodu tieši pirms decrementing skaitītāji, tai vajadzētu strādāt.

Un jā, jums ir skaidrs TMR0IF pirms izejat ISR, vai arī jūs uzreiz jāievada vēlreiz, jo mikro tikko testus karogu un rīkojas attiecīgi.

Vēl viena lieta, lai pārbaudītu: kā es atceros, TMR0 nesaņem palielina par 2 instrukcija ciklu tikai tad, ja prescaler ir iestatīts uz 1 vai piešķirts WDT.Es domāju, ka apgalvojums attiecas uz visu 16 bitu skaitītājs, TMR0 prescaler, tāpēc jums nav nepieciešams pārlādēt TMR0 ar 158, 157, bet, jo jūsu prescaler ir 01:02, tādējādi zaudējot divus instrukciju cikli ir 1 zaudēja skaits TMR0.

 
,thanks for reply again.

VVV apakšnodaļa,
paldies par atbildi vēlreiz.bet tas atkal doesn't darba ...

tā, ko es izdarīju, es pārvietots šis gabals kodu:
movlw 0,157
movwf TMR0

pirms decrementing skaits mainīgais ISR.

un es arī piešķirti 0,157 līdz TMR0 ar uzstādīšanas rutīnas ...

interesanti ir tas, rezultāts bija pats 1.279999 sekundēs ...tā didn't jautājums Vai es slodze 0,157 vai 0,158, kas TMR0 gan uzstādīšanas un ISR ...vai Vai es slodze viņiem abiem ar 0,157, rezultāts bija pats 1,279999 KĀPĒC?tā ir ļoti dīvaini ...un mans kods stil doesn't darbs i aprunāt iegūt vienu sekundi.

tu saki man ir slodze TMR0 ar 1 N ..ne N 2, bet vidējā segmenta rokasgrāmatā Microchip, sadaļā par Timer0 viņi saka, ka man ir slodze to ar N 2 ...

bet kā jau teicu pirms tagad tas didn't jautājums Vai es slodze to ar n 1, vai n 2 man bija pati nepareizi rezultātu ...Hmm ... dīvaini, any ideas?

ps es biju Mērīšanas laikam gan Proteus un MPLab SIM.divas lietas aprunāt būt nepareizi

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

Pievienots pēc 1 stundas 22 minūtēm:labi labi ...

tagad es esmu ievērojis, interesantas lietas.in front of every operation with TMR0.

esmu banksel TMR0
priekšā par katru darbību ar TMR0.
un es tomēr slodze TMR0 ar 0,156 gan ISR un setup.

rezultāts bija: 1,055 000 sekundesTad es nolēmu, lai mainītu aprēķinu un noskaidrot, kurš numura TMR0 grāmatvedība.1,055 000 = (4 * 2 * X * 5000) / 4 000 000 ===> X = 105,5Nez kāpēc didn't man veselam skaitlim?
tik ... TMR0 ir skaitīšana līdz 105,5 ...tad tas nozīmē, es esmu zaudēt 5,5 cikli ..
tad tas nozīmē, es jābūt pārlādēt TMR0 ar 156 5,5?liekas tā, bet nav iespējams.
Tad es mēģināju pārlādēt TMR0 ar 156 6 162 vai ...

un i did get rezultāts: 0.995000 sekundēs.OK, visas idejas tagad?

<img src="http://www.edaboard.com/images/smiles/icon_biggrin.gif" alt="Loti laimīgs" border="0" />
 
Es paskaidrot īsumā pantā teorija un 4 metodes, lai do precizitāti RTC izmantojot PIC un ārējo oscilatoru.Es arī iekļauti Romas Black zero-sum/zero kumulatīvā kļūdu metodi ...kas darbojas ļoti labi.

4 RTC Metodes precizitāte PIC izmantojot Zobenzivs Basic

4 RTC Metodes precizitāte PIC izmantojot mikroBasic

 
OK, tikai tagad did I paziņojums jums nav kas strādā nulles bankas galvenais cilpa
Anyway, mans kļūda: pievienot clrf STATUSS, uzreiz pēc glābšanas kontekstā.Kas jūs aizvedīs līdz 0 bankā.

Attiecībā uz kravas TMR0, jums ir nepieciešams ņemt vērā pārtraukt kavēšanos (2 cikli es domāju), plus kontekstā taupīšanas (3 cikli) plus clrf STATUSS, plus TMR0 papildināšanas instrukcijas (2 cikli), kā arī kavēšanos, kas nepieciešams, TMR0 līdz pieaugumu (2 cikli).
Tas ir kopā 10 cikli.Es ielādes TMR0 ar 166 un pārtrauc notiek 100us.

Cikli lieta ar 0,5 var atrisināt, pievienojot nop pirms pārkraušanas TMR0.Tā kā jūs izmantojat 01:02 prescaler, papildu apmācība pieskaitīs kā 1 / 2 ciklu.Šajā gadījumā clrf STATUSS darīja darbu.

Kods:pārtrauktmovwf w_temp

swapf STATUSS, w

movwf status_temp;clrf STATUSS

movlw 0,166; TMR0 ir skaits 100 reizes, tāpēc tam jābūt 156 sākotnēji

movwf TMR0, tā veic 2 apmācību cikli rakstīt TMR0, tāpēc man 158 irdecfsz skaits, f, samazināšanās skaitu, izejas ISR ja skaits iz nulle

Iet INTEXITmovlw 0,100

movwf skaitsdecfsz count2, f, samazināšanās count2, ieslēgt / izslēgt gaismas, ja nulle

Iet INTEXITmovlw 0,50

movwf count2
movlw b'10000000 "

xorwf PORTB, fINTEXITBCF INTCON, TMR0IFswapf status_temp, w

movwf STATUSS

swapf w_temp, f

swapf w_temp, wretfie

 
Izmantojot prescaler noteikti ieviesīs precizitāti un laika kļūdām.Jums jāuztur 01:01 taimeris darbību, lai sasniegtu RTC precizitāti.

 
, thank you, every your reply helps.

VVV apakšnodaļa,
paldies, katru jūsu atbildi palīdz.bet atkal i didn't get 1.000.000 sekundes ar ur jaunu kodu arī ...
i do get 0,955 sekundēm!so i do vaļēju 45000us, kur un kāpēc?

i ielādētas TMR0 ar 0,176, kas uzstādīšanas rutīnas, un ISR bija u liecina man ...un i got aizkavēšanos 0,955 sekundes!vēl kaut kas ir nepareizi!

bet tā doesn't jautājums tagad, ko es darīt Iepriekšielādēt TMR0 jo uzstādīšanas rutīnas ar ...pats 955000us kavēšanās ...Kur es varu zaudēt 45000us?

lūdzu palīdziet manPievienots pēc 2 stundām 4 minūtēm:Nu labi ..
Beidzot es to darīja.Pirmais ļaujiet man pēc mana gala kods, kas ļauj precīzi vienu sekundi, saskaņā ar MPLab SIM.šeit tā ir:DARBA KAVĒJUMS KODEKSA precīzi 1 sekundi, IZMANTOJOT Timer0 moduli un savilkšanai PAR TMR0Kods:;************************************************* **********************************

; Programma:

; Autors:

; Procesors: PIC16F88

; Apraksts:

, Šī ir programma, lai pierādītu konkrētu vienu sekundi kavēšanās, izmantojot

, Pārtrauc un Timer0 moduli.
Vispārējā formula aprēķināšanai kavēšanās:

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

; * Delay = (4 * Prescaler * (256 - TMR0) * skaits * count2) / Crystal FREQ.
*

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

; Mūsu gadījumā mēs Iepriekšielādēt TMR ar vērtību, kas padara to skaitu līdz 100.

; Izvēlieties prescaler no 01:02

Un piešķirt vērtību 100 un 50 saskaitīt un count2 attiecīgi

, Pēc tam mēs esam tieši vienu sekundi:

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

;************************************************* **********************************
# Ietvert <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

skaits; pirmais skaita mainīgais lielums

count2; otrais skaits mainīgs

ENDCORG RESET_ADDRSTART

Iet SETUP

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

; Sākums pārtraukt pakalpojumu REGULĀRA

;************************************************* **********************************Pārtrauktmovwf w_temp; taupīšanas sakarā

swapf STATUSS, w

movwf status_temp;nop, mēs izmantojam to, lai atkritumi 0,005 sekundes, pretējā gadījumā mēs kavēšanos 0,995 sekundes

banksel TMR0

movlw 0,162; TMR0 ir skaits 100 reizes, tāpēc tam jābūt 156 sākotnēji

movwf TMR0, bet mums ir arī cits cikli, ko mēs zaudēt to mums ir pievienot tos TMR0 arī

; Šie cikli ir:

; Kontekstā taupīšanas - 3

; TMR0 iekraušana - 2

; Banksel komanda - 1decfsz skaits, f, samazināšanās skaitu, izejas ISR ja skaits nav nulle

Goto INTEXIT, ja skaits ir nulle izlaist INTEXIT, un pārlādēt to ar 0,100 vēlreiz

movlw 0,100

movwf skaitsdecfsz count2, f, tad samazināšanās count2, izejas ISR ja count2 nav nulle

Goto INTEXIT, ja count2 ir nulle, izlaidiet INTEXIT un pārlādēt to ar 0,50 vēlreiz

movlw 0,50

movwf count2movlw b'10000000 "slēdzis PORTB tapu

xorwf PORTB, fINTEXITBCF INTCON, TMR0IF; Mijieskaits TMR0IF pēc iziešanas no ISRswapf status_temp, w; atjaunošana kontekstā

movwf STATUSS

swapf w_temp, f

swapf w_temp, wretfie

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

; Beigām pārtraukt pakalpojumu REGULĀRA

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

; Sākums SETUP REGULĀRA (skaitīšana tikai vienu reizi)

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

banksel OPTION_REG

movlw 0xc0; Prescaler ir 01:02

movwf OPTION_REGbanksel TRISB; PORTB ir viss, kas ir izeja

movlw b'00000000 "

movwf TRISBbanksel PORTB; klīringa PORTB

clrf PORTBbanksel OSCCON

movlw b'01100000 "4Mhz oscilatoru frekvences izvēlieties

movwf OSCCONmovlw 0,100; assing vērtības skaita mainīgo

movwf skaits

movlw 0,50

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

movwf INTCONbanksel TMR0; sākotnēji skaidrs TMR0, lai gan tās nav nepieciešams

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

; BEIGAS SETUP REGULĀRA

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

; Galvenais programmu START

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

nop

nop

nop

Iet MAINLOOP;################################################# ##################################

; Galvenais programmu END

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

 
un vēl viena lieta!VVV apakšnodaļa jums bija taisnība!Romiešu Black nesaņēma EXACT vienu sekundi!i mērīts viņa kavēšanos, izmantojot MPLab SIM, un tas parādīja man kavēšanos 1.000192 sekundēs!dont zināt, ja kāds cits darīja to pašu?Tad es mēra manu galīgo programmu un tas dod 1.000.000 kavēšanās.

 
un vēl viens jautājums par manu galīgo programmu, kā jūs zināt, es saņemam kavēšanās 1.000.000 sekundēm MPLab SIM.bet Proteus, izmantojot COUNTER rīks man iegūt kavēšanās 1.005.000 sekundes, KĀPĒC?

tomēr, ja es noņemt PON no ISR pirms TMR0 savilkšanai, i do get 1.000.000 otro kavēšanos Proteus, bet tad man saņemt 0.995.000 sekundes MPLab SIM.heh ...kāpēc tā?jebkura ideja?

 
Var būt, ka MPLab nav simulēt 2 cikla aizkavēšanās nepieciešams, lai filiāles, lai pārtraukt vektors.Es neesmu 100% pārliecināts par to, though.
Kad jūs veidot savu faktisko ķēdes jums būs iespēja novērtēt kavēšanās pin.Galu galā, galvenais mērķis ir iegūt pareizo laiku reālajā pasaulē.Ja tas nav exaclty, ko jūs sagaida, vismaz jūs zināt, ko darīt, lai labotu problēmu.

 
Kad esat taimeris prescaler, kas uz kaut ko, kas nav 01:01 Jūs ieviesīs dažas kļūdas, ko jūs nevar kompensēt, pat izmantojot romiešu Black's metodi.

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

Jums ir jābūt
01:01 Taimeris uz Tosc attiecības, lai izveidotu precīzu laiku bāzi.

 
Reģistrēties problēma ar rakstisku "grūti" vērtība TMR0 ir tāds, ka var būt 1 ciklu "nervozēt", uzsākot ISR, kad taimeris 0 "klausīšanās" pārtrauc laikā rodas 1 cikla vai 2 cikla instrukciju jūsu GALVENĀ programmā.

your 'reload' value to TMR0.

Labāka pieeja būtu pievienotu
savu "pārlādēt" vērtību TMR0.

Vēl viens caveat ir tas, ka rakstot TMR0 būs skaidrs prescaler, kas varētu izjaukt jūsu laiks, lai jūs, iespējams, vēlaties, lai saglabātu 01:01 prescaler iestatījumu.Tas ierobežo jūs diezgan īss pārtraukt intervāliem, bet es esmu pārliecināts, ka jūs varat nākt klajā ar praktiski realizējamu risinājumu.

Ja man bija spiesti izmantot Taimers 0 RTC "sirdsdarbība", nevis 2 Taimeris, es varētu darīt kaut kas līdzīgs šim (nepārbaudītu kods);

Good luck ar savu projektu.Slaistīties

Kods:

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

;

; Saglabāt galvenās programmas ietvaros

;

ISR_Proc

movwf W_ISR, saglabāt W-reg | B?

swapf STATUSS, W; nemaina STATUSS biti | B?

movwf S_ISR, ietaupāt STATUSS raj | B?

clrf statuss; banku 0 | B0

movf PCLATH, W; saņemt PCLATH | B0

movwf P_ISR, ietaupāt PCLATH | B0

clrf PCLATH, ISR ir banku 0 | B0

;

; PREP Nākamās pārtraukt cikla TMR0 un sasist 1 sekundi skaitītāji

;

movlw 2-d 250 "vērtība 250 usek pārtrauc | B0

addwf TMR0, F, pārlādēt TMR0 Nākamās pārtraukt | B0

decfsz RTCL, F; lo counter 0?
jā, izlaidiet, cits | B0

Goto ISR_Exit; izejas ISR | B0

decfsz RTCH, F, hi counter 0?
jā, izlaidiet, cits | B0

Goto ISR_Exit; izejas ISR | B0

;

; Pārlādēt 1 sekundi skaitītāji

;

movlw zema (d'4000 "); pārlādēt mūsu 1-otrā skaitītāji | B0

movwf RTCL; | B0

movlw augsts (d'4000 ") 1; | B0

movwf RTCH; | B0

;

; Veic mūsu vienreiz-per-otrā kārtība šeit

;

nop; | B0

;

; Atjaunot galvenās programmas ietvaros

;

ISR_Exit

BCF INTCON, TMR0IF; skaidrs TMR0 pārtraukt karoga bit | B0

movf P_ISR, W; | B0

movwf PCLATH; atjaunot PCLATH | B0

swapf S_ISR, W; | B0

movwf statuss; atjaunot STATUSS | B0

swapf W_ISR, f, nav skrūvējamu augšu STATUSS | B0

swapf W_ISR, W; atjaunot W-reg | B0

retfie; no pārtraukt | B0 atpakaļ;******************************************************************
 

Welcome to EDABoard.com

Sponsor

Back
Top