Mikrokontrolerski sistemi

Autor: Saša Tošić dipl.ing

Projekat

Kontakt: tosic@ptt.yu

 

PROGRAMABILNI BROJAČ/TAJMER  4 CIFRE

Pre ili kasnije svako od nas se sretne sa potrebom za brojačem. Da li će se brojati ulazni impulsi, vreme ili nešto treće nije toliko bitno; bitno je da uređaj radi, i to pouzdano.

Kada sam počinjao da radim susreo sam se sa binarnim brojačem čiji su izlazi bili adrese za EPROM iz kojih je brojač čitao vrednosti. Te vrednosti su predstavljale stanja pojedinih izalza a ovi su upravljali radom izvršnih elemenata na mašini. Inetresantna ideja koja je lepo radila na ispitnom stolu. Ali na mašini...

Sve je uredu dok ne isključi sklopka motora. A onda brojač postavi neku binarnu kombinaciju koja iz Eproma pročita sve jedinice i eto problema. Kao za inat projektant uređaja je postavio da su aktivna stanja na izlazu EPROMA logički visoka, a kako izgleda mašina kada se na njoj greškom popale svi izlazi, pretpostavljam da još poneko od vas dobro zna. Sve u svemu SMETNJE! E o tome nam je malo ko pričao tokom školovanja. Uz nekoliko RC zaštita i RSO filtar problem je rešen. Zaključak? Prvo (ako je ikako moguće) otklonite izvor smetnji (RC zaštitama). Ispravno postaviti RSO filtar ispred napajanja vašeg uređaja i naravno na samoj štampanoj ploči postavite po 100nF blok kondenzatore bar po jedan komad na svaka 2 kola. Preporučljivo je staviti i tantal kondenzatore na tačkama napajanja koje su najudaljenije od ispravljača i stabilizatora. Varistori, čoperska napajanja itd., nije loše imati ali je ipak malo verovatno da će se neko ko tek počinje odlučiti za takvo rešenje.

Sa smetnjama od sklopki motora više nisam imao problema; no javili su se neki drugi. Trebalo je napraviti četvorocifreni brojač sa zadavanjem vrednosti kod šalterima. U to vreme su CD4510 (dekadni brojač) i CD4511 (BCD u 7SEG dekoder) odrađivali posao. I ovde je sve bilo u redu osim tri stvari:
• prvo, šaka puna delova (ukupno 8 integrisanih kola samo za brojanje i prikaz cifara plus još bar jedno NI kolo za ostvarivanje logike oko uključivanja relea)
• prilično visoka cena kod šaltera
• i treće, ISTITRAVANJE KONTAKATA 

Lepo je to kada brojač taktujete induktivnim davačem. Ali kad neko hoće da ga taktuje mikro prekidačem, tada cifre same lete. Ipak je ovaj brojač odrađivao posao, samo je trebalo svaki put napomenuti: "ako hoćete da na ulazu koristite induktivni davač nema problema; a ako hoćete mikroprekidač tada treba povećati vremensku konstantu... Uređaj koji je podešen da radi sa jednim davačem ne može se koristiti za sigurno brojanje sa drugim itd. itd."

A onda se pojavio ICL7217. Sva gore pomenuta integrisana kola u jednom čipu. Lepo kolo. Sve radi samo. Jedino sto je malo skuplje. Štampa je bila daleko jednostavnija ali su ostali kod šalteri kao i potreba da se prerađuje cela štampana ploča, ako se pojavi potreba za dodatnim zahtevima u pogledu uključivanja i isključivanja relea. Naravno i istitravanje kontakata nije generalno rešeno. No i pored ovih zamerki ICL je dugo vrlo korektno odrađivao posao.

I šta sada? Tu bi otprilike bio kraj da se nije pojavila ideja: “Ako bih 4 kod šaltera koji su tada koštali oko 25 DEM uspeo da zamenim sa 4 mikrotstera koji kostaju 2 DEM i ako bih ICL od takodje 25 DEM zamenio sa nekim drugim čipom koji bi kostao do 10 DEM, tada bi cenu sa 50 skinuo na 12 DEM!!! Reklo bi se i nije neka ušteda. Ali na seriji od 100 komada to se bas lepo oseti.”

