|
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
|
|