Timer / Counter problemă în PIC16F819 şi Proteus model pentru ea

B

BlackOps

Guest
Bună ziua, prima întrebare este de unde să Proteus bibliotecă cu un model de PIC16F819 / 818?

Apoi, i-au programat meu PIC16F819 chip, şi conectat 7 segment pentru a afişa aşa:

RB1 - o
RB2 - b
RB3 - c
RB4 - d
RB5 - e
RB6 -
FRB7 - g

Vss Gnd conectat la terminalul de 7seg după cum este necesar.

toate conexiunile sunt OK, de programare a fost reuşită.

program trebuie să-mi număra de la 0 la 9, în fiecare secundă, şi va afişa în fiecare cifră 7seg pe ecran.Am făcut simulare cu aproape exact copie a acestui program, în conformitate cu PIC16F84 Proteus, şi a mers foarte bine acolo.Acum am schimbat un pic de program pentru a se potrivi cu el la mine în chip PIC16F819.digit on my 7seg display!

dar după programare, atunci când i se conectează la baterie, am doar 0

cifre pe afişaj 7seg!

în mod normal, aceasta trebuie să înceapă cu zero cifre, şi du-te în fiecare secundă, apoi din nou la zero .. si asa mai departe.dar incepe cu zero cifre .. si sta asa, du-te până doesnt.

atunci când acesta a lucrat în Proteus cu Pic16F84, i 20mhz cristal extern conectat la acesta.

aici, în circuitul real cu PIC16F819 i dont au nici un cristal conectat la el ... vere-l are, de asemenea, o Oscilator interne.

Cred ca problema mea are ceva de a face cu setări de configurare de la inceputul meu de cod sursă ....

Am dori, de asemenea, să ştii, dacă i
didnt conecta la orice cristal PIC16F819-mi ce s-ar fi implicit frecvenţa de Oscilator?

acum, uita-te la meu de cod sursă plz:

Cod:;================================================= ====

; File: RB0Int.ASM

; Data: 22 aprilie 2006

; Autor: Julio Sanchez

; Procesor: 16F84A

;================================================= ====

; Descriere:

; Programul de testare pentru a întrerupe pe portul RB0

; A pushbutton comuta este conectat la portul RB0.

; De pushbutton Comută un LED de pe port-B, linia de 7

;

;

;================================================= ====;=========================

; De instalare şi configurare

;=========================

; procesor 16f84A

# include <p16F819.inc>

__CONFIG _CP_OFF & _WRT_ENABLE_OFF & _CPD_OFF & _CCP1_RB2 & _DEBUG_OFF & _LVP_OFF & _BODEN_OFF & _MCLR_OFF & _WDT_OFF & _PWRTE_ON & _INTRC_IO; Variabilelor aiciCBLOCK 0x20; începe de berbec în 16F84bres_hi; hi byte noastre 24bit variabilă

bres_mid; mijlocul byte

bres_lo; lo byte

(Am nevoie doar de 3 octeţi pentru acest sistem)status_temp; utilizate pentru intrerup service

w_temp; utilizate pentru intrerup service

NUM

decnumENDC;================================================= =============================

; Cod aiciorg 0x000; Configuraţi programul de memorie de bază la reiniţializaţi vector 0x000

reset

Mergi la setup; înfiinţat ints şi port chestiiorg 0x004; Interrupt vector, int manipulant codul urmează.

;================================================= =============================;************************************************* *****************************

; Interrupt handler (se execută acest cod fiecare timer0 întrerup)

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

;

;------------------

int_handler;

;------------------;-------------------------------------------------

; Prima pastram W şi registru de staremovwf w_temp; salva off curent W registru conţinutul

movf STARE, W; muta în registrul de stare W registru

movwf status_temp; salva off conţinutul STARE registru;-------------------------------------------------

; Notă!
am ajuns aici la fiecare 256 de instalare, am

; Pot face acum noastre speciale de o secundă calendarul de sistem.; Aceasta constă în trei paşi principali;

; * Scădere de la 256 contează noastre 24bit variabilă

; * Test dacă am ajuns la setpoint

; * Dacă este cazul, se adaugă 1000000 contează 24bit variabilă şi de a genera eveniment.

;-------------------------------------------------

; * Optimizate 24 bit scădere aici

; Aceasta se face cu minim de instalare.

; Noi scădere de la 256 de 24bit variabilă

; De doar decrementing de la mijlocul octet.movf bres_mid, 1; primul test pentru mijlocul anului == 0

btfsc STARE, 2; NZ = nu underflow necesare

decf bres_hi, f; z, deci este underflow, deci dec de msbdecfsz bres_mid, f; dec de la mijlocul octet (scădere 256); Acum complet 24bit optimizat scădere, se face!

; Aceasta este de aproximativ 4 ori mai repede decât o "buna"

; 24bit scădere.Mergi la int_exit; NZ, deci cu siguranţă nu o secundă încă.

; În cele mai multe cazuri întreaga int ia

; Doar 16 de instalare.

;------------------------