I rešenje je nađeno. PIC16F84 i sve to lepo radi:
• štampa je uprošćena
• PIC16F84 je jedino integrisano kolo
• brojač može da broji na gore ili dole što se određuje postavljanjem otpornika R24
• može da radi i kao tajmer takođe na gore ili dole R25 (prikazuje sati : minuti ili minuti : sekunde)
• ima softverski filtar za eliminaciju istitravanja kontakata na ulazu
• ulaz za spoljni START/STOP
• kada radi na gore ispisuje koliko je više odbrojao od zadate vrednosti zbog inercije mašine ili procesa
• prikazuje ukupni broj urađenih komada
• prikazuje broj urađenih serija
• ispisuje StoP, Auto ili ProG u zavisnosti u kom režimu rada se nalazi.

I ono što je jos bitnije. Proizvod je prilično unificiran. Od toga da je sada neophodna samo jedna štampana ploča (sve druge izmene se rade u programu) pa do toga da je predviđeno da bude što je moguće više istih otpornika.

I nekoliko napomena. Ovaj uređaj vrlo pouzdano radi u praksi. Ipak vam preporučujem da između pinova 5 i 14 PIC-a (sa donje strane štampe) postavite blok kondenzator 100nF. Takodje je preporučljivo da ako nemate RSO filtar isperd ovog uređaja, postavite bar blok kondenzator 100nf/630VDC u paralelu sa primarom trafoa.

I nešto oko tolerancije komponenata. Komponente su standardne i što se tiče njihove nabavke ne bi trebalo da bude nikakvih problema. Displeji su sa zaj. Anodom, ako ne nadjete optokapler 4N32 možete da stavite i bilo koji drugi pin kompatibilan. Osvežavanje displeja je sa 100Hz tako da nećete videti nikakvo treperenje (skoro sam video da je čovek postavio kvarc od 2MHz umesto 4MHz koliko je predviđeno. Osim sto je poremetio vremensku konstantu za filtriranje ulaza, koju je programirao na manju vrednost, nije imao nikakvih drugih problema).
Ako zelite da koristite tajmersku funkciju uređaja onda je neophodno staviti kvarc od 4,096MHz. Preporučujemo da u ovom modu postavite otpornik od 220 W kojim ćete upaliti DP (decimalnu tačku) segment displeja Dis2, koja bi trebala da predstavlja "razmak" između cifara minuta i sekundi.

Nadam se da ćete ovim brojačem/tajmerom biti zadovoljni bar još neko vreme dok se ne pojavi nešto jevtinije i fleksibilnije. Do tada možete koristiti ovaj a kako se njime rukuje možete naći u "Tehničkim karakteristikama".

1. TEHNIČKE KARAKTERISTIKE :

• displej: 4 cifre (7 seg. displej sa zajedničkom anodom)
• izlaz: rele (m, r, z izvedeni svi kontakti)
• indikacija: zelena led dioda svetli kada rele radi
• tastatura: 4 tastera sa sledećim rasporedom: PROG LEVO PLUS START/STOP
• ulazi: 2 eksterna
- start/stop
- clock (brojački ulaz)
• potpuna galvanska izolacija
• mikroprocesorski uređaj (PIC 16F84)
• uključen watch-dog
• mogućnost programiranja:
- zadate vrednosti brojanja
- softverskog filtra
• mogućnost izbora rada:
- brojanje na gore
- brojanje na dole
- tajmer na gore 
- tajmer na dole 
• prikaz broja urađenih serija
• prikaz ukupnog broja ulaza

2. OPIS UREĐAJA:

Brojač/tajmer je zasnovan na mikrokontroleru PIC16F84, koji je jedino integrisano kolo. Može brojati na dole ili na gore, što se određuje otpornikom 2K2, koji treba postaviti kada se želi brojanje na dole (pin 9 na PIC-u). Ako se želi tajmerska funkcija, potrebno je postaviti još jedan otpornik od 2K2 (pin7 na PIC-u).

Uređaj se programira na isti način bez obzira na način brojanja! Programiranje se izvodi preko 4 tastera na prednjoj strani uređaja. Tasteri su poređani prema gore datom rasporedu, a njihova funkcija je sledeća:
• PROG taster služi za programiranje uređaja
• LEVO taster prelazi na sledeću levu cifru koju želimo da menjamo
• PLUS taster povećava vrednost koja blinka
• START/STOP taster služi za startovanje brojanja i njegovo zaustavljanje


Sve programirane vrenosti uredjaj čuva u svojoj EEPROM memoriji minimalno 10 godina !!!

Kilknite na sliku da bi je uvećali

Shema programabilnog brojača/tajmera sa 4 cifre

3. NAČIN UPOTREBE:

Priključivanjem napajanja na displeju se ispisuje poruka "Auto", koja signalizira da je brojač spreman za automatski rad. Zelena dioda ne svetli, a rele ne radi. Sada se mogu uraditi sledeće stvari:
1. mogu se programirati (prekontrolisati) vrednosti pritiskom na taster PROG
2. može se startovati ciklus pritiskom na taster START/STOP ili spoljnim tasterom.
3. može se prikazati broj urađenih serija pritiskom na taster PLUS
4. može se prikazati ukupan broj ulaznih impulsa pritiskom na taster LEVO

1. Programiranje vrednosti izvodi se pritiskom na taster PROG. Na displeju će se pojaviti "ProG", što je potvrda da je uredjaj ušao u mod za programiranje. Sada treba pritisnuti ponovo taster PROG i na displeju se pojavljuje zadata vrednost brojanja. Takođe treperi cifra najmanje težine, što znači da je nju moguće menjati. Možemo je povećati tasterom "PLUS" do 9 i ponovo u krug, ili tasterom "LEVO" preći na cifru veće težine. Ta cifra će sada početi da treperi. Sve radimo samo sa ova dva tastera. Kada smo završili promenu vrednosti, ili ako ne želimo ništa da menjamo, treba pritisnuti taster PROG.

Na displeju se pojavljuje "F 56". Ovo je opcija koja nam omogućava da postavimo softverski filtar. Vrednost se menja na isti način kao i prethodna, samo filtar može imati vredost u opsegu 1 do 99, za razliku od zadate vrednosti brojanja koja može biti u opsegu od 1 do 9999.

Softverski filtar omogućuje korisniku da bez ikakvih hardverskih izmena prilagodi brojač okruženju u kome radi ako je ono puno smetnji. Takođe se izborom velike vrednosti filtra može postići da umesto induktivnog davača na ulaz za brojanje vežemo mikro prekidač. Vrednost F=1 znači da brojač traži da u vremenskom intervalu od oko 150 mikrosekundi na ulazu mora postojati stabilan ulazni signal da bi vrednost brojača bila uvećana za 1. Ako je signal kraći (kontakt istitrava ili se pojavio impuls smetnje), vrednost brojača neće biti uvećana, a ceo postupak će biti ponovljen sa prvom detektovanom rastućom ivicom.

Kada završimo sa promenom vrednosti, pritiskom na taster PROG na displeju ćemo dobiti poruku "Auto", koja pokazuje da smo završili sa programiranjem vrednosti i da smo opet na početku.

2. Startovanje ciklusa se vrši pritiskom na taster START/STOP ili spoljnim tasterom. Kada se to desi, uključuje se rele (led svetli) i zavisno od načina rada gore ili dole dešava se sledeće:

2.1 ako je postavljen otpornik 2K2 (uređaj broji na dole), pojaviće se zadata vrednost brojanja na displeju. Kada dođe ulazni signal, zadata vrednost će se smanjiti za 1 i kada dođe do nule, rele će se isključiti, a na displeju će se pojaviti poruka "Auto", pa ciklus možemo startovati iz početka. Ako u toku brojanja pritisnemo taster START/STOP ili spoljni taster, prekinućemo brojanje, isključiće se rele i ispisaće se "Auto".

2.2 ako nije postavljen otpornik 2K2 (uređaj broji na gore) na displeju će se pojaviti 0000. Kada dođe ulazni signal, izbrojana vrednost će se povećati za 1, a kada dođe do zadate vrednosti, rele će se isključiti, ali se na displeju neće pojaviti poruka "Auto"!!! već će displej i dalje pokazivati odbrojane vrednosti. Ovo nam omogućava da vidimo koliko je mašina izbrojala više impulsa zbog inercije. Ako sada pritisnemo START/STOP ili spoljni taster na displeju se pojavljuje "0000", rele se uključuje i idemo na još jedan ciklus.

Ako bi želeli sada da programiramo uređaj ne bi mogli nego bi morali da isključimo brojač i da ga ponovo uključimo, nakon čega se javlja poruka "Auto" posle koje možemo da programiramo vrednosti ili da startujemo ciklus.

3. Prikaz broja urađenih serija dobija se pritiskom na taster PLUS i to kada je uredjaj završio sa brojanjem (na displeju je ispisano Auto). Broj urađenih serija će biti prikazan na displeju dokle god bude pritisnut ovaj taster. Ovaj brojač nije moguće resetovati na drugi način osim isključenjem napajanja! Napominjemo da će ovaj brojač biti uvećan za 1 čak i kada se već startovani ciklus prekine pritiskom na taster STOP!

