;****************************************************************************** ; This file is a basic template for assembly code for a PIC18F2550. Copy * ; this file into your project directory and modify or add to it as needed. * ; * ; Refer to the MPASM User's Guide for additional information on the * ; features of the assembler. * ; * ; Refer to the PIC18Fx455/x550 Data Sheet for additional * ; information on the architecture and instruction set. * ; * ;****************************************************************************** ; * ; Filename:lcd.asm * ; Date: 3.7.2011 * ; jyrki.k@innopultti.fi * ; * ; * ; * ; * ;****************************************************************************** ; * ; Files Required: P18F2550.INC * ; * ;****************************************************************************** ;Toimiva koodi 6.7.2011 LIST P=18F2550 ;directive to define processor #include ;processor specific variable definitions ;****************************************************************************** ;Configuration bits ;Microchip has changed the format for defining the configuration bits, please ;see the .inc file for futher details on notation. Below are a few examples. config PLLDIV = 1 ;config CPUDIV = OSC3_PLL4 ;config USBDIV = 2 config FOSC = HS ;XT_XT ;config FCMEM = OFF ;config IESO = OFF config PWRT = ON ;Käyttöjännitteen ylös nousun odotus ON/OFF config BOR = OFF ;Programmable Brown-out Reset (BOR) ;config BORV = 21 config VREGEN = OFF ;USB regulaattori ON/OFF config WDT = OFF ;Vahtikoira ajastin, joka aktivoituu resetoimalla prosessorin jos prosessori jumiutuu. ON/OFF config WDTPS = 32768 ;Vahtikoiran ajastus. config MCLRE = OFF ;MCLRE Pää resetti pinnissä ON/OFF config LPT1OSC = OFF ;Oscillaattorin ajaminen pienellä teholla. Pieni teho altistaa helpommin häiriölle. ON/OFF config PBADEN = OFF config CCP2MX = OFF config STVREN = ON ;Pinon ylivuodon resetti. ON/OFF config LVP = OFF ;Matala jännite ohjelmointi. Jos päällä osa B-portin pinneistä ei toimi. ;config ICPRT = OFF ;config XINST = OFF config DEBUG = OFF ;Muistin luku/kirjoitussuojabittejä. config CP0 = OFF config CP1 = OFF config CP2 = OFF config CP3 = OFF config CPB = OFF config CPD = OFF config WRT0 = OFF config WRT1 = OFF config WRT2 = OFF config WRT3 = OFF config WRTB = OFF config WRTC = OFF config WRTD = OFF config EBTR0 = OFF config EBTR1 = OFF config EBTR2 = OFF config EBTR3 = OFF config EBTRB = OFF ;****************************************************************************** ;Variable definitions ; These variables are only needed if low priority interrupts are used. ; More variables may be needed to store other special function registers used ; in the interrupt routines. CBLOCK 0x080 WREG_TEMP ;variable used for context saving STATUS_TEMP ;variable used for context saving BSR_TEMP ;variable used for context saving ENDC CBLOCK 0x000 ;LCD-näytön ohjaamiseen rekisterit. ;Viiveen rekisterit. d1 d2 d3 KELLOTAAJUUS ;Tällä säädetään LCD-näytön viiveet toimimaan suuremmilla kuin 1Mhz kellotaajuuksilla. TEMPKELLOTAAJUUS ;Väliaikainen rekisteri KELLOTAAJUUS rekisterin datalle. ;LCD-näytön ohjaus rekistereitä. OHJAUSKASKY ;Tähän tulee kaikki ohjauskäskyt, jotka menee OHJAUSKOMENTO ja KIRJOITUSKOMENTO aliohjemmille. ENITENM4 ;Tähän jaetaan annetun tavun 4 eniten merkitsevää bittiä. VAHITENM4 ;Tähän jaetaan annetun tavun 4 vähiten merkitsevää bittiä. ;Väliaikaiset rekisterit. TEMP TEMPPI ;******************************************************************************************* ; PWM lukemisen keskeytyksessä olevat rekisterit. 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 ;***************************************************************************** ;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 ; -||- AYKKOSET ;Näytön ohjauksessa käytettävät apurekisterit rekisterit. AKYMMENET ; -||- ASADAT ; -||- ATUHANNET ; -||- JAKAJA ;Lukeman tallennus ja näyttö rekistereitä. ETUMERKKIC ;Etumerkki, jotta tiedetään lisättiinkö vai vähennettiinkö lukemaa. ;Lippurekisterit: YLIVUOTO ;Näytönohjauksen apuna käytettävä lippurekisteri.Ilmottamassa numeroiden 0-9 ylivuotamisesta. ;***************************************************************************** ENDC ;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. ;Liittyy LCD-näytön portin LCDOHJAUSBITIT rekisterin määrittelyyn. E equ 3 RS equ 1 RW equ 2 LCDKIIREINEN equ 7 ;LCD-näytön porttien määrittely kahteen eri porttiin. LCDKASKYTAVU equ PORTB ;Tähän ohjataan LCD-näytön 8 bittinen ohjauskäsky 2 osassa 4 bittinä. LCDOHJAUSBITIT equ PORTA ;Tähän ohjataan LCD-näytön ohjausbitit. LCDKASKYSUUNTAREKISTERI equ TRISB ;Suuntarekisterin määrittely uudelleen LCD-näytön aliohjelman takia. LCDOHJAUSSUUNTAREKISTERI equ TRISA ;Suuntarekisterin määrittely uudelleen LCD-näytön aliohjelman takia. ;****************************************************************************** ;EEPROM data ; Data to be programmed into the Data EEPROM is defined here ORG 0xf00000 DE "Test Data",0,1,2,3,4,5 ;****************************************************************************** ;Reset vector ; This code will start executing when a reset occurs. ORG 0x0000 goto PORTIT ;Porttien alustukseen. ;****************************************************************************** ;High priority interrupt vector ; This code will start executing when a high priority interrupt occurs or ; when any interrupt occurs if interrupt priorities are not enabled. ORG 0x0008 goto HighInt ;Hypätään korkeamman tason keskeytykseen jos se on asetettu päälle. ;****************************************************************************** ;Low priority interrupt vector and routine ; This code will start executing when a low priority interrupt occurs. ; This code can be removed if low priority interrupts are not used. ORG 0x0018 movff STATUS,STATUS_TEMP ;save STATUS register movff WREG,WREG_TEMP ;save working register movff BSR,BSR_TEMP ;save BSR register ; *** low priority interrupt code goes here *** movff BSR_TEMP,BSR ;restore BSR register movff WREG_TEMP,WREG ;restore working register movff STATUS_TEMP,STATUS ;restore STATUS register retfie ;****************************************************************************** ;High priority interrupt routine ; The high priority interrupt code is placed here to avoid conflicting with ; the low priority interrupt vector. HighInt: movff STATUS,STATUS_TEMP ;save STATUS register movff WREG,WREG_TEMP ;save working register movff BSR,BSR_TEMP ;save BSR register bcf PIR1,CCP1IF ;Nollataan keskeytyslippu. ;Tähän tullaan kun tulee keskeytys RC2 pinniin tai timeri pyörähtää ympäri. ;Tutkitaan mistä syystä keskeytys on aiheutunut. btfsc PIR1, TMR1IF ; Onko keskeytyksen syy timer1 ylipyörähdys. goto TIMER1YLI ; Timer1 ylipyörähdys. movlw 0x00 xorwf PWMLIPUT,W btfss STATUS,Z goto KAYNNISTYS goto ALUSTETAANTIMERI KAYNNISTYS movlw 0x01 xorwf PWMLIPUT,W btfss STATUS,Z goto PWMLUKEMINEN1 goto TIMERINLUKUKAYNTIIN PWMLUKEMINEN1 movlw 0x02 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ä. goto PALUUKESKEYTYKSESTA 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, TMR1IF ; Resetoidaan timer1 yli pyörähtämisestä kertova lippubitti. goto PALUUKESKEYTYKSESTA ALUSTETAANTIMERI ;Nollataan timerin lukema. clrf TMR1L clrf TMR1H incf PWMLIPUT clrf RESOAUTO ;;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,T1CKPS0 btfsc RESOAUTO,1 bsf T1CON,T1CKPS1 btfss RESOAUTO,0 bcf T1CON,T1CKPS0 btfss RESOAUTO,1 bcf T1CON,T1CKPS1 ;Lopuksi käynnistetään timeri. bsf T1CON,TMR1ON goto PALUUKESKEYTYKSESTA ; 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, TMR1IF ; Resetoidaan timer1 yli pyörähtämisestä kertova lippubitti. goto PALUUKESKEYTYKSESTA TIMER1YLI ;Tähän kohtaan tullaan kun timer1 on yli pyörähtänyt. bcf PIR1, TMR1IF ; Resetoidaan timer1 yli pyörähtämisestä kertova lippubitti. 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. movlw 0x004 xorwf RESOAUTO,W btfss STATUS,Z goto RESOEIYLI ;Tähän tullaan jos RESOAUTO rekisteri on 4 eli timeri menee yli vaikka timeria on hidastettu maksimiin. clrf RESOAUTO ;Nollataan RESOAUTO reksiteri ja kokeillaan uudestaan. 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 ;Säädetään timerin pyörimisnopeutta. movlw B'00000100' ; Capture mode falling edge movwf CCP1CON btfsc RESOAUTO,0 bsf T1CON,T1CKPS0 btfsc RESOAUTO,1 bsf T1CON,T1CKPS1 btfss RESOAUTO,0 bcf T1CON,T1CKPS0 btfss RESOAUTO,1 bcf T1CON,T1CKPS1 PALUUKESKEYTYKSESTA bcf PIR1, T0IF ;Reset flag that indicates interrupt movff BSR_TEMP,BSR ;restore BSR register movff WREG_TEMP,WREG ;restore working register movff STATUS_TEMP,STATUS ;restore STATUS register retfie FAST ;****************************************************************************** PORTIT ;Kytketään toimintoja pois päältä pinneistä. clrf PORTA clrf LATA clrf PORTB clrf LATB clrf PORTC clrf LATC BANKSEL ADCON0 ; Select Bank of ADCON0 clrf ADCON0 BANKSEL ADCON1 ; Select Bank of ADCON1 movlw b'00001111' ; Configure all pins movwf ADCON1 ; as digital inputs movlw 07h ; Turn off movwf CMCON ; comparators ;configuration bit = 0); otherwise, read as ‘0’. ;3: Unimplemented in 28-pin devices; read as ‘0’. ;Keskeytykset pinneistä pois päältä. BANKSEL CCP1CON clrf CCP1CON ; CCP moduli off BANKSEL CCP2CON clrf CCP2CON ; CCP moduli off ;Lopuksi asetellaan porttien pinnit joko sisääntuloiksi tai ulostuloiksi. ;Portin pinni saadaan sisääntuloksi 1 ja ulostuloksi 0 . ;A-portti BANKSEL TRISA movlw b'11110001' ;Bitit 7,6,5,4,3,2,1,0 movwf TRISA ;B-portti BANKSEL TRISB movlw b'00001011' ;Bitit 7,6,5,4,3,2,1,0 movwf TRISB ;C-portti BANKSEL TRISC movlw b'11111111' ;Bitit 7,6,5,4,3,2,1,0 movwf TRISC BANKSEL PORTA bcf INTCON,GIE ;Estetään kaikki keskeytykset. goto MAIN ;****************************************************************************** ;LCD-näytön ohjausaliohjelmisto ;Tarvittavia rekistereitä. ;OHJAUSKASKY ;Tähän tulee kaikki ohjauskäskyt, jotka menee OHJAUSKOMENTO ja KIRJOITUSKOMENTO aliohjemmille. ;ENITENM4 ;VAHITENM4 ;d1 ;d2 ;d3 ; ;Aliohjelmien esittely: ;LCDKAYNNISTYS Käynnistää näytön 4-bititillä ohjattavaksi. ;OHJAUSKOMENTO Suorittaa LCD-näytön ohjaukseenliittyvät komennot, kuten tyhjennys, kursorin siirto, uudelle riville siirtyminen jne. ;KIRJOITUSKOMENTO Kirjoittaa halutun merkin näyttöön. ;LCDVARATTU Tarkistaa koska LCD-näyttö on suorittanut kirjoituksen KIRJOITUSKOMENTO aliohjelman jälkeen. ;**************************************** ;LCD-näytön käynnistys viiveitä. ;***************************************** VIIVE15MILLISEKUNTTIA ;Viive 15ms. ;Viive mitoitettu 1Mhz kellotaajuuden mukaan. movf KELLOTAAJUUS,W ;Joten viive pitää uusia riittävän monta kertaa, movwf TEMPKELLOTAAJUUS ;että saadaan haluttu viiveen pituus mikro-ohjaimen taajuuden mukaan. VIIVE15MS ;3743 cycles movlw 0xEC movwf d1 movlw 0x03 movwf d2 VIIVE15MS_0 decfsz d1, f goto VIIVE15MS_0 decfsz d2, f goto VIIVE15MS_0 ;3 cycles nop nop decfsz TEMPKELLOTAAJUUS, f goto VIIVE15MS ;Uusitaan viive. return ;**************************************************************************************** VIIVE4_2MILLISEKUNTTIA ;Viive 4,2ms. ;Viive mitoitettu 1Mhz kellotaajuuden mukaan. movf KELLOTAAJUUS,W ;Joten viive pitää uusia riittävän monta kertaa, movwf TEMPKELLOTAAJUUS ;että saadaan haluttu viiveen pituus mikro-ohjaimen taajuuden mukaan. VIIVE4_2MS ;1043 cycles movlw 0xD0 movwf d1 movlw 0x01 movwf d2 VIIVE4_2MS_0 decfsz d1, f goto VIIVE4_2MS_0 decfsz d2, f goto VIIVE4_2MS_0 ;3 cycles nop nop decfsz TEMPKELLOTAAJUUS, f goto VIIVE4_2MS ;Uusitaan viive. return ;****************************************************************************************** VIIVE1MILLISEKUNTTIA ;Viive 1ms. ;Viive mitoitettu 1Mhz kellotaajuuden mukaan. movf KELLOTAAJUUS,W ;Joten viive pitää uusia riittävän monta kertaa, movwf TEMPKELLOTAAJUUS ;että saadaan haluttu viiveen pituus mikro-ohjaimen taajuuden mukaan. VIIVE1MS ;244 cycles movlw 0x51 movwf d1 VIIVE1MS_0 decfsz d1, f goto VIIVE1MS_0 ;2 cycles nop decfsz TEMPKELLOTAAJUUS, f goto VIIVE1MS ;Uusitaan viive. return ;****************************************************************************************** VIIVE100MIKROSEKUNTTIA ;Viive 100ms. ;Viive mitoitettu 1Mhz kellotaajuuden mukaan. movf KELLOTAAJUUS,W ;Joten viive pitää uusia riittävän monta kertaa, movwf TEMPKELLOTAAJUUS ;että saadaan haluttu viiveen pituus mikro-ohjaimen taajuuden mukaan. VIIVE100US ;19 cycles movlw 0x06 movwf d1 VIIVE100US_0 decfsz d1, f goto VIIVE100US_0 ;2 cycles nop decfsz TEMPKELLOTAAJUUS, f goto VIIVE100US ;Uusitaan viive. return ;********************************************************************************************** LCDKAYNNISTYS movlw 0x64 ;Asetetaan KELLOTAAJUUS rekisteri. movwf KELLOTAAJUUS bcf LCDOHJAUSBITIT,RS ;RS-ohjausbitti nollaksi. bcf LCDOHJAUSBITIT,RW ;RW-ohjausbitti nollaksi. call VIIVE15MILLISEKUNTTIA ;Odotetaan vähintään 15 ms virran kytkennän jälkeen. call PUOLISEK call PUOLISEK bsf LCDOHJAUSBITIT,E movlw b'00110000' movwf LCDKASKYTAVU call VIIVE100MIKROSEKUNTTIA bcf LCDOHJAUSBITIT,E clrf LCDKASKYTAVU CALL VIIVE15MILLISEKUNTTIA ;Odotetaan vähintään 15 ms virran kytkennän jälkeen. bsf LCDOHJAUSBITIT,E movlw b'00110000' movwf LCDKASKYTAVU call VIIVE100MIKROSEKUNTTIA bcf LCDOHJAUSBITIT,E clrf LCDKASKYTAVU call VIIVE1MILLISEKUNTTIA ;Odotetaan vähintään 1 ms. bsf LCDOHJAUSBITIT,E movlw b'00110000' movwf LCDKASKYTAVU call VIIVE100MIKROSEKUNTTIA bcf LCDOHJAUSBITIT,E clrf LCDKASKYTAVU ;Ja sitten käynnistetään LCD-moduli 4-bittisenä. Jos halutaan käynnistää 8-bittisenä, niin jätetään tämä kohta pois. call VIIVE1MILLISEKUNTTIA ;Odotetaan vähintään 1 ms. bsf LCDOHJAUSBITIT,E movlw b'00110000' movwf LCDKASKYTAVU call VIIVE100MIKROSEKUNTTIA bcf LCDOHJAUSBITIT,E clrf LCDKASKYTAVU call VIIVE100MIKROSEKUNTTIA bsf LCDOHJAUSBITIT,E movlw b'00100000' movwf LCDKASKYTAVU call VIIVE100MIKROSEKUNTTIA bcf LCDOHJAUSBITIT,E clrf LCDKASKYTAVU call VIIVE15MILLISEKUNTTIA ;Odotetaan vähintään 15 ms virran kytkennän jälkeen. ;---Nyt näyttö on käynnistynyt 4 bittisenä, joten seuraavat 8-bittiset käskyt pitää antaa 2 osassa eli 4 bitin paloina. Joista ensin annetaan aina ylimmät neljä bittiä, sitten alimmat 4. call RIVIMAARAJAMERKKIKOKO call VIIVE15MILLISEKUNTTIA ;Odotetaan vähintään 15 ms. ;Näyttö pitäisi olla toimintakunnossa. return ;**************************************************** ;OHJAUSKASKY ;ENITENM4 ;VAHITENM4 OHJAUSKOMENTO ;Muutetaan OHJAUSKASKY-rekisteri ENITENM4 ja VAHITENM4 rekistereihin. movf OHJAUSKASKY,W movwf VAHITENM4 swapf VAHITENM4 bcf VAHITENM4,0 bcf VAHITENM4,1 bcf VAHITENM4,2 bcf VAHITENM4,3 movf OHJAUSKASKY,W movwf ENITENM4 ;swapf ENITENM4 bcf ENITENM4,0 bcf ENITENM4,1 bcf ENITENM4,2 bcf ENITENM4,3 ;Neljä eniten merkitsevää bittiä. bsf LCDOHJAUSBITIT,E movf ENITENM4,W movwf LCDKASKYTAVU call VIIVE100MIKROSEKUNTTIA bcf LCDOHJAUSBITIT,E clrf LCDKASKYTAVU call VIIVE100MIKROSEKUNTTIA ;Neljä vähiten merkitsevää bittiä. bsf LCDOHJAUSBITIT,E movf VAHITENM4,W movwf LCDKASKYTAVU call VIIVE100MIKROSEKUNTTIA bcf LCDOHJAUSBITIT,E clrf LCDKASKYTAVU call LCDVARATTU return ;***************************************** ;OHJAUSKASKY ;ENITENM4 ;VAHITENM4 KIRJOITUSKOMENTO ;Muutetaan OHJAUSKASKY-rekisteri ENITENM4 ja VAHITENM4 rekistereihin. movf OHJAUSKASKY,W movwf VAHITENM4 swapf VAHITENM4 bcf VAHITENM4,0 bcf VAHITENM4,1 bcf VAHITENM4,2 bcf VAHITENM4,3 movf OHJAUSKASKY,W movwf ENITENM4 ;swapf ENITENM4 bcf ENITENM4,0 bcf ENITENM4,1 bcf ENITENM4,2 bcf ENITENM4,3 bsf LCDOHJAUSBITIT,RS ;Neljä eniten merkitsevää bittiä. bsf LCDOHJAUSBITIT,E movf ENITENM4,W movwf LCDKASKYTAVU call VIIVE100MIKROSEKUNTTIA bcf LCDOHJAUSBITIT,E clrf LCDKASKYTAVU call VIIVE100MIKROSEKUNTTIA ;Neljä vähiten merkitsevää bittiä. bsf LCDOHJAUSBITIT,E movf VAHITENM4,W movwf LCDKASKYTAVU call VIIVE100MIKROSEKUNTTIA bcf LCDOHJAUSBITIT,E bcf LCDOHJAUSBITIT,RS clrf LCDKASKYTAVU call VIIVE100MIKROSEKUNTTIA call LCDVARATTU return ;******************************************* ;Tämä aliohjelma odottaa kunnes LCD-näyttö on käsitellyt annetun käskyn/merkin. LCDVARATTU BANKSEL LCDKASKYSUUNTAREKISTERI bsf LCDKASKYSUUNTAREKISTERI,LCDKIIREINEN BANKSEL PORTA bsf LCDOHJAUSBITIT,RW POLLAUS call VIIVE100MIKROSEKUNTTIA bsf LCDOHJAUSBITIT,E call VIIVE100MIKROSEKUNTTIA btfss LCDKASKYTAVU,LCDKIIREINEN ;Tarkastetaan onko bitti LCDKIIREINEN nolla, jos ei ole niin hypätään seuraavn käskyn yli. goto MENINOLLAAN ;Hyppy kohtaan MENINOLLAAN. bcf LCDOHJAUSBITIT,E call VIIVE100MIKROSEKUNTTIA bsf LCDOHJAUSBITIT,E call VIIVE100MIKROSEKUNTTIA bcf LCDOHJAUSBITIT,E goto POLLAUS MENINOLLAAN bcf LCDOHJAUSBITIT,E bcf LCDOHJAUSBITIT,RW BANKSEL LCDKASKYSUUNTAREKISTERI bcf LCDKASKYSUUNTAREKISTERI,LCDKIIREINEN BANKSEL PORTA return ;********************************************** ;Tässä päivitetään näytön tekstit. NAYTTO_PAIVITYS call KURSORIKOTIASEMAAN movlw A'L' movwf OHJAUSKASKY call KIRJOITUSKOMENTO movlw A'a' movwf OHJAUSKASKY call KIRJOITUSKOMENTO movlw A'm' movwf OHJAUSKASKY call KIRJOITUSKOMENTO movlw A'p' movwf OHJAUSKASKY call KIRJOITUSKOMENTO movlw A'o' movwf OHJAUSKASKY call KIRJOITUSKOMENTO movlw A't' movwf OHJAUSKASKY call KIRJOITUSKOMENTO movlw A'i' movwf OHJAUSKASKY call KIRJOITUSKOMENTO movlw A'l' movwf OHJAUSKASKY call KIRJOITUSKOMENTO movlw A'a' movwf OHJAUSKASKY call KIRJOITUSKOMENTO movlw A':' movwf OHJAUSKASKY call KIRJOITUSKOMENTO movlw A' ' movf ETUMERKKIC,w movwf OHJAUSKASKY call KIRJOITUSKOMENTO movlw A' ' movf TUHANNETC,w movwf OHJAUSKASKY call KIRJOITUSKOMENTO movlw A' ' movf SADATC,w movwf OHJAUSKASKY call KIRJOITUSKOMENTO movlw A' ' movf KYMMENETC,w movwf OHJAUSKASKY call KIRJOITUSKOMENTO movlw A' ' movf YKKOSETC,w movwf OHJAUSKASKY call KIRJOITUSKOMENTO movlw A' ' movwf OHJAUSKASKY call KIRJOITUSKOMENTO movlw 0xA8 ;Toiselle riville movwf OHJAUSKASKY call OHJAUSKOMENTO movlw A'P' movwf OHJAUSKASKY call KIRJOITUSKOMENTO movlw A'W' movwf OHJAUSKASKY call KIRJOITUSKOMENTO movlw A'M' movwf OHJAUSKASKY call KIRJOITUSKOMENTO movlw A':' movwf OHJAUSKASKY call KIRJOITUSKOMENTO movlw A' ' movf TUHANNETPWM,w movwf OHJAUSKASKY call KIRJOITUSKOMENTO movlw A' ' movf SADATPWM,w movwf OHJAUSKASKY call KIRJOITUSKOMENTO movlw A' ' movf KYMMENETPWM,w movwf OHJAUSKASKY call KIRJOITUSKOMENTO movlw A' ' movf YKKOSETPWM,w movwf OHJAUSKASKY call KIRJOITUSKOMENTO movlw A' ' movwf OHJAUSKASKY call KIRJOITUSKOMENTO movlw A' ' movwf OHJAUSKASKY call KIRJOITUSKOMENTO movlw A' ' movwf OHJAUSKASKY call KIRJOITUSKOMENTO movlw A' ' movwf OHJAUSKASKY call KIRJOITUSKOMENTO movlw A' ' movwf OHJAUSKASKY call KIRJOITUSKOMENTO movlw A' ' movwf OHJAUSKASKY call KIRJOITUSKOMENTO movlw A' ' movwf OHJAUSKASKY call KIRJOITUSKOMENTO movlw A' ' movwf OHJAUSKASKY call KIRJOITUSKOMENTO return ;************************************************* ;Ensinmäiset käskyt LCD-näytölle käynnistyksen jälkeen. ENSINMAISETKASKYTLCDLLE call SAMMUTANAYTTO call TYHJENNANAYTTO call MERKKIMUISTINOSOITIN call KURSORIKOTIASEMAAN call NAYTTOPAALLE1 return ;************************************************* ;Erilaisia käskyjä LCD-näytölle. ;Bittien merkitykset. HUOM! Bitit erotettu toisistaan pisteillä. Esim. 0.0.0.0.0.0.0.0 ; Bitti => Mitä tarkoittaa. ; 1 => Bitin tila aina. ; 0 => Bitin tila aina. ; * => Oletusasetus LCD-näytössä valmiina. ; x => Ei merkitystä ko. tilanteessa ; 1/D => *1=Lisäys/0=Vähennys ; R/L => Siirtosuunta *1=Oikealle/0=Vasemmalle ; S => Näytön siirto 1=Päällä/*0=Pois ; 8/4 => Dataväylän leveys *1=8 bit/0=4 bit ; D => Näyttö 1=Päällä/*0=Pois ; 2/1 => Näyttö 1=2 rivinen/*0=1 rivinen ; U => Kursori 1=Käytössä/*0=Pois ; 10/7 => Merkkikoko 1=5x10/*0=5x7 pistettä ; B => Kursori vilkutus 1=Päällä/*0=Pois ; D/C Siirto 1=Näyttö/*0=Kursori TYHJENNANAYTTO ; Tyhjennä näyttömuisti 0.0.0.0.0.0.0.1 movlw b'00000001' ; Tyhjennetään näyttö. movwf OHJAUSKASKY call OHJAUSKOMENTO call VIIVE15MS return KURSORIKOTIASEMAAN ; Näyttö ja kursori alkutilaan 0.0.0.0.0.0.1.x movlw b'00000010' ; Siirretään kursori kotia. Tähän voi joutua joissakin näytöissä laittaan 000000011, jotta kursori palaa kotiasemaan. movwf OHJAUSKASKY call OHJAUSKOMENTO call VIIVE15MS return MERKKIMUISTINOSOITIN ; Näyttömuistin osoitteen ominaisuudet. 1/D => *1=Lisäys/0=Vähennys, S => Näytön siirto 1=Päällä/*0=Pois ; 0.0.0.0.0.1.1/D.S movlw b'00000110' ; movwf OHJAUSKASKY call OHJAUSKOMENTO call VIIVE15MS return SAMMUTANAYTTO ;Sammuta näyttö. ; D = Moduli päälle(1) pois(0), U = Kursori käytössä(1) pois(0), B = Vilkutus käytössä(1) pois(0) ; 0.0.0.0.1.D.U.B movlw b'00001000' movwf OHJAUSKASKY call OHJAUSKOMENTO call VIIVE15MS return NAYTTOPAALLE1 ;Kytketään moduli päälle ilman kursoria ja sen vilkkumista. ; D = Moduli päälle(1) pois(0), U = Kursori käytössä(1) pois(0), B = Vilkutus käytössä(1) pois(0) ; 0.0.0.0.1.D.U.B movlw b'00001100' movwf OHJAUSKASKY call OHJAUSKOMENTO call VIIVE15MS return NAYTTOPAALLE2 ;Kytketään moduli päälle kursorilla ja ilman sen vilkkumista. ; D = Moduli päälle(1) pois(0), U = Kursori käytössä(1) pois(0), B = Vilkutus käytössä(1) pois(0) ; 0.0.0.0.1.D.U.B movlw b'00001110' movwf OHJAUSKASKY call OHJAUSKOMENTO call VIIVE15MS return NAYTTOPAALLE3 ;Kytketään moduli päälle vilkkuvalla kursorilla. ; D = Moduli päälle(1) pois(0), U = Kursori käytössä(1) pois(0), B = Vilkutus käytössä(1) pois(0) ; 0.0.0.0.1.D.U.B movlw b'00001111' movwf OHJAUSKASKY call OHJAUSKOMENTO call VIIVE15MS return RIVIMAARAJAMERKKIKOKO ;Asetetaan rivien määrä merkkimatriisin koko. ; 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. ; 0.0.1.1.2/1.10/7.x.x movlw b'00111000' ;2 rivinen näyttö 5x7 merkkimatriisi käyttöön. movwf OHJAUSKASKY call OHJAUSKOMENTO call VIIVE15MS return ;********************************************************************************************* ;Viive näytön käynnistymiseen 0,5s 4Mhz. PUOLISEK ;499994 cycles movlw 0x05 movwf TEMPPI PUOLISEK1 movlw 0x03 movwf d1 movlw 0x18 movwf d2 movlw 0x02 movwf d3 PUOLISEK_0 decfsz d1, f goto PUOLISEK_0 decfsz d2, f goto PUOLISEK_0 decfsz d3, f goto PUOLISEK_0 decfsz TEMPPI, f goto PUOLISEK1 ;Uusitaan viive. ;2 cycles ;goto $+1 ;4 cycles (including call) return ;****************************************************************************** ;Lämpötilan laskenta aliohjelmia. ;********************************************************** ;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 rkisteri 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 ;****************************************************************************** ;***************************Näytönohjaus aliohjelma******************************************** ;Näytönohjaus aliohjelmat jotka, päivittää uuden luvun näytönpäivitys aliohjelmalle. ;********************************************************************************************** NAYTTO_OHJAUS_ETUNPERIN incf AYKKOSET movlw A':' xorwf AYKKOSET,W ; btfss STATUS,Z ;Testataan Z lippu STATUS rekisteristä.Jos se on yksi merkki oli se mitä etsittiin. goto EIYLI ;Ei yli 9. movlw A'0' ;Ladataan w rekisteriin luku 0. movwf AYKKOSET ;Ladataan w rekisterin arvo rekisteriin. incf AKYMMENET movlw A':' xorwf AKYMMENET,W ; btfss STATUS,Z ;Testataan Z lippu STATUS rekisteristä.Jos se on yksi merkki oli se mitä etsittiin. goto EIYLI ;Ei yli 9. movlw A'0' ;Ladataan w rekisteriin luku 0. movwf AKYMMENET ;Ladataan w rekisterin arvo rekisteriin. incf ASADAT movlw A':' xorwf ASADAT,W ; btfss STATUS,Z ;Testataan Z lippu STATUS rekisteristä.Jos se on yksi merkki oli se mitä etsittiin. goto EIYLI ;Ei yli 9. movlw A'0' ;Ladataan w rekisteriin luku 0. movwf ASADAT ;Ladataan w rekisterin arvo rekisteriin. incf ATUHANNET movlw A':' xorwf ATUHANNET,W ; btfss STATUS,Z ;Testataan Z lippu STATUS rekisteristä.Jos se on yksi merkki oli se mitä etsittiin. goto EIYLI ;Ei yli 9. movlw A'0' ;Ladataan w rekisteriin luku 0. movwf ATUHANNET ;Ladataan w rekisterin arvo rekisteriin. EIYLI return ;Paluu tästä aliohjelmasta. ;********************************************************************************************** ;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. movwf YKKOSETC ;Ladataan nyt TAULUKKO_SEG aliohjelmasta w rekisteriin saatu ;arvo YKKOSET rekisteriin. movf AKYMMENET,w ;Siirretään rekisterin AKYMMENET arvo w rekisteriin. movwf KYMMENETC ;Ladataan nyt TAULUKKO_SEG aliohjelmasta w rekisteriin saatu ;arvo KYMMENET rekisteriin. movf ASADAT,w ;Siirretään rekisterin ASADAT arvo w rekisteriin. movwf SADATC ;Ladataan nyt TAULUKKO_SEG aliohjelmasta w rekisteriin saatu ;arvo SADAT rekisteriin. movf ATUHANNET,w ;Siirretään rekisterin ATUHANNET arvo w rekisteriin. 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. movwf YKKOSETPWM ;Ladataan nyt TAULUKKO_SEG aliohjelmasta w rekisteriin saatu ;arvo YKKOSET rekisteriin. movf AKYMMENET,w ;Siirretään rekisterin AKYMMENET arvo w rekisteriin. movwf KYMMENETPWM ;Ladataan nyt TAULUKKO_SEG aliohjelmasta w rekisteriin saatu ;arvo KYMMENET rekisteriin. movf ASADAT,w ;Siirretään rekisterin ASADAT arvo w rekisteriin. movwf SADATPWM ;Ladataan nyt TAULUKKO_SEG aliohjelmasta w rekisteriin saatu ;arvo SADAT rekisteriin. movf ATUHANNET,w ;Siirretään rekisterin ATUHANNET arvo w rekisteriin. movwf TUHANNETPWM ;Ladataan nyt TAULUKKO_SEG aliohjelmasta w rekisteriin saatu ;arvo TUHANNET rekisteriin. return ;********************************************************************************************** ALUSTAKAAPPAUS ;CCP1 kaappauspinnin asetukset. movlw b'00000101' ;Kaappaus jokaisella nousevalla reunalla. movwf CCP1CON ;Timer1 asetukset. movlw b'00000000' ;RD16, T1RUN, T1CKPS1, T1CKPS0, T1OSCEN, T1SYNC, TMR1CS, TMR1ON movwf T1CON ;Aktivoidaan keskeytykset. bsf PIE1,CCP1IE ;CCP1 pinnin nouseva reuna aktivoi myös keskeytyksen. bsf INTCON,PEIE ;CCP2 kaappauspinnin asetukset. movlw b'00000000' movwf CCP2CON return ;****************************************************************************** ;LCD-Näytön lukeman ja ohjauksen alustus. ALKULUKEMA clrf YLIVUOTO ;Nollataan YLIVUOTO rekisteri myös varmuuden vuoksi. 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. LUKEMAALUSTUS movlw A'0' ;Ladataan w rekisteriin luku 0.NAYTON_OHJAUS aliohjelmaa varten. movwf AYKKOSET ;Ladataan arvo AYKKOSET rekisteriin. movlw A'0' ;Ladataan w rekisteriin luku 0.NAYTON_OHJAUS aliohjelmaa varten. movwf AKYMMENET ;Ladataan arvo AKYMMENET rekisteriin. movlw A'0' ;Ladataan w rekisteriin luku 0.NAYTON_OHJAUS aliohjelmaa varten. movwf ASADAT ;Ladataan arvo ASADAT rekisteriin. movlw A'0' ;Ladataan w rekisteriin luku 0.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. return ;****************************************************************************** ALUSTUKSET call LCDKAYNNISTYS ;Käynnistää näytön 4-bititillä ohjattavaksi. call ENSINMAISETKASKYTLCDLLE call ALUSTAKAAPPAUS call ALKULUKEMA return ;***************************************************************** VILKUTUS bsf PORTB,2 call PUOLISEK bcf PORTB,2 call PUOLISEK bsf PORTB,2 call PUOLISEK bcf PORTB,2 call PUOLISEK LYHYTVILKUTUS bsf PORTB,2 call PUOLISEK bcf PORTB,2 call PUOLISEK bsf PORTB,2 call PUOLISEK bcf PORTB,2 return ;****************************************************************************** ;Pääohjelma MAIN call ALUSTUKSET call NAYTTO_PAIVITYS clrf PWMLIPUT bcf INTCON,GIE ;Estetään kaikki keskeytykset. bsf T1CON,TMR1ON LOOP btfss PIR1, TMR1IF goto LOOP bcf T1CON,TMR1ON PWM_NAYTTEENOTTO_UUDESTAAN clrf PWMLIPUT bcf PIR1, TMR1IF ; Resetoidaan timer1 yli pyörähtämisestä kertova lippubitti. bsf INTCON, GIE ; Enable interrupts PWM_NAYTTEENOTTO_ODOTUS movlw 0x00 xorwf PWMLIPUT,W btfss STATUS,Z goto PWM_NAYTTEENOTTO_ALKANUT goto PWM_NAYTTEENOTTO_ODOTUS PWM_NAYTTEENOTTO_ALKANUT movlw 0x06 xorwf PWMLIPUT,W btfsc STATUS,Z goto LOOP movlw 0x00 xorwf PWMLIPUT,W btfss STATUS,Z goto PWM_NAYTTEENOTTO_ALKANUT movlw 0x06 xorwf PWMLIPUT,W btfsc STATUS,Z goto LOOP ;Tähän jos RESOAUTO rekisteri mennyt yli 3. bcf INTCON, GIE ;Estetään keskeytykset, kun lasketaan PWM-suhde ja lämpötila lukema. ;Tässä muokakataan saatu PWM näyte ja lasketaan siittä itse PWM-suhde ja lämpötila. call PWM_NAYTTEEN_MUOKKAUS call LUKEMAALUSTUS call PWMSUHDE call HAE_UUSI_LUKU_PWM call LUKEMAALUSTUS call ASTEET call HAE_UUSI_LUKU_C call NAYTTO_PAIVITYS bcf PIR1, T0IF ; Reset flag that indicates interrupt bcf PIR1, TMR1IF ; Resetoidaan timer1 yli pyörähtämisestä kertova lippubitti. bsf T1CON,TMR1ON ; Timeri 1 käyntiin. goto LOOP ;****************************************************************************** ;End of program END