; * Test dacă ne-am atins o secundă.

; Numai ajunge aici, atunci când mijlocul == 0, acesta MAI fi o secundă.

; Doar pentru a ajunge aici 1 din fiecare 256 de ori.

; (Aceasta este cea mai bună optimizat test)

; Acesta ajunge aici, atunci când bres_mid == 0.movf bres_hi, 1; test zero prea bună pentru

btfss STARE, 2; z = ambele hi şi mijlocul sunt zero, este o secundă!

Mergi la int_exit; NZ, deci nu o secundă încă.;-------------------------------------------------

Doar pentru a ajunge aici, dacă am ajuns la o secundă.; Acum putem genera o secundă cazul nostru, ca şi a adăuga

; O secundă la ceas sau orice altceva.

; (În acest exemplu vom comuta un LED); Celelalte lucru de care avem nevoie să faceţi este să adăugaţi 1000000 contează

; Pentru a ne 24bit variabilă şi începe din nou, peste tot.

;-------------------------------------------------

; Adăugaţi 1000000 conteaza primele.

; O secunda = 1000000 = 0F 42 40 (in hex); Ştim hi == 0 şi mijlocul == 0 Acest lucru face foarte rapid.

; Aceasta este o optimizate 24bit adăuga, pentru că ne putem

; Sarcină doar primele două octeţi şi numai necesitatea de a face

; Un real adăuga pe fundul octet.
Acest lucru este mult mai rapid

; Decât o "buna" 24bit adăuga.movlw 0x0F; obţine msb valoare

movwf bres_hi; sarcină în msbmovlw 0x42; obţine mijlocul valoare

movwf bres_mid; sarcină la mijlocul anuluimovlw 0x40; lsb pentru a adăuga valoare

addwf bres_lo, f; să-l adauge pe restul deja în lsb

btfss STARE, 0; NC = nu prea plin, aşa că este încă la mijlocul okincf bres_mid, f, c, astfel încât lsb overflowed, astfel inc mijlocul

; Aceasta este optimizat şi se bazează pe la mijlocul anului fiind cunoscut

, Precum şi faptul că la mijlocul anului nu va fi prea plin de la o inc.; Asta este!
Noastre optimizate 24bit adăuga se face,

; Aceasta este de aproximativ de două ori mai repede ca o "buna"

; 24bit adăuga.

;-------------------------

; Acum, noi ne vom ocupa de "eveniment" pe care o facem în fiecare o secundă.; Notă!
pentru acest exemplu vom comuta un dus, care

; Se va da un fulger, care este condus de la un al doilea

; Şi off pentru un al doilea.

; Adăugaţi-vă propriul cod aici pentru o secundă eveniment.; Notă!
Meu este condus pe porta, 3

; Dvs. poate fi condus pe un alt cod PIN.

; movlw b'00001000 "; masca pentru bit 3

; xorwf PORTB, f; comuta Porta, bit3 (comutare LED)

incf decnum, 1;-------------------------------------------------

; Nostru acum o secundă eveniment este terminat, putem ieşi din

; Intrerup handler.

;-------------------------------------------------

; În sfârşit vom restaura w şi registrele de stare.

; De asemenea, şterge TMRO int pavilion acum am terminat.

int_exit

BCF INTCON, TMR0IF; reseta tmr0 intrerup pavilionmovf status_temp, W; prelua copie a STARE registru

movwf STARE; restaura pre-ISR STARE registru conţinutul

swapf w_temp, f

swapf w_temp, W; restaura pre-ISR W registru conţinutul

retfie; reveni la intrerup

;------------------------------------------------- -----------------------------
;************************************************* *****************************

; SETUP (rulează această doar o singură dată la pornire)

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

;

;------------------

setup; Mergi la eticheta

;------------------;-------------------------------------------------

; Notă!
16F84 versiunea.

; Notă!
aici am înfiinţat periferice şi port direcţii.

; Aceasta va trebui să fie schimbată pentru diferite Pics.

;-------------------------------------------------

; OPTION setup

movlw b'10001000 ";

; X -------; 7, 0 = permite, 1 = dezactiva, portb pullups

;-X ------; 6, 1 = /, int marginea selectaţi bit

; - X -----; 5, timer0 sursa, 0 = ceasul intern, 1 = int PIN.

; --- X ----; 4, int timer0 EDGE, 1 = \

; ---- X ---; 3, prescaler aloca, 1 = wdt, 0 = timer0

; ----- X -; 2,1,0, timer0 prescaler rata selectaţi

; ------ X-; 000 = 2, 001 = 4, 010 = 8, 011 = 16, etc

; ------- X;

; Notă!
Am stabilit de prescaler la wdt, deci timer0

; Nu are nici o prescaler si va fi prea plin la fiecare 256

; Instrucţiuni şi să o întrerup.

;

banksel OPTION_REG; merg buna reg bancar

movwf OPTION_REG; încărcare a datelor în OPTION_REG

banksel 0; reveni la normal banca 0

;-------------------------------------------------

; PORTB pins direcţie setup