4. Prikaz ukupnog broja ulaznih signala dobija se pritiskom na taster LEVO i to kada je uredjaj završio sa brojanjem (na displeju je ispisano Auto). Ukupni brojač serija će biti prikazan na displeju dokle god bude držan ovaj taster. Ni ovaj brojač nije moguće resetovati na drugi način osim isključenjem napajanja! 

NAPOMENA!!!: Preporučuje se upotreba RSO filtra ispred trafoa za napajanje uređaja, kao i postavljanje RC filtra na kontaktima relea da bi se izbegla mogućnost zaglavljivanja kontrolera zbog visokofrekventnih smetnji. 

PREPORUKA: Optimalno bi bilo čopersko napajanje uređaja. x

LISTING PROGRAMA

;***************************************************************
;
;
BROJAC: * 4 CIFRE
; * 4 TASTERA
; * 1 RELE
; * 1 START TASTER SPOLJNI
; * 1 BROJACKI ULAZ SA SOFTVERSKIM FILTRIRANJEM
;
; !!! Ovo je demo verzija softvera !!!
;
; U njoj nije uradjeno:
; * filtriranje ulaznog signala 
; * brojanje na gore
; * tajmer na gore
; * tajmer na dole
; * brojac uradjenih serija
; * ukupni brojac
; Za sve neophodne informacije obratite se autoru na 
; telefone: 089/261-035
; 034/333-428
; ili e-mail: tosics@ptt.yu
;
;***************************************************************

LIST P=16f84
include "p16f84.inc"

; DEFINICIJA BAJTOVA
BAFER1 EQU 12H ;
BAFER2 EQU 13H ; BAFER
BAFER3 EQU 14H ;
BAFER4 EQU 15H ;
CIFRA1 EQU 16H ;
CIFRA2 EQU 17H ;
CIFRA3 EQU 18H ; VIDEO RAM !!!
CIFRA4 EQU 19H ;
POINTER EQU 1A ; pokazivac na vrednost koja
; se menja
DISPL_CIFRA EQU 1BH ; vrenost na koju ukazuje cifra
ROTOR EQU 1CH ; cifra koja se osvezava
STARI EQU 1DH ; sta je stvarno pritisnuto
LAST_KEY EQU 1EH ; sta je novo pritisnuto aktivno ; visoko
FILTAR_ZA_TASTERE EQU 1FH ; TASTERI
POST_SKALER_SEC EQU 20H
RADNI_0 EQU 21H ; radni registar za program
RADNI_1 EQU 22H ; radni registar za interapte
FLEGOVI EQU 23H ; flegovi
STEK_W EQU 24H
STEK_STATUS EQU 25H
CIFRA EQU 26H ; pozicija cifre kojoj se menja ; vrednost
VREDNOST EQU 27H ; vrednost na koju ukazuje cifra
FILTAR EQU 28H
RADNI_2 EQU 29H ; radni registar za 100 mikro ; sekundi
BAFER_OFFSET EQU 12H
VIDEO_OFFSET EQU 16H

; DEFINICIJA BITOVA
CY EQU 00H
DC EQU 01H
Z equ 02h

#define BLINK_DIODA FLEGOVI,0
#define NOVI_TASTER FLEGOVI,1
#define IVICA_ FLEGOVI,2
#define JEDNAKI FLEGOVI,3
#define ULAZ FLEGOVI,4
#define STARI_ULAZ FLEGOVI,5
#define DOLE? FLEGOVI,7 ; da li brojac broji na dole ili ; gore
#define RELE PORTA,4 ;
#define CLOCK PORTB,7 ;

; DEFINICIJA TASTERA
#define PROG? LAST_KEY,0
#define START_STOP? LAST_KEY,4
#define PLUS? LAST_KEY,5
#define LEVO? LAST_KEY,6

