Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ;----------------------------------------------------------------------
- ;Laboratorna Uloha SYS (c.3)
- ;Vypracoval: Schmiedt / Zeidler (D-6)
- ;Zadanie: C_18
- ;
- ;NASTAVENIE CASOVACOV--------------------------------------------------
- ;FOSC = 10MHz, IPEN = 1
- ;casovac T0 naplnit po 160
- ;casovac T2 naplnit po 97
- ;----------------------------------------------------------------------
- ;
- ;----------------------------------------------------------------------
- ;DEKLARACIE
- ;----------------------------------------------------------------------
- LIST p=18F87J11
- #include <P18F87J11.INC>
- ;----------------------------------------------------------------------
- ;KONFIGURACNE BITY
- ;----------------------------------------------------------------------
- CONFIG FOSC=HS
- CONFIG WDTEN=OFF
- CONFIG XINST=OFF
- ;----------------------------------------------------------------------
- ;DEFINICIA PREMENNYCH
- ;----------------------------------------------------------------------
- BTN1 equ 0x020 ;tlacitko na porte B0
- BTN2 equ 0x021 ;tlacitko na porte A5
- PRIZB equ 0x030 ;prinzak RB0
- PRIZA equ 0x039 ;priznak RA5
- MASK equ 0x031 ;MASKA
- MASKF equ 0x022 ;MASKA FINAL
- BTN equ 0x03B ;Stav tlacitok
- STAV_LED equ 0x032 ;stav LED diod
- SMER equ 0x037 ;urcuje smer pocitania 0(dole) default
- STOP equ 0x038 ;urciuje ci sa ma pocitanie zastavit 0(run) default
- TMR1S equ 0x033 ;pocitadlo 1 sekundy pre timer 0 = 160
- TM1S equ 0x034 ;pomocna premenna pre pocitadlo 1s Timer 0
- TM2S equ 0x035 ;pomocna premenna pre Timer 2
- TMR2S equ 0x036 ;pocitadlo 10ms pre timer 2 = 97
- CBLOCK 0x000
- WREG_TMP1
- STATUS_TMP1
- BSR_TMP1
- WREG_TMP2
- STATUS_TMP2
- BSR_TMP2
- ENDC
- ;----------------------------------------------------------------------
- ;ZACIATOK
- ;----------------------------------------------------------------------
- org 0x0000 ;start programu po restarte
- goto Main
- org 0x0008 ;start obsluhy prerusenia s vyssou prioritou
- goto High_int
- org 0x0018 ;start obsluhy prerusenia s nizsiou prioritou
- goto Low_int
- ;----------------------------------------------------------------------
- ;MAIN
- ;----------------------------------------------------------------------
- Main
- movlw 0x00 ;WREG = 0
- movwf TRISD ;PORT D = vystup
- movwf TRISA ;PORT A = vystup
- movwf TRISB ;PORT B = vystup
- movwf PORTD ;vynuluje PORT D
- movwf SMER ;vynuluje smer pocitania 0 = dole
- movwf STOP ;vynuluje zastavenie pocitania 0 = run
- movlw 0x0F ;naplni WREG = F
- movwf STAV_LED ;nastavi stan_led na F
- bsf TRISB,RB0,0 ;0 bit PORT B = vstup
- bsf TRISA,RA5,0 ;5 bit PORT A = vstup
- bsf WDTCON,ADSHR,0
- bsf ANCON0,PCFG4,0
- bcf WDTCON,ADSHR,0
- movlw 0x00 ;WREG = 0
- movwf BTN1 ;tlacitko na porte B0 = 0
- movwf BTN2 ;tlacitko na porte A5 = 0
- movwf BTN ;vynuluje
- movwf PRIZA ;prinzak tlacitok = 0
- movwf PRIZB ;priznak tlacitok = 0
- movlw 0xFF ;WREG = FF
- movwf MASKF ;MASKF = 11111111b
- ;Cyklovac pre Timer0
- movlw 0x25 ;dec = 160 0xA0, doladili sme na 0x25
- movwf TM1S ;napln pomocnu premennu
- movff TM1S,TMR1S ;napln pocitadlo, 1 sekunda na casovaci
- ;Cyklovac pre Timer 2
- movlw 0x30 ;dec = 97 0x61, doladili sme na 0x30
- movwf TM2S ;napln pomocnu premennu
- movff TM2S,TMR2S ;napln pocitadlo, 10ms na casovaci
- ;TIMER 0 nastavenie
- movlw 0x08 ;b'00001000'
- movwf T0CON ;16-bit, vnutorne hodiny 10MHz, prescaler 1:256, 1 sekunda
- movlw 0xE0 ;b'11100000'
- movwf INTCON ;Timer high-priority interupts, owerflow interupt enable
- bsf RCON,IPEN ;IPEN = ON
- movlw 0x04 ;b'00000100'
- movwf INTCON2 ;Timer 0 nastaveny ako High Priority
- ;TIMER 2 nastavenie
- bsf PIE1,TMR2IE ;nastavenie owerflow casovaca 2
- bsf T2CON,T2CKPS0 ;set Timer 2 8-bit, prescale 1:4, 10ms
- bcf IPR1,TMR2IP ;low priority Timer 2
- ;TIMERS ON !!!!!!!!!!!!!!!!!!
- bsf T0CON,TMR0ON ;zapni Timer 0
- bsf T2CON,TMR2ON ;zapni Timer 2
- ;----------------------------------------------------------------------
- ;LOOP
- ;----------------------------------------------------------------------
- Loop
- goto Loop
- ;----------------------------------------------------------------------
- ;HIGH_INT - prerusenie s nizsou prioritou, snimanie tlacitok
- ;Timer 0 treba plnit 160 krat = 1 sekunda
- ;----------------------------------------------------------------------
- High_int
- movff STATUS,STATUS_TMP1
- movff WREG,WREG_TMP1
- movff BSR,BSR_TMP1
- bcf INTCON,TMR0IF ;reset flag Timeru 0
- decf TMR1S ;dekrement TMR1S
- tstfsz TMR1S ;skip if zero
- goto Rets
- ;OBSLUHA PROGRAMU PO 1 SEKUNDE
- movff TM1S,TMR1S ;1 sekunda na casovaci
- goto Do ;goto Do-------------------------------
- Rets ;RETURN
- movff STATUS_TMP1,STATUS
- movff WREG_TMP1,WREG
- movff BSR_TMP1,BSR
- retfie
- ;----------------------------------------------------------------------
- ;LOW_INT - prerusenie s nizsou prioritou, vypis LED diod
- ;Timer 2 treba plnit na 97 krat = 10 milisekund
- ;----------------------------------------------------------------------
- Low_int
- movff STATUS,STATUS_TMP2
- movff WREG,WREG_TMP2
- movff BSR,BSR_TMP2
- bcf PIR1,TMR2IF ;reset flag Timeru 2
- decf TMR2S ;dekrement TMR2S
- tstfsz TMR2S ;skip if zero
- goto Rets2
- ;OBSLUHA PROGRAMU PO 10 MILISEKUNDACH
- movff TM2S,TMR2S ;10 ms na casovaci
- goto Obsluha_Tlac ;goto Obsluha_Tlacitiek----------------
- Rets2 ;RETURN 2
- movff STATUS_TMP2,STATUS
- movff WREG_TMP2,WREG
- movff BSR_TMP2,BSR
- retfie
- ;----------------------------------------------------------------------
- ;OBLUHA TLACITIEK
- ;RB0 - zastavi cyklus
- ;RA5 - zmeni smer cyklu
- ;----------------------------------------------------------------------
- Obsluha_Tlac
- movlw 0x00 ;WREG = 00000000b
- ;TLACITKO B0
- btfsc PORTB,0,0 ;je B0 stlacene ?
- movwf BTN1 ;vynuluj masku B0
- btfss PORTB,0,0 ;je B0 stlacene ?
- goto B0_Stisk ;goto B0_Stisk
- movlw 0x00 ;WREG = 0
- ;TLACITKO A5
- btfsc PORTA,5,0 ;je A5 stlacene ?
- movwf BTN2 ;vynuluj masku A5
- btfss PORTA,5,0 ;je A5 stlacene ?
- goto A5_Stisk ;goto A5_Stick
- ;reset BTN
- ;btfsc PORTB,0,0 ;je B0 stlacene ?
- ;goto Reset_BTN
- goto Rets2 ; pre istotu
- Reset_BTN
- btfsc PORTA,5,0 ;je A5 stlacene ?
- clrf BTN ;clear BTN
- goto Rets2
- ;TLACITKO B-------------------------------------------------------------
- B0_Stisk
- btfss PORTB,0,0 ;je B0 stlacene ?
- bsf BTN1,0,0 ;nastav prvy bit na 1
- rlncf BTN1,1,0 ;rotuj dolava o 1 bit
- clrf BTN ;clear BTN
- bsf BTN,7 ;nastavi jednotku na 7 bit
- ;test
- movlw 0x0E ;WREG = 00001110b
- cpfseq BTN1 ;porovna masku
- goto Not_B0 ;goto NOT B0
- goto Naozaj_B0 ;goto naozaj B0
- Naozaj_B0
- movlw 0x01 ;WREG = 1
- xorwf STOP ;Zmeni STOP -----------------------------------
- ;goto Vypis ;goto Vypis
- goto Rets2
- Not_B0
- ;movlw 0x00 ;WREG = 0
- ;movwf BTN ;BTN = 00000000b
- ;goto Vypis ;goto Vypis
- goto Rets2
- ;TLACITKO A----------------------------------------------------------------
- A5_Stisk
- btfss PORTA,5,0 ;je A5 stlacene ?
- bsf BTN2,0,0 ;nastav prvy bit na 1
- rlncf BTN2,1,0 ;rotuj dolava o 1
- clrf BTN ;clear BTN
- bsf BTN,6 ;nastavi jednotku na 6 bit
- ;test
- movlw 0x0E ;WREG = 00001110b
- cpfseq BTN2 ;porovna masku
- goto Not_A5
- goto Naozaj_A5
- Naozaj_A5
- movlw 0x01 ;WREG = 1
- xorwf SMER ;zmeni SMER---------------------------------
- ;goto Vypis
- goto Rets2
- Not_A5
- ;movlw 0x00 ;WREG = 0
- ;movwf BTN ;BTN = 00000000b
- ;goto Vypis ;goto Vypis
- goto Rets2
- ;----------------------------------------------------------------------
- ;VYPIS
- ;----------------------------------------------------------------------
- Vypis
- movlw 0xFF ;WREG = FF
- andwf BTN,1 ;maskuje, dufam ze uspesne :)
- movlw 0x00 ;WREG = 0
- addwf BTN,0 ;urobi masku a vysledok ulozi do WREG
- addwf STAV_LED,0 ;urobi masku a vysledok ulozi do WREG
- movwf PORTD ;vypise na LED
- clrf BTN ;clear BTN
- ;goto Rets2
- goto Rets
- ;----------------------------------------------------------------------
- ;DO - byhodnoti ci ma odpocitavat ci pripocitavat
- ;----------------------------------------------------------------------
- Do
- tstfsz STOP ;if STOP = 0 (run) skip next
- goto Rets ;ked STOP = 1(stop) tak skoc na Rets
- tstfsz SMER ;if SMER = 0 (dole a default) skip next
- goto Pripoc ;pripocitaj jednu
- goto Odpoc ;odpocitaj jednu
- ;----------------------------------------------------------------------
- ;ODPOCITAVANIE
- ;----------------------------------------------------------------------
- Odpoc
- tstfsz STAV_LED ;if STAV_LED = 0 skip next
- goto Dekrement ;goto Dekrement
- goto Dekrement_Set ;goto Dekrement_Set
- Dekrement ;OBYCAJNY DEKREMENT
- decf STAV_LED ;dekrement STAV_LED
- ;goto Rets
- goto Vypis
- Dekrement_Set ;IF STAV_LED = 0 TAK NASTAVI STAV_LED = F
- movlw 0x0F ;nastavi WREG = F
- movwf STAV_LED ;napli STAV_LED = F
- ;goto Rets
- goto Vypis
- ;----------------------------------------------------------------------
- ;PRIPOCITAVANIE
- ;----------------------------------------------------------------------
- Pripoc
- movlw 0x0F ;WREG = F
- cpfseq STAV_LED ;if STAV_LED = F skip next
- goto Inkrement ;goto inkrement
- goto Inkrement_Set ;goto Inkrement_Set
- Inkrement ;OBYCAJNY INKREMENT
- incf STAV_LED ;inkrement STAV_LED
- ;goto Rets
- goto Vypis
- Inkrement_Set ;IF STAV_LED = F TAK NASTAVI STAV_LED = 0
- movlw 0x00 ;nastavi WREG = 0
- movwf STAV_LED ;napli STAV_LED = 0
- ;goto Rets
- goto Vypis
- ;----------------------------------------------------------------------
- ;END
- ;----------------------------------------------------------------------
- END
Add Comment
Please, Sign In to add comment