; 1 = intrare, 0 = ieşire

clrf PORTB;

;

movlw b'00000000 "; toate cele 8 portb sunt rezultate

;

banksel TRISB; merg buna reg bancar

movwf TRISB; masca pentru a trimite portb

banksel 0; reveni la normal reg bancar

;-------------------------------------------------

; Porta PINS direcţie setup

; 1 = intrare, 0 = ieşire

clrf porta;

;

movlw b'00000000 "; toate cele 5 porta sunt rezultate,

; (Cu 16F84 porta-a mai redus doar 5 biţi)

;

banksel TRISB; merg buna reg bancar

movwf TRISA; trimite masca la porta

banksel 0; reveni la normal reg bancar

;-------------------------------------------------

; INTCON setup

;

; Pentru acest cod de exemplu, ne permite timer0

; Overflow întrerup.

;

; Permite întrerupe ultima

; Întrerupe setup

movlw b'10100000 "; GIE = pe TOIE = pe (timer0 overflow int)

movwf INTCON; înfiinţat.;-------------------------------------------------

; Notă!
Acum, hardware-ul este configurat avem nevoie pentru a încărca

; Prima conta pentru o secundă în nostru 24bit bres variabilă.

;-------------------------------------------------

; Notă!
Acest exemplu utilizează 4 MHz ceas, care este

; 1000000 contează pe secundă.

;

; Avem nevoie de o perioadă de 1 secundă, aşa că trebuie să încărcaţi

; 1000000 conteaza de fiecare dată.

; 1000000 = 0F 42 40 (in hex)

;

; De asemenea, necesitatea de a adăuga 256 contează pentru prima dată,

, Astfel că ne-am adăuga la 1 la mijlocul octet.

; Verificaţi mijlocul overflow, dacă este necesar.; Aici ne incarca 24bit variabilă.

movlw 0x0F; obţine msb valoare

movwf bres_hi; pune în himovlw 0x42 1; ajunge la jumătatea anului valoarea (nota am adăugat la 1 la acesta)

movwf bres_mid; pune la mijlocul anuluimovlw 0x40; obţine lsb valoare

movwf bres_lo; pune la mijlocul anului; Acum setup este complet, se poate începe executarea.

;-------------------------------------------------

Mergi principal; începe programul principal;------------------------------------------------- -----------------------------
;************************************************* *****************************

; PRINCIPALA (principale program buclă)

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

;

;------------------

principale; Mergi la eticheta

;------------------

movlw 0

movwf decnum

;-------------------------------------------------

; Notă!
Acest exemplu utilizează timer0 overflow întrerup.

; Aceasta va întrerupe programul nostru principal fiecare 256 de instalare

; Şi nu de o secundă de timp sistem.

;-------------------------------------------------

main_loop;

; Notă!
aici aveţi un cod de program principal,

; Sau apeluri la principalele piese de program.

; De întrerupere nu toate lucrurile o secundă de timp.

; Chestii

; Chestii

; Chestii

; Chestii

movf decnum, 0Segmentul de apelmovwf NUM

rlf NUM, 0

movwf PORTB;-------------------------------------------------

Mergi la main_loop; ţine să fie difuzate de principalele cod.;------------------------------------------------- -----------------------------segment:

addwf PCL, 1; PCL este program contra clanţă

retlw 0x3f; cod 0

retlw 0x06; 1

retlw 0x5b; 2

retlw 0x4f; 3

retlw 0x66, 4

retlw 0x6d; 5

retlw 0x7d; 6

retlw 0x07, 7

retlw 0x7f; 8

retlw 0x6f; 9

; retlw 0x77; A

; retlw 0x7c; B

; retlw 0x39; C

; retlw 0x5e; D

; retlw 0x79; E

; retlw 0x71; F

; retlw 0x40; Doar în cazul în care pe toate

;================================================= =============================

end; nici un cod după acest punct.

;================================================= =============================

 
Cele mai multe dintre PIC16Fxxx MCUs interne cu OSC implicit frecvenţa este 4MHz după resetare.

 
OK,
l-am găsit răspunsul la această problemă.

aici este modul meu de configurare directive ar trebui să fie:
and here is the code i had to paste before clearing of PORTB:

__config _INTRC_IO & _CP_OFF & _DEBUG_OFF & _WRT_ENABLE_OFF & _CPD_OFF & _LVP_OFF & _BODEN_OFF & _MCLR_OFF & _PWRTE_OFF & _WDT_OFF
şi aici este codul pentru a lipi am avut înainte de compensare a PORTB:BANKSEL OSCCONmovlw B'01100000 "Ar trebui să fie 4 MHzmovwf OSCCONAm avut de a selecta manual frecvenţa de interne Oscilator prin OSCCON registru.Thats it.Dar, am mai gasit nici un
didnt Proteus biblioteca pentru PIC16F819 model, care poate ajuta la asta?sau trimite-l la mine?Aş aprecia!

mulţumesc

 

Welcome to EDABoard.com

Sponsor

Back
Top