; ***********************************************
; Inicijalizacija
; ***********************************************
ORG 0
CLRF INTCON ; zabrani interapte
GOTO INIT ; Idi na inicijalizaciju
ORG 4
GOTO INTERAPT
; ***********************************************
; tabela za prikaz kodova
; ***********************************************
TABELA andlw B'00011111' ; osiguranje da ne ode bezveze negde i ; da se zaglavi
ADDWF PCL ; efabgdc
; segmenti displeja AKTIVNA LOGICKA ; NULA !!!
RETLW B'10000100' ; 0
RETLW B'11110110' ; 1
RETLW B'10100001' ; 2
RETLW B'11100000' ; 3
RETLW B'11010010' ; 4
RETLW B'11001000' ; 5
RETLW B'10001000' ; 6
RETLW B'11100110' ; 7
RETLW B'10000000' ; 8
RETLW B'11000000' ; 9
RETLW B'11001000' ; S
RETLW B'10011001' ; t
RETLW B'10111000' ; o
RETLW B'10000011' ; P
RETLW B'10111100' ; u
RETLW B'10111010' ; n
RETLW B'11111110' ; i
RETLW B'10011001' ; L
RETLW B'10110000' ; d
RETLW B'10111011' ; r
RETLW B'11111111' ; spejs NISTA NIJE AKTIVNO
RETLW B'10000010' ; A
RETLW B'10001000' ; g isto kao 6
RETLW B'10001011' ; F
RETLW B'10110011' ; r
RETLW B'10110011' ; r | ovaj simbol pokazuje da je
RETLW B'10110011' ; r - dekoder premasio opseg
RETLW B'10110011' ; r | dozvoljenih vrednosti
RETLW B'10110011' ; r
RETLW B'10110011' ; r
RETLW B'10110011' ; r
RETLW B'10110011' ; r
; ***********************************************
; program
; ***********************************************
INIT ; posle reseta je portb 
; konfigurisan kao ulaz
CLRF FLEGOVI ; obrisi tastere i flegove
BCF DOLE?
BTFSs PORTB,3
BSF DOLE?
movlw 0ffh ; ugasi displej
movwf PORTB
movlw 0F7h ; ugasi tranzistore
movwf PORTA
BSF STATUS,RP0 ; SELECT PAGE 1
CLRF TRISA ; RA0-4 izlazi
MOVLW 80H ; RB0-6 izlazi RB7 ulaz
MOVWF TRISB ;
MOVLW B'00000110' ; pullup omoguceni
; preskaler dodeljen tajmeru
movwf 81H ; "OPTION"
; deli internu ferkvenciju sa 128
BCF STATUS,RP0 ; SELECT PAGE 0
MOVLW .217 ; 128*39=4992
MOVWF TMR0 ; 1MHz:4992=200.3 Hz
; osvezavanje displeja svakih ; 5msec.(za jednu cifru)

MOVLW .100 ; 100*5msec=0.5sec (za blink_diodu)
MOVWF POST_SKALER_SEC
CLRF STARI
CLRF LAST_KEY
MOVLW .10
MOVWF FILTAR_ZA_TASTERE
MOVLW 0F7H ; samo 4 cifre 11110111
MOVWF ROTOR ; aktivna nula
MOVLW 4
MOVWF DISPL_CIFRA ;
clrf CIFRA ; idemo od cifre najmanje tezine
movlw 1
movwf POINTER
; prebaci ukupno vreme iz eeproma u ; bafer
call EEPROM_U_BAFER
clrf POINTER ; da ne bi blinkala cifra
; prebaci eeprom filtar u filtar
call EEPROM_U_FILTAR
; Omoguci INT od tajmera
MOVLW B'10100000' ;
MOVWF INTCON
; ***********************************************
; GLAVNA PETLJA
; ***********************************************
GLAVNI_1 bsf RELE ; iskljuci rele
MOVLW .21 ; A ispisi "AUTO"
MOVWF CIFRA4
MOVLW .14 ; u
MOVWF CIFRA3
MOVLW .11 ; t
MOVWF CIFRA2
MOVLW .12 ; o
MOVWF CIFRA1
BTFSS NOVI_TASTER
goto GLAVNI_1 ; nista nije pritisnuto
; pritisnut je novi taster !!!
bcf NOVI_TASTER 
; taster PROG?
btfsc PROG?
GOTO PROGRAMIRANJE ; !!! IDI U PROGRAMIRANJE PARAMETARA ; !!!
; taster START_STOP?
btfss START_STOP?
goto GLAVNI_1 ; !! NE !! idi na pocetak
; DA !! startovan je ciklus
GLAVNI_2 bcf RELE ; ukljuci rele
; broji dole
call BAFER_U_VIDEO
;----------------------------------------------------------------
; do ovde je bila priprema za brojanje sa prebacivanjem vrednosti
; GL_3 je glavna petlja u kojoj se vrti program dok ne odbroji
; ili bude pritisnut taster START_STOP
;----------------------------------------------------------------
GL_3 call IVICA
btfss IVICA_
goto GL_4 ; nije ivica od brojackog ulaza
; pojavila se ivica od ulaza broj.
; broji na dole
DOLE call SMANJI_VIDEO
movfw CIFRA1 ; da nije nula ?
iorwf CIFRA2,W
iorwf CIFRA3,W
iorwf CIFRA4,W
btfsc STATUS,Z
goto GLAVNI_1 ; DOSAO JE DO NULE IDI NA POCETAK
goto GL_4 ; da nije pritisnut taster
GL_4 btfss NOVI_TASTER
goto GL_3 ; nije novi taster
bcf NOVI_TASTER
btfss START_STOP?
goto GL_3 ; nije start_stop taster
; ZAUSTAVLJEN JE TASTEROM
btfss RELE
GOTO GLAVNI_1 ; 
GOTO GLAVNI_2 ; odbrojao je idi na pocetak, ugasi ; rele ...
; ***********************************************
; INTERAPT na svakih 5msec.
; ***********************************************
INTERAPT 
MOVWF STEK_W ; PUSH
SWAPF STATUS,W
MOVWF STEK_STATUS
clrwdt ; PRVO OBRISI WATCH-DOG !!!
MOVLW .217
MOVWF TMR0
bcf INTCON,T0IF
DECFSZ FILTAR_ZA_TASTERE
GOTO IN6
MOVLW .10
MOVWF FILTAR_ZA_TASTERE
movlw 0fh
iorwf PORTA,1
nop
nop
nop
nop
BSF STATUS,RP0
MOVLW 0FFH
MOVWF TRISB
BCF STATUS,RP0
nop
nop
nop
nop

