;****************************************************************************** ; 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:gsmlampo.asm * ; Date: 3.7.2011 * ; * ; * ; * ; * ; * ;****************************************************************************** ; * ; Files Required: P18F2550.INC * ; * ;****************************************************************************** ;Toimiva koodi 11.7.2011, mutta pitää vielä saada lähettämään tekstiviesti soittavaan numeroon. Nyt numero on kiinteä. ;12.7.2011 ;Animoitu käynnistymisteksti näytössä. Sekä PWM-suhteeseen lisätty pilkut ja prosenttimerkit kohdalleen. Ja lämpötilaan C-kirjain LCD-näytössä. ;Lisäksi koodi lähettää tekstiviestin soittavaan numeroon, eli numero ei ole enää kiinteä. ;Kun soitto tulee niin LCD-näytössä lukee mitä milloinkin tapahtuu. 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 ;Oskillaattorin valinta. ;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. ; Sarjaliikenneväylän rekistereitä. MERKKEJATULLUT ;Merkkejä tullut RS232-väylästä rekisteri. ;Sarjaliikenneväylän puskurimuistin osoiterekisterit. PUSKURIOSOITEL PUSKURIOSOITEH ;Sarjaliikenteen lähetyksen rekisterit. TAVU ;LCD näytölle tulevien taulujen muistiinluku osoitteet. LCDTAULUOSOITEL LCDTAULUOSOITEH ;Tiedon vertailupuskuri. Eli kun tarkastetaan esimerkiksi onko RS-232 väylästä tullu oikeita tietoja, joita verrataan esim tauluista haettuihin tietoihin. VERTAILUTAULUOSOITEL VERTAILUTAULUOSOITEH VERTAILUTASMASI ;Jos vertailu täsmää niin tähän K-merkki jos ei niin E-merkki. VAARATMERKIT ;RS-232 väylästä tulleiden väärien merkkien suodatus. ;AT-komentojen rekistereitä. VIRHE ;Tämä rekisteri tarkkailee ja kertoo tuliko OK-kuittaus AT-komennon jälkeen oikein. Jos tuli oikein tähän tulee arvo FF jos ei niin 1. ;***************************************************************************** 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, timeri pyörähtää ympäri tai sarjaliikenneväylään alkaa tulemaan tavuja. ;Tutkitaan mistä syystä keskeytys on aiheutunut. btfsc PIR1, TMR1IF ; Onko keskeytyksen syy timer1 ylipyörähdys. goto TIMER1YLI ; Timer1 ylipyörähdys. btfsc PIR1,RCIF ; Sarjaliikenneväylään tulossa merkkejä? goto SARJAPORTTILUKU ; Sarjaliikenteeseen tulee merkkejä. ;Kaappaustoiminnon keskeytys jossa otetaan talteen PWM. 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äytteenottoa 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' ; Kaappaus laskevalle reunalle. movwf CCP1CON bcf PIR1, T0IF ; Nollataan keskeytyksen lippubitti. bcf PIR1, TMR1IF ; Nollataan 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' ; Kaappaus nousevalle reunalle. movwf CCP1CON bcf PIR1, TMR1IF ; Nollataan 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' ; Kaappaus nousevalla reunalla. movwf CCP1CON bcf PIR1, T0IF ; Nollataan keskeytyksen lippubitti. bcf PIR1, TMR1IF ; Nollataan 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' ;Kaappaus laskevalla reunalla. movwf CCP1CON bcf PIR1, TMR1IF ;Nollataan 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 ; Nollataan 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' ; Kaappaus laskevalla reunalla. 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 goto PALUUKESKEYTYKSESTA ;Lämpötilan lukemiseen liittyvä keskeytysaliohjelmat päättyy tähän. ;*********************************************************************** ;Sarjaportin lukemisen keskeytyksen aliohjelma alkaa tästä. SARJAPORTTILUKU ; Asetetaan puskurin osoite. call RS232PUSKURIPOINTTERI ; Viiverekisterien alustus. movlw 0xff movwf d1 movlw 0xff movwf d2 FIFOTAYSI movf RCREG,W movff RCREG,POSTINC0 ; Ladataan data puskuriin. movff RCREG,TAVU movlw 0xff movwf d1 movlw 0xff movwf d2 FIFOTYHJA btfsc PIR1,RCIF goto FIFOTAYSI decfsz d1, f goto FIFOTYHJA decfsz d2, f goto FIFOTYHJA movlw A'K' ; movwf MERKKEJATULLUT ;Nollataan kaikki virheet pois. movf RCREG,W ;Tyhjätään RCREG mahdollisesta turhasta tiedosta. movf RCREG,W banksel RCSTA bcf RCSTA, CREN ;Mahdolliset virheet nollataan. bsf RCSTA, CREN goto PALUUKESKEYTYKSESTA ;SARJAPORTIN keskeytys loppuu tähän. 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 ;****************************************************************************** ;Taulut, joista haetaan tarvittavat tekstit. ;GSM-modulin viestien tunnistamiseen tarvittavat taulut. RINGTAULU ;Tallennetaan ohjelmalaskurin tiedot. movff PCL,TBLPTRL movff PCLATH,TBLPTRH movff PCLATU,TBLPTRU return ;Itse teksti, joka löytyy taulusta. db "RING/" ;Teskti täytyy päättää /-merkkiin. ;Testiviestiin menevät taulut. LAMPOTILATAULU ;Tallennetaan ohjelmalaskurin tiedot. movff PCL,TBLPTRL movff PCLATH,TBLPTRH movff PCLATU,TBLPTRU return ;Itse teksti, joka löytyy taulusta. db "Lampotila:<" ;Tesktiviesti täytyy päättää <-merkkiin. PWMTAULU ;Tallennetaan ohjelmalaskurin tiedot. movff PCL,TBLPTRL movff PCLATH,TBLPTRH movff PCLATU,TBLPTRU return ;Itse teksti, joka löytyy taulusta. db " PWM-suhde:<" ;Tesktiviesti täytyy päättää <-merkkiin. ;LCD-näytölle menevät taulut. ETALUKUKYSELYTAULU ;Tallennetaan ohjelmalaskurin tiedot. movff PCL,TBLPTRL movff PCLATH,TBLPTRH movff PCLATU,TBLPTRU return ;Itse teksti, joka löytyy taulusta. ; 12345678123456781234567812345678 LCD-näytön merkkien määrä. Ne joihin ei tule mitään täytyy jättää välilyönnillä tyhjäksi. db "Saapuva etalukukysely... <" ;Tesktiviesti täytyy päättää <-merkkiin. TEKSTIVIESTITAULU ;Tallennetaan ohjelmalaskurin tiedot. movff PCL,TBLPTRL movff PCLATH,TBLPTRH movff PCLATU,TBLPTRU return ;Itse teksti, joka löytyy taulusta. ; 12345678123456781234567812345678 LCD-näytön merkkien määrä. Ne joihin ei tule mitään täytyy jättää välilyönnillä tyhjäksi. db "Tekstiviestin lahetys... <" ;Tesktiviesti täytyy päättää <-merkkiin. LAHETETTYTAULU ;Tallennetaan ohjelmalaskurin tiedot. movff PCL,TBLPTRL movff PCLATH,TBLPTRH movff PCLATU,TBLPTRU return ;Itse teksti, joka löytyy taulusta. ; 12345678123456781234567812345678 LCD-näytön merkkien määrä. Ne joihin ei tule mitään täytyy jättää välilyönnillä tyhjäksi. db "Tekstiviesti lahetetty. <" ;Tesktiviesti täytyy päättää <-merkkiin. TYHJATAULU ;Tallennetaan ohjelmalaskurin tiedot. movff PCL,TBLPTRL movff PCLATH,TBLPTRH movff PCLATU,TBLPTRU return ;Itse teksti, joka löytyy taulusta. ; 12345678123456781234567812345678 LCD-näytön merkkien määrä. Ne joihin ei tule mitään täytyy jättää välilyönnillä tyhjäksi. db " <" ;Tesktiviesti täytyy päättää <-merkkiin. ;Käynnistyy taulut, jolla saadaan pieni animaatioefekti aikaiseksi LCD-näyttöön. KAYNNISTYYTAULU ;Tallennetaan ohjelmalaskurin tiedot. movff PCL,TBLPTRL movff PCLATH,TBLPTRH movff PCLATU,TBLPTRU return ;Itse teksti, joka löytyy taulusta. ; 12345678123456781234567812345678 LCD-näytön merkkien määrä. Ne joihin ei tule mitään täytyy jättää välilyönnillä tyhjäksi. db "Lampotilamittarikaynnistyy <" ;Tesktiviesti täytyy päättää <-merkkiin. KAYNNISTYY1TAULU ;Tallennetaan ohjelmalaskurin tiedot. movff PCL,TBLPTRL movff PCLATH,TBLPTRH movff PCLATU,TBLPTRU return ;Itse teksti, joka löytyy taulusta. ; 12345678123456781234567812345678 LCD-näytön merkkien määrä. Ne joihin ei tule mitään täytyy jättää välilyönnillä tyhjäksi. db "Lampotilamittarikaynnistyy. <" ;Tesktiviesti täytyy päättää <-merkkiin. KAYNNISTYY2TAULU ;Tallennetaan ohjelmalaskurin tiedot. movff PCL,TBLPTRL movff PCLATH,TBLPTRH movff PCLATU,TBLPTRU return ;Itse teksti, joka löytyy taulusta. ; 12345678123456781234567812345678 LCD-näytön merkkien määrä. Ne joihin ei tule mitään täytyy jättää välilyönnillä tyhjäksi. db "Lampotilamittarikaynnistyy.. <" ;Tesktiviesti täytyy päättää <-merkkiin. KAYNNISTYY3TAULU ;Tallennetaan ohjelmalaskurin tiedot. movff PCL,TBLPTRL movff PCLATH,TBLPTRH movff PCLATU,TBLPTRU return ;Itse teksti, joka löytyy taulusta. ; 12345678123456781234567812345678 LCD-näytön merkkien määrä. Ne joihin ei tule mitään täytyy jättää välilyönnillä tyhjäksi. db "Lampotilamittarikaynnistyy... <" ;Tesktiviesti täytyy päättää <-merkkiin. ;***************************************************************************** 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 movf ETUMERKKIC,w movwf OHJAUSKASKY call KIRJOITUSKOMENTO movf TUHANNETC,w movwf OHJAUSKASKY call KIRJOITUSKOMENTO movf SADATC,w movwf OHJAUSKASKY call KIRJOITUSKOMENTO movf KYMMENETC,w movwf OHJAUSKASKY call KIRJOITUSKOMENTO movf YKKOSETC,w movwf OHJAUSKASKY call KIRJOITUSKOMENTO movlw A'C' 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's' movwf OHJAUSKASKY call KIRJOITUSKOMENTO movlw A'u' movwf OHJAUSKASKY call KIRJOITUSKOMENTO movlw A'h' movwf OHJAUSKASKY call KIRJOITUSKOMENTO movlw A'd' movwf OHJAUSKASKY call KIRJOITUSKOMENTO movlw A'e' movwf OHJAUSKASKY call KIRJOITUSKOMENTO movlw A':' movwf OHJAUSKASKY call KIRJOITUSKOMENTO movf TUHANNETPWM,w movwf OHJAUSKASKY call KIRJOITUSKOMENTO movf SADATPWM,w movwf OHJAUSKASKY call KIRJOITUSKOMENTO movf KYMMENETPWM,w movwf OHJAUSKASKY call KIRJOITUSKOMENTO movlw A',' movwf OHJAUSKASKY call KIRJOITUSKOMENTO movf YKKOSETPWM,w movwf OHJAUSKASKY call KIRJOITUSKOMENTO movlw A'%' movwf OHJAUSKASKY call KIRJOITUSKOMENTO return ;*************************************************************************************** ;Tässä päivitetään näytön tekstit. NAYTTO_PAIVITYS1 call KURSORIKOTIASEMAAN call LCDPUSKURIPOINTTERI ;Luetaan RAM-muistin osoite. movf POSTINC1,w movwf OHJAUSKASKY call KIRJOITUSKOMENTO movf POSTINC1,w movwf OHJAUSKASKY call KIRJOITUSKOMENTO movf POSTINC1,w movwf OHJAUSKASKY call KIRJOITUSKOMENTO movf POSTINC1,w movwf OHJAUSKASKY call KIRJOITUSKOMENTO movf POSTINC1,w movwf OHJAUSKASKY call KIRJOITUSKOMENTO movf POSTINC1,w movwf OHJAUSKASKY call KIRJOITUSKOMENTO movf POSTINC1,w movwf OHJAUSKASKY call KIRJOITUSKOMENTO movf POSTINC1,w movwf OHJAUSKASKY call KIRJOITUSKOMENTO movf POSTINC1,w movwf OHJAUSKASKY call KIRJOITUSKOMENTO movf POSTINC1,w movwf OHJAUSKASKY call KIRJOITUSKOMENTO movf POSTINC1,w movwf OHJAUSKASKY call KIRJOITUSKOMENTO movf POSTINC1,w movwf OHJAUSKASKY call KIRJOITUSKOMENTO movf POSTINC1,w movwf OHJAUSKASKY call KIRJOITUSKOMENTO movf POSTINC1,w movwf OHJAUSKASKY call KIRJOITUSKOMENTO movf POSTINC1,w movwf OHJAUSKASKY call KIRJOITUSKOMENTO movf POSTINC1,w movwf OHJAUSKASKY call KIRJOITUSKOMENTO movlw 0xA8 ;Toiselle riville movwf OHJAUSKASKY call OHJAUSKOMENTO movf POSTINC1,w movwf OHJAUSKASKY call KIRJOITUSKOMENTO movf POSTINC1,w movwf OHJAUSKASKY call KIRJOITUSKOMENTO movf POSTINC1,w movwf OHJAUSKASKY call KIRJOITUSKOMENTO movf POSTINC1,w movwf OHJAUSKASKY call KIRJOITUSKOMENTO movf POSTINC1,w movwf OHJAUSKASKY call KIRJOITUSKOMENTO movf POSTINC1,w movwf OHJAUSKASKY call KIRJOITUSKOMENTO movf POSTINC1,w movwf OHJAUSKASKY call KIRJOITUSKOMENTO movf POSTINC1,w movwf OHJAUSKASKY call KIRJOITUSKOMENTO movf POSTINC1,w movwf OHJAUSKASKY call KIRJOITUSKOMENTO movf POSTINC1,w movwf OHJAUSKASKY call KIRJOITUSKOMENTO movf POSTINC1,w movwf OHJAUSKASKY call KIRJOITUSKOMENTO movf POSTINC1,w movwf OHJAUSKASKY call KIRJOITUSKOMENTO movf POSTINC1,w movwf OHJAUSKASKY call KIRJOITUSKOMENTO movf POSTINC1,w movwf OHJAUSKASKY call KIRJOITUSKOMENTO movf POSTINC1,w movwf OHJAUSKASKY call KIRJOITUSKOMENTO movf POSTINC1,w 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 ;***************************************************************************** ;Viive tekstien näyttämiseen yms. KOLMESEKUNTTIA ;14999990 cycles movlw 0x87 movwf d1 movlw 0xB3 movwf d2 movlw 0x21 movwf d3 KOLMESEKUNTTIA_0 decfsz d1, f goto KOLMESEKUNTTIA_0 decfsz d2, f goto KOLMESEKUNTTIA_0 decfsz d3, f goto KOLMESEKUNTTIA_0 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 ;****************************************************************************** ;Sarjaportin eli RS232-väylän alustus ja muut siihen liittyvät aliohjelmat. ;****************************************************************************** ;Sarjaliikenne väylän alustus C-portin pinneissä RC6 = TX, RC7 = RX . ;Nopeus 1200b/s 20Mhz kiteellä. SARJALIIKENNEALUSTUS banksel BAUDCON clrf BAUDCON banksel SPBRG movlw 0xFF ;Alusta siirtonopeuden määrittävä arvo SPBRG rekisteriin.Tämä arvo toimii 20Mhz kiteellä jolloin nopeus on 1200 . movwf SPBRG ; banksel TXSTA movlw b'00100000' ;CSRC, TX9, TXEN, SYNC, SENDB, BRGH, TRMT, TX9D movwf TXSTA ;Siirrä TXSTA rekisteriin. banksel RCSTA movlw b'10010000' ;SPEN RX9 SREN CREN ADDEN FERR OERR RX9D movwf RCSTA ;Siirrä RCSTA rekisteriin. banksel PIE1 bcf PIE1,TXIE ;Jos halutaan lähetyksen keskeytys päälle niin aseta TXIE bitti ykköseksi PIE1 rekisterissä. bsf PIE1,RCIE ;Jos halutaan vastaanoton keskeytys päälle niin aseta RCIE bitti ykköseksi PIE1 rekisterissä. banksel INTCON bsf INTCON,PEIE ;Sallitaan keskeytys. bsf INTCON,GIE ;Sallitaan kaikki keskeytykset. ;Nollataan kaikki virheet pois. movff RCREG,TAVU ;Tyhjätään RCREG mahdollisesta turhasta tiedosta. movff RCREG,TAVU banksel RCSTA bcf RCSTA, CREN bsf RCSTA, CREN call RS232PUSKURIPOINTTERI return ;****************************************************************************** ;Lahetysaliohjelma. LAHETYS232 movf TAVU,W movwf TXREG ;Lataa 8 bittinen lähettettävä tavu TXREG rekisteriin w rekisterista.Ja lähetys alkaa. banksel TXSTA UUDESTAAN btfss TXSTA,TRMT ;odota kunnes TX puskuri on tyhjä.Eli TRMT lippu bitti menee ykköseksi. goto UUDESTAAN ;Ei ollut tyhjä.Palataan kohtaan UUDESTAAN. banksel PORTA return ;********************************************************************************* ;GSM-modulin AT-ohjauskomennot ja niihin liittyvät aliohjelmat. ;********************************************************************************* ;AT-komento, joka tulee yleensä aina ensin. AT movlw A'A' movwf TAVU call LAHETYS232 movlw A'T' movwf TAVU call LAHETYS232 return ;********************************************************************************* ;Return napin painallus. ;Tämä tulee jakaisen annetun AT-komennon jälkeen. RETUR movlw 0x0d ;cr movwf TAVU call LAHETYS232 movlw 0x0A ;lf movwf TAVU call LAHETYS232 return ;******************************************************************************* ;Saapuvan soiton numeron näyttö päälle. ;AT+CLIP=1 NUMERONAYTTO call AT movlw A'+' movwf TAVU call LAHETYS232 movlw A'C' movwf TAVU call LAHETYS232 movlw A'L' movwf TAVU call LAHETYS232 movlw A'I' movwf TAVU call LAHETYS232 movlw A'P' movwf TAVU call LAHETYS232 movlw A'=' movwf TAVU call LAHETYS232 movlw A'1' movwf TAVU call LAHETYS232 call RETUR call OKKUITTAUS decfsz VIRHE, f return goto NUMERONAYTTO ;******************************************************************************* ;GSM-modulilta tuleva OK-kuittaus annetun AT-komennon jälkeen. OKKUITTAUS movlw A'K' xorwf MERKKEJATULLUT,W ; btfss STATUS,Z ;Testataan Z lippu STATUS rekisteristä.Jos se on yksi merkki oli se mitä etsittiin. goto OKKUITTAUS call RS232PUSKURIPOINTTERI ;Alustetaan pointteri. movlw 0x1E ;Moduli kaiuttaa annetun AT-komennon yleensä ennen OK-kuittausta. movwf VIRHE ;Joten suodatetaan annettu AT-komento pois ensin. EIOIKEAKIRJAIN decfsz VIRHE, f goto TARKASTETAANKIRJAIN goto EILOYTYNYTOIKEITAKIRJAIMIA TARKASTETAANKIRJAIN movff POSTINC0,TAVU ; Ladataan data puskurista TAVU-rekisteriin. movlw A'O' xorwf TAVU,W ; btfss STATUS,Z ;Testataan Z lippu STATUS rekisteristä.Jos se on yksi merkki oli se mitä etsittiin. goto EIOIKEAKIRJAIN ;Ja kun O-kirjain tuli siirrytään etsimään K-kirjainta. movff POSTINC0,TAVU ; Ladataan data puskurista TAVU-rekisteriin. movlw A'K' xorwf TAVU,W ; btfss STATUS,Z ;Testataan Z lippu STATUS rekisteristä.Jos se on yksi merkki oli se mitä etsittiin. goto EIOIKEAKIRJAIN ;Tähän tullaan jos OK-kuittaus tuli oikein. movlw 0xFF ;Kun OK-kuittaus tuli oikein asetetaan VIRHE rekisteriin FF eli 255 kertomaan kuittauksen olleen oikein. movwf VIRHE ;Ja näin ollen aliohjelmassa, josta on kutusuttu tätä alaiohjelmaa voidaan tarkastaa tuliko OK-kuittausta. movlw A'E' ; movwf MERKKEJATULLUT return EILOYTYNYTOIKEITAKIRJAIMIA movlw 0x1 ;Jos OK-kuittausta ei tullut laitetaan VIRHE-rekisteriin luku 1 kertomaan kuittauksen epäonnistumisesta. movwf VIRHE ;Ja näin ollen aliohjelmassa, josta on kutusuttu tätä alaiohjelmaa voidaan tarkastaa tuliko OK-kuittausta. movlw A'E' ; movwf MERKKEJATULLUT return ;***************************************************************************** ;Testiviestin lähettämiseen tarvittavat AT-komennot. ;Tämä alustus tehdään aina ensin kun tekstiviestiä lähetetään tai luetaan. CMGF1 call AT movlw A'+' movwf TAVU call LAHETYS232 movlw A'C' movwf TAVU call LAHETYS232 movlw A'M' movwf TAVU call LAHETYS232 movlw A'G' movwf TAVU call LAHETYS232 movlw A'F' movwf TAVU call LAHETYS232 movlw A'=' movwf TAVU call LAHETYS232 movlw A'1' movwf TAVU call LAHETYS232 call RETUR call PUOLISEK ;Odotellaan lopuksi OK-kuittausta ennen jatkoa. call OKKUITTAUS return ;---------------------------------------------------- CMGS? call AT movlw A'+' movwf TAVU call LAHETYS232 movlw A'C' movwf TAVU call LAHETYS232 movlw A'M' movwf TAVU call LAHETYS232 movlw A'G' movwf TAVU call LAHETYS232 movlw A'S' movwf TAVU call LAHETYS232 movlw A'=' movwf TAVU call LAHETYS232 movlw A'?' movwf TAVU call LAHETYS232 call RETUR call PUOLISEK ;Odotellaan lopuksi OK-kuittausta ennen jatkoa. call OKKUITTAUS return ;---------------------------------------------------- PUHNUMERO ;Haetaan soittava numero, jonne tekstiviesti lähtee. movlw 0x64 movwf VAARATMERKIT call RS232PUSKURIPOINTTERI ; EKALAINAUSMERKKI movff POSTINC0,TAVU ;Ladataan RS-232 väylästä tulleet merkit tarkasteluun. ;Tarkastetaan täsmääkö "-merkit. movlw A'"' xorwf TAVU,W btfsc STATUS,Z goto EKALAINAUSMERKKITASMASI decfsz VAARATMERKIT, f ;Tällä estetään ikuiseen silmukkaan jääminen jos toista "-merkkiä ei löydykään jostain syystä. goto EKALAINAUSMERKKI return EKALAINAUSMERKKITASMASI movlw 0x30 movwf VAARATMERKIT TOKALAINAUSMERKKI movff POSTINC0,TAVU ;Ladataan RS-232 väylästä tulleet merkit tarkasteluun. ;Tarkastetaan täsmääkö "-merkit. movlw A'"' xorwf TAVU,W btfsc STATUS,Z return ;Myös viimeinen eli toinen "-merkki löytyi ja numero on annettu RS-232 väylään, eli voidaan poistua tästä aliohjelmasta. call LAHETYS232 ;Nyt tulee todennäköisesti puhelinnumero, joten lähetetään se RS-232 väylään. decfsz VAARATMERKIT, f ;Tällä estetään ikuiseen silmukkaan jääminen jos toista "-merkkiä ei löydykään jostain syystä. goto TOKALAINAUSMERKKI return ;Tokaa lainausmerkkiä ei löytynyt joten pois tästä aliohjelmasta. ;---------------------------------------------------- CMGSNUMERO call AT movlw A'+' movwf TAVU call LAHETYS232 movlw A'C' movwf TAVU call LAHETYS232 movlw A'M' movwf TAVU call LAHETYS232 movlw A'G' movwf TAVU call LAHETYS232 movlw A'S' movwf TAVU call LAHETYS232 movlw A'=' movwf TAVU call LAHETYS232 movlw A'"' movwf TAVU call LAHETYS232 call PUHNUMERO ;Annetaan numero jonne viesti lähetetään. movlw A'"' movwf TAVU call LAHETYS232 call RETUR call PUOLISEK ;Odotellaan lopuksi >-kuittausta ennen jatkoa, jonka jälkeen kirjoitetaan itse viesti. HAKAMERKINODOTUS call RS232PUSKURIPOINTTERI ;Alustetaan pointteri. movlw 0xC movwf d1 HAKAMERKINODOTUSLOOP2 decfsz d1, f goto HAKAMERKINODOTUSLOOP1 return HAKAMERKINODOTUSLOOP1 movff POSTINC0,TAVU ; Ladataan data puskurista TAVU-rekisteriin. movlw A'>' xorwf TAVU,W ; btfss STATUS,Z ;Testataan Z lippu STATUS rekisteristä.Jos se on yksi merkki oli se mitä etsittiin. goto HAKAMERKINODOTUSLOOP2 movlw A'E' ; movwf MERKKEJATULLUT return ;---------------------------------------------------- ;Itse tekstiviesti osuus tekstiviestissä. ;Ennen tähän aliohjelmaan tulo on pitänyt hakea sen taulun osoite, joka lähetetään ;Pointteri siirto. TAULUPOINTTERI movlw 0xC movwf d1 TEKSTIPOINTTERIKOHDALLE TBLRD*+ decfsz d1, f goto TEKSTIPOINTTERIKOHDALLE return KIRJOITAVIESTI TBLRD*+ ; Luetaan TABLAT-rekisteri ja lisätään osoitinta sen jälkeen. movff TABLAT, TAVU movlw A'<' xorwf TABLAT,W btfsc STATUS,Z ; Testataan Z lippu STATUS rekisteristä.Jos se on yksi merkki oli se mitä etsittiin. return call LAHETYS232 goto KIRJOITAVIESTI TEKSTIVIESTI call PUOLISEK ;Ennen viestiä pakko olla pieni viive, muuten ei toimi. call PUOLISEK ;Ennen viestiä pakko olla pieni viive, muuten ei toimi. call PUOLISEK ;Ennen viestiä pakko olla pieni viive, muuten ei toimi. call LAMPOTILATAULU ;Haetaan esimerkiksi tämän taulun osoite. Tämän voi poistaa kun taulu haetaan ennen tämän aliohjelman kutsumista. call TAULUPOINTTERI call KIRJOITAVIESTI movff ETUMERKKIC,TAVU call LAHETYS232 movff TUHANNETC,TAVU call LAHETYS232 movff SADATC,TAVU call LAHETYS232 movff KYMMENETC,TAVU call LAHETYS232 movff YKKOSETC,TAVU call LAHETYS232 movlw A'C' movwf TAVU call LAHETYS232 call PWMTAULU ;Haetaan esimerkiksi tämän taulun osoite. Tämän voi poistaa kun taulu haetaan ennen tämän aliohjelman kutsumista. call TAULUPOINTTERI call KIRJOITAVIESTI movff TUHANNETPWM,TAVU call LAHETYS232 movff SADATPWM,TAVU call LAHETYS232 movff KYMMENETPWM,TAVU call LAHETYS232 movlw A',' movwf TAVU call LAHETYS232 movff YKKOSETPWM,TAVU call LAHETYS232 movlw A'%' movwf TAVU call LAHETYS232 ;Lopuksi CTRL+Z call PUOLISEK movlw 0x1A ;CTRL+Z ascii-koodina movwf TAVU call LAHETYS232 call PUOLISEK ;Odotellaan loppukuittauksia. +CMGS: 0 ja OK:ta ;Odotellaan lopuksi OK-kuittausta ennen jatkoa. call OKKUITTAUS return ;---------------------------------------------------- TEKSTIVIESTILAHETYS ;Tekstiviestin lähetys. ;AT ;OK ;AT+CMGF=1 ;OK ;AT+CMGS=? ;OK ;AT+CMGS="0501234567" ;> Testiviesti kokeilu (Lopuksi Ctrl+Z) ;+CMGS: 0 ;OK call PUOLISEK call PUOLISEK call CMGF1 call CMGS? call CMGSNUMERO call TEKSTIVIESTI return ;------------------------------------------------------------------------------ ;ATA-komento, joka vastaa puheluun. ATA call AT movlw A'A' movwf TAVU call LAHETYS232 call RETUR call OKKUITTAUS decfsz VIRHE, f goto ATA return ;------------------------------------------------------------------------------ ;ATH-komento, joka katkaisee yhteyden. ATH call AT movlw A'H' movwf TAVU call LAHETYS232 call RETUR call OKKUITTAUS decfsz VIRHE, f goto ATH return ;------------------------------------------------------------------------------ ;***************************************************************************** ;RAM-muistin käsittely. ;********************************************************************************* ;Alustetaan RS232-väylän FSR0x RAM-muistin osoituspointteri. RS232PUSKURIPOINTTERI movlw 0x03 ; Asetetaan puskurin osoite. movwf PUSKURIOSOITEH movlw 0x00 movwf PUSKURIOSOITEL movff PUSKURIOSOITEH,FSR0H movff PUSKURIOSOITEL,FSR0L return ;****************************************************************************** ;Alustetaan LCD-näytön FSR0x RAM-muistin osoituspointteri. LCDPUSKURIPOINTTERI movlw 0x04 ; Asetetaan puskurin osoite. movwf LCDTAULUOSOITEH movlw 0x00 movwf LCDTAULUOSOITEL movff LCDTAULUOSOITEH,FSR1H movff LCDTAULUOSOITEL,FSR1L return ;****************************************************************************** ;Alustetaan vertailun FSR0x RAM-muistin osoituspointteri. VERTAILUPUSKURIPOINTTERI movlw 0x05 ; Asetetaan puskurin osoite. movwf VERTAILUTAULUOSOITEH movlw 0x00 movwf VERTAILUTAULUOSOITEL movff VERTAILUTAULUOSOITEH,FSR1H movff VERTAILUTAULUOSOITEL,FSR1L return ;****************************************************************************** ;Ennen tähän aliohjelmaan tuloa. On pitänyt käydä lukemassa kyseisen taulun osoite "call tauluosoite". ;Sieltä missä taulu sijaitsee. ;Lisäksi pitää hakea RAM-muistiin osoittava osoite jostakin näistä 3 aliohjelmasta RS232PUSKURIASETUS, LCDPUSKURIASETUS tai VERTAILUPUSKURIASETUS. ;Luetaan taulu RAM-muistiin. LCDPUSKURIIN call LCDPUSKURIPOINTTERI ;Haetaan RAM-muistin pointteri. movlw 0xC movwf d1 POINTTERIKOHDALLEEN TBLRD*+ decfsz d1, f goto POINTTERIKOHDALLEEN LUETAVU1 TBLRD*+ ; Luetaan TABLAT-rekisteri ja lisätään osoitinta sen jälkeen. ;movff TABLAT, TAVU movlw A'<' xorwf TABLAT,W btfsc STATUS,Z ; Testataan Z lippu STATUS rekisteristä.Jos se on yksi merkki oli se mitä etsittiin. return movff TABLAT,POSTINC1; Varastoidaan data bufferiin. goto LUETAVU1 return ;****************************************************************************** ;Vertaillaan puskureiden sisältöä. VERTAILE ;Estetään keskeytys RS-232 väylästä vertailun ajaksi, jotta vertailu ei menisi pieleen, kun väylästä tulisi puskuriin uusia merkkejä kesken vertailun. bcf PIE1,RCIE ;Jos halutaan vastaanoton keskeytys päälle niin aseta RCIE bitti ykköseksi PIE1 rekisterissä. ;Asetaan pointterit. call RS232PUSKURIPOINTTERI ; ;Sitten säädetään aikaisemmin annetun taulun pointteri kohdalleen. movlw 0xC movwf d1 POINTTERIKOHDALLEEN1 TBLRD*+ decfsz d1, f goto POINTTERIKOHDALLEEN1 ;Asetaan d1 rekisteri, jonka avulla kelataan yli väärät merkit. movlw 0x64 movwf VAARATMERKIT TBLRD*+ ;Luetaan TABLAT-rekisteri ja lisätään osoitinta sen jälkeen. movff TABLAT, TAVU ;Ladataan taulun eka merkki tarkasteluun. goto MERKKIEITASMAA ;Ja kohtaan MERKKIEITASMAA ensin. ;Voidaan aloittaa tarkastus. MERKKITASMAA movlw 0x1 movwf VAARATMERKIT ;Kun ensinmäinen merkki täsmäsi niin tähän rekisteriin yksi, koska seuraavat merkit pitää olla oikein tai puskurit ei täsmää. TBLRD*+ ;Luetaan TABLAT-rekisteri ja lisätään osoitinta sen jälkeen. movff TABLAT, TAVU ;Ladataan taulun eka merkki tarkasteluun. MERKKIEITASMAA movf POSTINC0,W ;Ladataan RS-232 väylästä tullut eka merkki tarkasteluun. ;Tarkastetaan täsmääkö merkit. xorwf TAVU,W btfsc STATUS,Z goto MERKKITASMAA ;Jos merkki täsmäsi niin oletetaan että loputkin täsmää. movlw A'/' xorwf TAVU,W btfsc STATUS,Z ;Testataan Z lippu STATUS rekisteristä.Jos se on yksi merkki oli se mitä etsittiin. goto KENOMERKKITASMAA ;Jos /-merkki ei täsmännyt niin jatketaan tarkastusta. decfsz VAARATMERKIT, f goto MERKKIEITASMAA movlw A'E' movwf VERTAILUTASMASI ;Sallitaan keskeytys RS-232 väylästä jälleen, kun vertailu on suoritettu. bsf PIE1,RCIE ;Jos halutaan vastaanoton keskeytys päälle niin aseta RCIE bitti ykköseksi PIE1 rekisterissä. return KENOMERKKITASMAA movlw A'K' movwf VERTAILUTASMASI ;Sallitaan keskeytys RS-232 väylästä jälleen, kun vertailu on suoritettu. bsf PIE1,RCIE ;Jos halutaan vastaanoton keskeytys päälle niin aseta RCIE bitti ykköseksi PIE1 rekisterissä. return ;****************************************************************************** ALUSTUKSET call LCDKAYNNISTYS ;Käynnistää näytön 4-bititillä ohjattavaksi. call ENSINMAISETKASKYTLCDLLE call ALUSTAKAAPPAUS call ALKULUKEMA call SARJALIIKENNEALUSTUS movlw 0x7 ;Käynnistys viiveen asettelu. movwf TEMP ; ;GSM-modulin alustus. ;Odotellaan ensin hetki Käynnistyy tekstiä näyttäen, että myös GSM-moduli ehtii käynnistyä. ;Muuten se ei vastaa AT-komentoihin OK:lla. ;Tehdään pieni animaation LCD-näytöön, jotta käynnistys mäyttäisi etenevän. KAYNNISTYY call KAYNNISTYYTAULU ;Haetaan tämän taulun osoite. call LCDPUSKURIIN ;Kirjoitetaan viesti RAM-muistiin. call NAYTTO_PAIVITYS1 ;Käydään päivittämässä LCD-näyttö. call PUOLISEK call KAYNNISTYY1TAULU ;Haetaan tämän taulun osoite. call LCDPUSKURIIN ;Kirjoitetaan viesti RAM-muistiin. call NAYTTO_PAIVITYS1 ;Käydään päivittämässä LCD-näyttö. call PUOLISEK call KAYNNISTYY2TAULU ;Haetaan tämän taulun osoite. call LCDPUSKURIIN ;Kirjoitetaan viesti RAM-muistiin. call NAYTTO_PAIVITYS1 ;Käydään päivittämässä LCD-näyttö. call PUOLISEK call KAYNNISTYY3TAULU ;Haetaan tämän taulun osoite. call LCDPUSKURIIN ;Kirjoitetaan viesti RAM-muistiin. call NAYTTO_PAIVITYS1 ;Käydään päivittämässä LCD-näyttö. call PUOLISEK decfsz TEMP, f goto KAYNNISTYY call AT call RETUR call OKKUITTAUS call NUMERONAYTTO 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 ;****************************************************************************** LUELAMPOTILA bcf INTCON, GIE ; Estä kaikki keskeytykset. ; Jos ei estettäisi ohjelma jää jumiin ekaan LOOPLÄMPÖ loppiin. ; Koska keskeytys estäisi timerin ympäri pyörähdyksen. call ALUSTAKAAPPAUS ;Estetään RS-232 linjan keskeytykset. banksel PIE1 bcf PIE1,TXIE ;Jos halutaan lähetyksen keskeytys pois päältä niin aseta TXIE bitti nollaksi PIE1 rekisterissä. bcf PIE1,RCIE ;Jos halutaan vastaanoton keskeytys pois päältä niin aseta RCIE bitti nollaksi PIE1 rekisterissä. LOOPLAMPO ;Annetaan timer1 pyörähtää ekan kerran ympäri. bsf T1CON,TMR1ON btfss PIR1, TMR1IF goto LOOPLAMPO 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 LOOPLAMPO movlw 0x00 xorwf PWMLIPUT,W btfss STATUS,Z goto PWM_NAYTTEENOTTO_ALKANUT movlw 0x06 xorwf PWMLIPUT,W btfsc STATUS,Z goto LOOPLAMPO ;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 ;Estetään lämpötilan aiheuttamat keskeytykset sen lukemisen jälkeen, jotta ne ei haittaa seuraavia aliohjelmia ja niiden keskeytyksiä. banksel PIE1 bcf PIE1,CCP1IE ;CCP1 pinnin nouseva reuna aktivoi myös keskeytyksen. banksel T1CON bcf T1CON,TMR1ON ;Pysäytetään timeri 1 pyöriminen. bcf PIR1, TMR1IF ;Resetoidaan timer1 yli pyörähtämisestä kertova lippubitti. banksel PIR1 bcf PIR1, T0IF ; Reset flag that indicates interrupt bsf INTCON, GIE ; Sallitaan kaikki keskeytykset. banksel PORTA return ;****************************************************************************** ;Pääohjelma MAIN call ALUSTUKSET clrf PWMLIPUT bcf INTCON,GIE ;Estetään kaikki keskeytykset. MAINLOOP call LUELAMPOTILA call SARJALIIKENNEALUSTUS call NAYTTO_PAIVITYS call PUOLISEK call NAYTTO_PAIVITYS call PUOLISEK call NAYTTO_PAIVITYS call PUOLISEK call NAYTTO_PAIVITYS call PUOLISEK call NAYTTO_PAIVITYS call PUOLISEK call NAYTTO_PAIVITYS call PUOLISEK ;Seuraavaksi tutkitaan mahdollisesti RS232-väylästä tulleet merkit. movlw A'K' xorwf MERKKEJATULLUT,W ; btfss STATUS,Z ;Testataan Z-lippu STATUS rekisteristä.Jos se on yksi merkki oli se mitä etsittiin. goto MAINLOOP call RINGTAULU call VERTAILE movlw A'K' xorwf VERTAILUTASMASI,W ; btfss STATUS,Z ;Testataan Z-lippu STATUS rekisteristä.Jos se on yksi merkki oli se mitä etsittiin. goto EIRINGIA ;Tulostetaan näyttöön "Saapuva etalukukysely..." teksti. call ETALUKUKYSELYTAULU ;Haetaan tämän taulun osoite. call LCDPUSKURIIN ;Kirjoitetaan viesti RAM-muistiin. call NAYTTO_PAIVITYS1 ;Käydään päivittämässä LCD-näyttö. call KOLMESEKUNTTIA call ATH ;Katkaistaan tuleva soitto siihen vastaamatta. ;Tulostetaan näyttöön "Tekstiviestin lahetys..." teksti. call TEKSTIVIESTITAULU ;Haetaan tämän taulun osoite. call LCDPUSKURIIN ;Kirjoitetaan viesti RAM-muistiin. call NAYTTO_PAIVITYS1 ;Käydään päivittämässä LCD-näyttö. ;Nyt alkaa itse tekstiviestin muodostus. call TEKSTIVIESTILAHETYS;Lähetetään PWM-suhde ja lämpötila etumerkin kanssa tekstiviestinä numeroon, joka soitti. call KOLMESEKUNTTIA ;Tulostetaan näyttöön "Tekstiviesti lahetetty." teksti. call LAHETETTYTAULU ;Haetaan tämän taulun osoite. call LCDPUSKURIIN ;Kirjoitetaan viesti RAM-muistiin. call NAYTTO_PAIVITYS1 ;Käydään päivittämässä LCD-näyttö. call KOLMESEKUNTTIA ;Tulostetaan näyttöön pelkkää tyhjää tekstiä LCD-näyttöön toiselle riville. ;call TYHJATAULU ;Haetaan tämän taulun osoite. ;call LCDPUSKURIIN ;Kirjoitetaan viesti RAM-muistiin. ;call NAYTTO_PAIVITYS1 ;Käydään päivittämässä LCD-näyttö. ;call KOLMESEKUNTTIA EIRINGIA movlw A'E' ; movwf MERKKEJATULLUT goto MAINLOOP ;****************************************************************************** ;End of program END