;************************************************* ;Copyright Jyrki jyrki.k(a)innopultti.fi 19.7.2008 ;PWM, lämpötila ja kiihtyvyysmittari yhtäaikaa, joka toimii Microchipin 16f628A mikro-ohjaimella, SMT160-30 lämpötila-anturilla ja MXD2125M kiihtyvyysanturilla. ;Ja jonka näyttönä toimii 2*16 merkin LCD-näyttö. Eli siis kaikki nuo tiedot näkyy yhtäaikaa LCD-näytöllä. Toisin sanoen riippuen kytketystä anturista, eli onko ;kiihtyvyysanturi vai lämpötila-anturi kytkettynä RB3 pinniin. Niin silloin myös joko kiihtyvyyden tai lämpötilan lukema näyttää väärin. PWM-lukema näyttää tietysti ;aina oikein jos mitattavana on vain PWM-pulssi. ;Ohjelman rakentelussa on käytetty apuna netistä löytynyttä koodia, joka suorittaa yhteen ja vähennyslaskua nopeasti ja helposti. ;Koodit löytyy täältä: http://www.piclist.com/techref/microchip/math/frtomath32.asm . Tuota koodia on sitten muokattu tähän ohjelmaan paremmin sopivaksi. ;Ohjelman rakentelua: ;PWM prosentteina laskennallisesti MBLAB:ssa. 24.6.2008 ;PWM näytteenotto toimii RB3 pinnistä MBLAB:ssa. 26.6.2008. ;PWM prosentteina toimii nyt RB3 pinnistä otettuna ja siittä laskettuna MBLAB:ssa. 27.6.2008 ;PWM prosenttilaskenta toimii kokeiltuna koekytkentäalustalla, jossa näyttönä 2*16 merkin LCD näyttö. 2.7.2008 ;6.7.2008. ;Toimii lämpömittarina SMT160-30 digitaalisella PWM ulostuloisella lämpötila-anturilla, ;josta saa lämpötilan lasketuna kaavalla: PWM= 0.320+0.00470*t ( t= Celsius aste). ;16.7.2008. ;Toimii nyt yhtä aikaa 2*16 merkin LCD-näytöllä sekä PWM-suhteen prosenttimittarina. Kuin myös lämpömittarina SMT160-30 anturilla. ;Ja myös kiihtyvyysmittarina anturilla MXD2125M. ;Joka on +/- 3g kahden akselin kiihtyvyysmittari PWM antosignaalilla ja jonka herkkyys on 12.5%/g. ;************************************************* LIST P=16f628 ;Prosessori jolle lähdekoodi käännetään. include ;Liitetiedosto jossa on määritelty ;pic16f628:n rekisterit ja muut vakiot. __CONFIG _CP_OFF & _WDT_OFF & _BODEN_ON & _PWRTE_ON &_HS_OSC & _MCLRE_ON & _LVP_OFF ;************************************************ ;Omien rekisterien määrittely. ;************************************************ ;Omat rekisterit. cblock 0x20 ;Vapaa muisti alkaa osoitteesta 0x20 luku hexana. PWMLIPUT ;PWM talteen keräämistä ohjaava lippurekisteri RESOAUTO ;Tämä rekisteri hidastaa timer1 pyörimistä, jos timeri1 pyörähtää ympäri. ;PWM talteen keräysrekisterit. PWMALKUL PWMALKUH PWMT1L PWMT1H PWMT1HH PWMT1HHH PWMT2L PWMT2H PWMT2HH PWMT2HHH VALMISPWML VALMISPWMH VALMISPWMHH VALMISPWMHHH ;PWM talteen keräysrekisterit. ;Yhteen ja vähennyslaskun rekisterit operand_1 operand_2 operand_3 operand_4 accumulator_1 accumulator_2 accumulator_3 accumulator_4 operand_1t operand_2t operand_3t operand_4t accumulator_1t accumulator_2t accumulator_3t accumulator_4t KERROIN1 KERROIN2 LASKENTALIPUT TULOS ;***************************** ;LCD-näytön rekistereitä. ;Tavalliset rekisterit: ;Lämpötilan rekisterit. YKKOSETC ;Näytön päivityksessä käytettävät rekisterit. KYMMENETC ; -||- SADATC ; -||- TUHANNETC ; -||- ;PWM-suhteen rekisterit. YKKOSETPWM ;Näytön päivityksessä käytettävät rekisterit. KYMMENETPWM ; -||- SADATPWM ; -||- TUHANNETPWM ; -||- ;Kiihtyvyyden rekisterit. YKKOSETG ;Näytön päivityksessä käytettävät rekisterit. KYMMENETG ; -||- SADATG ; -||- TUHANNETG ; -||- AYKKOSET ;Näytön ohjauksessa käytettävät apurekisterit rekisterit. AKYMMENET ; -||- ASADAT ; -||- ATUHANNET ; -||- VIIVE0 ;Kytkinvärähtelyn viiveen rekisterit. VIIVE1 ; -||- JAKAJA ;Lukeman tallennus ja näyttö rekistereitä. ETUMERKKIC ;Etumerkki, jotta tiedetään lisättiinkö vai vähennettiinkö lukemaa. ETUMERKKIG ;Lippurekisterit: YLIVUOTO ;Näytönohjauksen apuna käytettävä lippurekisteri.Ilmottamassa numeroiden 0-9 ylivuotamisesta. SEGMENTTI ;Näytön päivityksen ohjausreksiteri. Tämä rekisteri auttaa segmenttien himmenyksien poistossa. ;Viiveiden rekistereitä d1 d2 d3 ;Nämä kertoo monta kertaa laskuria on hidastettu ympäripyörähdyksen takia. ATIMER TIMER ;LCD-näytön ohjaus rekistereitä. ohjaustavu tavu tavuvarasto endc ;Omien rekistereiden määrittely loppuu tähän. ;Näihin tallennetaan keskeytyksessä w ja status-rekisteri. w_temp EQU 0x71 ; variable used for context saving status_temp EQU 0x72 ; variable used for context saving ;Tämä bitti valvoo yhteen ja vähennyslaskun ylivuotoja. LV_YLI equ 0 ;Ylivuoto yhteen tai vähennyslaskussa. ;LCD-näytön bitit. ;Bitit jotka tarvitaan LCD-näytön ohjailussa. E equ 1 RS equ 2 RW equ 0 ;Keskeytyksessa tallennetaan status ja w rekisteri näihin talteen väliaikaisesti. w_temp EQU 0x71 ; variable used for context saving status_temp EQU 0x72 ; variable used for context saving ;************************************************ ;Porttien suuntien määrittely. ;************************************************ org 0x000 ;Aletaan täyttämään ohjelmamuistia ;muistipaikasta 0 clrf PORTA ;Tyhjennetään portit clrf PORTB goto PORTIT ;Keskeytysvektori alkaa tästä. ORG 0x004 ; interrupt vector location ;Tähän tullaan kun tulee keskeytys RB3 pinniin tai timeri pyörähtää ympäri. movwf w_temp ; save off current W register contents movf STATUS,w ; move status register into W register movwf status_temp ; save off contents of STATUS register ;Tutkitaan mistä syystä keskeytys on aiheutunut. btfsc PIR1, TMR1IF ; Onko keskeytyksen syy timer1 ylipyörähdys. goto TIMER1YP ; Timer1 ylipyörähdys. movlw 0x000 xorwf PWMLIPUT,W btfss STATUS,Z goto KAYNNISTYS goto ALUSTETAANTIMERI KAYNNISTYS movlw 0x001 xorwf PWMLIPUT,W btfss STATUS,Z goto PWMLUKEMINEN1 goto TIMERINLUKUKAYNTIIN PWMLUKEMINEN1 movlw 0x002 xorwf PWMLIPUT,W btfss STATUS,Z goto PWMKOKOPITUUSTALTEEN goto EKAOSAPWMTALTEEN PWMKOKOPITUUSTALTEEN ;Koska viimeinen näyte PWM on otettu. MOVLW B'00000000' ; Niin pysäytetään timeri. MOVWF T1CON CLRF PWMLIPUT ; Ja alustetaan PWM näytten ottoa ohjaava lippurekisteri. CLRF RESOAUTO ; Alustetaan myös timerin pyörimisnopeutta ohjaava rekisteri. ;Sitten otetaan laskurin loppulukema talteen. Tämä lukema on PWM T2 arvo. MOVF CCPR1L,W MOVWF PWMT2L MOVF CCPR1H,W MOVWF PWMT2H MOVLW B'00000100' ; Capture mode falling edge. MOVWF CCP1CON bcf PIR1, T0IF ; Reset flag that indicates interrupt bcf PIR1, TMR1IF ; Resetoidaan timer1 yli pyörähtämisestä kertova lippubitti. ;Ja kun tähän on päästy, niin on alustettu samalla myös alkamaan uudestaan näytteenotto PWM:stä. movf status_temp,w ; retrieve copy of STATUS register movwf STATUS ; restore pre-isr STATUS register contents swapf w_temp,f swapf w_temp,w ; restore pre-isr W register contents retfie ; return from interrupt EKAOSAPWMTALTEEN INCF PWMLIPUT ;Sitten otetaan laskurin eka lukema talteen. Tämä lukema on PWM T1 arvo. MOVF CCPR1L,W MOVWF PWMT1L MOVF CCPR1H,W MOVWF PWMT1H MOVLW B'00000101' ; Capture mode rising edge MOVWF CCP1CON bcf PIR1, T0IF ; Reset flag that indicates interrupt bcf PIR1, TMR1IF ; Resetoidaan timer1 yli pyörähtämisestä kertova lippubitti. movf status_temp,w ; retrieve copy of STATUS register movwf STATUS ; restore pre-isr STATUS register contents swapf w_temp,f swapf w_temp,w ; restore pre-isr W register contents retfie ALUSTETAANTIMERI ;Nollataan timerin lukema. CLRF TMR1L CLRF TMR1H INCF PWMLIPUT ;;Säädetään aloitus tapahtumaan nousevalla reunalla ja käynnistetään timeri laskuri. MOVLW B'00000101' ; Capture mode rising edge MOVWF CCP1CON bcf PIR1, T0IF ; Reset flag that indicates interrupt bcf PIR1, TMR1IF ; Resetoidaan timer1 yli pyörähtämisestä kertova lippubitti. ;Timerin pyörintänopeus RESOAUTO rekisteristä T1CON rekisteriin. btfsc RESOAUTO,0 bsf T1CON,4 btfsc RESOAUTO,1 bsf T1CON,5 btfss RESOAUTO,0 bcf T1CON,4 btfss RESOAUTO,1 bcf T1CON,5 ;Lopuksi käynnistetään timeri. bsf T1CON,TMR1ON movf status_temp,w ; retrieve copy of STATUS register movwf STATUS ; restore pre-isr STATUS register contents swapf w_temp,f swapf w_temp,w ; restore pre-isr W register contents retfie ; return from interrupt ;Timerin alustaminen päättyy. TIMERINLUKUKAYNTIIN ;Jos ei tullut laskevaa reunaa vastaan ja timeri on alustettu niin, ;säädetään aloitus tapahtumaan laskevalla reunalla ja luetaan laskurin eka lukema ylös, joka sitten vähennetään ;T1 ja T2:sta. ; Luetaan PWM alkupätkä ylös, joka sitten vähennetään PWM T1 ja T2 lukemista. MOVF CCPR1L,W MOVWF PWMALKUL MOVF CCPR1H,W MOVWF PWMALKUH INCF PWMLIPUT ;Lisätään tämän rekisterin lukemaa PWM lukemisen edistymisen takia. MOVLW B'00000100' ; Capture mode falling edge MOVWF CCP1CON BCF PIR1, T0IF ; Reset flag that indicates interrupt BCF PIR1, TMR1IF ; Resetoidaan timer1 yli pyörähtämisestä kertova lippubitti. movf status_temp,w ; retrieve copy of STATUS register movwf STATUS ; restore pre-isr STATUS register contents swapf w_temp,f swapf w_temp,w ; restore pre-isr W register contents retfie ; return from interrupt TIMER1YP ;Tähän kohtaan tullaan kun timer1 on yli pyörähtänyt. INCF RESOAUTO ; Tämän rekisterin sisältö määrää timerin pyörintänopeuden. Nyt sitä lisätään +1, koska timer1 on pyörähtänyt ympäri. Koska pyöri liian nopeasti. ;Säädetään lukemaa joka kertoo haluttaessa timerin pyörinnopeuden LCD-näytössä. DECF ATIMER,f movf ATIMER,w ; call TAULUKKO_SEG ;Kutsutaan TAULUKKO_SEG aliohjelmaa tästä aliohjelmasta. movwf TIMER ; movlw 0x004 xorwf RESOAUTO,W btfss STATUS,Z goto RESOEIYLI goto RESOMENIYLI RESOMENIYLI ;Tähän tullaan kun RESOAUTO meni yli 4. clrf RESOAUTO movlw 0xA ; movwf ATIMER ; movlw A'0' ; movwf TIMER ; RESOEIYLI ;Koska TIMERI meni ympäri pysäytetään se. ;Ja aloitetaan kaikki PWM näytteenotto alusta. MOVLW B'00000000' ; Niin pysäytetään timeri. MOVWF T1CON CLRF PWMLIPUT ; Ja alustetaan PWM näytteenottoa ohjaava lippurekisteri. INCF PWMLIPUT INCF PWMLIPUT INCF PWMLIPUT INCF PWMLIPUT INCF PWMLIPUT INCF PWMLIPUT MOVLW B'00000100' ; Capture mode falling edge MOVWF CCP1CON bcf PIR1, T0IF ; Reset flag that indicates interrupt bcf PIR1, TMR1IF ; Resetoidaan timer1 yli pyörähtämisestä kertova lippubitti. movf status_temp,w ; retrieve copy of STATUS register movwf STATUS ; restore pre-isr STATUS register contents swapf w_temp,f swapf w_temp,w ; restore pre-isr W register contents retfie ; return from interrupt ;************************************************************** ;*********************************Aliohjelma LCD-näytön ohjaustaulukko***************** ;Lisätään ohjelmalaskurin (PCL) arvoa w-rekisterin arvolla. Jolloinka hypätään johonkin ;retlw *x** kohtaan. Jossa ladataan taas w-rekisteriin siinä kohtaa oleva arvo. ;Ja jonka jälkeen palataan takaisin tästä aliohjelmasta. ;********************************************************************************************** TAULUKKO_SEG addwf PCL,f retlw A'0' ;Nro. 0 LCD-näyttöön. retlw A'9' ;Nro. 9 LCD-näyttöön. retlw A'8' ;Nro. 8 LCD-näyttöön. retlw A'7' ;Nro. 7 LCD-näyttöön. retlw A'6' ;Nro. 6 LCD-näyttöön. retlw A'5' ;Nro. 5 LCD-näyttöön. retlw A'4' ;Nro. 4 LCD-näyttöön. retlw A'3' ;Nro. 3 LCD-näyttöön. retlw A'2' ;Nro. 2 LCD-näyttöön. retlw A'1' ;Nro. 1 LCD-näyttöön. retlw A'0' ;Nro. 0 LCD-näyttöön. ;************************************************************** ;Porttien suuntien määrittely. PORTIT BANKSEL TRISA ;Pankin valinta siihen missä on TRISA suuntarekisteri. movlw b'00001000' ;siirrä w rekisteriin '00001000'. Vain RB3 sisääntuloksi, koska siihen tulee PWM sisääntulo. movwf TRISB ; movlw b'11111111' ;siirrä w rekisteriin '11111111'. movwf TRISA ;porta = inputput kaikki pinnit. BANKSEL PORTA goto MAIN ;**************************************************************** ;Alustukset, joita tarvitaan ohjelman alussa. ALUSTUS ;Alustetaan keskeytystulo ja timeri. BANKSEL TRISB BSF TRISB,3 ; CCP1 is an input. BANKSEL PIE1 BSF PIE1, CCP1IE ; Enable interrupts from CCP1 BSF PIE1, TMR1IE ; Hyväksytään keskeytys kun TMR1 pyörähtää ympäri. BANKSEL PORTA CLRF STATUS ; Back to BANK 0 MOVLW B'00000000' ; Enable Timer 1 1:1 Prescale MOVWF T1CON MOVLW B'00000100' ; Capture mode fallin edge MOVWF CCP1CON BSF INTCON, PEIE ; Enable Peripheral Interrupts BSF INTCON, T0IE ; Enable Timer 0 to interrupt BCF INTCON, T0IF ; Reset flag that indicates interrupt ;BSF INTCON, GIE ; Enable interrupts BCF INTCON, GIE ; Disable interrupts CLRF PWMLIPUT CLRF RESOAUTO ; Tämän rekisterin sisältö kertoo timerin pyörintänopeuden, joka on 1:1 tällä asetuksella. ;LCD-näytön ohjauksen alustus. clrf AYKKOSET ;Näytön ohjauksessa käytettävien apurekistereiden nollaus. clrf AKYMMENET ; -||- clrf ASADAT ; -||- clrf ATUHANNET ; -||- clrf YLIVUOTO ;Nollataan YLIVUOTO rekisteri myös varmuuden vuoksi. movlw A' ' ;Ladataan w rekisteriin tyhjä merkki. movwf ETUMERKKIG ;Ladataan w rekisteri ETUMERKKIG rekisteriin. movlw A' ' ;Ladataan w rekisteriin tyhjä merkki. movwf ETUMERKKIC ;Ladataan w rekisteri ETUMERKKIC rekisteriin. movlw A'-' ;Ladataan w rekisteriin -. movwf YKKOSETC ;Ladataan w rekisteri VIIVE1 rekisteriin. movlw A'-' ;Ladataan w rekisteriin -. movwf KYMMENETC ;Ladataan w rekisteri KYMMENET rekisteriin. movlw A'-' ;Ladataan w rekisteriin -. movwf SADATC ;Ladataan w rekisteri SADAT rekisteriin. movlw A'-' ;Ladataan w rekisteriin -. movwf TUHANNETC ;Ladataan w rekisteri TUHANNET rekisteriin. movlw A'-' ;Ladataan w rekisteriin -. movwf YKKOSETPWM ;Ladataan w rekisteri VIIVE1 rekisteriin. movlw A'-' ;Ladataan w rekisteriin -. movwf KYMMENETPWM ;Ladataan w rekisteri KYMMENET rekisteriin. movlw A'-' ;Ladataan w rekisteriin -. movwf SADATPWM ;Ladataan w rekisteri SADAT rekisteriin. movlw A'-' ;Ladataan w rekisteriin -. movwf TUHANNETPWM ;Ladataan w rekisteri TUHANNET rekisteriin. movlw A'-' ;Ladataan w rekisteriin -. movwf YKKOSETG ;Ladataan w rekisteri VIIVE1 rekisteriin. movlw A'-' ;Ladataan w rekisteriin -. movwf KYMMENETG ;Ladataan w rekisteri KYMMENET rekisteriin. movlw A'-' ;Ladataan w rekisteriin -. movwf SADATG ;Ladataan w rekisteri SADAT rekisteriin. movlw A'-' ;Ladataan w rekisteriin -. movwf TUHANNETG ;Ladataan w rekisteri TUHANNET rekisteriin. movlw 0xA ;Ladataan w rekisteriin luku 10 hexana A.NAYTON_OHJAUS aliohjelmaa varten. movwf AYKKOSET ;Ladataan arvo AYKKOSET rekisteriin. movlw 0xA ;Ladataan w rekisteriin luku 10 hexana A.NAYTON_OHJAUS aliohjelmaa varten. movwf AKYMMENET ;Ladataan arvo AKYMMENET rekisteriin. movlw 0xA ;Ladataan w rekisteriin luku 10 hexana A.NAYTON_OHJAUS aliohjelmaa varten. movwf ASADAT ;Ladataan arvo ASADAT rekisteriin. movlw 0xA ;Ladataan w rekisteriin luku 10 hexana A.NAYTON_OHJAUS aliohjelmaa varten. movwf ATUHANNET ;Ladataan arvo ATUHANNET rekisteriin. movlw 0xA ;Ladataan w rekisteriin luku 10 hexana A. movwf JAKAJA ;Ladataan arvo JAKAJA rekisteriin. movlw 0xA ;Ladataan w rekisteriin luku 10 hexana A.NAYTON_OHJAUS aliohjelmaa varten. movwf ATIMER ;Ladataan arvo ATIMER rekisteriin. movlw A'0' ;Ladataan w rekisteriin 0. movwf TIMER ;Ladataan w rekisteri TIMER rekisteriin. clrf PORTB call ALUSTETAANLCD RETURN ;********************************************************** ;Laskennan aliohjelmia. ;Nämä koodit löytyy täältä: http://www.piclist.com/techref/microchip/math/frtomath32.asm . Tuota koodia on sitten muokattu tähän ohjelmaan paremmin sopivaksi. ;--------------------------------------------------------------- ;Tätä aliohjelmarutiinia käytetään pluslaskussa yksistään. ;Ja kun lisääjä operand_x rekistereissä ei mahdu enää accumulator_x rekistereihin. ;Niin LASKENTALIPUT rekisterin LV_YLI bitti menee ykköseksi. add32 movf operand_1,w ;get low part of addwf accumulator_1 ;into w and add to accumulator btfsc STATUS,C ;was there a carry? call accumulator_ripple_2 ;if so, do ripple carry movf operand_2,w ;get next part of addwf accumulator_2 ;into w and add to accumulator btfsc STATUS,C ;was there a carry? call accumulator_ripple_3 ;if so, do ripple carry movf operand_3,w ;get next part of addwf accumulator_3 ;into w and add to accumulator btfsc STATUS,C ;was there a carry? call accumulator_ripple_4 ;if so, do ripple carry movf operand_4,w ;get next part of addwf accumulator_4 ;into w and add to accumulator btfsc STATUS,C ;Kun pluslaskussa lisäysrekistereihin accumulator_x eimahdu enää uutta lukemaa. bsf LASKENTALIPUT,LV_YLI ;Niin tämä LASKENTALIPUT rekisterin LV_YLI lippu menee ykköseksi. return ;************************************************************ ;Tätä käytetään miinuslaskussa neg32 aliohjelman kanssa. ;Ja kun vähentäjä operand_x rekistereissä on suurempi kuin ;vähennettävä accumulator_x rekistreissä. Niin LASKENTALIPUT ;rekisterin LV_YLI bitti menee ykköseksi. neg32add32 movf operand_1,w ;get low part of addwf accumulator_1 ;into w and add to accumulator btfsc STATUS,C ;was there a carry? call accumulator_ripple_2 ;if so, do ripple carry movf operand_2,w ;get next part of addwf accumulator_2 ;into w and add to accumulator btfsc STATUS,C ;was there a carry? call accumulator_ripple_3 ;if so, do ripple carry movf operand_3,w ;get next part of addwf accumulator_3 ;into w and add to accumulator btfsc STATUS,C ;was there a carry? call accumulator_ripple_4 ;if so, do ripple carry movf operand_4,w ;get next part of addwf accumulator_4 ;into w and add to accumulator btfss STATUS,C ;Ja kun vähennysrekistereistä accumulator_x ei pysty enää vähentämään. bsf LASKENTALIPUT,LV_YLI ;Niin rekisterin LASKENTALIPUT bitti LV_YLI menee ykköseksi. return ;***************************************************************** ;Tämä aliohjelma toimii lainaajana yhdessä neg32add32 ja add32 ohjelma rutiinien kanssa lainaten accumulator_x rekistereiden ;sisältöä kun pitää lainata toisesta accumulator_x rekisteristä. accumulator_ripple_2 ;do ripple carry incf accumulator_2 ;via increment btfss STATUS,Z ;if result is NOT zero return ;then ripple carry is done. accumulator_ripple_3 ;otherwise ripply carry next... incf accumulator_3 btfss STATUS,Z return ;on non-zero result we are done. accumulator_ripple_4 ;otherwise do last ripple carry... incf accumulator_4 btfsc STATUS,Z bsf LASKENTALIPUT, LV_YLI ; Set _mflag_overflow if accumulator_4 return ;wrapped around to zero because of ;increment. This reports overflow ; +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ;Tällä aliohjella otetaan käänteisluku vähentäjä operand_x rekistereistä, kun ;Halutaan vähentää. Tämä aliohjelma pitääkin ajaa ensin vähentämistä, muuten kyseessä on pelkkä lisäys. neg32 ;make twos complement of operand comf operand_1,f ;ones complement of operand: comf operand_2,f ;4 bytes to get 32 bits... comf operand_3,f comf operand_4,f incf operand_1 ;twos complement of operand btfss STATUS,Z ;If result is 0 we need ripple carry return ;return if no more carries needed incf operand_2 ;perform carry by incrementing btfss STATUS,Z ;If result is 0 we need ripple carry return ;return if no more carries needed incf operand_3 ;perform carry by incrementing btfss STATUS,Z ;If result is 0 we need ripple carry return ;return if no more carries needed incf operand_4 ;perform carry by incrementing ;Ignore any carry out from MSB return ;All 4 bytes ripple carried, ;so return. ;********************************************************************************************** ;Tätä aliohjelmarutiinia käytetään pluslaskussa yksistään. ;Ja kun lisääjä operand_x rekistereissä ei mahdu enää accumulator_x rekistereihin. ;Niin LASKENTALIPUT rekisterin LV_YLI bitti menee ykköseksi. add32t movf operand_1t,w ;get low part of addwf accumulator_1t ;into w and add to accumulator btfsc STATUS,C ;was there a carry? call accumulator_ripple_2t ;if so, do ripple carry movf operand_2t,w ;get next part of addwf accumulator_2t ;into w and add to accumulator btfsc STATUS,C ;was there a carry? call accumulator_ripple_3t ;if so, do ripple carry movf operand_3t,w ;get next part of addwf accumulator_3t ;into w and add to accumulator btfsc STATUS,C ;was there a carry? call accumulator_ripple_4t ;if so, do ripple carry movf operand_4t,w ;get next part of addwf accumulator_4t ;into w and add to accumulator btfsc STATUS,C ;Kun pluslaskussa lisäysrekistereihin accumulator_x eimahdu enää uutta lukemaa. bsf LASKENTALIPUT,LV_YLI ;Niin tämä LASKENTALIPUT rekisterin LV_YLI lippu menee ykköseksi. return ;************************************************************ ;Tätä käytetään miinuslaskussa neg32 aliohjelman kanssa. ;Ja kun vähentäjä operand_x rekistereissä on suurempi kuin ;vähennettävä accumulator_x rekistreissä. Niin LASKENTALIPUT ;rekisterin LV_YLI bitti menee ykköseksi. neg32add32t movf operand_1t,w ;get low part of addwf accumulator_1t ;into w and add to accumulator btfsc STATUS,C ;was there a carry? call accumulator_ripple_2t ;if so, do ripple carry movf operand_2t,w ;get next part of addwf accumulator_2t ;into w and add to accumulator btfsc STATUS,C ;was there a carry? call accumulator_ripple_3t ;if so, do ripple carry movf operand_3t,w ;get next part of addwf accumulator_3t ;into w and add to accumulator btfsc STATUS,C ;was there a carry? call accumulator_ripple_4t ;if so, do ripple carry movf operand_4t,w ;get next part of addwf accumulator_4t ;into w and add to accumulator btfss STATUS,C ;Ja kun vähennysrekistereistä accumulator_x ei pysty enää vähentämään. bsf LASKENTALIPUT,LV_YLI ;Niin rekisterin LASKENTALIPUT bitti LV_YLI menee ykköseksi. return ;***************************************************************** ;Tämä aliohjelma toimii lainaajana yhdessä neg32add32 ja add32 ohjelma rutiinien kanssa lainaten accumulator_x rekistereiden ;sisältöä kun pitää lainata toisesta accumulator_x rekisteristä. accumulator_ripple_2t ;do ripple carry incf accumulator_2t ;via increment btfss STATUS,Z ;if result is NOT zero return ;then ripple carry is done. accumulator_ripple_3t ;otherwise ripply carry next... incf accumulator_3t btfss STATUS,Z return ;on non-zero result we are done. accumulator_ripple_4t ;otherwise do last ripple carry... incf accumulator_4t btfsc STATUS,Z bsf LASKENTALIPUT, LV_YLI ; Set _mflag_overflow if accumulator_4 return ;wrapped around to zero because of ;increment. This reports overflow ; +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ;Tällä aliohjella otetaan käänteisluku vähentäjä operand_x rekistereistä, kun ;Halutaan vähentää. Tämä aliohjelma pitääkin ajaa ensin vähentämistä, muuten kyseessä on pelkkä lisäys. neg32t ;make twos complement of operand comf operand_1t,f ;ones complement of operand: comf operand_2t,f ;4 bytes to get 32 bits... comf operand_3t,f comf operand_4t,f incf operand_1t ;twos complement of operand btfss STATUS,Z ;If result is 0 we need ripple carry return ;return if no more carries needed incf operand_2t ;perform carry by incrementing btfss STATUS,Z ;If result is 0 we need ripple carry return ;return if no more carries needed incf operand_3t ;perform carry by incrementing btfss STATUS,Z ;If result is 0 we need ripple carry return ;return if no more carries needed incf operand_4t ;perform carry by incrementing ;Ignore any carry out from MSB return ;All 4 bytes ripple carried, ;so return. ;********************************************************************************************** ;Muokataan PWM-näyte siihen kuntoon, että siittä voidaan laskea PWM-suhde. PWM_NAYTTEEN_MUOKKAUS ;Yhteen ja vähennyslaskun rekisterit clrf operand_1 clrf operand_2 clrf operand_3 clrf operand_4 clrf accumulator_1 clrf accumulator_2 clrf accumulator_3 clrf accumulator_4 ;Alkupätkä vähentäjäksi. movf PWMALKUL,w movwf operand_1 movf PWMALKUH,w movwf operand_2 ;PWM T1 arvo vähennys rekisteriin. movf PWMT1L,w movwf accumulator_1 movf PWMT1H,w movwf accumulator_2 ;Tehdään vähennys. call neg32 ;Muunnetaan vähentäjä call neg32add32 clrf LASKENTALIPUT ;Siirretään saatu tulos nyt operand_1 ja operand_2 rekisterihin kertomista varten. movf accumulator_1,w movwf operand_1 movf accumulator_2,w movwf operand_2 clrf operand_3 clrf operand_4 clrf accumulator_1 clrf accumulator_2 clrf accumulator_3 clrf accumulator_4 ;Suoritetaan kertominen 10000. MOVLW 0x63 MOVWF KERROIN1 MOVLW 0x64 MOVWF KERROIN2 clrf LASKENTALIPUT KERROTAAN btfss LASKENTALIPUT,LV_YLI call add32 ;Jos LV_YLI bitti menee ykköseksi, niin accumulator_x rekisterit on täynnä. decfsz KERROIN1,f goto KERROTAAN MOVLW 0x64 MOVWF KERROIN1 decfsz KERROIN2,f goto KERROTAAN ;Siirretään vähennyksen ja kertolaskun jälkeen saatu tulos takaisin PWMTT1L, H, HH ja HHH rekisterihin. movf accumulator_1,w movwf PWMT1L movf accumulator_2,w movwf PWMT1H movf accumulator_3,w movwf PWMT1HH movf accumulator_4,w movwf PWMT1HHH ;Vähennetään alkupätkä myös T2 ajasta. clrf operand_1 clrf operand_2 clrf operand_3 clrf operand_4 clrf accumulator_1 clrf accumulator_2 clrf accumulator_3 clrf accumulator_4 ;Alkupätkä vähentäjäksi. movf PWMALKUL,w movwf operand_1 movf PWMALKUH,w movwf operand_2 ;PWM T2 arvo vähennys rekisteriin. movf PWMT2L,w movwf accumulator_1 movf PWMT2H,w movwf accumulator_2 ;Tehdään vähennys. call neg32 ;Muunnetaan vähentäjä call neg32add32 clrf LASKENTALIPUT ;Siirretään alkupätkällä vähennetty arvo muistiin T2 rekistereihin. movf accumulator_1,w movwf PWMT2L movf accumulator_2,w movwf PWMT2H movf accumulator_3,w movwf PWMT2HH movf accumulator_4,w movwf PWMT2HHH ;Kaikki on nyt valmista jakolaskua varten. return ;********************************************************** ;Itse jakolasku aliohjelma, jossa jaetaan rekistereiden accumulator_1, 2,3 ja 4 lukema. ;Rekistereiden operand_1, 2,3 ja 4 lukemalla. PWMSUHDE clrf LASKENTALIPUT clrf operand_1 clrf operand_2 clrf operand_3 clrf operand_4 clrf accumulator_1 clrf accumulator_2 clrf accumulator_3 clrf accumulator_4 clrf operand_1t clrf operand_2t clrf operand_3t clrf operand_4t incf operand_1t clrf accumulator_1t clrf accumulator_2t clrf accumulator_3t clrf accumulator_4t clrf TULOS ;Siirretään T1 vähennettävään rekisteriin. movf PWMT1L,w movwf accumulator_1 movf PWMT1H,w movwf accumulator_2 movf PWMT1HH,w movwf accumulator_3 movf PWMT1HHH,w movwf accumulator_4 ;Siirretään T2 vähentäjä rekisteriin. movf PWMT2L,w movwf operand_1 movf PWMT2H,w movwf operand_2 movf PWMT2HH,w movwf operand_3 movf PWMT2HHH,w movwf operand_4 call neg32 ;Muunnetaan vähentäjä goto YLIEKAVAHENNYSPWM VAHENNYSTA decfsz JAKAJA,f goto OHIPWM ;Koska JAKAJA rekisteri ei mennyt nollaan, niin ei listä näytön lukemaa vaan hypätään siittä ohi. ;Kun JAKAJA rekisteri menee nollaa, niin lisätään näytön lukema +1. Ja alustetaan JAKAJA rekisteri uudestaan. call NAYTTO_OHJAUS_ETUNPERIN movlw 0xA ;Ladataan w rekisteriin luku 10 hexana A. movwf JAKAJA ;Ladataan arvo JAKAJA rekisteriin. OHIPWM call add32t YLIEKAVAHENNYSPWM btfss LASKENTALIPUT, LV_YLI call neg32add32 btfss LASKENTALIPUT, LV_YLI goto VAHENNYSTA ;Tallennetaan valmis PWM, jotta siittä voidaan laskea vielä lämpötila ja kiihtyvyys. movf accumulator_1t,w movwf VALMISPWML movf accumulator_2t,w movwf VALMISPWMH movf accumulator_3t,w movwf VALMISPWMHH movf accumulator_4t,w movwf VALMISPWMHHH return ;******************************************************************** ;Tässä lasketaan asteet PWM-suhteesta. ASTEET clrf LASKENTALIPUT clrf operand_1 clrf operand_2 clrf operand_3 clrf operand_4 clrf accumulator_1 clrf accumulator_2 clrf accumulator_3 clrf accumulator_4 clrf operand_1t clrf operand_2t clrf operand_3t clrf operand_4t clrf accumulator_1t clrf accumulator_2t clrf accumulator_3t clrf accumulator_4t ;Siirretään PWM suhde VALMISPWMX rekistereistä operand_x ja accumulator_xt rekistereihin. ;Jos käy niin, että asteet onkin miinuksia jos PWM-suhde oli pienempi kuin 3200. ;Niin miinusasteet saadaan vähentämällä ;saatu PWM suhde 3200, koska se on sen alle ja lämpöasteet miinusmerkkisiä. ;Lopuksi jaetaan tämä tulos 47. movf VALMISPWML,w movwf operand_1 movwf accumulator_1t movf VALMISPWMH,w movwf operand_2 movwf accumulator_2t movf VALMISPWMHH,w movwf operand_3 movwf accumulator_3t movf VALMISPWMHHH,w movwf operand_4 movwf accumulator_4t ;Luku 3200. movlw 0x80 ;Desimaaleina 128 -> hex 80 movwf operand_1t movwf accumulator_1 movlw 0xC ;Desimaaleina 12 -> hex C movwf operand_2t movwf accumulator_2 clrf LASKENTALIPUT call neg32t ;Muunnetaan vähentäjä call neg32add32t ;Suoritetaan vähennys. btfss LASKENTALIPUT, LV_YLI ;Tarkastetaan oliko vähentäjä isompi. goto EIISOMPIPLUSC ;Ei ollut isompi. ;Jos oli niin kyseessä on miinus asteet ja nyt täytyy sitten vähentää PWM-suhde 3200. clrf LASKENTALIPUT call neg32 ;Muunnetaan vähentäjä call neg32add32 ;Suoritetaan vähennys. btfss LASKENTALIPUT, LV_YLI ;Tarkastetaan oliko vähentäjä isompi. goto EIISOMPIMIINUSC ;Ei ollut isompi. goto JOTAINMENIPIELEENC EIISOMPIPLUSC movlw A'+' ;Ladataan w rekisteriin + merkki, koska lukemaa kasvatetaan. movwf ETUMERKKIC ;Ladataan w rekisteri ETUMERKKIC rekisteriin. clrf LASKENTALIPUT clrf operand_1t clrf operand_2t clrf operand_3t clrf operand_4t movlw 0x2F ;Desimaaleina 47 -> hex 2F movwf operand_1t call neg32t goto YLIEKAVAHENNYSC EIISOMPIPLUSLOOPC call NAYTTO_OHJAUS_ETUNPERIN YLIEKAVAHENNYSC btfss LASKENTALIPUT, LV_YLI call neg32add32t btfss LASKENTALIPUT, LV_YLI goto EIISOMPIPLUSLOOPC return ;****************************** EIISOMPIMIINUSC movlw A'-' ;Ladataan w rekisteriin - merkki, koska lukemaa kasvatetaan. movwf ETUMERKKIC ;Ladataan w rekisteri ETUMERKKIC rekisteriin. clrf LASKENTALIPUT clrf operand_1 clrf operand_2 clrf operand_3 clrf operand_4 movlw 0x2F ;Desimaaleina 47 -> hex 2F movwf operand_1 call neg32 goto YLIEKAVAHENNYSCM EIISOMPIMIINUSLOOPC call NAYTTO_OHJAUS_ETUNPERIN YLIEKAVAHENNYSCM btfss LASKENTALIPUT, LV_YLI call neg32add32 btfss LASKENTALIPUT, LV_YLI goto EIISOMPIMIINUSLOOPC return JOTAINMENIPIELEENC return ;********************************************************** ;Tässä lasketaan kiihtyvyys PWM-suhteesta. KIIHTYVYYS clrf LASKENTALIPUT clrf operand_1 clrf operand_2 clrf operand_3 clrf operand_4 clrf accumulator_1 clrf accumulator_2 clrf accumulator_3 clrf accumulator_4 clrf operand_1t clrf operand_2t clrf operand_3t clrf operand_4t clrf accumulator_1t clrf accumulator_2t clrf accumulator_3t clrf accumulator_4t ;Siirretään PWM suhde VALMISPWMX rekistereistä operand_x ja accumulator_xt rekistereihin. ;Jos käy niin, että kiihtyvyys onkin miinuks merkkistä eli PWM-suhde oli pienempi kuin 5000. ;Niin miinus merkkinen kiihtyvyys saadaan vähentämällä ;saatu PWM suhteesta 5000, koska se on sen alle ja kiihtyvyys miinusmerkkisiä. ;Lopuksi jaetaan tämä tulos 125, niin saadaan kiihtyvyys. movf VALMISPWML,w movwf operand_1 movwf accumulator_1t movf VALMISPWMH,w movwf operand_2 movwf accumulator_2t movf VALMISPWMHH,w movwf operand_3 movwf accumulator_3t movf VALMISPWMHHH,w movwf operand_4 movwf accumulator_4t ;Luku 5000. movlw 0x88 ;Desimaaleina 136 -> hex 88 movwf operand_1t movwf accumulator_1 movlw 0x13 ;Desimaaleina 19 -> hex 13 movwf operand_2t movwf accumulator_2 clrf LASKENTALIPUT call neg32t ;Muunnetaan vähentäjä call neg32add32t ;Suoritetaan vähennys. btfss LASKENTALIPUT, LV_YLI ;Tarkastetaan oliko vähentäjä isompi. goto EIISOMPIPLUSG ;Ei ollut isompi. ;Jos oli niin kyseessä on miinus asteet ja nyt täytyy sitten vähentää PWM-suhde 3200. clrf LASKENTALIPUT call neg32 ;Muunnetaan vähentäjä call neg32add32 ;Suoritetaan vähennys. btfss LASKENTALIPUT, LV_YLI ;Tarkastetaan oliko vähentäjä isompi. goto EIISOMPIMIINUSG ;Ei ollut isompi. goto JOTAINMENIPIELEENG EIISOMPIPLUSG movlw A'+' ;Ladataan w rekisteriin + merkki, koska lukemaa kasvatetaan. movwf ETUMERKKIG ;Ladataan w rekisteri ETUMERKKIG rekisteriin. clrf LASKENTALIPUT clrf operand_1t clrf operand_2t clrf operand_3t clrf operand_4t movlw 0x7D ;Desimaaleina 125 -> hex 7D movwf operand_1t call neg32t goto YLIEKAVAHENNYSG EIISOMPIPLUSLOOPG call NAYTTO_OHJAUS_ETUNPERIN YLIEKAVAHENNYSG btfss LASKENTALIPUT, LV_YLI call neg32add32t btfss LASKENTALIPUT, LV_YLI goto EIISOMPIPLUSLOOPG return ;****************************** EIISOMPIMIINUSG movlw A'-' ;Ladataan w rekisteriin - merkki, koska lukemaa kasvatetaan. movwf ETUMERKKIG ;Ladataan w rekisteri ETUMERKKIG rekisteriin. clrf LASKENTALIPUT clrf operand_1 clrf operand_2 clrf operand_3 clrf operand_4 movlw 0x7D ;Desimaaleina 125 -> hex 7D movwf operand_1 call neg32 goto YLIEKAVAHENNYSGM EIISOMPIMIINUSLOOPG call NAYTTO_OHJAUS_ETUNPERIN YLIEKAVAHENNYSGM btfss LASKENTALIPUT, LV_YLI call neg32add32 btfss LASKENTALIPUT, LV_YLI goto EIISOMPIMIINUSLOOPG return JOTAINMENIPIELEENG return ;******************************************************************** ;************************LCD-NÄYTÖN ALIOHJELMAT*********************** ;**************LCD-näytön alustukset, ohjaus yms aliohjelmat*********** ;******************************************************************** ;Viiveet mitä tarvitaan LCD-moduulin ohjauksessa. KYMMENENMS ;9993 cycles movlw 0xCE movwf d1 movlw 0x08 movwf d2 KYMMENENMS_0 decfsz d1, f goto $+2 decfsz d2, f goto KYMMENENMS_0 ;3 cycles goto $+1 nop ;4 cycles (including call) return ;********************************************************************** SATAUS ;94 cycles movlw 0x1F movwf d1 SATAUS_0 decfsz d1, f goto SATAUS_0 ;2 cycles goto $+1 ;4 cycles (including call) return ;************************************************************************* SEKUNTTI5 ;4999993 cycles movlw 0x2C movwf d1 movlw 0xE7 movwf d2 movlw 0x0B movwf d3 SEKUNTTI5_0 decfsz d1, f goto $+2 decfsz d2, f goto $+2 decfsz d3, f goto SEKUNTTI5_0 ;3 cycles goto $+1 nop ;4 cycles (including call) return ;****************************************************************************** LCDVARATTU clrf PORTB bsf STATUS,RP0 ;-> BANK 1 ;porttien bitit movlw b'11111000' ;Muutetaan B-portin bittejä pollausta varten. movwf TRISB ; bcf STATUS,RP0 ;-> BANK 0 bcf STATUS,RP1 ;-> BANK 0 clrf ohjaustavu nop nop nop nop nop bsf ohjaustavu, RW ;Aseta bitti RW. movf ohjaustavu,W ;Ohjaustavu rekisteri w-rekisteriin. movwf PORTB ;Ladataan w-rekisteri B-porttiin. POLLAUS nop nop nop nop nop ;Ylimmät neljä bittiä joissa on tuo BF-lippu. bsf ohjaustavu, E ;Aseta bitti E. movf ohjaustavu,W ;Ohjaustavu rekisteri w-rekisteriin. movwf PORTB ;Ladataan w-rekisteri B-porttiin. nop nop nop nop nop btfss PORTB,7 ;Tarkastetaan onko bitti 7 nolla, jos ei ole niin hypätään seuraavn käskyn yli. goto MENINOLLAAN ;Hyppy kohtaan MENINOLLAAN. bcf ohjaustavu, E ;Nollaa bitti E. movf ohjaustavu,W ;Ohjaustavu rekisteri w-rekisteriin. movwf PORTB ;Ladataan w-rekisteri B-porttiin. ;Alimmant bititkin täytyy lukea, kunnes voidaan siirtyä lukemaan uudestaan ylimmät biti joissa on se BF-lippu. nop nop nop nop nop bsf ohjaustavu, E ;Aseta bitti E. movf ohjaustavu,W ;Ohjaustavu rekisteri w-rekisteriin. movwf PORTB ;Ladataan w-rekisteri B-porttiin. nop nop nop nop nop bcf ohjaustavu, E ;Nollaa bitti E. movf ohjaustavu,W ;Ohjaustavu rekisteri w-rekisteriin. movwf PORTB ;Ladataan w-rekisteri B-porttiin. nop nop nop nop nop goto POLLAUS bcf ohjaustavu, RW ;Aseta bitti RW. movf ohjaustavu,W ;Ohjaustavu rekisteri w-rekisteriin. movwf PORTB ;Ladataan w-rekisteri B-porttiin. goto POLLAUS MENINOLLAAN bcf ohjaustavu, E ;Nollaa bitti E. movf ohjaustavu,W ;Ohjaustavu rekisteri w-rekisteriin. movwf PORTB ;Ladataan w-rekisteri B-porttiin. nop nop nop nop nop bcf ohjaustavu, RW ;Aseta bitti RW. movf ohjaustavu,W ;Ohjaustavu rekisteri w-rekisteriin. movwf PORTB ;Ladataan w-rekisteri B-porttiin. bsf STATUS,RP0 ;-> BANK 1 ;porttien bitit movlw b'00001000' ;. movwf TRISB ; bcf STATUS,RP0 ;-> BANK 0 bcf STATUS,RP1 ;-> BANK 0 CALL SATAUS ;Kutsutaan lyhyt viive. clrf ohjaustavu clrf PORTB return ;******************************************************************************************* LCDKIRJOITUS movwf tavu movwf tavuvarasto swapf tavuvarasto ;Nollataan alimmat bitit pois, koska niissä sijaitsee B-portin kautta välitettävä LCD-modulin ohjausdata. bcf tavu,0 bcf tavu,1 bcf tavu,2 bcf tavu,3 bcf tavuvarasto,0 bcf tavuvarasto,1 bcf tavuvarasto,2 bcf tavuvarasto,3 ;Seuraavaksi ladataan merkki 4 bittisenä sisään LCD-moduliin. ;Aloitetaan ylimmistä 4 bitistä. bsf ohjaustavu, RS ;Aseta bitti RS. bsf tavu, RS ;Aseta bitti RS myös tavu rekisterissä, koska muuten tavu rekisteri pyyhkii LCD-modulin ohjaustiedot pois B-portista. bsf tavuvarasto, RS ;Aseta bitti RS myös tavuvarasto rekisterissä, koska muuten tavu rekisteri pyyhkii LCD-modulin ohjaustiedot pois B-portista kun kirjoitetaan neljä alinta bittiä. movf ohjaustavu,W ;Ohjaustavu rekisteri w-rekisteriin. movwf PORTB ;Ladataan w-rekisteri B-porttiin. bsf ohjaustavu, E ;Aseta bitti E. bsf tavu, E ;Aseta bitti E myös tavu rekisterissä, koska muuten tavu rekisteri pyyhkii LCD-modulin ohjaustiedot pois B-portista kun se siirretään B-porttiin. movf ohjaustavu,W ;Ohjaustavu rekisteri w-rekisteriin. movwf PORTB ;Ladataan w-rekisteri B-porttiin. movf tavu,W ;Tavu rekisteri w-rekisteriin. movwf PORTB ;Ladataan w-rekisteri B-porttiin. CALL SATAUS ;Kutsutaan lyhyt viive. bcf ohjaustavu, E ;Nollaa bitti E. bcf tavu, E ;Nollaa bitti E myös tavu rekisterissä, koska muuten tavu rekisteri pyyhkii LCD-modulin ohjaustiedot pois B-portista. movf tavu,W ;Tavu rekisteri w-rekisteriin. Näin siksi, että itse data ei pyyhkiytyisi pois B-portista jos E-bitti nollattaisi ohjaustavu rekisterillä. movwf PORTB ;Ladataan w-rekisteri B-porttiin. CALL SATAUS ;Kutsutaan lyhyt viive. ;Sitten alimmat neljä bittiä. bsf ohjaustavu, E ;Aseta bitti E. bsf tavuvarasto, E ;Aseta bitti E myös tavu rekisterissä, koska muuten tavu rekisteri pyyhkii LCD-modulin ohjaustiedot pois B-portista. movf ohjaustavu,W ;Ohjaustavu rekisteri w-rekisteriin. movwf PORTB ;Ladataan w-rekisteri B-porttiin. movf tavuvarasto,W ;Tavu rekisteri w-rekisteriin. movwf PORTB ;Ladataan w-rekisteri B-porttiin. CALL SATAUS ;Kutsutaan lyhyt viive. bcf ohjaustavu, E ;Nollaa bitti E. bcf tavuvarasto, E ;Nollaa bitti E myös tavu rekisterissä, koska muuten tavu rekisteri pyyhkii LCD-modulin ohjaustiedot pois B-portista. movf tavuvarasto,W ;Tavuvarasto rekisteri w-rekisteriin. Näin siksi, että itse data ei pyyhkiytyisi pois B-portista jos E-bitti nollattaisi ohjaustavu rekisterillä. movwf PORTB ;Ladataan w-rekisteri B-porttiin. bcf ohjaustavu, RS ;Aseta bitti RS. bcf tavuvarasto,RS ;Aseta bitti RS myös tavu rekisterissä, koska muuten tavu rekisteri pyyhkii LCD-modulin ohjaustiedot pois B-portista. movf ohjaustavu,W ;Ohjaustavu rekisteri w-rekisteriin. movwf PORTB ;Ladataan w-rekisteri B-porttiin. clrf tavu clrf tavuvarasto clrf ohjaustavu clrf PORTB return ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;Tämä aliohjelma laittaa 8 bittiset alustuskomennot sisään 4 bitin paloissa aloittaen 4 ylimmästä bitistä. LCDALUSTUS movwf tavu movwf tavuvarasto swapf tavuvarasto ;Nollataan alimmat bitit pois, koska niissä sijaitsee B-portin kautta välitettävä LCD-modulin ohjausdata. bcf tavu,0 bcf tavu,1 bcf tavu,2 bcf tavu,3 bcf tavuvarasto,0 bcf tavuvarasto,1 bcf tavuvarasto,2 bcf tavuvarasto,3 ;Seuraavaksi ladataan merkki 4 bittisenä sisään LCD-moduliin. ;Aloitetaan ylimmistä 4 bitistä. bsf ohjaustavu, E ;Aseta bitti E. bsf tavu, E ;Aseta bitti E myös tavu rekisterissä, koska muuten tavu rekisteri pyyhkii LCD-modulin ohjaustiedot pois B-portista kun se siirretään B-porttiin. movf ohjaustavu,W ;Ohjaustavu rekisteri w-rekisteriin. movwf PORTB ;Ladataan w-rekisteri B-porttiin. movf tavu,W ;Tavu rekisteri w-rekisteriin. movwf PORTB ;Ladataan w-rekisteri B-porttiin. CALL SATAUS ;Kutsutaan lyhyt viive. bcf ohjaustavu, E ;Nollaa bitti E. bcf tavu, E ;Nollaa bitti E myös tavu rekisterissä, koska muuten tavu rekisteri pyyhkii LCD-modulin ohjaustiedot pois B-portista. movf tavu,W ;Tavu rekisteri w-rekisteriin. Näin siksi, että itse data ei pyyhkiytyisi pois B-portista jos E-bitti nollattaisi ohjaustavu rekisterillä. movwf PORTB ;Ladataan w-rekisteri B-porttiin. CALL SATAUS ;Kutsutaan lyhyt viive. ;Sitten alimmat neljä bittiä. bsf ohjaustavu, E ;Aseta bitti E. bsf tavuvarasto, E ;Aseta bitti E myös tavu rekisterissä, koska muuten tavu rekisteri pyyhkii LCD-modulin ohjaustiedot pois B-portista. movf ohjaustavu,W ;Ohjaustavu rekisteri w-rekisteriin. movwf PORTB ;Ladataan w-rekisteri B-porttiin. movf tavuvarasto,W ;Tavu rekisteri w-rekisteriin. movwf PORTB ;Ladataan w-rekisteri B-porttiin. CALL SATAUS ;Kutsutaan lyhyt viive. bcf ohjaustavu, E ;Nollaa bitti E. bcf tavuvarasto, E ;Nollaa bitti E myös tavu rekisterissä, koska muuten tavu rekisteri pyyhkii LCD-modulin ohjaustiedot pois B-portista. movf tavuvarasto,W ;Tavuvarasto rekisteri w-rekisteriin. Näin siksi, että itse data ei pyyhkiytyisi pois B-portista jos E-bitti nollattaisi ohjaustavu rekisterillä. movwf PORTB ;Ladataan w-rekisteri B-porttiin. clrf tavu clrf tavuvarasto clrf ohjaustavu return ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;Tällä aliohjelmalla alustetaan LCD-näyttö 4 bittisesti ohjattavaksi. ALUSTETAANLCD: movlw 0x03; ;Luku 3 ensin kolme kertaa ilman neljää alinta bittiä, movwf tavu swapf tavu ;Alimmat bitit ylimpiin bitteihin. ;Ensinmäinen kerta. bsf ohjaustavu, E ;Aseta bitti E. bsf tavu, E ;Aseta bitti E myös tavu rekisterissä, koska muuten tavu rekisteri pyyhkii LCD-modulin ohjaustiedot pois B-portista. movf ohjaustavu,W ;Ohjaustavu rekisteri w-rekisteriin. movwf PORTB ;Ladataan w-rekisteri B-porttiin. movf tavu,W ;Tavu rekisteri w-rekisteriin. movwf PORTB ;Ladataan w-rekisteri B-porttiin. CALL SATAUS ;Kutsutaan lyhyt viive. bcf ohjaustavu, E ;Nollaa bitti E. bcf tavu, E ;Nollaa bitti E myös tavu rekisterissä, koska muuten tavu rekisteri pyyhkii LCD-modulin ohjaustiedot pois B-portista. movf tavu,W ;Tavu rekisteri w-rekisteriin. Näin siksi, että itse data ei pyyhkiytyisi pois B-portista jos E-bitti nollattaisi ohjaustavu rekisterillä. movwf PORTB ;Ladataan w-rekisteri B-porttiin. call KYMMENENMS ;Odotetaan yli 4,1ms. ;Toinen kerta. bsf ohjaustavu, E ;Aseta bitti E. bsf tavu, E ;Aseta bitti E myös tavu rekisterissä, koska muuten tavu rekisteri pyyhkii LCD-modulin ohjaustiedot pois B-portista. movf ohjaustavu,W ;Ohjaustavu rekisteri w-rekisteriin. movwf PORTB ;Ladataan w-rekisteri B-porttiin. movf tavu,W ;Tavu rekisteri w-rekisteriin. movwf PORTB ;Ladataan w-rekisteri B-porttiin. CALL SATAUS ;Kutsutaan lyhyt viive. bcf ohjaustavu, E ;Nollaa bitti E. bcf tavu, E ;Nollaa bitti E myös tavu rekisterissä, koska muuten tavu rekisteri pyyhkii LCD-modulin ohjaustiedot pois B-portista. movf tavu,W ;Tavu rekisteri w-rekisteriin. Näin siksi, että itse data ei pyyhkiytyisi pois B-portista jos E-bitti nollattaisi ohjaustavu rekisterillä. movwf PORTB ;Ladataan w-rekisteri B-porttiin. CALL SATAUS ;Kolmas ja viimeinen kerta. bsf ohjaustavu, E ;Aseta bitti E. bsf tavu, E ;Aseta bitti E myös tavu rekisterissä, koska muuten tavu rekisteri pyyhkii LCD-modulin ohjaustiedot pois B-portista. movf ohjaustavu,W ;Ohjaustavu rekisteri w-rekisteriin. movwf PORTB ;Ladataan w-rekisteri B-porttiin. movf tavu,W ;Tavu rekisteri w-rekisteriin. movwf PORTB ;Ladataan w-rekisteri B-porttiin. CALL SATAUS ;Kutsutaan lyhyt viive. bcf ohjaustavu, E ;Nollaa bitti E. bcf tavu, E ;Nollaa bitti E myös tavu rekisterissä, koska muuten tavu rekisteri pyyhkii LCD-modulin ohjaustiedot pois B-portista. movf tavu,W ;Tavu rekisteri w-rekisteriin. Näin siksi, että itse data ei pyyhkiytyisi pois B-portista jos E-bitti nollattaisi ohjaustavu rekisterillä. movwf PORTB ;Ladataan w-rekisteri B-porttiin. CALL SATAUS ;Noin 100us. movlw 0x32; ; Tätä kohtaa ei ole 8 bittiseksi alustamisessa. call LCDALUSTUS call KYMMENENMS movlw 0x38; ; Tekstirivien määrä 2/1, 0=1 rivi ja 1=2 rivi näyttö, ; ja merkkikoko 10/7, 0=5x7 ja 1=5x10 pisteen matriisi. call LCDALUSTUS call KYMMENENMS ;Odotetaan ,että LCD-moduli kerkeää tehdä asetukset. movlw 0x08 ; Pimennetään näyttö. call LCDALUSTUS call KYMMENENMS ;Odotetaan ,että LCD-moduli kerkeää tehdä asetukset. movlw 0x01; ; Tyhjennetään näyttö. call LCDALUSTUS call KYMMENENMS ;Odotetaan ,että LCD-moduli kerkeää tehdä asetukset. movlw 0x06; ;Näytön merkkimuistin osoittimen asetukset. call LCDALUSTUS call KYMMENENMS ;Odotetaan ,että LCD-moduli kerkeää tehdä asetukset. movlw 0x0C; ; Modulin näyttö D=päälle(1) pois(0), kursori U=käytössä(1) pois(0), B=vilkutus käytössä(1) pois(0) call LCDALUSTUS call KYMMENENMS ;Odotetaan ,että LCD-moduli kerkeää tehdä asetukset. movlw 0x02; ; Siirretään kursori kotia. call LCDALUSTUS call KYMMENENMS ;Odotetaan ,että LCD-moduli kerkeää tehdä asetukset. return ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;Tässä päivitetään näytön tekstit. NAYTTO_PAIVITYS movlw 0x02; ; Kursori kotia. call LCDALUSTUS call LCDVARATTU ;Odotetaan LCDVARATTU aliohjelmassa ,että LCD-moduli kerkeää kirjoittaa . ;Tämä kertoo LCD-näytössä haluttaessa monta kertaa timeri on pyörähtänyt ympäri. ;movf TIMER,W ;Rekisteri w-rekisteriin. ;call LCDKIRJOITUS ;call LCDVARATTU ;Odotetaan LCDVARATTU aliohjelmassa ,että LCD-moduli kerkeää kirjoittaa. movlw A' ' call LCDKIRJOITUS call LCDVARATTU ;Odotetaan LCDVARATTU aliohjelmassa ,että LCD-moduli kerkeää kirjoittaa. movlw A' ' call LCDKIRJOITUS call LCDVARATTU ;Odotetaan LCDVARATTU aliohjelmassa ,että LCD-moduli kerkeää kirjoittaa. movlw A' ' call LCDKIRJOITUS call LCDVARATTU ;Odotetaan LCDVARATTU aliohjelmassa ,että LCD-moduli kerkeää kirjoittaa. movlw A'P' call LCDKIRJOITUS call LCDVARATTU ;Odotetaan LCDVARATTU aliohjelmassa ,että LCD-moduli kerkeää kirjoittaa. movlw A'W' call LCDKIRJOITUS call LCDVARATTU ;Odotetaan LCDVARATTU aliohjelmassa ,että LCD-moduli kerkeää kirjoittaa. movlw A'M' call LCDKIRJOITUS call LCDVARATTU ;Odotetaan LCDVARATTU aliohjelmassa ,että LCD-moduli kerkeää kirjoittaa. movlw A':' call LCDKIRJOITUS call LCDVARATTU ;Odotetaan LCDVARATTU aliohjelmassa ,että LCD-moduli kerkeää kirjoittaa. movf TUHANNETPWM,W ;Rekisteri w-rekisteriin. call LCDKIRJOITUS call LCDVARATTU ;Odotetaan LCDVARATTU aliohjelmassa ,että LCD-moduli kerkeää kirjoittaa. movf SADATPWM,W ;Rekisteri w-rekisteriin. call LCDKIRJOITUS call LCDVARATTU ;Odotetaan LCDVARATTU aliohjelmassa ,että LCD-moduli kerkeää kirjoittaa. movf KYMMENETPWM,W ;Rekisteri w-rekisteriin. call LCDKIRJOITUS call LCDVARATTU ;Odotetaan LCDVARATTU aliohjelmassa ,että LCD-moduli kerkeää kirjoittaa. movlw A',' call LCDKIRJOITUS call LCDVARATTU ;Odotetaan LCDVARATTU aliohjelmassa ,että LCD-moduli kerkeää kirjoittaa. movf YKKOSETPWM,W ;Rekisteri w-rekisteriin. call LCDKIRJOITUS call LCDVARATTU ;Odotetaan LCDVARATTU aliohjelmassa ,että LCD-moduli kerkeää kirjoittaa. movlw A'%' call LCDKIRJOITUS call LCDVARATTU ;Odotetaan LCDVARATTU aliohjelmassa ,että LCD-moduli kerkeää kirjoittaa. movlw A' ' call LCDKIRJOITUS call LCDVARATTU ;Odotetaan LCDVARATTU aliohjelmassa ,että LCD-moduli kerkeää kirjoittaa. movlw A' ' call LCDKIRJOITUS call LCDVARATTU ;Odotetaan LCDVARATTU aliohjelmassa ,että LCD-moduli kerkeää kirjoittaa. movlw A' ' call LCDKIRJOITUS call LCDVARATTU ;Odotetaan LCDVARATTU aliohjelmassa ,että LCD-moduli kerkeää kirjoittaa. movlw 0xA8 ;LCD-näytön ohjaus toiselle riville call LCDALUSTUS call LCDVARATTU ;Odotetaan LCDVARATTU aliohjelmassa ,että LCD-moduli kerkeää kirjoittaa. movlw A'T' call LCDKIRJOITUS call LCDVARATTU ;Odotetaan LCDVARATTU aliohjelmassa ,että LCD-moduli kerkeää kirjoittaa. movf ETUMERKKIC,W ;Rekisteri w-rekisteriin. call LCDKIRJOITUS call LCDVARATTU ;Odotetaan LCDVARATTU aliohjelmassa ,että LCD-moduli kerkeää kirjoittaa. movf TUHANNETC,W ;Rekisteri w-rekisteriin. call LCDKIRJOITUS call LCDVARATTU ;Odotetaan LCDVARATTU aliohjelmassa ,että LCD-moduli kerkeää kirjoittaa. movf SADATC,W ;Rekisteri w-rekisteriin. call LCDKIRJOITUS call LCDVARATTU ;Odotetaan LCDVARATTU aliohjelmassa ,että LCD-moduli kerkeää kirjoittaa. movf KYMMENETC,W ;Rekisteri w-rekisteriin. call LCDKIRJOITUS call LCDVARATTU ;Odotetaan LCDVARATTU aliohjelmassa ,että LCD-moduli kerkeää kirjoittaa. movf YKKOSETC,W ;Rekisteri w-rekisteriin. call LCDKIRJOITUS call LCDVARATTU ;Odotetaan LCDVARATTU aliohjelmassa ,että LCD-moduli kerkeää kirjoittaa. movlw A'C' call LCDKIRJOITUS call LCDVARATTU ;Odotetaan LCDVARATTU aliohjelmassa ,että LCD-moduli kerkeää kirjoittaa. movlw A' ' call LCDKIRJOITUS call LCDVARATTU ;Odotetaan LCDVARATTU aliohjelmassa ,että LCD-moduli kerkeää kirjoittaa. movlw A'A' call LCDKIRJOITUS call LCDVARATTU ;Odotetaan LCDVARATTU aliohjelmassa ,että LCD-moduli kerkeää kirjoittaa. movf ETUMERKKIG,W ;Rekisteri w-rekisteriin. call LCDKIRJOITUS call LCDVARATTU ;Odotetaan LCDVARATTU aliohjelmassa ,että LCD-moduli kerkeää kirjoittaa. movf TUHANNETG,W ;Rekisteri w-rekisteriin. call LCDKIRJOITUS call LCDVARATTU ;Odotetaan LCDVARATTU aliohjelmassa ,että LCD-moduli kerkeää kirjoittaa. movf SADATG,W ;Rekisteri w-rekisteriin. call LCDKIRJOITUS call LCDVARATTU ;Odotetaan LCDVARATTU aliohjelmassa ,että LCD-moduli kerkeää kirjoittaa. movf KYMMENETG,W ;Rekisteri w-rekisteriin. call LCDKIRJOITUS call LCDVARATTU ;Odotetaan LCDVARATTU aliohjelmassa ,että LCD-moduli kerkeää kirjoittaa. movlw A',' call LCDKIRJOITUS call LCDVARATTU ;Odotetaan LCDVARATTU aliohjelmassa ,että LCD-moduli kerkeää kirjoittaa. movf YKKOSETG,W ;Rekisteri w-rekisteriin. call LCDKIRJOITUS call LCDVARATTU ;Odotetaan LCDVARATTU aliohjelmassa ,että LCD-moduli kerkeää kirjoittaa. movlw A'G' call LCDKIRJOITUS call LCDVARATTU ;Odotetaan LCDVARATTU aliohjelmassa ,että LCD-moduli kerkeää kirjoittaa. return ;********************************************************************************************** ;*********************************Laskurin alustus********************************************* ;Alustetaan laskurin näyttöön lukema 0000.Ja annetaan aloitus arvot NAYTON_OHJAUS aliohjelmalle. ;********************************************************************************************** ALUSTUSNAYTTO clrf AYKKOSET ;Näytön ohjauksessa käytettävien apurekistereiden nollaus. clrf AKYMMENET ; -||- clrf ASADAT ; -||- clrf ATUHANNET ; -||- clrf YLIVUOTO ;Nollataan YLIVUOTO rekisteri myös varmuuden vuoksi. movlw 0xA ;Ladataan w rekisteriin luku 10 hexana A.NAYTON_OHJAUS aliohjelmaa varten. movwf AYKKOSET ;Ladataan arvo AYKKOSET rekisteriin. movlw 0xA ;Ladataan w rekisteriin luku 10 hexana A.NAYTON_OHJAUS aliohjelmaa varten. movwf AKYMMENET ;Ladataan arvo AKYMMENET rekisteriin. movlw 0xA ;Ladataan w rekisteriin luku 10 hexana A.NAYTON_OHJAUS aliohjelmaa varten. movwf ASADAT ;Ladataan arvo ASADAT rekisteriin. movlw 0xA ;Ladataan w rekisteriin luku 10 hexana A.NAYTON_OHJAUS aliohjelmaa varten. movwf ATUHANNET ;Ladataan arvo ATUHANNET rekisteriin. movlw 0xA ;Ladataan w rekisteriin luku 10 hexana A. movwf JAKAJA ;Ladataan arvo JAKAJA rekisteriin. movlw 0xA ;Ladataan w rekisteriin luku 10 hexana A.NAYTON_OHJAUS aliohjelmaa varten. movwf ATIMER ;Ladataan arvo AYKKOSET rekisteriin. movlw A'0' ;Ladataan w rekisteriin *. movwf TIMER ;Ladataan w rekisteri TUHANNET rekisteriin. clrf PORTB call ALUSTETAANLCD return ;***************************Näytönohjaus aliohjelma******************************************** ;Näytönohjaus aliohjelmat jotka, päivittää uuden luvun näytönpäivitys aliohjelmalle. ;********************************************************************************************** NAYTTO_OHJAUS_ETUNPERIN ;movlw A'+' ;Ladataan w rekisteriin + merkki, koska lukemaa kasvatetaan. ;movwf ETUMERKKI ;Ladataan w rekisteri ETUMERKKI rekisteriin. decfsz AYKKOSET,f ;Vähennetään rekisteriä AYKKOSET.Jos meni nollaan hyppy seuraavan käskyn yli. return ;Rekisteri ei mennyt nollaan.Paluu tästä aliohjelmasta. clrf AYKKOSET ;Ylivuoto sattunut.Puhdistetaan rekisteri. movlw 0xA ;Ladataan w rekisteriin luku 10 hexana A. movwf AYKKOSET ;Ladataan w rekisterin arvo AYKKOSET rekisteriin. decfsz AKYMMENET,f ;Vähennetään rekisteriä AKYMMENET.Jos meni nollaan hyppy seuraavan käskyn yli. return ;Rekisteri ei mennyt nollaan.Paluu tästä aliohjelmasta. clrf AKYMMENET ;Ylivuoto sattunut.Puhdistetaan rekisteri. movlw 0xA ;Ladataan w rekisteriin luku 10 hexana A. movwf AKYMMENET ;Ladataan w rekisterin arvo AYKKOSET rekisteriin. decfsz ASADAT,f ;Vähennetään rekisteriä ASADAT.Jos meni nollaan hyppy seuraavan käskyn yli. return ;Rekisteri ei mennyt nollaan.Paluu tästä aliohjelmasta. clrf ASADAT ;Ylivuoto sattunut.Puhdistetaan rekisteri. movlw 0xA ;Ladataan w rekisteriin luku 10 hexana A. movwf ASADAT ;Ladataan w rekisterin arvo AYKKOSET rekisteriin. decfsz ATUHANNET,f ;Vähennetään rekisteriä ATUHANNET.Jos meni nollaan hyppy seuraavan käskyn yli. return ;Rekisteri ei mennyt nollaan.Paluu tästä aliohjelmasta. clrf ATUHANNET ;Ylivuoto sattunut.Puhdistetaan rekisteri. movlw 0xA ;Ladataan w rekisteriin luku 10 hexana A. movwf ATUHANNET ;Ladataan w rekisterin arvo AYKKOSET rekisteriin. return ;Paluu tästä aliohjelmasta. ;********************************************************************************************** NAYTTO_OHJAUS_TAKANPERIN ;movlw A'-' ;Ladataan w rekisteriin - merkki, koska lukemaa vähennetään. ;movwf ETUMERKKI ;Ladataan w rekisteri ETUMERKKI rekisteriin. incf AYKKOSET,f ;Vähennetään rekisteriä AYKKOSET.Jos meni nollaan hyppy seuraavan käskyn yli. movlw 0xB ;Ladataan w rekisteriin luku 10 hexana A. xorwf AYKKOSET,W ; btfss STATUS,Z ;Testataan Z lippu STATUS rekisteristä.Jos se on yksi luku oli 10 hexana A. return movlw 0x1 ;Ladataan w rekisteriin luku 1 hexana 1. movwf AYKKOSET incf AKYMMENET,f ;Vähennetään rekisteriä AKYMMENET.Jos meni nollaan hyppy seuraavan käskyn yli. movlw 0xB ;Ladataan w rekisteriin luku 10 hexana A. xorwf AKYMMENET,W ; btfss STATUS,Z ;Testataan Z lippu STATUS rekisteristä.Jos se on yksi luku oli 10 hexana A. return movlw 0x1 ;Ladataan w rekisteriin luku 1 hexana 1. movwf AKYMMENET incf ASADAT,f ;Vähennetään rekisteriä ASADAT.Jos meni nollaan hyppy seuraavan käskyn yli. movlw 0xB ;Ladataan w rekisteriin luku 10 hexana A. xorwf ASADAT,W ; btfss STATUS,Z ;Testataan Z lippu STATUS rekisteristä.Jos se on yksi luku oli 10 hexana A. return movlw 0x1 ;Ladataan w rekisteriin luku 1 hexana 1. movwf ASADAT incf ATUHANNET,f ;Vähennetään rekisteriä ATUHANNET.Jos meni nollaan hyppy seuraavan käskyn yli. movlw 0xB ;Ladataan w rekisteriin luku 10 hexana A. xorwf ATUHANNET,W ; btfss STATUS,Z ;Testataan Z lippu STATUS rekisteristä.Jos se on yksi luku oli 10 hexana A. return movlw 0x1 ;Ladataan w rekisteriin luku 1 hexana 1. movwf ATUHANNET return ;Paluu tästä aliohjelmasta. ;****************************************************************************** ODOTUS ;993 cycles movlw 0xC6 movwf d1 movlw 0x01 movwf d2 ODOTUS_0 decfsz d1, f goto $+2 decfsz d2, f goto ODOTUS_0 ;3 cycles goto $+1 nop ;4 cycles (including call) return ;********************************************************************************************** ;Tällä aliohjelmalla haetaan merkit taulukosta. HAE_UUSI_LUKU_C ;Haetaan länpötilan luku talteen. movf AYKKOSET,w ;Siirretään rekisterin AYKKOSET arvo w rekisteriin. call TAULUKKO_SEG ;Kutsutaan TAULUKKO_SEG aliohjelmaa tästä aliohjelmasta. movwf YKKOSETC ;Ladataan nyt TAULUKKO_SEG aliohjelmasta w rekisteriin saatu ;arvo YKKOSET rekisteriin. movf AKYMMENET,w ;Siirretään rekisterin AKYMMENET arvo w rekisteriin. call TAULUKKO_SEG ;Kutsutaan TAULUKKO_SEG aliohjelmaa tästä aliohjelmasta. movwf KYMMENETC ;Ladataan nyt TAULUKKO_SEG aliohjelmasta w rekisteriin saatu ;arvo KYMMENET rekisteriin. movf ASADAT,w ;Siirretään rekisterin ASADAT arvo w rekisteriin. call TAULUKKO_SEG ;Kutsutaan TAULUKKO_SEG aliohjelmaa tästä aliohjelmasta. movwf SADATC ;Ladataan nyt TAULUKKO_SEG aliohjelmasta w rekisteriin saatu ;arvo SADAT rekisteriin. movf ATUHANNET,w ;Siirretään rekisterin ATUHANNET arvo w rekisteriin. call TAULUKKO_SEG ;Kutsutaan TAULUKKO_SEG aliohjelmaa tästä aliohjelmasta. movwf TUHANNETC ;Ladataan nyt TAULUKKO_SEG aliohjelmasta w rekisteriin saatu ;arvo TUHANNET rekisteriin. return ;********************************************************************************************** ;Tällä aliohjelmalla haetaan merkit taulukosta. HAE_UUSI_LUKU_PWM ;Haetaan PWM luku talteen. movf AYKKOSET,w ;Siirretään rekisterin AYKKOSET arvo w rekisteriin. call TAULUKKO_SEG ;Kutsutaan TAULUKKO_SEG aliohjelmaa tästä aliohjelmasta. movwf YKKOSETPWM ;Ladataan nyt TAULUKKO_SEG aliohjelmasta w rekisteriin saatu ;arvo YKKOSET rekisteriin. movf AKYMMENET,w ;Siirretään rekisterin AKYMMENET arvo w rekisteriin. call TAULUKKO_SEG ;Kutsutaan TAULUKKO_SEG aliohjelmaa tästä aliohjelmasta. movwf KYMMENETPWM ;Ladataan nyt TAULUKKO_SEG aliohjelmasta w rekisteriin saatu ;arvo KYMMENET rekisteriin. movf ASADAT,w ;Siirretään rekisterin ASADAT arvo w rekisteriin. call TAULUKKO_SEG ;Kutsutaan TAULUKKO_SEG aliohjelmaa tästä aliohjelmasta. movwf SADATPWM ;Ladataan nyt TAULUKKO_SEG aliohjelmasta w rekisteriin saatu ;arvo SADAT rekisteriin. movf ATUHANNET,w ;Siirretään rekisterin ATUHANNET arvo w rekisteriin. call TAULUKKO_SEG ;Kutsutaan TAULUKKO_SEG aliohjelmaa tästä aliohjelmasta. movwf TUHANNETPWM ;Ladataan nyt TAULUKKO_SEG aliohjelmasta w rekisteriin saatu ;arvo TUHANNET rekisteriin. return ;********************************************************************************************** ;Tällä aliohjelmalla haetaan merkit taulukosta. HAE_UUSI_LUKU_G ;Haetaan kihtyvyys luku talteen. movf AYKKOSET,w ;Siirretään rekisterin AYKKOSET arvo w rekisteriin. call TAULUKKO_SEG ;Kutsutaan TAULUKKO_SEG aliohjelmaa tästä aliohjelmasta. movwf YKKOSETG ;Ladataan nyt TAULUKKO_SEG aliohjelmasta w rekisteriin saatu ;arvo YKKOSET rekisteriin. movf AKYMMENET,w ;Siirretään rekisterin AKYMMENET arvo w rekisteriin. call TAULUKKO_SEG ;Kutsutaan TAULUKKO_SEG aliohjelmaa tästä aliohjelmasta. movwf KYMMENETG ;Ladataan nyt TAULUKKO_SEG aliohjelmasta w rekisteriin saatu ;arvo KYMMENET rekisteriin. movf ASADAT,w ;Siirretään rekisterin ASADAT arvo w rekisteriin. call TAULUKKO_SEG ;Kutsutaan TAULUKKO_SEG aliohjelmaa tästä aliohjelmasta. movwf SADATG ;Ladataan nyt TAULUKKO_SEG aliohjelmasta w rekisteriin saatu ;arvo SADAT rekisteriin. movf ATUHANNET,w ;Siirretään rekisterin ATUHANNET arvo w rekisteriin. call TAULUKKO_SEG ;Kutsutaan TAULUKKO_SEG aliohjelmaa tästä aliohjelmasta. movwf TUHANNETG ;Ladataan nyt TAULUKKO_SEG aliohjelmasta w rekisteriin saatu ;arvo TUHANNET rekisteriin. return ;*********************************PÄÄOHJELMA************************* MAIN call KYMMENENMS call KYMMENENMS call KYMMENENMS call KYMMENENMS call KYMMENENMS CALL ALUSTUS ;Alustetaan näyttökin päälle. movlw 0x01; ;Tyhjennetään näyttö. call LCDALUSTUS call KYMMENENMS call NAYTTO_PAIVITYS ;Päivitetään LCD-näyttö. LOOP btfss PIR1, T0IF goto LOOP PWM_NAYTTEENOTTO_UUDESTAAN clrf PWMLIPUT bcf PIR1, T0IF ; Reset flag that indicates interrupt bcf PIR1, TMR1IF ; Resetoidaan timer1 yli pyörähtämisestä kertova lippubitti. BSF INTCON, GIE ; Enable interrupts PWM_NAYTTEENOTTO_ODOTUS movlw 0x000 xorwf PWMLIPUT,W btfss STATUS,Z goto PWM_NAYTTEENOTTO_ALKANUT goto PWM_NAYTTEENOTTO_ODOTUS PWM_NAYTTEENOTTO_ALKANUT movlw 0x006 xorwf PWMLIPUT,W btfsc STATUS,Z GOTO LOOP movlw 0x000 xorwf PWMLIPUT,W btfss STATUS,Z goto PWM_NAYTTEENOTTO_ALKANUT movlw 0x006 xorwf PWMLIPUT,W btfsc STATUS,Z GOTO LOOP ;Tähän jos RESOAUTO rekisteri mennyt yli 3. BCF INTCON, GIE ; Disable interrupts ;Tässä muokakataan saatu PWM näyte ja lasketaan siittä itse PWM-suhde. CALL PWM_NAYTTEEN_MUOKKAUS movlw 0xA ;Ladataan w rekisteriin luku 10 hexana A.NAYTON_OHJAUS aliohjelmaa varten. movwf AYKKOSET ;Ladataan arvo AYKKOSET rekisteriin. movlw 0xA ;Ladataan w rekisteriin luku 10 hexana A.NAYTON_OHJAUS aliohjelmaa varten. movwf AKYMMENET ;Ladataan arvo AKYMMENET rekisteriin. movlw 0xA ;Ladataan w rekisteriin luku 10 hexana A.NAYTON_OHJAUS aliohjelmaa varten. movwf ASADAT ;Ladataan arvo ASADAT rekisteriin. movlw 0xA ;Ladataan w rekisteriin luku 10 hexana A.NAYTON_OHJAUS aliohjelmaa varten. movwf ATUHANNET ;Ladataan arvo ATUHANNET rekisteriin. CALL PWMSUHDE call HAE_UUSI_LUKU_PWM movlw 0xA ;Ladataan w rekisteriin luku 10 hexana A.NAYTON_OHJAUS aliohjelmaa varten. movwf AYKKOSET ;Ladataan arvo AYKKOSET rekisteriin. movlw 0xA ;Ladataan w rekisteriin luku 10 hexana A.NAYTON_OHJAUS aliohjelmaa varten. movwf AKYMMENET ;Ladataan arvo AKYMMENET rekisteriin. movlw 0xA ;Ladataan w rekisteriin luku 10 hexana A.NAYTON_OHJAUS aliohjelmaa varten. movwf ASADAT ;Ladataan arvo ASADAT rekisteriin. movlw 0xA ;Ladataan w rekisteriin luku 10 hexana A.NAYTON_OHJAUS aliohjelmaa varten. movwf ATUHANNET ;Ladataan arvo ATUHANNET rekisteriin. CALL ASTEET call HAE_UUSI_LUKU_C movlw 0xA ;Ladataan w rekisteriin luku 10 hexana A.NAYTON_OHJAUS aliohjelmaa varten. movwf AYKKOSET ;Ladataan arvo AYKKOSET rekisteriin. movlw 0xA ;Ladataan w rekisteriin luku 10 hexana A.NAYTON_OHJAUS aliohjelmaa varten. movwf AKYMMENET ;Ladataan arvo AKYMMENET rekisteriin. movlw 0xA ;Ladataan w rekisteriin luku 10 hexana A.NAYTON_OHJAUS aliohjelmaa varten. movwf ASADAT ;Ladataan arvo ASADAT rekisteriin. movlw 0xA ;Ladataan w rekisteriin luku 10 hexana A.NAYTON_OHJAUS aliohjelmaa varten. movwf ATUHANNET ;Ladataan arvo ATUHANNET rekisteriin. CALL KIIHTYVYYS call HAE_UUSI_LUKU_G call NAYTTO_PAIVITYS bcf PIR1, T0IF ; Reset flag that indicates interrupt bcf PIR1, TMR1IF ; Resetoidaan timer1 yli pyörähtämisestä kertova lippubitti. GOTO LOOP END