TASTERI COMF PORTB,0
XORWF STARI,1
ANDWF STARI,1

movwf RADNI_1
MOVFW STARI
movwf LAST_KEY
MOVFW RADNI_1
MOVWF STARI

BCF NOVI_TASTER
movf LAST_KEY,1
BTFSS STATUS,Z
BSF NOVI_TASTER

BSF STATUS,RP0
MOVLW 80H
MOVWF TRISB
BCF STATUS,RP0

nop
nop
nop

IN6 BSF STATUS,CY
RRF ROTOR

DECFSZ DISPL_CIFRA
GOTO IN5
MOVLW 4
MOVWF DISPL_CIFRA

MOVLW 0F7H
btfss RELE
MOVLW 0E7H
movwf ROTOR

IN5 btfss RELE
goto IN10
movlw 0F0h
iorwf ROTOR
goto IN11

IN10 movlw 0EFH
andwf ROTOR

IN11 movfw ROTOR
movwf PORTA

movlw 0F0h
iorwf ROTOR

movfw DISPL_CIFRA
addlw 15h
movwf FSR
movfw INDF
call TABELA

movwf PORTB

decfsz POST_SKALER_SEC
goto INT3
movlw .100
movwf POST_SKALER_SEC

BTFSS BLINK_DIODA
GOTO INT2
BCF BLINK_DIODA
GOTO INT3
INT2 BSF BLINK_DIODA

INT3 movf POINTER,1
btfsc STATUS,Z
goto INT1
BTFSS BLINK_DIODA
GOTO INT4
movfw CIFRA
addlw VIDEO_OFFSET
movwf FSR
movlw .20
movwf INDF
goto INT1

INT4 MOVFW CIFRA
ADDLW BAFER_OFFSET
MOVWF FSR
MOVFW INDF

movwf RADNI_1

MOVFW CIFRA
ADDLW VIDEO_OFFSET
MOVWF FSR
MOVFW RADNI_1
MOVWF INDF
INT1 SWAPF STEK_STATUS,W ; POP
MOVWF STATUS
SWAPF STEK_W,1
SWAPF STEK_W,W
RETFIE

; ***********************************************
; KRAJ INTERAPTA
; ***********************************************

; ***********************************************
; PROGRAMIRANJE
; ***********************************************
PROGRAMIRANJE MOVLW .13 ; ispisi "PROG"
MOVWF CIFRA4

MOVLW .19
MOVWF CIFRA3

MOVLW .12
MOVWF CIFRA2

MOVLW .22
MOVWF CIFRA1

btfss NOVI_TASTER
goto PROGRAMIRANJE ; cekaj taster
bcf NOVI_TASTER

btfss PROG?
goto PROGRAMIRANJE ; nije pritisnut taster ; za programiranje
movlw 1
movwf POINTER

PROG_1 clrf CIFRA ; idemo od cifre najmanje ; tezine
call EEPROM_U_BAFER

PROG_2 call BAFER_U_VIDEO

PROG_3 btfss NOVI_TASTER ; cekaj taster
goto PROG_3

bcf NOVI_TASTER
BTFSS PLUS?
GOTO PROG_4 ; nije plus taster

