[ pesoholicar90 @ 22.01.2012. 17:52 ] @
POTREBNA POMOC!!!!!
Napraviti program za kvadriranje brojeva od 1 do 15. broj se unosi u binarnom obliku inkrementiranjem ili dekrementiranjem. Nije moguće pojavljivanje broja većeg od 15 ni manjeg od 1. Zadatak realizovati pomoću mikrokontrolera PIC16F84 na asembleru.

PORTB Prikaz binarnog broja
PORTA.0 Inkrementiranje broja
PORTA.1 dekrementiranje broja
PORTA.2 Prikaz rezultata
[ veselinovic @ 22.01.2012. 18:22 ] @
Milose,
ne ide to tako kako si zamislio.
1.Otvaras dvije teme za isto pitanje.
2. Nisi se potrudio da makar pocnes pisati program, nego ocekujes da ti neko uradi tvoj zadatak.

Moras sam poceti, pa ce se vec neko naci da ti pomogne, iako se ovdje slabo koristi asembler, ali ima ko zna.
[ pesoholicar90 @ 29.01.2012. 18:06 ] @
evo koda....samo me zanima da li radi kako treba
#include p16f84.inc ; inicijalizacija procesora koji ce se koristiti
processor 16f84
org 5 ; program pocinje od pozicije 5 u memoriji
cinil1 equ 0x18 ; prvi cinilac
cin1 equ 0x19 ; prvi cinilac/pomocna promenljiva
cin2 equ 0x20 ; drugi cinilac/pomocna promenljiva
proizvod equ 0x21 ; proizvod
stanje equ 0x22 ; pomocna promenljiva za upis prethodnog stanja PORTA
delay equ 0x23 ; pomocna promenljiva za definisanje kasnjenja
brojac equ 0x24 ; brojac
pombr equ 0x25 ; pomocni brojac inicijalizacija
clrf PORTA ;
clrf PORTB ;
clrf stanje ;
clrf cinil1 ;
bsf STATUS,RP0 ; prebaciti se u banku 1 memorije
movlw 0x1f ; definisanje da je PORTA ulazni
movwf TRISA ; nazivi registara pisu se velikim slovom
movlw B'00000000' ; definisanje da je PORTB izlazni
movwf TRISB ; vratiti se iz banke 1 memorije
bcf STATUS,RP0


start

btfsc PORTA,4 ; provera da li je pritisnut taster za reset cinilaca
call reset ; pozovi potprogram za reset

btfsc PORTA,0 ; provera da li je pritisnut poziv 1. cinioca, ako jeste
goto cinilac1 ; idi na upis 1 cinioca



clrf stanje ; pripremi stanje za sledecu operaciju
movf proizvod,0 ; prikazi proizvod na PORTB ako nisu pritisnuti tasteri 0,1
movwf PORTB
clrf proizvod ; resetuj proizvod
mnozenje

movf cinil1,0 ; prebacivanje cinioca 1 u pomocnu promenljivu
movwf cin1
movf cinil1,0 ; prebacivanje cinioca 1 u pomocnu promenljivu
movwf cin2
clrf brojac ; resetuj brojac
clrf pombr ; resetuj pomocni brojac
btfsc cin2,0 ; provera da li je prva cifra drugog cinioca 1
call zbir1 ; ako jeste uradi podprogram sa labelom zbir1
btfss cin2,0 ;
call zbir0 ; u suprotnom uradi podprogram sa labelom zbir0
incf brojac,1 ; inkrementiraj brojac

petlje

rlf cin1,1 ; rotiraj sadrzaj cinioca 1 ulevo i smesti ga u njega samog
bcf cin1,0 ; resetuj prvi bit cinioca 1
btfsc STATUS,C ; proveri da li je bit C 1
call provera ; ako jeste uradi podprogram sa labelom provera
rrf cin2,1 ; rotiraj sadrzaj cinioca 2 udesno i smesti ga u njega samog
btfsc cin2,0 ; provera da li je prv bit drugog cinioca 1
call zbir2 ; ako jeste uradi podprogram sa labelom zbir2
btfss cin2,0 ;
call zbir0 ; u suprotnom uradi podprogram sa labelom zbir0
incf brojac,1 ; inkrementiraj brojac
btfsc brojac,3 ; ako je brojac stigao do 8
goto start ; idi na pocetak ciklusa
goto petlje ; idi na podprogram sa labelom petlje
zbir1

movf cin1,0 ; smesti sadrzaj cinioca 1 u akumulator
movwf proizvod ; saberi to sa proizvodom
return ; vrati se ispod mesta poziva

zbir2

movf cin1,0 ; smesti sadrzaj cinioca 1 u akumulator
addwf proizvod ; dodaj sadrzaj akumulatora proizvodu
return ; vrati se ispod mesta poziva



zbir0

clrw ; obrisi sadrzaj akumulatora
addwf proizvod ; dodaj sadrzaj akumulatora proizvodu
return ; vrati se ispod mesta poziva



provera

rrf cin2,1 ; rotiraj sadrzaj cinioca 2 udesno i smesti ga u njega samog
incf pombr,1 ; inkrementiraj pomocni brojac
btfsc cin2,0 ; provera da li je prvi bit drugog cinioca 1
bsf PORTB,3 ; setuj cetvrti bit PORT-a B
btfsc pombr,7-brojac ; provera da li su ispitani svi bitovi drugog cinioca
goto start ; ako jesu idi na start programa
goto provera ; u suprotnom idi na proveru
return ; vrati se ispod mesta poziva

cinilac1

btfsc PORTA,2 ; proveri da li je pritisnut taster za inkrementiranje
call inkr1 ; idi na inkrementiranje
btfss PORTA,2 ;
bcf stanje,2 ; ciklus inkrementiranja zavrsen
btfsc PORTA,3 ; proveri da li je pritisnut taster za dekrementiranje
call dekr1 ; idi na dekrementiranje
btfss PORTA,3 ;
bcf stanje,3 ; ciklus dekrementiranja zavrsen
movf cinil1,0 ; prikazi 1 cinilac na PORTB
movwf PORTB
goto mnozenje ; idi na mnozenje


reset ; potprogram za brisanje cinilaca
clrf cinil1

return



inkr1 ; potprogram za inkrementiranje 1 cinioca
btfss stanje,2 ; proveri da li je taster 2 bio pritisnut, ako nije
incf cinil1,1 ; inkrementiraj 1 cinilac
bsf stanje,2 ; jedno inkrementiranje zavrseno
call pauza ; sacekaj da se kontakti smire
return
dekr1 ; potprogram za dekrementiranje 1 cinioca
btfss stanje,3 ; proveri da li je taster 3 bio pritisnut, ako nije
decf cinil1,1 ; dekrementiraj 1 cinilac
bsf stanje,3 ; jedno dekrementiranje zavrseno
call pauza ; sacekaj da se kontakti smire
return


pauza ; potprogram za pravljenje kasnjenja
movlw 0xff
movwf delay
petlja
decfsz delay,1 ; kasnjenje je oko delay * 2 mikrosekundi
goto petlja ; za oscilator od 4MHz
return

; konfiguraciona rec
__config B'11111111110001' ; nema zastite koda, powerup dozvoljeno,
; wd iskljucen, xt oscilator

end ; kraj programa
[ ZAS011 @ 30.01.2012. 14:51 ] @
Izprogramiras PIConju, ubodes na protobord i proveris. Nista lakse. (ili propustis kroz neki simulator)