MOVFW CIFRA ;VREDNOST=(CIFRA+BAFER_OFFSET)
ADDLW BAFER_OFFSET
MOVWF FSR
INCF INDF ; VREDNOST=VREDNOST+1
MOVLW .10 ; VREDNOST >= 10 ?
SUBWF INDF,W ; rezultat u W !!!!
BTFSC STATUS,CY
CLRF INDF
; taster LEVO?
PROG_4 BTFSS LEVO?
GOTO PROG_5
INCF CIFRA ; da !! CIFRA = CIFRA+1

PROG_5 MOVFW POINTER ; pointer = 1 ?
SUBLW .1
BTFSS STATUS,Z
GOTO PROG_6
movlw .4 ; cifra >=4
SUBWF CIFRA,W
BTFSS STATUS,CY
goto PROG_7
CLRF CIFRA
goto PROG_7
; onda je pointer = 2
PROG_6 movlw .2 ; cifra >=2
SUBWF CIFRA,W
BTFSS STATUS,CY
goto PROG_7 ; nije vece od 2
CLRF CIFRA
; taster prog?
PROG_7 btfss PROG?
goto PROG_2 ; pritisnut je neki taster pa prebaci ; bafer u video
call BAFER_U_EEPROM ; pritisnut je taster prog
incf POINTER
; pointer >=3 ?
movlw .3 ; pointer >=3
subwf POINTER,W
btfss STATUS,CY
goto PROG_1 ; nije vece od 3 idi na podesavanje ; filtra

movlw 1
movwf POINTER
call EEPROM_U_BAFER ; prebaci zadati broj u bafer
clrf POINTER ; ne treba da blinka vise

call EEPROM_U_FILTAR ; prebaci iz eeproma u filtar

GOTO GLAVNI_1 ; VRATI SE U GLAVNI PROGRAM
; ***********************************************
; KRAJ PROGRAMIRANJA
; ***********************************************


; ***********************************************
; POTPROGRAMI
; ***********************************************
; ---------------------------------------------------------
; citanje iz eeprom memorije
; ulazi: w=eeadr
; izlazi: w=eedata
; ---------------------------------------------------------
EEREAD MOVWF EEADR
bcf INTCON,GIE ; zabrani interapte
BSF STATUS,RP0 
BSF EECON1,RD 
BCF STATUS,RP0 
MOVF EEDATA,W 
BSF INTCON,GIE ; dozvoli interapte

RETURN
; ---------------------------------------------------------
; upis u eeprom memoriju
; ulazi: eeadr i eedata
; izlazi: nema
; ---------------------------------------------------------
EEWRITE bcf INTCON,GIE ; zabrani interapte

clrwdt

BSF STATUS,RP0 ; banka 1
bsf EECON1,WREN ; dozvoli upis u eeprom
MOVLW 55H ; obavezna sekvenca
MOVWF EECON2
MOVLW 0AAH
MOVWF EECON2
BSF EECON1,WR ; startuj upis

EE_1 clrwdt ; obrisi watch-dog
BTFSC EECON1,WR ; ceka da se zavrsi upis u eeprom 
GOTO EE_1

BCF EECON1,WREN ; zabrani upis u eeprom
BCF STATUS,RP0 ; banka 0
BSF INTCON,GIE ; dozvoli interapte

RETURN
; ---------------------------------------------------------
; potprogram prebacuje iz eeproma u bafer na osnovu formule
; pocetna_adresa=(pointer-1)*4
; ---------------------------------------------------------
EEPROM_U_BAFER 
MOVFW POINTER
MOVWF RADNI_0
DECF RADNI_0 ; POINTER-1
; RADNI_0 je pocetna adresa
BCF STATUS,CY ; *4
RLF RADNI_0
RLF RADNI_0

movfw RADNI_0 ; POCETNA ADRESA
CALL EEREAD ; procitaj sa adrese
movwf 12H ; LSB

INCF RADNI_0
movfw RADNI_0
CALL EEREAD ; procitaj sa adrese
movwf 13H

INCF RADNI_0
movfw RADNI_0
CALL EEREAD ; procitaj sa adrese
movwf 14H

INCF RADNI_0
movfw RADNI_0
CALL EEREAD ; procitaj sa adrese
movwf 15H ; MSB

RETURN
; ---------------------------------------------------------
; potprogram prebacuje iz bafera u eeprom na osnovu formule
; pocetna_adresa=(pointer-1)*4
; ---------------------------------------------------------
BAFER_U_EEPROM 
MOVFW POINTER
MOVWF RADNI_0
DECF RADNI_0 ; POINTER-1
; RADNI_0 je pocetna adresa
BCF STATUS,CY ; *4
RLF RADNI_0
RLF RADNI_0

movfw RADNI_0 ; POCETNA ADRESA
MOVWF EEADR ; LSB
MOVFW 12H
MOVWF EEDATA
CALL EEWRITE ; upisi na pocetnu adresu

INCF RADNI_0 ; POCETNA ADRESA + 1
MOVFW RADNI_0
MOVWF EEADR ;
MOVFW 13H
MOVWF EEDATA
CALL EEWRITE ; upisi na pocetnu adresu

INCF RADNI_0 ; POCETNA ADRESA + 2
movfw RADNI_0 ; POCETNA ADRESA
MOVWF EEADR ;
MOVFW 14
MOVWF EEDATA
CALL EEWRITE ; upisi na pocetnu adresu

INCF RADNI_0 ; POCETNA ADRESA + 3
movfw RADNI_0 ; POCETNA ADRESA
MOVWF EEADR ; MSB
MOVFW 15H
MOVWF EEDATA
CALL EEWRITE ; upisi na pocetnu adresu

RETURN
; ---------------------------------------------------------
; potprogram prebacuje iz bafera u video
; ---------------------------------------------------------
BAFER_U_VIDEO 
movfw BAFER1
movwf CIFRA1

movfw BAFER2
movwf CIFRA2

movfw BAFER3
movwf CIFRA3

movfw BAFER4
movwf CIFRA4

RETURN
; ---------------------------------------------------------
; potprogram ispituje ivicu ulaznog signala
; ---------------------------------------------------------
IVICA btfsc ULAZ
goto IV_1
; ceka rastucu ivicu
IV_2 btfsc CLOCK
goto IV_3
bsf ULAZ
goto IV_3


IV_1 btfss CLOCK
goto IV_3
bcf ULAZ

IV_3 bcf IVICA_
btfsc STARI_ULAZ
goto IV_5
btfss ULAZ
goto IV_5
bsf IVICA_

IV_5 bcf STARI_ULAZ
btfsc ULAZ
bsf STARI_ULAZ

RETURN
; ---------------------------------------------------------
; potprogram smanjuje vrenost u video memoriji kada broji
; na dole. dok ne dodje do nule a onda stalno drzi nulu !!
; ---------------------------------------------------------
SMANJI_VIDEO 
movlw 1 ; ne moze sa DECFSZ CIFRA1
subwf CIFRA1 ; ali moze ovako !!
btfsc STATUS,C ; cifra1 = cifra1 - 1
RETURN
movlw 9
movwf CIFRA1 ; cifra1<0 !!

movlw 1 ;
subwf CIFRA2 ;
btfsc STATUS,C ; cifra2 = cifra2 - 1
RETURN
movlw 9
movwf CIFRA2 ; cifra2<0 !!

movlw 1 ;
subwf CIFRA3 ;
btfsc STATUS,C ; cifra3 = cifra3 - 1
RETURN
movlw 9
movwf CIFRA3 ; cifra3<0 !!

movlw 1 ;
subwf CIFRA4 ;
btfsc STATUS,C ; cifra4 = cifra4 - 1
RETURN
movlw 9
movwf CIFRA4 ; cifra4<0 !!

RETURN
; ---------------------------------------------------------
; prebaci eeprom filtar u filtar
; ---------------------------------------------------------
EEPROM_U_FILTAR 
movlw 4
call EEREAD
movwf FILTAR

movlw 5
call EEREAD
MOVWF RADNI_0
bcf STATUS,CY
RLF RADNI_0 ; x16H
RLF RADNI_0
RLF RADNI_0
RLF RADNI_0
movfw RADNI_0
iorwf FILTAR

RETURN
; ***********************************************
; KRAJ POTPROGRAMA
; ***********************************************
; Pocetne vrednosti za brojac
; ORG 0x2100
; DATA 0x01 ; pocetne vrednost za brojac
; DATA 0x02
; DATA 0x03
; DATA 0x04

; DATA 0x05 ; pocetna vrednost za filtar
; DATA 0x06
; DATA 0x14 ; Spejs
; DATA 0x17 ; F

END


Pročitajte više o ovoj temi
Povezivanje LCD-a
Step motor i PIC 
PIP02 
Portovi

C o p y r i g h t  1998 mikroElektronika. All Right Reserved. Za sva pitanja obratite se redakciji