;Toimiva tallentava ja toistava valourku PWM:llä. 27.8.2008 ;****************************************************************************** ; This file is a basic code template for code generation * ; on the PIC16F88. This file contains the basic code building * ; blocks to build upon. * ; * ; Refer to the MPASM User's Guide for additional information on * ; features of the assembler. * ; * ; Refer to the respective data sheet for additional * ; information on the instruction set. * ; * ;****************************************************************************** ; * ; Filename: ad.asm * ; Date: * ; File Version: * ; * ; Author: * ; Company: * ; * ; * ;****************************************************************************** ; * ; Files required: P16F88.INC * ; * ;****************************************************************************** ; * ; Features of the 16F88: * ; * ; 1 10-bit PWM * ; 8 MHz Internal Oscillator * ; ICD support * ; 256 bytes of EEPROM data memory * ; Capture/Compare Module * ; * ;****************************************************************************** ; * ; Notes: * ; * ;****************************************************************************** ; * ; Revision History: * ; * ;****************************************************************************** ;------------------------------------------------------------------------------ ; PROCESSOR DECLARATION ;------------------------------------------------------------------------------ LIST p=16F88 ; list directive to define processor #INCLUDE ; processor specific variable definitions ;------------------------------------------------------------------------------ ; ; CONFIGURATION WORD SETUP ; ; The 'CONFIG' directive is used to embed the configuration word within the ; .asm file. The lables following the directive are located in the respective ; .inc file. See the data sheet for additional information on configuration ; word settings. ; ;------------------------------------------------------------------------------ __CONFIG _CONFIG1, _CP_OFF & _CCP1_RB3 & _DEBUG_OFF & _WRT_PROTECT_OFF & _CPD_OFF & _LVP_OFF & _BODEN_OFF & _MCLR_ON & _PWRTE_ON & _WDT_OFF & _XT_OSC __CONFIG _CONFIG2, _IESO_OFF & _FCMEN_OFF ;__CONFIG _CONFIG1, _CP_OFF & _CCP1_RB3 & _DEBUG_OFF & _WRT_PROTECT_OFF & _CPD_OFF & _LVP_OFF & _BODEN_OFF & _MCLR_ON & _PWRTE_ON & _WDT_OFF & _INTRC_IO ;__CONFIG _CONFIG2, _IESO_OFF & _FCMEN_OFF ;------------------------------------------------------------------------------ ; ; VARIABLE DEFINITIONS ; ; Available Data Memory divided into Bank 0 through Bank 3. Each Bank contains ; Special Function Registers and General Purpose Registers at the locations ; below: ; ; SFR GPR SHARED GPR's ; Bank 0 0x00-0x1F 0x20-0x6F 0x70-0x7F ; Bank 1 0x80-0x9F 0xA0-0xEF 0xF0-0xFF ; Bank 2 0x100-0x10F 0x110-0x16F 0x170-0x17F ; Bank 3 0x180-0x18F 0x190-0x1EF 0x1F0-0x1FF ; ;------------------------------------------------------------------------------ ;Program Configuration Register 1 ;__CONFIG _CONFIG1, _HS_OSC & _CP_OFF & _CCP1_RB3 & _DEBUG_OFF & _WRT_PROTECT_OFF & _CPD_ON & _LVP_ON & _BODEN_OFF & _MCLR_ON & _PWRTE_ON & _WDT_OFF ;Program Configuration Register 2 ;__CONFIG _CONFIG2, _IESO_OFF & _FCMEN_OFF cblock 0x20 ; Vapaa muisti alkaa osoitteesta 0x20 luku hexana. ;A/D-muuntimen rekistreitä. TEMP ; A/D-muuntimen väliaikaisrekisteri. ADL ; A/D-muunnos alintavu. ADH ; A/D-muunnos ylintavu. 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 ;PWM-suhteen rekisterit. YKKOSETPWM ;Näytön päivityksessä käytettävät rekisterit. KYMMENETPWM ; -||- SADATPWM ; -||- TUHANNETPWM ; -||- ;PWM talteen keräysrekisterit. ;Yhteen ja vähennyslaskun rekisterit operand_1 operand_2 operand_3 operand_4 accumulator_1 accumulator_2 accumulator_3 accumulator_4 operand_1t operand_2t operand_3t operand_4t accumulator_1t accumulator_2t accumulator_3t accumulator_4t KERROIN1 KERROIN2 LASKENTALIPUT TULOS ;***************************** ;LCD-NÄYTÖN REKISTEREITÄ. ;Tavalliset rekisterit: YKKOSET ;Näytön päivityksessä käytettävät rekisterit. KYMMENET ; -||- SADAT ; -||- TUHANNET ; -||- AYKKOSET ;Näytön ohjauksessa käytettävät apurekisterit rekisterit. AKYMMENET ; -||- ASADAT ; -||- ATUHANNET ; -||- VIIVE0 ;Kytkinvärähtelyn viiveen rekisterit. VIIVE1 ; -||- SAMA ;Lukeman tallennus ja näyttö rekistereitä. ETUMERKKI ;Etumerkki, jotta tiedetään lisättiinkö vai vähennettiinkö lukemaa. YKKOSETL ;Lukeman talletuksessa apuna käytettävät rekisterit. KYMMENETL ; -||- SADATL ; -||- TUHANNETL ; -||- AJASTUS ;Ajastus rekisteri jolla ajoitetaan tallennus tai tallennetun toimintaa. ;Lippurekisterit: YLIVUOTO ;Näytönohjauksen apuna käytettävä lippurekisteri.Ilmottamassa numeroiden 0-9 ylivuotamisesta. SEGMENTTI ;Näytön päivityksen ohjausreksiteri. Tämä rekisteri auttaa segmenttien himmenyksien poistossa. d1 d2 d3 ATIMER TIMER ;LCD-näytön ohjaus rekistereitä. ohjaustavu tavu tavuvarasto ;Flash-muistin kirjoitus ja luku rekisterit. ARRAY word_block ARVOK ;Flash muistiin kirjoittamisen ja lukemisen ARVO rekisteri ARVOM ;Flash muistiin kirjoittamisen ja lukemisen ARVO rekisteri FLASHLIPUT ;FLASH muistiin kirjoitus lippurekisteri FLASHERASOINTI ;FLASH-muistin käyttöprosenttia mittaavat rekisterit. MYKKOSET MKYMMENET MSADAT MNYKKOSET MNKYMMENET MNSADAT FLASHPROSENTTI ;Lisää aina kun tämä kuluu loppuun FLASH-muistia on kulunut 1%. endc ; Omien rekistereiden määrittely loppuu tähän. ADDR equ 0x110 ;Nämä rekisterit täytyy määritellä bank2:een VALUE equ 0x111 ;Koska näitä rekistereitä käyttää EEPROMI, jonka rekisterit toimii vain pankki 2:ssa. OSOITEK equ 0x112 ;osoitetieto korkein tavu OSOITEM equ 0x113 ;osoitetieto matalin tavu ; Example of using Shared Uninitialized Data Section INT_VAR UDATA_SHR W_TEMP RES 1 ; w register for context saving (ACCESS) STATUS_TEMP RES 1 ; status used for context saving (ACCESS) PCLATH_TEMP RES 1 ; variable used for context saving ; Example of using GPR Uninitialized Data GPR_VAR UDATA MYVAR1 RES 1 ; User variable placed by linker MYVAR2 RES 1 ; User variable placed by linker MYVAR3 RES 1 ; User variable placed by linker ;Laskennan ylivuodon lippubitti. LV_YLI equ 0 ;Ylivuoto yhteen tai vähennyslaskussa. ;LCD-näytön bitit. ;Bitit jotka tarvitaan LCD-näytön ohjailussa. E equ 1 RS equ 2 RW equ 0 ;Lippubitit: lippuy equ 0 ;Lippubitti kun laskurin ykköset vuotaa yli. lippuk equ 1 ;Lippubitti kun laskurin kymmenet vuotaa yli. lippus equ 2 ;Lippubitti kun laskurin sadat vuotaa yli. lipput equ 3 ;Lippubitti kun laskurin tuhannet vuotaa yli. SEG1 equ 2 ;7-Segmenttien ohjaus bitit jotka,tulee A portin pinneihin 0,1,2 ja 3. SEG2 equ 3 ; -||- SEG3 equ 0 ; -||- SEG4 equ 1 ; -||- SEG1OFF equ 6 ;7-Segmenttien ohjaus bitit jotka,tulee A portin pinneihin 0,1,2 ja 3. SEG2OFF equ 7 ;Näillä biteillä pidetään haluttu segmentti sammutettuna. SEG3OFF equ 4 ; -||- SEG4OFF equ 5 ; -||- ;FLASHLIPUT lippu rekisterin bitit. fraja equ 0 ;FLASHLIPUT rekisterin muistipaikan rajalle tulo lippu. alatavu equ 1 ;FLASHLIPUT rekisterin alatavu bitti. paatakirjoitus equ 2 ;FLASHLIPUT tällä päätetään kirjoitus. paatalukeminen equ 3 ;FLASHLIPUT tällä päätetään lukeminen. ;FLASH-muistin kirjoitus ja lukunapit. FLASHLUE equ 3 ; FLASHKIRJOITA equ 4 ; ;------------------------------------------------------------------------------ ; EEPROM INITIALIZATION ; ; The 16F88 has 256 bytes of non-volatile EEPROM, starting at address 0x2100 ; ;------------------------------------------------------------------------------ DATAEE CODE 0x2100 DE "jyrki.k@mbnet.fi" ; EEPROM-muistiin kirjoitus. ;------------------------------------------------------------------------------ ; RESET VECTOR ;------------------------------------------------------------------------------ RESET CODE 0x0000 ; processor reset vector pagesel MAIN GOTO PORTIT ; go to beginning of program ;------------------------------------------------------------------------------ ; INTERRUPT SERVICE ROUTINE ;------------------------------------------------------------------------------ INT_VECT CODE 0x0004 ; interrupt vector location ; Context saving for ISR MOVWF W_TEMP ; save off current W register contents MOVF STATUS,W ; move status register into W register MOVWF STATUS_TEMP ; save off contents of STATUS register MOVF PCLATH,W ; move pclath register into W register MOVWF PCLATH_TEMP ; save off contents of PCLATH register ;------------------------------------------------------------------------------ ; USER INTERRUPT SERVICE ROUTINE GOES HERE ;------------------------------------------------------------------------------ ;------------------------------------------------------------------------------ ; USER INTERRUPT SERVICE ROUTINE GOES HERE ;------------------------------------------------------------------------------ ; Restore context before returning from interrupt MOVF PCLATH_TEMP,W ; retrieve copy of PCLATH register MOVWF PCLATH ; restore pre-isr PCLATH register contents MOVF STATUS_TEMP,W ; retrieve copy of STATUS register MOVWF STATUS ; restore pre-isr STATUS register contents SWAPF W_TEMP,F SWAPF W_TEMP,W ; restore pre-isr W register contents RETFIE ; return from interrupt ;********************************************************************** ;*********************************Aliohjelma 7-segmentti näytönohjaus taulukko***************** ;Lisätään ohjelmalaskurin (PCL) arvoa w-rekisterin arvolla. Jolloinka hypätään johonkin ;retlw *x** kohtaan. Jossa ladataan taas w-rekisteriin siinä kohtaa oleva arvo. ;Ja jonka jälkeen palataan takaisin tästä aliohjelmasta. ;********************************************************************************************** TAULUKKO_SEG addwf PCL,f ;Lisätään PCL eli ohjelmalaskuriin w rekisterin arvo. ;Jonka jälkeen tapahtuukin hyppy johonkin alla olevista ;11 käskystä. Se mihinkä kohtaan hyppy kohdistuu. ;Niin siinä oleva arvo ladataan w rekisteriin. ;Ja sitten hypätään tästä aliohjelmasta pois. retlw A'0' ;Nro. 0 7-segmenttiin. retlw A'9' ;Nro. 9 7-segmenttiin. retlw A'8' ;Nro. 8 7-segmenttiin. retlw A'7' ;Nro. 7 7-segmenttiin. retlw A'6' ;Nro. 6 7-segmenttiin. retlw A'5' ;Nro. 5 7-segmenttiin. retlw A'4' ;Nro. 4 7-segmenttiin. retlw A'3' ;Nro. 3 7-segmenttiin. retlw A'2' ;Nro. 2 7-segmenttiin. retlw A'1' ;Nro. 1 7-segmenttiin. retlw A'0' ;Nro. 0 7-segmenttiin. ;************************************************************** ;Porttien suuntien määrittely. PORTIT BANKSEL TRISA movlw b'00000000' ; movwf TRISB ;portb = output kaikki pinnit. movlw b'00011001' ; movwf TRISA ;porta = output kaikki pinnit paitsi 0, joka on A/D-muuntimen sisääntulo ja muistiin kirjoitus nappien 3 ja 4 pinnit. ; bcf STATUS,RP0 ;-> BANK 0 bcf STATUS,RP1 ;-> BANK 0 BANKSEL PORTA goto MAIN ;**************************************************************** ;Alustukset, joita tarvitaan ohjelman alussa. ALUSTUS ;LCD-näytön ohjauksen alustus. clrf AYKKOSET ;Näytön ohjauksessa käytettävien apurekistereiden nollaus. clrf AKYMMENET ; -||- clrf ASADAT ; -||- clrf ATUHANNET ; -||- clrf YLIVUOTO ;Nollataan YLIVUOTO rekisteri myös varmuuden vuoksi. clrf SEGMENTTI ;Nollataan SEGMENTTI lippurekisteri. movlw A' ' ;Ladataan w rekisteriin tyhjä merkki. movwf ETUMERKKI ;Ladataan w rekisteri ETUMERKKI rekisteriin. movlw A'*' ;Ladataan w rekisteriin *. movwf YKKOSET ;Ladataan w rekisteri VIIVE1 rekisteriin. movlw A'*' ;Ladataan w rekisteriin *. movwf KYMMENET ;Ladataan w rekisteri KYMMENET rekisteriin. movlw A'*' ;Ladataan w rekisteriin *. movwf SADAT ;Ladataan w rekisteri SADAT rekisteriin. movlw A'*' ;Ladataan w rekisteriin *. movwf TUHANNET ;Ladataan w rekisteri TUHANNET rekisteriin. movlw 0xA ;Ladataan w rekisteriin luku 10 hexana A.NAYTON_OHJAUS aliohjelmaa varten. movwf AYKKOSET ;Ladataan arvo AYKKOSET rekisteriin. movlw 0xA ;Ladataan w rekisteriin luku 10 hexana A.NAYTON_OHJAUS aliohjelmaa varten. movwf AKYMMENET ;Ladataan arvo AKYMMENET rekisteriin. movlw 0xA ;Ladataan w rekisteriin luku 10 hexana A.NAYTON_OHJAUS aliohjelmaa varten. movwf ASADAT ;Ladataan arvo ASADAT rekisteriin. movlw 0xA ;Ladataan w rekisteriin luku 10 hexana A.NAYTON_OHJAUS aliohjelmaa varten. movwf ATUHANNET ;Ladataan arvo ATUHANNET rekisteriin. movlw 0xA ;Ladataan w rekisteriin luku 10 hexana A. movwf SAMA ;Ladataan arvo SAMA rekisteriin. movlw 0xA ;Ladataan w rekisteriin luku 10 hexana A.NAYTON_OHJAUS aliohjelmaa varten. movwf ATIMER ;Ladataan arvo AYKKOSET rekisteriin. movlw A'0' ;Ladataan w rekisteriin *. movwf TIMER ;Ladataan w rekisteri TUHANNET rekisteriin. clrf PORTB call ALUSTETAANLCD call ALUSTAPWM call ALUSTAAD RETURN ;********************************************************** ; setup ADC module for RA0 as an analog input, Fosc/32 conversion ; clock (20-Mhz), and internal Vdd/Vss Voltage Reference. ; ALUSTAAD bsf STATUS,RP0 ; select Bank 1 |B1 movlw b'00011001' ; |B1 movwf TRISA ; set RA0 pin as input ja RA3 ja 4 napeille. |B1 movlw b'00000001' ; set RA0/AN0 pin as analog and |B1 movwf ANSEL ; other 6 ANx pins as digital |B1 movlw b'01000000' ; ADSC2 clock source/2 |B1 movwf ADCON1 ; left justified, internal Vref |B1 bcf STATUS,RP0 ; select Bank 0 |B0 ; movlw b'01000000' ; Fosc/08, ch 0, ADC off ( 8-mhz) |B0 movlw b'10000000' ; Fosc/32, ch 0, ADC off (20-mhz) |B0 movwf ADCON0 ; |B0 return ;********************************************************************* ;Tämä aliohjlema alustaa PWM. ALUSTAPWM clrf T2CON clrf TMR2 clrf INTCON bsf STATUS,RP0 clrf PIE1 bcf STATUS,RP0 clrf PIR1 bsf STATUS,RP0 movlw 0xFF movwf PR2 ; compare with 255 bcf STATUS,RP0 movlw 0x00 movwf CCPR1L ;Tämä ohjaa toimintajaksoa. movlw 0x03; movwf T2CON ; prescaler 1:16 and postscaler 1:1 movlw 0x3C movwf CCP1CON ;Laitetaan PWM päälle. bsf T2CON,TMR2ON ; Timeri käyntiin. return ;********************************************************** ;Laskennan aliohjelmia. ;--------------------------------------------------------------- ;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. ;********************************************************** ;Itse jakolasku aliohjelma, jossa jaetaan rekistereiden accumulator_1, 2,3 ja 4 lukema. ;Rekistereiden operand_1, 2,3 ja 4 lukemalla. JAKOLASKU 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 ADL,w movwf accumulator_1 movf ADH,w movwf accumulator_2 ;movf PWMT1HH,w ;movwf accumulator_3 ;movf PWMT1HHH,w ;movwf accumulator_4 ;Siirretään T2 vähentäjä rekisteriin. incf operand_1 ;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 YLIEKAVAHENNYS VAHENNYSTA ;Tähän tullaan niin monta kertaa kuin vähennettävää riittää. ;call NAYTTO_OHJAUS ;call YLIVUOTO_ ;INCF TULOS call NAYTTO_OHJAUS_ETUNPERIN call add32t YLIEKAVAHENNYS btfss LASKENTALIPUT, LV_YLI call neg32add32 btfss LASKENTALIPUT, LV_YLI goto VAHENNYSTA ;goto NAYTTOON return ;******************************************************************** ;************************LCD-NÄYTÖN ALIOHJELMAT*********************** ;*********************************LCD-näytön alustukset, ohjaus yms aliohjelmat************************************** ;*************************************************************** ;Viiveet mitä tarvitaan LCD-moduulin ohjauksessa. ;*************************************************************** KYMMENENMS ;9993 cycles movlw 0xCE movwf d1 movlw 0x08 movwf d2 KYMMENENMS_0 decfsz d1, f goto $+2 decfsz d2, f goto KYMMENENMS_0 ;3 cycles goto $+1 nop ;4 cycles (including call) return ;*************************************************************** SATAUS ;94 cycles movlw 0x1F movwf d1 SATAUS_0 decfsz d1, f goto SATAUS_0 ;2 cycles goto $+1 ;4 cycles (including call) return ;*************************************************************** ALOITUSVIIVE ;4999993 cycles movlw 0x2C movwf d1 movlw 0xE7 movwf d2 movlw 0x0B movwf d3 ALOITUSVIIVE_0 decfsz d1, f goto $+2 decfsz d2, f goto $+2 decfsz d3, f goto ALOITUSVIIVE_0 ;3 cycles goto $+1 nop ;4 cycles (including call) return ;*************************************************************** LCDVARATTU clrf PORTB bsf STATUS,RP0 ;-> BANK 1 ;porttien bitit movlw b'11110000' ;Muutetaan B-portin bitit 4,5,6 ja 7 sisääntuloksi pollausta varten. movwf TRISB ; bcf STATUS,RP0 ;-> BANK 0 bcf STATUS,RP1 ;-> BANK 0 clrf ohjaustavu nop nop nop nop nop bsf ohjaustavu, RW ;Aseta bitti RW. movf ohjaustavu,W ;Ohjaustavu rekisteri w-rekisteriin. movwf PORTB ;Ladataan w-rekisteri B-porttiin. POLLAUS nop nop nop nop nop ;Ylimmät neljä bittiä joissa on tuo BF-lippu. bsf ohjaustavu, E ;Aseta bitti E. movf ohjaustavu,W ;Ohjaustavu rekisteri w-rekisteriin. movwf PORTB ;Ladataan w-rekisteri B-porttiin. nop nop nop nop nop btfss PORTB,7 ;Tarkastetaan onko bitti 7 nolla, jos ei ole niin hypätään seuraavn käskyn yli. goto MENINOLLAAN ;Hyppy kohtaan MENINOLLAAN. bcf ohjaustavu, E ;Nollaa bitti E. movf ohjaustavu,W ;Ohjaustavu rekisteri w-rekisteriin. movwf PORTB ;Ladataan w-rekisteri B-porttiin. ;Alimmant bititkin täytyy lukea, kunnes voidaan siirtyä lukemaan uudestaan ylimmät biti joissa on se BF-lippu. nop nop nop nop nop bsf ohjaustavu, E ;Aseta bitti E. movf ohjaustavu,W ;Ohjaustavu rekisteri w-rekisteriin. movwf PORTB ;Ladataan w-rekisteri B-porttiin. nop nop nop nop nop bcf ohjaustavu, E ;Nollaa bitti E. movf ohjaustavu,W ;Ohjaustavu rekisteri w-rekisteriin. movwf PORTB ;Ladataan w-rekisteri B-porttiin. nop nop nop nop nop goto POLLAUS bcf ohjaustavu, RW ;Aseta bitti RW. movf ohjaustavu,W ;Ohjaustavu rekisteri w-rekisteriin. movwf PORTB ;Ladataan w-rekisteri B-porttiin. goto POLLAUS MENINOLLAAN bcf ohjaustavu, E ;Nollaa bitti E. movf ohjaustavu,W ;Ohjaustavu rekisteri w-rekisteriin. movwf PORTB ;Ladataan w-rekisteri B-porttiin. nop nop nop nop nop bcf ohjaustavu, RW ;Aseta bitti RW. movf ohjaustavu,W ;Ohjaustavu rekisteri w-rekisteriin. movwf PORTB ;Ladataan w-rekisteri B-porttiin. bsf STATUS,RP0 ;-> BANK 1 ;porttien bitit movlw b'00000000' ;. movwf TRISB ; bcf STATUS,RP0 ;-> BANK 0 bcf STATUS,RP1 ;-> BANK 0 CALL SATAUS ;Kutsutaan lyhyt viive. clrf ohjaustavu clrf PORTB return ;*************************************************************** LCDKIRJOITUS movwf tavu movwf tavuvarasto swapf tavuvarasto ;Nollataan alimmat bitit pois, koska niissä sijaitsee B-portin kautta välitettävä LCD-modulin ohjausdata. bcf tavu,0 bcf tavu,1 bcf tavu,2 bcf tavu,3 bcf tavuvarasto,0 bcf tavuvarasto,1 bcf tavuvarasto,2 bcf tavuvarasto,3 ;Seuraavaksi ladataan merkki 4 bittisenä sisään LCD-moduliin. ;Aloitetaan ylimmistä 4 bitistä. bsf ohjaustavu, RS ;Aseta bitti RS. bsf tavu, RS ;Aseta bitti RS myös tavu rekisterissä, koska muuten tavu rekisteri pyyhkii LCD-modulin ohjaustiedot pois B-portista. bsf tavuvarasto, RS ;Aseta bitti RS myös tavuvarasto rekisterissä, koska muuten tavu rekisteri pyyhkii LCD-modulin ohjaustiedot pois B-portista kun kirjoitetaan neljä alinta bittiä. movf ohjaustavu,W ;Ohjaustavu rekisteri w-rekisteriin. movwf PORTB ;Ladataan w-rekisteri B-porttiin. bsf ohjaustavu, E ;Aseta bitti E. bsf tavu, E ;Aseta bitti E myös tavu rekisterissä, koska muuten tavu rekisteri pyyhkii LCD-modulin ohjaustiedot pois B-portista kun se siirretään B-porttiin. movf ohjaustavu,W ;Ohjaustavu rekisteri w-rekisteriin. movwf PORTB ;Ladataan w-rekisteri B-porttiin. movf tavu,W ;Tavu rekisteri w-rekisteriin. movwf PORTB ;Ladataan w-rekisteri B-porttiin. CALL SATAUS ;Kutsutaan lyhyt viive. bcf ohjaustavu, E ;Nollaa bitti E. bcf tavu, E ;Nollaa bitti E myös tavu rekisterissä, koska muuten tavu rekisteri pyyhkii LCD-modulin ohjaustiedot pois B-portista. movf tavu,W ;Tavu rekisteri w-rekisteriin. Näin siksi, että itse data ei pyyhkiytyisi pois B-portista jos E-bitti nollattaisi ohjaustavu rekisterillä. movwf PORTB ;Ladataan w-rekisteri B-porttiin. CALL SATAUS ;Kutsutaan lyhyt viive. ;Sitten alimmat neljä bittiä. bsf ohjaustavu, E ;Aseta bitti E. bsf tavuvarasto, E ;Aseta bitti E myös tavu rekisterissä, koska muuten tavu rekisteri pyyhkii LCD-modulin ohjaustiedot pois B-portista. movf ohjaustavu,W ;Ohjaustavu rekisteri w-rekisteriin. movwf PORTB ;Ladataan w-rekisteri B-porttiin. movf tavuvarasto,W ;Tavu rekisteri w-rekisteriin. movwf PORTB ;Ladataan w-rekisteri B-porttiin. CALL SATAUS ;Kutsutaan lyhyt viive. bcf ohjaustavu, E ;Nollaa bitti E. bcf tavuvarasto, E ;Nollaa bitti E myös tavu rekisterissä, koska muuten tavu rekisteri pyyhkii LCD-modulin ohjaustiedot pois B-portista. movf tavuvarasto,W ;Tavuvarasto rekisteri w-rekisteriin. Näin siksi, että itse data ei pyyhkiytyisi pois B-portista jos E-bitti nollattaisi ohjaustavu rekisterillä. movwf PORTB ;Ladataan w-rekisteri B-porttiin. bcf ohjaustavu, RS ;Aseta bitti RS. bcf tavuvarasto,RS ;Aseta bitti RS myös tavu rekisterissä, koska muuten tavu rekisteri pyyhkii LCD-modulin ohjaustiedot pois B-portista. movf ohjaustavu,W ;Ohjaustavu rekisteri w-rekisteriin. movwf PORTB ;Ladataan w-rekisteri B-porttiin. clrf tavu clrf tavuvarasto clrf ohjaustavu clrf PORTB return ;*************************************************************** ;Tämä aliohjelma laittaa 8 bittiset alustus komennot sisään 4 bitin paloissa aloittaen 4 ylimmästä bitistä. LCDALUSTUS movwf tavu movwf tavuvarasto swapf tavuvarasto ;Nollataan alimmat bitit pois, koska niissä sijaitsee B-portin kautta välitettävä LCD-modulin ohjausdata. bcf tavu,0 bcf tavu,1 bcf tavu,2 bcf tavu,3 bcf tavuvarasto,0 bcf tavuvarasto,1 bcf tavuvarasto,2 bcf tavuvarasto,3 ;Seuraavaksi ladataan merkki 4 bittisenä sisään LCD-moduliin. ;Aloitetaan ylimmistä 4 bitistä. bsf ohjaustavu, E ;Aseta bitti E. bsf tavu, E ;Aseta bitti E myös tavu rekisterissä, koska muuten tavu rekisteri pyyhkii LCD-modulin ohjaustiedot pois B-portista kun se siirretään B-porttiin. movf ohjaustavu,W ;Ohjaustavu rekisteri w-rekisteriin. movwf PORTB ;Ladataan w-rekisteri B-porttiin. movf tavu,W ;Tavu rekisteri w-rekisteriin. movwf PORTB ;Ladataan w-rekisteri B-porttiin. CALL SATAUS ;Kutsutaan lyhyt viive. bcf ohjaustavu, E ;Nollaa bitti E. bcf tavu, E ;Nollaa bitti E myös tavu rekisterissä, koska muuten tavu rekisteri pyyhkii LCD-modulin ohjaustiedot pois B-portista. movf tavu,W ;Tavu rekisteri w-rekisteriin. Näin siksi, että itse data ei pyyhkiytyisi pois B-portista jos E-bitti nollattaisi ohjaustavu rekisterillä. movwf PORTB ;Ladataan w-rekisteri B-porttiin. CALL SATAUS ;Kutsutaan lyhyt viive. ;Sitten alimmat neljä bittiä. bsf ohjaustavu, E ;Aseta bitti E. bsf tavuvarasto, E ;Aseta bitti E myös tavu rekisterissä, koska muuten tavu rekisteri pyyhkii LCD-modulin ohjaustiedot pois B-portista. movf ohjaustavu,W ;Ohjaustavu rekisteri w-rekisteriin. movwf PORTB ;Ladataan w-rekisteri B-porttiin. movf tavuvarasto,W ;Tavu rekisteri w-rekisteriin. movwf PORTB ;Ladataan w-rekisteri B-porttiin. CALL SATAUS ;Kutsutaan lyhyt viive. bcf ohjaustavu, E ;Nollaa bitti E. bcf tavuvarasto, E ;Nollaa bitti E myös tavu rekisterissä, koska muuten tavu rekisteri pyyhkii LCD-modulin ohjaustiedot pois B-portista. movf tavuvarasto,W ;Tavuvarasto rekisteri w-rekisteriin. Näin siksi, että itse data ei pyyhkiytyisi pois B-portista jos E-bitti nollattaisi ohjaustavu rekisterillä. movwf PORTB ;Ladataan w-rekisteri B-porttiin. clrf tavu clrf tavuvarasto clrf ohjaustavu return ;*************************************************************** ;Tällä aliohjelmalla alustetaan LCD-näyttö 4 bittisesti ohjattavaksi. ALUSTETAANLCD: movlw 0x03; ;Luku 3 ensin kolme kertaa ilman neljää alinta bittiä, movwf tavu swapf tavu ;Alimmat bitit ylimpiin bitteihin. ;Ensinmäinen kerta. bsf ohjaustavu, E ;Aseta bitti E. bsf tavu, E ;Aseta bitti E myös tavu rekisterissä, koska muuten tavu rekisteri pyyhkii LCD-modulin ohjaustiedot pois B-portista. movf ohjaustavu,W ;Ohjaustavu rekisteri w-rekisteriin. movwf PORTB ;Ladataan w-rekisteri B-porttiin. movf tavu,W ;Tavu rekisteri w-rekisteriin. movwf PORTB ;Ladataan w-rekisteri B-porttiin. CALL SATAUS ;Kutsutaan lyhyt viive. bcf ohjaustavu, E ;Nollaa bitti E. bcf tavu, E ;Nollaa bitti E myös tavu rekisterissä, koska muuten tavu rekisteri pyyhkii LCD-modulin ohjaustiedot pois B-portista. movf tavu,W ;Tavu rekisteri w-rekisteriin. Näin siksi, että itse data ei pyyhkiytyisi pois B-portista jos E-bitti nollattaisi ohjaustavu rekisterillä. movwf PORTB ;Ladataan w-rekisteri B-porttiin. call KYMMENENMS ;Odotetaan yli 4,1ms. ;Toinen kerta. bsf ohjaustavu, E ;Aseta bitti E. bsf tavu, E ;Aseta bitti E myös tavu rekisterissä, koska muuten tavu rekisteri pyyhkii LCD-modulin ohjaustiedot pois B-portista. movf ohjaustavu,W ;Ohjaustavu rekisteri w-rekisteriin. movwf PORTB ;Ladataan w-rekisteri B-porttiin. movf tavu,W ;Tavu rekisteri w-rekisteriin. movwf PORTB ;Ladataan w-rekisteri B-porttiin. CALL SATAUS ;Kutsutaan lyhyt viive. bcf ohjaustavu, E ;Nollaa bitti E. bcf tavu, E ;Nollaa bitti E myös tavu rekisterissä, koska muuten tavu rekisteri pyyhkii LCD-modulin ohjaustiedot pois B-portista. movf tavu,W ;Tavu rekisteri w-rekisteriin. Näin siksi, että itse data ei pyyhkiytyisi pois B-portista jos E-bitti nollattaisi ohjaustavu rekisterillä. movwf PORTB ;Ladataan w-rekisteri B-porttiin. CALL SATAUS ;Kolmas ja viimeinen kerta. bsf ohjaustavu, E ;Aseta bitti E. bsf tavu, E ;Aseta bitti E myös tavu rekisterissä, koska muuten tavu rekisteri pyyhkii LCD-modulin ohjaustiedot pois B-portista. movf ohjaustavu,W ;Ohjaustavu rekisteri w-rekisteriin. movwf PORTB ;Ladataan w-rekisteri B-porttiin. movf tavu,W ;Tavu rekisteri w-rekisteriin. movwf PORTB ;Ladataan w-rekisteri B-porttiin. CALL SATAUS ;Kutsutaan lyhyt viive. bcf ohjaustavu, E ;Nollaa bitti E. bcf tavu, E ;Nollaa bitti E myös tavu rekisterissä, koska muuten tavu rekisteri pyyhkii LCD-modulin ohjaustiedot pois B-portista. movf tavu,W ;Tavu rekisteri w-rekisteriin. Näin siksi, että itse data ei pyyhkiytyisi pois B-portista jos E-bitti nollattaisi ohjaustavu rekisterillä. movwf PORTB ;Ladataan w-rekisteri B-porttiin. CALL SATAUS ;Noin 100us. movlw 0x32; ; Tätä kohtaa ei ole 8 bittiseksi alustamisessa. call LCDALUSTUS call KYMMENENMS movlw 0x38; ; Tekstirivien määrä 2/1, 0=1 rivi ja 1=2 rivi näyttö, ; ja merkkikoko 10/7, 0=5x7 ja 1=5x10 pisteen matriisi. call LCDALUSTUS call KYMMENENMS ;Odotetaan ,että LCD-moduli kerkeää tehdä asetukset. movlw 0x08 ; Pimennetään näyttö. call LCDALUSTUS call KYMMENENMS ;Odotetaan ,että LCD-moduli kerkeää tehdä asetukset. movlw 0x01; ; Tyhjennetään näyttö. call LCDALUSTUS call KYMMENENMS ;Odotetaan ,että LCD-moduli kerkeää tehdä asetukset. movlw 0x06; ;Näytön merkkimuistin osoittimen asetukset. call LCDALUSTUS call KYMMENENMS ;Odotetaan ,että LCD-moduli kerkeää tehdä asetukset. movlw 0x0C; ; Modulin näyttö D=päälle(1) pois(0), kursori U=käytössä(1) pois(0), B=vilkutus käytössä(1) pois(0) call LCDALUSTUS call KYMMENENMS ;Odotetaan ,että LCD-moduli kerkeää tehdä asetukset. movlw 0x02; ; Siirretään kursori kotia. call LCDALUSTUS call KYMMENENMS ;Odotetaan ,että LCD-moduli kerkeää tehdä asetukset. return ;*************************************************************** ;Aloitusteksi. ALOITUSTEKSTI movlw 0x02; ; Kursori kotia. call LCDALUSTUS call LCDVARATTU ;Odotetaan LCDVARATTU aliohjelmassa ,että LCD-moduli kerkeää kirjoittaa . movlw A' ' call LCDKIRJOITUS call LCDVARATTU ;Odotetaan LCDVARATTU aliohjelmassa ,että LCD-moduli kerkeää kirjoittaa. movlw A' ' call LCDKIRJOITUS call LCDVARATTU ;Odotetaan LCDVARATTU aliohjelmassa ,että LCD-moduli kerkeää kirjoittaa. movlw A' ' call LCDKIRJOITUS call LCDVARATTU ;Odotetaan LCDVARATTU aliohjelmassa ,että LCD-moduli kerkeää kirjoittaa. movlw A' ' call LCDKIRJOITUS call LCDVARATTU ;Odotetaan LCDVARATTU aliohjelmassa ,että LCD-moduli kerkeää kirjoittaa. movlw A'V' call LCDKIRJOITUS call LCDVARATTU ;Odotetaan LCDVARATTU aliohjelmassa ,että LCD-moduli kerkeää kirjoittaa. movlw A'a' call LCDKIRJOITUS call LCDVARATTU ;Odotetaan LCDVARATTU aliohjelmassa ,että LCD-moduli kerkeää kirjoittaa. movlw A'l' call LCDKIRJOITUS call LCDVARATTU ;Odotetaan LCDVARATTU aliohjelmassa ,että LCD-moduli kerkeää kirjoittaa. movlw A'o' call LCDKIRJOITUS call LCDVARATTU ;Odotetaan LCDVARATTU aliohjelmassa ,että LCD-moduli kerkeää kirjoittaa. movlw A'u' call LCDKIRJOITUS call LCDVARATTU ;Odotetaan LCDVARATTU aliohjelmassa ,että LCD-moduli kerkeää kirjoittaa. movlw A'r' call LCDKIRJOITUS call LCDVARATTU ;Odotetaan LCDVARATTU aliohjelmassa ,että LCD-moduli kerkeää kirjoittaa. movlw A'k' call LCDKIRJOITUS call LCDVARATTU ;Odotetaan LCDVARATTU aliohjelmassa ,että LCD-moduli kerkeää kirjoittaa. movlw A'u' call LCDKIRJOITUS call LCDVARATTU ;Odotetaan LCDVARATTU aliohjelmassa ,että LCD-moduli kerkeää kirjoittaa. movlw A' ' call LCDKIRJOITUS call LCDVARATTU ;Odotetaan LCDVARATTU aliohjelmassa ,että LCD-moduli kerkeää kirjoittaa. movlw A' ' call LCDKIRJOITUS call LCDVARATTU ;Odotetaan LCDVARATTU aliohjelmassa ,että LCD-moduli kerkeää kirjoittaa. movlw A' ' call LCDKIRJOITUS call LCDVARATTU ;Odotetaan LCDVARATTU aliohjelmassa ,että LCD-moduli kerkeää kirjoittaa. movlw A' ' call LCDKIRJOITUS call LCDVARATTU ;Odotetaan LCDVARATTU aliohjelmassa ,että LCD-moduli kerkeää kirjoittaa. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; movlw 0xA8 ;LCD-näytön ohjaus toiselle riville call LCDALUSTUS call LCDVARATTU ;Odotetaan LCDVARATTU aliohjelmassa ,että LCD-moduli kerkeää kirjoittaa. movlw A'C' call LCDKIRJOITUS call LCDVARATTU ;Odotetaan LCDVARATTU aliohjelmassa ,että LCD-moduli kerkeää kirjoittaa. movlw A'o' call LCDKIRJOITUS call LCDVARATTU ;Odotetaan LCDVARATTU aliohjelmassa ,että LCD-moduli kerkeää kirjoittaa. movlw A'p' call LCDKIRJOITUS call LCDVARATTU ;Odotetaan LCDVARATTU aliohjelmassa ,että LCD-moduli kerkeää kirjoittaa. movlw A'y' call LCDKIRJOITUS call LCDVARATTU ;Odotetaan LCDVARATTU aliohjelmassa ,että LCD-moduli kerkeää kirjoittaa. movlw A'r' call LCDKIRJOITUS call LCDVARATTU ;Odotetaan LCDVARATTU aliohjelmassa ,että LCD-moduli kerkeää kirjoittaa. movlw A'i' call LCDKIRJOITUS call LCDVARATTU ;Odotetaan LCDVARATTU aliohjelmassa ,että LCD-moduli kerkeää kirjoittaa. movlw A'g' call LCDKIRJOITUS call LCDVARATTU ;Odotetaan LCDVARATTU aliohjelmassa ,että LCD-moduli kerkeää kirjoittaa. movlw A'h' call LCDKIRJOITUS call LCDVARATTU ;Odotetaan LCDVARATTU aliohjelmassa ,että LCD-moduli kerkeää kirjoittaa. movlw A't' call LCDKIRJOITUS call LCDVARATTU ;Odotetaan LCDVARATTU aliohjelmassa ,että LCD-moduli kerkeää kirjoittaa. movlw A' ' call LCDKIRJOITUS call LCDVARATTU ;Odotetaan LCDVARATTU aliohjelmassa ,että LCD-moduli kerkeää kirjoittaa. movlw A'J' call LCDKIRJOITUS call LCDVARATTU ;Odotetaan LCDVARATTU aliohjelmassa ,että LCD-moduli kerkeää kirjoittaa. movlw A'y' call LCDKIRJOITUS call LCDVARATTU ;Odotetaan LCDVARATTU aliohjelmassa ,että LCD-moduli kerkeää kirjoittaa. movlw A'r' call LCDKIRJOITUS call LCDVARATTU ;Odotetaan LCDVARATTU aliohjelmassa ,että LCD-moduli kerkeää kirjoittaa. movlw A'k' call LCDKIRJOITUS call LCDVARATTU ;Odotetaan LCDVARATTU aliohjelmassa ,että LCD-moduli kerkeää kirjoittaa. movlw A'i' call LCDKIRJOITUS call LCDVARATTU ;Odotetaan LCDVARATTU aliohjelmassa ,että LCD-moduli kerkeää kirjoittaa. movlw A' ' call LCDKIRJOITUS call LCDVARATTU ;Odotetaan LCDVARATTU aliohjelmassa ,että LCD-moduli kerkeää kirjoittaa. call ALOITUSVIIVE movlw 0xA8 ;LCD-näytön ohjaus toiselle riville call LCDALUSTUS call LCDVARATTU ;Odotetaan LCDVARATTU aliohjelmassa ,että LCD-moduli kerkeää kirjoittaa. movlw A'j' call LCDKIRJOITUS call LCDVARATTU ;Odotetaan LCDVARATTU aliohjelmassa ,että LCD-moduli kerkeää kirjoittaa. movlw A'y' call LCDKIRJOITUS call LCDVARATTU ;Odotetaan LCDVARATTU aliohjelmassa ,että LCD-moduli kerkeää kirjoittaa. movlw A'r' call LCDKIRJOITUS call LCDVARATTU ;Odotetaan LCDVARATTU aliohjelmassa ,että LCD-moduli kerkeää kirjoittaa. movlw A'k' call LCDKIRJOITUS call LCDVARATTU ;Odotetaan LCDVARATTU aliohjelmassa ,että LCD-moduli kerkeää kirjoittaa. movlw A'i' call LCDKIRJOITUS call LCDVARATTU ;Odotetaan LCDVARATTU aliohjelmassa ,että LCD-moduli kerkeää kirjoittaa. movlw A'.' call LCDKIRJOITUS call LCDVARATTU ;Odotetaan LCDVARATTU aliohjelmassa ,että LCD-moduli kerkeää kirjoittaa. movlw A'k' call LCDKIRJOITUS call LCDVARATTU ;Odotetaan LCDVARATTU aliohjelmassa ,että LCD-moduli kerkeää kirjoittaa. movlw A'@' call LCDKIRJOITUS call LCDVARATTU ;Odotetaan LCDVARATTU aliohjelmassa ,että LCD-moduli kerkeää kirjoittaa. movlw A'm' call LCDKIRJOITUS call LCDVARATTU ;Odotetaan LCDVARATTU aliohjelmassa ,että LCD-moduli kerkeää kirjoittaa. movlw A'b' call LCDKIRJOITUS call LCDVARATTU ;Odotetaan LCDVARATTU aliohjelmassa ,että LCD-moduli kerkeää kirjoittaa. movlw A'n' call LCDKIRJOITUS call LCDVARATTU ;Odotetaan LCDVARATTU aliohjelmassa ,että LCD-moduli kerkeää kirjoittaa. movlw A'e' call LCDKIRJOITUS call LCDVARATTU ;Odotetaan LCDVARATTU aliohjelmassa ,että LCD-moduli kerkeää kirjoittaa. movlw A't' call LCDKIRJOITUS call LCDVARATTU ;Odotetaan LCDVARATTU aliohjelmassa ,että LCD-moduli kerkeää kirjoittaa. movlw A'.' call LCDKIRJOITUS call LCDVARATTU ;Odotetaan LCDVARATTU aliohjelmassa ,että LCD-moduli kerkeää kirjoittaa. movlw A'f' call LCDKIRJOITUS call LCDVARATTU ;Odotetaan LCDVARATTU aliohjelmassa ,että LCD-moduli kerkeää kirjoittaa. movlw A'i' call LCDKIRJOITUS call LCDVARATTU ;Odotetaan LCDVARATTU aliohjelmassa ,että LCD-moduli kerkeää kirjoittaa. call ALOITUSVIIVE return ;*************************************************************** ;Tässä päivitetään näytön tekstit. NAYTTO_PAIVITYS movlw 0x02; ; Kursori kotia. call LCDALUSTUS call LCDVARATTU ;Odotetaan LCDVARATTU aliohjelmassa ,että LCD-moduli kerkeää kirjoittaa . ;Tämä kertoo LCD-näytössä haluttaessa monta kertaa timeri on pyörähtänyt ympäri. ;movf TIMER,W ;Rekisteri w-rekisteriin. ;call LCDKIRJOITUS ;call LCDVARATTU ;Odotetaan LCDVARATTU aliohjelmassa ,että LCD-moduli kerkeää kirjoittaa. movlw A'P' call LCDKIRJOITUS call LCDVARATTU ;Odotetaan LCDVARATTU aliohjelmassa ,että LCD-moduli kerkeää kirjoittaa. movlw A'W' call LCDKIRJOITUS call LCDVARATTU ;Odotetaan LCDVARATTU aliohjelmassa ,että LCD-moduli kerkeää kirjoittaa. movlw A'M' call LCDKIRJOITUS call LCDVARATTU ;Odotetaan LCDVARATTU aliohjelmassa ,että LCD-moduli kerkeää kirjoittaa. movf TUHANNETPWM,W ;Rekisteri w-rekisteriin. call LCDKIRJOITUS call LCDVARATTU ;Odotetaan LCDVARATTU aliohjelmassa ,että LCD-moduli kerkeää kirjoittaa. movf SADATPWM,W ;Rekisteri w-rekisteriin. call LCDKIRJOITUS call LCDVARATTU ;Odotetaan LCDVARATTU aliohjelmassa ,että LCD-moduli kerkeää kirjoittaa. movf KYMMENETPWM,W ;Rekisteri w-rekisteriin. call LCDKIRJOITUS call LCDVARATTU ;Odotetaan LCDVARATTU aliohjelmassa ,että LCD-moduli kerkeää kirjoittaa. movlw A',' call LCDKIRJOITUS call LCDVARATTU ;Odotetaan LCDVARATTU aliohjelmassa ,että LCD-moduli kerkeää kirjoittaa. movf YKKOSETPWM ,W ;Rekisteri w-rekisteriin. call LCDKIRJOITUS call LCDVARATTU ;Odotetaan LCDVARATTU aliohjelmassa ,että LCD-moduli kerkeää kirjoittaa. movlw A'%' call LCDKIRJOITUS call LCDVARATTU ;Odotetaan LCDVARATTU aliohjelmassa ,että LCD-moduli kerkeää kirjoittaa. movlw A'A' call LCDKIRJOITUS call LCDVARATTU ;Odotetaan LCDVARATTU aliohjelmassa ,että LCD-moduli kerkeää kirjoittaa. movlw A'/' call LCDKIRJOITUS call LCDVARATTU ;Odotetaan LCDVARATTU aliohjelmassa ,että LCD-moduli kerkeää kirjoittaa. movlw A'D' call LCDKIRJOITUS call LCDVARATTU ;Odotetaan LCDVARATTU aliohjelmassa ,että LCD-moduli kerkeää kirjoittaa. movf TUHANNET,W ;Rekisteri w-rekisteriin. call LCDKIRJOITUS call LCDVARATTU ;Odotetaan LCDVARATTU aliohjelmassa ,että LCD-moduli kerkeää kirjoittaa. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; movf SADAT,W ;Rekisteri w-rekisteriin. call LCDKIRJOITUS call LCDVARATTU ;Odotetaan LCDVARATTU aliohjelmassa ,että LCD-moduli kerkeää kirjoittaa. movf KYMMENET,W ;Rekisteri w-rekisteriin. call LCDKIRJOITUS call LCDVARATTU ;Odotetaan LCDVARATTU aliohjelmassa ,että LCD-moduli kerkeää kirjoittaa. movf YKKOSET,W ;Rekisteri w-rekisteriin. call LCDKIRJOITUS call LCDVARATTU ;Odotetaan LCDVARATTU aliohjelmassa ,että LCD-moduli kerkeää kirjoittaa. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; movlw 0xA8 ;LCD-näytön ohjaus toiselle riville call LCDALUSTUS call LCDVARATTU ;Odotetaan LCDVARATTU aliohjelmassa ,että LCD-moduli kerkeää kirjoittaa. movlw A'T' xorwf ETUMERKKI,W btfsc STATUS,Z goto TOISTETAANNAYTTO movlw A'K' xorwf ETUMERKKI,W btfsc STATUS,Z goto KIRJOITETAANNAYTTO NORMAALI movlw A'N' call LCDKIRJOITUS call LCDVARATTU ;Odotetaan LCDVARATTU aliohjelmassa ,että LCD-moduli kerkeää kirjoittaa. movlw A'o' call LCDKIRJOITUS call LCDVARATTU ;Odotetaan LCDVARATTU aliohjelmassa ,että LCD-moduli kerkeää kirjoittaa. movlw A'r' call LCDKIRJOITUS call LCDVARATTU ;Odotetaan LCDVARATTU aliohjelmassa ,että LCD-moduli kerkeää kirjoittaa. movlw A'm' call LCDKIRJOITUS call LCDVARATTU ;Odotetaan LCDVARATTU aliohjelmassa ,että LCD-moduli kerkeää kirjoittaa. movlw A'a' call LCDKIRJOITUS call LCDVARATTU ;Odotetaan LCDVARATTU aliohjelmassa ,että LCD-moduli kerkeää kirjoittaa. movlw A'a' call LCDKIRJOITUS call LCDVARATTU ;Odotetaan LCDVARATTU aliohjelmassa ,että LCD-moduli kerkeää kirjoittaa. movlw A'l' call LCDKIRJOITUS call LCDVARATTU ;Odotetaan LCDVARATTU aliohjelmassa ,että LCD-moduli kerkeää kirjoittaa. movlw A'i' call LCDKIRJOITUS call LCDVARATTU ;Odotetaan LCDVARATTU aliohjelmassa ,että LCD-moduli kerkeää kirjoittaa. movlw A' ' call LCDKIRJOITUS call LCDVARATTU ;Odotetaan LCDVARATTU aliohjelmassa ,että LCD-moduli kerkeää kirjoittaa. movlw A' ' call LCDKIRJOITUS call LCDVARATTU ;Odotetaan LCDVARATTU aliohjelmassa ,että LCD-moduli kerkeää kirjoittaa. movlw A' ' call LCDKIRJOITUS call LCDVARATTU ;Odotetaan LCDVARATTU aliohjelmassa ,että LCD-moduli kerkeää kirjoittaa. movlw A' ' call LCDKIRJOITUS call LCDVARATTU ;Odotetaan LCDVARATTU aliohjelmassa ,että LCD-moduli kerkeää kirjoittaa. movlw A' ' call LCDKIRJOITUS call LCDVARATTU ;Odotetaan LCDVARATTU aliohjelmassa ,että LCD-moduli kerkeää kirjoittaa. movlw A' ' call LCDKIRJOITUS call LCDVARATTU ;Odotetaan LCDVARATTU aliohjelmassa ,että LCD-moduli kerkeää kirjoittaa. movlw A' ' call LCDKIRJOITUS call LCDVARATTU ;Odotetaan LCDVARATTU aliohjelmassa ,että LCD-moduli kerkeää kirjoittaa. movlw A' ' call LCDKIRJOITUS call LCDVARATTU ;Odotetaan LCDVARATTU aliohjelmassa ,että LCD-moduli kerkeää kirjoittaa. return TOISTETAANNAYTTO movlw A'T' call LCDKIRJOITUS call LCDVARATTU ;Odotetaan LCDVARATTU aliohjelmassa ,että LCD-moduli kerkeää kirjoittaa. movlw A'o' call LCDKIRJOITUS call LCDVARATTU ;Odotetaan LCDVARATTU aliohjelmassa ,että LCD-moduli kerkeää kirjoittaa. movlw A'i' call LCDKIRJOITUS call LCDVARATTU ;Odotetaan LCDVARATTU aliohjelmassa ,että LCD-moduli kerkeää kirjoittaa. movlw A's' call LCDKIRJOITUS call LCDVARATTU ;Odotetaan LCDVARATTU aliohjelmassa ,että LCD-moduli kerkeää kirjoittaa. movlw A't' call LCDKIRJOITUS call LCDVARATTU ;Odotetaan LCDVARATTU aliohjelmassa ,että LCD-moduli kerkeää kirjoittaa. movlw A'e' call LCDKIRJOITUS call LCDVARATTU ;Odotetaan LCDVARATTU aliohjelmassa ,että LCD-moduli kerkeää kirjoittaa. movlw A't' call LCDKIRJOITUS call LCDVARATTU ;Odotetaan LCDVARATTU aliohjelmassa ,että LCD-moduli kerkeää kirjoittaa. movlw A'a' call LCDKIRJOITUS call LCDVARATTU ;Odotetaan LCDVARATTU aliohjelmassa ,että LCD-moduli kerkeää kirjoittaa. movlw A'a' call LCDKIRJOITUS call LCDVARATTU ;Odotetaan LCDVARATTU aliohjelmassa ,että LCD-moduli kerkeää kirjoittaa. movlw A'n' call LCDKIRJOITUS call LCDVARATTU ;Odotetaan LCDVARATTU aliohjelmassa ,että LCD-moduli kerkeää kirjoittaa. movlw A' ' call LCDKIRJOITUS call LCDVARATTU ;Odotetaan LCDVARATTU aliohjelmassa ,että LCD-moduli kerkeää kirjoittaa. movf MNSADAT,W call LCDKIRJOITUS call LCDVARATTU ;Odotetaan LCDVARATTU aliohjelmassa ,että LCD-moduli kerkeää kirjoittaa. movf MNKYMMENET,W call LCDKIRJOITUS call LCDVARATTU ;Odotetaan LCDVARATTU aliohjelmassa ,että LCD-moduli kerkeää kirjoittaa. movf MNYKKOSET,W call LCDKIRJOITUS call LCDVARATTU ;Odotetaan LCDVARATTU aliohjelmassa ,että LCD-moduli kerkeää kirjoittaa. movlw A'%' call LCDKIRJOITUS call LCDVARATTU ;Odotetaan LCDVARATTU aliohjelmassa ,että LCD-moduli kerkeää kirjoittaa. movlw A' ' call LCDKIRJOITUS call LCDVARATTU ;Odotetaan LCDVARATTU aliohjelmassa ,että LCD-moduli kerkeää kirjoittaa. return KIRJOITETAANNAYTTO movlw A'T' call LCDKIRJOITUS call LCDVARATTU ;Odotetaan LCDVARATTU aliohjelmassa ,että LCD-moduli kerkeää kirjoittaa. movlw A'a' call LCDKIRJOITUS call LCDVARATTU ;Odotetaan LCDVARATTU aliohjelmassa ,että LCD-moduli kerkeää kirjoittaa. movlw A'l' call LCDKIRJOITUS call LCDVARATTU ;Odotetaan LCDVARATTU aliohjelmassa ,että LCD-moduli kerkeää kirjoittaa. movlw A'l' call LCDKIRJOITUS call LCDVARATTU ;Odotetaan LCDVARATTU aliohjelmassa ,että LCD-moduli kerkeää kirjoittaa. movlw A'e' call LCDKIRJOITUS call LCDVARATTU ;Odotetaan LCDVARATTU aliohjelmassa ,että LCD-moduli kerkeää kirjoittaa. movlw A'n' call LCDKIRJOITUS call LCDVARATTU ;Odotetaan LCDVARATTU aliohjelmassa ,että LCD-moduli kerkeää kirjoittaa. movlw A't' call LCDKIRJOITUS call LCDVARATTU ;Odotetaan LCDVARATTU aliohjelmassa ,että LCD-moduli kerkeää kirjoittaa. movlw A'a' call LCDKIRJOITUS call LCDVARATTU ;Odotetaan LCDVARATTU aliohjelmassa ,että LCD-moduli kerkeää kirjoittaa. movlw A'a' call LCDKIRJOITUS call LCDVARATTU ;Odotetaan LCDVARATTU aliohjelmassa ,että LCD-moduli kerkeää kirjoittaa. movlw A' ' call LCDKIRJOITUS call LCDVARATTU ;Odotetaan LCDVARATTU aliohjelmassa ,että LCD-moduli kerkeää kirjoittaa. movf MNSADAT,W call LCDKIRJOITUS call LCDVARATTU ;Odotetaan LCDVARATTU aliohjelmassa ,että LCD-moduli kerkeää kirjoittaa. movf MNKYMMENET,W call LCDKIRJOITUS call LCDVARATTU ;Odotetaan LCDVARATTU aliohjelmassa ,että LCD-moduli kerkeää kirjoittaa. movf MNYKKOSET,W call LCDKIRJOITUS call LCDVARATTU ;Odotetaan LCDVARATTU aliohjelmassa ,että LCD-moduli kerkeää kirjoittaa. movlw A'%' call LCDKIRJOITUS call LCDVARATTU ;Odotetaan LCDVARATTU aliohjelmassa ,että LCD-moduli kerkeää kirjoittaa. movlw A' ' call LCDKIRJOITUS call LCDVARATTU ;Odotetaan LCDVARATTU aliohjelmassa ,että LCD-moduli kerkeää kirjoittaa. movlw A' ' call LCDKIRJOITUS call LCDVARATTU ;Odotetaan LCDVARATTU aliohjelmassa ,että LCD-moduli kerkeää kirjoittaa. return ;*********************************Laskurin alustus********************************************* ;Alustetaan laskurin näyttöön lukema 0000.Ja annetaan aloitus arvot NAYTON_OHJAUS aliohjelmalle. ;********************************************************************************************** ALUSTUSNAYTTO clrf AYKKOSET ;Näytön ohjauksessa käytettävien apurekistereiden nollaus. clrf AKYMMENET ; -||- clrf ASADAT ; -||- clrf ATUHANNET ; -||- clrf YLIVUOTO ;Nollataan YLIVUOTO rekisteri myös varmuuden vuoksi. clrf SEGMENTTI ;Nollataan SEGMENTTI lippurekisteri. movlw A' ' ;Ladataan w rekisteriin tyhjä merkki. movwf ETUMERKKI ;Ladataan w rekisteri ETUMERKKI rekisteriin. movlw A'*' ;Ladataan w rekisteriin *. movwf YKKOSET ;Ladataan w rekisteri VIIVE1 rekisteriin. movlw A'*' ;Ladataan w rekisteriin *. movwf KYMMENET ;Ladataan w rekisteri KYMMENET rekisteriin. movlw A'*' ;Ladataan w rekisteriin *. movwf SADAT ;Ladataan w rekisteri SADAT rekisteriin. movlw A'*' ;Ladataan w rekisteriin *. movwf TUHANNET ;Ladataan w rekisteri TUHANNET rekisteriin. movlw 0xA ;Ladataan w rekisteriin luku 10 hexana A.NAYTON_OHJAUS aliohjelmaa varten. movwf AYKKOSET ;Ladataan arvo AYKKOSET rekisteriin. movlw 0xA ;Ladataan w rekisteriin luku 10 hexana A.NAYTON_OHJAUS aliohjelmaa varten. movwf AKYMMENET ;Ladataan arvo AKYMMENET rekisteriin. movlw 0xA ;Ladataan w rekisteriin luku 10 hexana A.NAYTON_OHJAUS aliohjelmaa varten. movwf ASADAT ;Ladataan arvo ASADAT rekisteriin. movlw 0xA ;Ladataan w rekisteriin luku 10 hexana A.NAYTON_OHJAUS aliohjelmaa varten. movwf ATUHANNET ;Ladataan arvo ATUHANNET rekisteriin. movlw 0xA ;Ladataan w rekisteriin luku 10 hexana A. movwf SAMA ;Ladataan arvo SAMA rekisteriin. movlw 0xA ;Ladataan w rekisteriin luku 10 hexana A.NAYTON_OHJAUS aliohjelmaa varten. movwf ATIMER ;Ladataan arvo AYKKOSET rekisteriin. movlw A'0' ;Ladataan w rekisteriin *. movwf TIMER ;Ladataan w rekisteri TUHANNET rekisteriin. clrf PORTB call ALUSTETAANLCD return ;***************************Näytönohjaus aliohjelma******************************************** ;Näytönohjaus aliohjelmat jotka, päivittää uuden luvun näytönpäivitys aliohjelmalle. ;********************************************************************************************** NAYTTO_OHJAUS_ETUNPERIN ;movlw A'+' ;Ladataan w rekisteriin + merkki, koska lukemaa kasvatetaan. ;movwf ETUMERKKI ;Ladataan w rekisteri ETUMERKKI rekisteriin. decfsz AYKKOSET,f ;Vähennetään rekisteriä AYKKOSET.Jos meni nollaan hyppy seuraavan käskyn yli. return ;Rekisteri ei mennyt nollaan.Paluu tästä aliohjelmasta. clrf AYKKOSET ;Ylivuoto sattunut.Puhdistetaan rekisteri. movlw 0xA ;Ladataan w rekisteriin luku 10 hexana A. movwf AYKKOSET ;Ladataan w rekisterin arvo AYKKOSET rekisteriin. decfsz AKYMMENET,f ;Vähennetään rekisteriä AKYMMENET.Jos meni nollaan hyppy seuraavan käskyn yli. return ;Rekisteri ei mennyt nollaan.Paluu tästä aliohjelmasta. clrf AKYMMENET ;Ylivuoto sattunut.Puhdistetaan rekisteri. movlw 0xA ;Ladataan w rekisteriin luku 10 hexana A. movwf AKYMMENET ;Ladataan w rekisterin arvo AYKKOSET rekisteriin. decfsz ASADAT,f ;Vähennetään rekisteriä ASADAT.Jos meni nollaan hyppy seuraavan käskyn yli. return ;Rekisteri ei mennyt nollaan.Paluu tästä aliohjelmasta. clrf ASADAT ;Ylivuoto sattunut.Puhdistetaan rekisteri. movlw 0xA ;Ladataan w rekisteriin luku 10 hexana A. movwf ASADAT ;Ladataan w rekisterin arvo AYKKOSET rekisteriin. decfsz ATUHANNET,f ;Vähennetään rekisteriä ATUHANNET.Jos meni nollaan hyppy seuraavan käskyn yli. return ;Rekisteri ei mennyt nollaan.Paluu tästä aliohjelmasta. clrf ATUHANNET ;Ylivuoto sattunut.Puhdistetaan rekisteri. movlw 0xA ;Ladataan w rekisteriin luku 10 hexana A. movwf ATUHANNET ;Ladataan w rekisterin arvo AYKKOSET rekisteriin. return ;Paluu tästä aliohjelmasta. ;********************************************************************************************** ;FLASH-muistin käyttöprosentti. MUISTIPROSENTTI1 decfsz MYKKOSET,f ;Vähennetään rekisteriä AYKKOSET.Jos meni nollaan hyppy seuraavan käskyn yli. return ;Rekisteri ei mennyt nollaan.Paluu tästä aliohjelmasta. clrf MYKKOSET ;Ylivuoto sattunut.Puhdistetaan rekisteri. movlw 0xA ;Ladataan w rekisteriin luku 10 hexana A. movwf MYKKOSET ;Ladataan w rekisterin arvo AYKKOSET rekisteriin. decfsz MKYMMENET,f ;Vähennetään rekisteriä AKYMMENET.Jos meni nollaan hyppy seuraavan käskyn yli. return ;Rekisteri ei mennyt nollaan.Paluu tästä aliohjelmasta. clrf MKYMMENET ;Ylivuoto sattunut.Puhdistetaan rekisteri. movlw 0xA ;Ladataan w rekisteriin luku 10 hexana A. movwf MKYMMENET ;Ladataan w rekisterin arvo AYKKOSET rekisteriin. decfsz MSADAT,f ;Vähennetään rekisteriä ASADAT.Jos meni nollaan hyppy seuraavan käskyn yli. return ;Rekisteri ei mennyt nollaan.Paluu tästä aliohjelmasta. clrf MSADAT ;Ylivuoto sattunut.Puhdistetaan rekisteri. movlw 0xA ;Ladataan w rekisteriin luku 10 hexana A. movwf MSADAT ;Ladataan w rekisterin arvo AYKKOSET rekisteriin. return ;Paluu tästä aliohjelmasta. ;********************************************************************************************** ;Tällä aliohjelmalla haetaan merkit taulukosta. HAE_MUISTIPROSENTTI movf MYKKOSET,w ;Siirretään rekisterin AYKKOSET arvo w rekisteriin. call TAULUKKO_SEG ;Kutsutaan TAULUKKO_SEG aliohjelmaa tästä aliohjelmasta. movwf MNYKKOSET ;Ladataan nyt TAULUKKO_SEG aliohjelmasta w rekisteriin saatu ;arvo YKKOSET rekisteriin. movf MKYMMENET,w ;Siirretään rekisterin AKYMMENET arvo w rekisteriin. call TAULUKKO_SEG ;Kutsutaan TAULUKKO_SEG aliohjelmaa tästä aliohjelmasta. movwf MNKYMMENET ;Ladataan nyt TAULUKKO_SEG aliohjelmasta w rekisteriin saatu ;arvo KYMMENET rekisteriin. movf MSADAT,w ;Siirretään rekisterin ASADAT arvo w rekisteriin. call TAULUKKO_SEG ;Kutsutaan TAULUKKO_SEG aliohjelmaa tästä aliohjelmasta. movwf MNSADAT ;Ladataan nyt TAULUKKO_SEG aliohjelmasta w rekisteriin saatu ;arvo SADAT rekisteriin. return ;********************************************************************************************** ;Tällä aliohjelmalla haetaan merkit taulukosta. HAE_UUSI_LUKU movf AYKKOSET,w ;Siirretään rekisterin AYKKOSET arvo w rekisteriin. call TAULUKKO_SEG ;Kutsutaan TAULUKKO_SEG aliohjelmaa tästä aliohjelmasta. movwf YKKOSET ;Ladataan nyt TAULUKKO_SEG aliohjelmasta w rekisteriin saatu ;arvo YKKOSET rekisteriin. movf AKYMMENET,w ;Siirretään rekisterin AKYMMENET arvo w rekisteriin. call TAULUKKO_SEG ;Kutsutaan TAULUKKO_SEG aliohjelmaa tästä aliohjelmasta. movwf KYMMENET ;Ladataan nyt TAULUKKO_SEG aliohjelmasta w rekisteriin saatu ;arvo KYMMENET rekisteriin. movf ASADAT,w ;Siirretään rekisterin ASADAT arvo w rekisteriin. call TAULUKKO_SEG ;Kutsutaan TAULUKKO_SEG aliohjelmaa tästä aliohjelmasta. movwf SADAT ;Ladataan nyt TAULUKKO_SEG aliohjelmasta w rekisteriin saatu ;arvo SADAT rekisteriin. movf ATUHANNET,w ;Siirretään rekisterin ATUHANNET arvo w rekisteriin. call TAULUKKO_SEG ;Kutsutaan TAULUKKO_SEG aliohjelmaa tästä aliohjelmasta. movwf TUHANNET ;Ladataan nyt TAULUKKO_SEG aliohjelmasta w rekisteriin saatu ;arvo TUHANNET rekisteriin. return ;***************************************************************************** ADVIIVE ;9993 cycles movlw 0xCE movwf d1 movlw 0x08 movwf d2 ADVIIVE_0 decfsz d1, f goto $+2 decfsz d2, f goto ADVIIVE_0 ;3 cycles goto $+1 nop ;4 cycles (including call) return ;********************************************************************************************** ;Tällä aliohjelmalla haetaan merkit taulukosta. HAE_UUSI_LUKU_PWM ;Haetaan PWM luku talteen. movf AYKKOSET,w ;Siirretään rekisterin AYKKOSET arvo w rekisteriin. call TAULUKKO_SEG ;Kutsutaan TAULUKKO_SEG aliohjelmaa tästä aliohjelmasta. movwf YKKOSETPWM ;Ladataan nyt TAULUKKO_SEG aliohjelmasta w rekisteriin saatu ;arvo YKKOSET rekisteriin. movf AKYMMENET,w ;Siirretään rekisterin AKYMMENET arvo w rekisteriin. call TAULUKKO_SEG ;Kutsutaan TAULUKKO_SEG aliohjelmaa tästä aliohjelmasta. movwf KYMMENETPWM ;Ladataan nyt TAULUKKO_SEG aliohjelmasta w rekisteriin saatu ;arvo KYMMENET rekisteriin. movf ASADAT,w ;Siirretään rekisterin ASADAT arvo w rekisteriin. call TAULUKKO_SEG ;Kutsutaan TAULUKKO_SEG aliohjelmaa tästä aliohjelmasta. movwf SADATPWM ;Ladataan nyt TAULUKKO_SEG aliohjelmasta w rekisteriin saatu ;arvo SADAT rekisteriin. movf ATUHANNET,w ;Siirretään rekisterin ATUHANNET arvo w rekisteriin. call TAULUKKO_SEG ;Kutsutaan TAULUKKO_SEG aliohjelmaa tästä aliohjelmasta. movwf TUHANNETPWM ;Ladataan nyt TAULUKKO_SEG aliohjelmasta w rekisteriin saatu ;arvo TUHANNET rekisteriin. return ;**************************************************************************************** ;Muokataan PWM-näyte siihen kuntoon, että siittä voidaan laskea PWM-suhde. PWM_NAYTTEEN_MUOKKAUS ;Siirretään saatu tulos nyt operand_1 ja operand_2 rekisterihin kertomista varten. movf ADL,w movwf operand_1 movf ADH,w movwf operand_2 clrf operand_3 clrf operand_4 clrf accumulator_1 clrf accumulator_2 clrf accumulator_3 clrf accumulator_4 ;Suoritetaan kertominen 1000. MOVLW 0x63 MOVWF KERROIN1 MOVLW 0xA 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. clrf PWMT1L clrf PWMT1H clrf PWMT1HH clrf PWMT1HHH movf accumulator_1,w movwf PWMT1L movf accumulator_2,w movwf PWMT1H movf accumulator_3,w movwf PWMT1HH movf accumulator_4,w movwf PWMT1HHH ;Kaikki on nyt valmista PWM-suhteen laskemista varten. return ;********************************************************** ;Itse jakolasku aliohjelma PWMSUHTEELLE, 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 ;Ladataan T2 vähentäjä rekisteriin 1024. movlw d'255' movwf operand_1 movlw d'3' movwf operand_2 call neg32 ;Muunnetaan vähentäjä goto YLIEKAVAHENNYSPWM VAHENNYSTAPWM call NAYTTO_OHJAUS_ETUNPERIN OHIPWM call add32t YLIEKAVAHENNYSPWM btfss LASKENTALIPUT, LV_YLI call neg32add32 btfss LASKENTALIPUT, LV_YLI goto VAHENNYSTAPWM return ;****************************************************************************** ;Noudetaan LCD-näytöllä näytettävän datan tarvitsema tieto laskennalle:lle sopivassa järjestyksessä ADCON1 rekisterin ADFM bitin avulla. ; turn on the ADC module, take a reading, return with 8 most ; signigicant bits of reading in W ADLTALLASKENTAAN banksel ADCON1 bsf ADCON1,ADFM ; banksel ADCON0 ADC1 bsf ADCON0,ADON ; turn on AD module |B0 bcf PIR1,ADIF ; clear AD interrupt flag |B0 movlw d'33' ; use 33 (20 mhz) or 13 (8 mhz) |B0 movwf TEMP ; |B0 ACQ1 decfsz TEMP,F ; wait 20 usec to acquire |B0 goto ACQ1 ; |B0 bsf ADCON0,GO_DONE ; start conversion |B0 ADX1 btfsc ADCON0,GO_DONE ; conversion complete? |B0 goto ADX1 ; no, loop |B0 banksel ADRESL nop nop nop nop nop movf ADRESL,W ; get result low byte |B0 banksel ADRESH movwf ADL ;call ADVIIVE movf ADRESH,W ; get result high byte |B0 movwf ADH bcf ADCON0,ADON ; turn off AD module |B0 return ;****************************************************************************** ;Flash-muistiin kirjoitus aliohjelma. ;FLASH muistiin kirjoitus aliohjelma ;OSOITEK osoitetieto korkein tavu ;OSOITEM osoitetieto matalin tavu ;ARVOK tieto osotteesta korkein tavu ;ARVOM tieto osotteesta matalin tavu FLASHK ; This write routine assumes the following: ; 1. The 32 words in the erase block have already been erased. ; 2. A valid starting address (the least significant bits = '00') is loaded into EEADRH:EEADR ; 3. This example is starting at 0x100, this is an application dependent setting. ; 4. The 8 bytes (4 words) of data are loaded, starting at an address in RAM called ARRAY. ; 5. This is an example only, location of data to program is application dependent. ; 6. word_block is located in data memory. BCF INTCON,GIE ;enable interrupts BANKSEL EECON1 ;prepare for WRITE procedure BSF EECON1,EEPGD ;point to program memory BSF EECON1,WREN ;allow write cycles BCF EECON1, FREE ;perform write only BANKSEL word_block MOVLW .4 MOVWF word_block ;prepare for 4 words to be written BANKSEL EEADRH ;Start writing at 0x100 MOVF OSOITEK,W MOVWF EEADRH ;load HIGH address MOVF OSOITEM,W MOVWF EEADR ;load LOW address ;BANKSEL ARRAY ;MOVLW ARRAY ;initialize FSR to start of data MOVLW 0xA0 ;initialize pointer MOVWF FSR ;to RAM LOOPF MOVF INDF,W ;indirectly load EEDATA BANKSEL EEDATA MOVWF EEDATA INCF FSR,F ;increment data pointer ;BANKSEL ARVOK ;MOVF ARVOK,W ;indirectly load EEDATA ;BANKSEL EEDATA ;MOVWF EEDATA ;INCF FSR,F ;increment data pointer MOVF INDF,W ;indirectly load EEDATA BANKSEL ARVOM MOVWF ARVOM SWAPF ARVOM ;Swapataan tämä, että se mahtuisi 3F kokoisen tilaan. MOVF ARVOM,W ;indirectly load EEDATH SWAPF ARVOM ;Swapataan tämä takaisin, koska sitä tarvitaan vielä. BANKSEL EEDATH MOVWF EEDATH INCF FSR,F ;increment data pointer ;BANKSEL ARVOM ;SWAPF ARVOM ;Swapataan tämä, että se mahtuisi 3F kokoisen tilaan. ;MOVF ARVOM,W ;indirectly load EEDATH ;SWAPF ARVOM ;Swapataan tämä takaisin, koska sitä tarvitaan vielä. ;BANKSEL EEDATH ;MOVWF EEDATH ;INCF FSR,F ;increment data pointer BANKSEL EECON2 MOVLW 0x55 ;required sequence MOVWF EECON2 MOVLW 0xAA MOVWF EECON2 BSF EECON1,WR ;set WR bit to begin write NOP ;instructions here are ignored as processor NOP NOP NOP NOP NOP NOP ;call FLASHMUISTI BANKSEL EEADR INCFSZ EEADR,f ;load next word address goto FJ INCF EEADRH,f FJ BANKSEL word_block DECFSZ word_block,f ;have 4 words been written? GOTO LOOPF ;NO, continue with writing ;call FLASHMUISTI ;call FLASH_INIT BANKSEL EECON1 BCF EECON1,WREN ;YES, 4 words complete, disable writes BCF INTCON,GIE ;enable interrupts ;DECFSZ FLASHERASOINTI,f ;return ;call FLASHMUISTI ;call FLASH_INIT ;MOVLW 0x08 ; ;MOVWF FLASHERASOINTI return ;****************************************************************************** ;Luetaan FLASH-muistia FLASHL BANKSEL EEADRH ; Select Bank of EEADRH MOVF OSOITEK,W MOVWF EEADRH ; MS Byte of Program ; Address to read MOVF OSOITEM,W MOVWF EEADR ; LS Byte of Program ; Address to read BANKSEL EECON1 ; Select Bank of EECON1 BSF EECON1, EEPGD ; Point to PROGRAM ; memory BSF EECON1, RD ; EE Read ; NOP ; Any instructions ; here are ignored as NOP ; program memory is ; read in second cycle ; after BSF EECON1,RD BANKSEL EEDATA ; Select Bank of EEDATA MOVF EEDATA, W ; DATAL = EEDATA BANKSEL ARVOM MOVWF ARVOM ; BANKSEL EEDATH MOVF EEDATH, W ; DATAH = EEDATH BANKSEL ARVOK MOVWF ARVOK ; ;SWAPF ARVOM ;Swapataan tämä, koska tallennettaessa sitä FLASH muistiin se olisi mahtunut 3F kokoisen tilaan ilman swappausta. RETURN ;************************************************************************************* FLASHERASOIDAAN ;Erasoidaan muisti ennen uutta kirjoitusta. call FLASHALUSTUS BANKSEL OSOITEM ;Pankkiin jossa sijaitsee OSOITEK rekisteri. MOVF OSOITEM,W BANKSEL EEADR MOVWF EEADR BANKSEL OSOITEK MOVF OSOITEK,W BANKSEL EEADRH MOVWF EEADRH GOTO TAHANALUSTUKSISTA UUDELLEENALUSTUS BANKSEL PORTA ;Takaisin pankkiin 0 movlw 0x21 ;Ladataan korkeimpaan muistipaikan osoitus rekisteriin luku movwf FLASHERASOINTI ;josta aletaan täyttää muistia.Tämä siksi ettei mennä POINTTERINSIIRTO32 call FLASHMUISTI BANKSEL EEADR INCFSZ EEADR,f ;load next word address goto PS BANKSEL EEADRH INCF EEADRH,f PS banksel FLASHERASOINTI DECFSZ FLASHERASOINTI,f goto POINTTERINSIIRTO32 TAHANALUSTUKSISTA ;Itse erasointi, kun pointteria on siirretty 32krt. Ja sen jälkeen uudestaan alustus, jollei FLASMUISTI fraja-bitti ole mennyt ykköseksi. NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP banksel FLASHLIPUT btfss FLASHLIPUT,fraja call FLASHERASE;FLASH_INIT banksel FLASHLIPUT btfss FLASHLIPUT,fraja goto UUDELLEENALUSTUS BANKSEL EECON1 ; Select Bank of EECON1 BCF EECON1, FREE ;perform write only return ;****************************************************************************** FLASHALUSTUS BANKSEL OSOITEK ;Pankkiin jossa sijaitsee OSOITEK rekisteri. clrf OSOITEK ; osoitetieto korkein tavu movlw 0x06 ;Ladataan korkeimpaan muistipaikan osoitus rekisteriin luku movwf OSOITEK ;josta aletaan täyttää muistia.Tämä siksi ettei mennä ;vahingossa itse ohjelmakoodin alueelle. movlw 0x68 movwf OSOITEM ;clrf OSOITEM ;nollataan osoitetieto matalin tavu BANKSEL PORTA ;Takaisin pankkiin 0 clrf ARVOK ;nollataan myös tiedon säilytys tavut korkea clrf ARVOM ;ja matala clrf FLASHLIPUT; return ;***************************************************************************************** ;Tallennus muistipaikan osoitus flash muistissa.Eli kun tätä aliohjelma koodia kutsutaan ;lisätään osoitusta +1 FLASHMUISTI BANKSEL OSOITEK ; Select Bank incfsz OSOITEM,f goto FLASHPALUU incf OSOITEK,f movlw 0x0F ;Ladataan w rekisteriin korkeimpaan muistipaikan osoituspaikan korkein ;sallittu paikka. xorwf OSOITEK,W ;Katsotaan onko OSOITEK rekisterin sisältö sama kuin w rekisterin sisältö. btfss STATUS,Z ;Testataan Z lippu STATUS rekisteristä.Jos se on yksi sisältö oli sama. goto FLASHPALUU ;Korkein muistipaikka ei ole vielä raja-arvossa. BANKSEL PORTA ;Select Bank bsf FLASHLIPUT,fraja;Korkein muistipaikka on raja-arvossaan.Laitetaan fraja lippu 1:si FLASHPALUU BANKSEL PORTA ; Select Bank return ;****************************************************************************** ; Noudetaan PWM:lle AD-muuntimelta arvo. PWM:lle sopivassa järjestyksessä ADCON1 rekisterin ADFM bitin avulla. ; turn on the ADC module, take a reading, return with 8 most ; signigicant bits of reading in W ADLTAPWMLLE banksel ADCON1 bcf ADCON1,ADFM ; banksel ADCON0 ADC bsf ADCON0,ADON ; turn on AD module |B0 bcf PIR1,ADIF ; clear AD interrupt flag |B0 movlw d'33' ; use 33 (20 mhz) or 13 (8 mhz) |B0 movwf TEMP ; |B0 ACQ decfsz TEMP,F ; wait 20 usec to acquire |B0 goto ACQ ; |B0 bsf ADCON0,GO_DONE ; start conversion |B0 ADX btfsc ADCON0,GO_DONE ; conversion complete? |B0 goto ADX ; no, loop |B0 banksel ADRESL movf ADRESL,W ; get result low byte |B0 banksel ADRESH movwf ADL ;call ADVIIVE movf ADRESH,W ; get result high byte |B0 movwf ADH bcf ADCON0,ADON ; turn off AD module |B0 ;Säädetään A/D-muntimelta saatu arvo myös PWM rekistereihin. ;Asetetaan alimmat 2 bittia AD-muuntimen 10 arvosta ensin CCP1CON rekisterin 4,5 bitteihin. btfsc ADL,6 bsf CCP1CON, 4 ; btfsc ADL,7 bsf CCP1CON, 5 ; btfss ADL,6 bcf CCP1CON, 4 ; btfss ADL,7 bcf CCP1CON, 5 ; ;Ja lopuksi A/D-muuntimen ylimmät bitit CCPR1L rekisteriin. movf ADH,W ; movwf CCPR1L ;Tämä ohjaa toimintajaksoa. return ;*************************************************************************** FLASHTOISTA call NAYTTO_PAIVITYS call ADVIIVE movlw A'X' movwf ETUMERKKI btfsc PORTA,FLASHLUE goto FLASHTOISTA movlw A'T' ;Ladataan w rekisteriin tyhjä merkki. xorwf ETUMERKKI,W ;Katsotaan onko OSOITEK rekisterin sisältö sama kuin w rekisterin sisältö. btfsc STATUS,Z ;Testataan Z lippu STATUS rekisteristä.Jos se on yksi sisältö oli sama. goto FLASHTOISTAL ;Alustukset on tehty joten hyppy FLASHTALLENNUSL kohtaan. ;Jos alustuksiaei ole tehty niin sitten ollaan tässä. TOISTONALAUSTUS call FLASHALUSTUS BANKSEL FLASHLIPUT clrf FLASHLIPUT movlw A'T' movwf ETUMERKKI ;Alustetaan FLASH-muistin täyttymistä mittaava lukema. Jota listään aina, kun käydään FLASHMUISTI aliohjelmassa. movlw 0xA ;Ladataan w rekisteriin luku 10 hexana A.NAYTON_OHJAUS aliohjelmaa varten. movwf MYKKOSET ;Ladataan arvo AYKKOSET rekisteriin. movlw 0xA ;Ladataan w rekisteriin luku 10 hexana A.NAYTON_OHJAUS aliohjelmaa varten. movwf MKYMMENET ;Ladataan arvo AKYMMENET rekisteriin. movlw 0xA ;Ladataan w rekisteriin luku 10 hexana A.NAYTON_OHJAUS aliohjelmaa varten. movwf MSADAT ;Ladataan arvo ASADAT rekisteriin. movlw d'22' ; movwf FLASHPROSENTTI call HAE_MUISTIPROSENTTI ;Haetaan muistiprosentti lukema. FLASHTOISTAL decfsz FLASHPROSENTTI,F goto TS1 PROSENTTIVALMIST ;Joten alustetaan uuden prosentin laskenta. call MUISTIPROSENTTI1 ;Käydään lisäämässä muisti prosenttia +1. call HAE_MUISTIPROSENTTI ;Haetaan muistiprosentti lukema. movlw d'22' ; movwf FLASHPROSENTTI TS1 call NAYTTO_PAIVITYS call FLASHMUISTI call FLASHL BANKSEL ARVOK movlw 0x3F xorwf ARVOK,W btfsc STATUS,Z goto TOISTONALAUSTUS SWAPF ARVOK MOVF ARVOM,W movwf ADH MOVF ARVOK,W movwf ADL btfsc ADL,6 bsf CCP1CON, 4 ; btfsc ADL,7 bsf CCP1CON, 5 ; btfss ADL,6 bcf CCP1CON, 4 ; btfss ADL,7 bcf CCP1CON, 5 ; ;Ja lopuksi A/D-muuntimen ylimmät bitit CCPR1L rekisteriin. movf ADH,W ; movwf CCPR1L ;Tämä ohjaa toimintajaksoa. ;************************* clrf TEMP btfsc ADL,6 bsf TEMP,0 btfsc ADL,7 bsf TEMP,1 btfsc ADH,0 bsf TEMP,2 btfsc ADH,1 bsf TEMP,3 btfsc ADH,2 bsf TEMP,4 btfsc ADH,3 bsf TEMP,5 btfsc ADH,4 bsf TEMP,6 btfsc ADH,5 bsf TEMP,7 MOVF TEMP,W MOVWF ADL CLRF TEMP btfsc ADH,6 bsf TEMP,0 btfsc ADH,7 bsf TEMP,1 MOVF TEMP,W MOVWF ADH CLRF TEMP ;call ADLTALLASKENTAAN movlw 0xA ;Ladataan w rekisteriin luku 10 hexana A.NAYTON_OHJAUS aliohjelmaa varten. movwf AYKKOSET ;Ladataan arvo AYKKOSET rekisteriin. movlw 0xA ;Ladataan w rekisteriin luku 10 hexana A.NAYTON_OHJAUS aliohjelmaa varten. movwf AKYMMENET ;Ladataan arvo AKYMMENET rekisteriin. movlw 0xA ;Ladataan w rekisteriin luku 10 hexana A.NAYTON_OHJAUS aliohjelmaa varten. movwf ASADAT ;Ladataan arvo ASADAT rekisteriin. movlw 0xA ;Ladataan w rekisteriin luku 10 hexana A.NAYTON_OHJAUS aliohjelmaa varten. movwf ATUHANNET ;Ladataan arvo ATUHANNET rekisteriin. CALL JAKOLASKU call HAE_UUSI_LUKU movlw 0xA ;Ladataan w rekisteriin luku 10 hexana A.NAYTON_OHJAUS aliohjelmaa varten. movwf AYKKOSET ;Ladataan arvo AYKKOSET rekisteriin. movlw 0xA ;Ladataan w rekisteriin luku 10 hexana A.NAYTON_OHJAUS aliohjelmaa varten. movwf AKYMMENET ;Ladataan arvo AKYMMENET rekisteriin. movlw 0xA ;Ladataan w rekisteriin luku 10 hexana A.NAYTON_OHJAUS aliohjelmaa varten. movwf ASADAT ;Ladataan arvo ASADAT rekisteriin. movlw 0xA ;Ladataan w rekisteriin luku 10 hexana A.NAYTON_OHJAUS aliohjelmaa varten. movwf ATUHANNET ;Ladataan arvo ATUHANNET rekisteriin. call PWM_NAYTTEEN_MUOKKAUS call PWMSUHDE call HAE_UUSI_LUKU_PWM ;************************* btfss PORTA,FLASHLUE goto FLASHTOISTAL call ADVIIVE FLASHTOISTASEIS movlw A'N' movwf ETUMERKKI call NAYTTO_PAIVITYS call ADVIIVE btfsc PORTA,FLASHLUE goto FLASHTOISTASEIS RETURN ;*************************************************************************** PROSENTTIVALMIS ;Tämä on pakko tehdä aliohjelmana, koska muuten FLASH-muistin täyttymis laskenta vääristyy FLASHTALLENNUS aliohjelmassa, josta tätä aliohjelmaa kutsutaan. call MUISTIPROSENTTI1 ;Käydään lisäämässä muisti prosenttia +1. call HAE_MUISTIPROSENTTI ;Haetaan muistiprosentti lukema. movlw d'22' ; movwf FLASHPROSENTTI return ;Tallennetaan FLASH-muistiin lukema. FLASHTALLENNUS call NAYTTO_PAIVITYS call ADVIIVE movlw A'X' movwf ETUMERKKI btfsc PORTA,FLASHKIRJOITA goto FLASHTALLENNUS movlw A'K' ;Ladataan w rekisteriin tyhjä merkki. xorwf ETUMERKKI,W ;Katsotaan onko OSOITEK rekisterin sisältö sama kuin w rekisterin sisältö. btfsc STATUS,Z ;Testataan Z lippu STATUS rekisteristä.Jos se on yksi sisältö oli sama. goto FLASHTALLENNUSL ;Alustukset on tehty joten hyppy FLASHTALLENNUSL kohtaan. ;Jos alustuksiaei ole tehty niin sitten ollaan tässä. call FLASHERASOIDAAN ;Erasoidaan ensin FLASH-muisti uutta dataa varten. BANKSEL word_block MOVLW .4 MOVWF word_block ;prepare for 4 words to be written MOVLW 0xA0 ;initialize pointer MOVWF FSR ;to RAM call FLASHALUSTUS clrf FLASHLIPUT movlw A'K' movwf ETUMERKKI ;Alustetaan FLASH-muistin täyttymistä mittaava lukema. Jota listään aina, kun käydään FLASHMUISTI aliohjelmassa. movlw 0xA ;Ladataan w rekisteriin luku 10 hexana A.NAYTON_OHJAUS aliohjelmaa varten. movwf MYKKOSET ;Ladataan arvo AYKKOSET rekisteriin. movlw 0xA ;Ladataan w rekisteriin luku 10 hexana A.NAYTON_OHJAUS aliohjelmaa varten. movwf MKYMMENET ;Ladataan arvo AKYMMENET rekisteriin. movlw 0xA ;Ladataan w rekisteriin luku 10 hexana A.NAYTON_OHJAUS aliohjelmaa varten. movwf MSADAT ;Ladataan arvo ASADAT rekisteriin. movlw d'22' ; movwf FLASHPROSENTTI call HAE_MUISTIPROSENTTI ;Haetaan muistiprosentti lukema. FLASHTALLENNUSL ;*************************************** call ADLTALLASKENTAAN movlw 0xA ;Ladataan w rekisteriin luku 10 hexana A.NAYTON_OHJAUS aliohjelmaa varten. movwf AYKKOSET ;Ladataan arvo AYKKOSET rekisteriin. movlw 0xA ;Ladataan w rekisteriin luku 10 hexana A.NAYTON_OHJAUS aliohjelmaa varten. movwf AKYMMENET ;Ladataan arvo AKYMMENET rekisteriin. movlw 0xA ;Ladataan w rekisteriin luku 10 hexana A.NAYTON_OHJAUS aliohjelmaa varten. movwf ASADAT ;Ladataan arvo ASADAT rekisteriin. movlw 0xA ;Ladataan w rekisteriin luku 10 hexana A.NAYTON_OHJAUS aliohjelmaa varten. movwf ATUHANNET ;Ladataan arvo ATUHANNET rekisteriin. CALL JAKOLASKU call HAE_UUSI_LUKU movlw 0xA ;Ladataan w rekisteriin luku 10 hexana A.NAYTON_OHJAUS aliohjelmaa varten. movwf AYKKOSET ;Ladataan arvo AYKKOSET rekisteriin. movlw 0xA ;Ladataan w rekisteriin luku 10 hexana A.NAYTON_OHJAUS aliohjelmaa varten. movwf AKYMMENET ;Ladataan arvo AKYMMENET rekisteriin. movlw 0xA ;Ladataan w rekisteriin luku 10 hexana A.NAYTON_OHJAUS aliohjelmaa varten. movwf ASADAT ;Ladataan arvo ASADAT rekisteriin. movlw 0xA ;Ladataan w rekisteriin luku 10 hexana A.NAYTON_OHJAUS aliohjelmaa varten. movwf ATUHANNET ;Ladataan arvo ATUHANNET rekisteriin. call PWM_NAYTTEEN_MUOKKAUS call PWMSUHDE call HAE_UUSI_LUKU_PWM call NAYTTO_PAIVITYS ;*************************************** call ADLTAPWMLLE ;goto ADLTAPWMLLE;UUDESTAAN;ADLTAPWMLLE;return MOVF ADH,W MOVWF INDF ;clear INDF register INCF FSR,F ;inc pointer MOVF ADL,W MOVWF INDF ;clear INDF register INCF FSR,F ;inc pointer BANKSEL word_block DECFSZ word_block,f ;have 4 words been written? goto FLASHTALLENNUSL call FLASHK ;Kun 4 tavua on saatu, niin käydään kirjoittaan ne muistiin FLASH:iin ;Sen jälkeensiirretään pointeria 4 kertaa. call FLASHMUISTI call FLASHMUISTI call FLASHMUISTI call FLASHMUISTI ;Seuraavaksi lasketaan FLASMUISTIN käyttöprosentti. decfsz FLASHPROSENTTI,F goto S1 call PROSENTTIVALMIS S1 decfsz FLASHPROSENTTI,F goto S2 call PROSENTTIVALMIS S2 decfsz FLASHPROSENTTI,F goto S3 call PROSENTTIVALMIS S3 decfsz FLASHPROSENTTI,F goto S4 call PROSENTTIVALMIS S4 ;FLASH-muistin käyttöprosentin laskenta päättyy. BANKSEL word_block MOVLW .4 MOVWF word_block ;prepare for 4 words to be written MOVLW 0xA0 ;initialize pointer MOVWF FSR ;to RAM KIRJOITUSSEIS ;movlw A'K' ;movwf ETUMERKKI btfsc PORTA,FLASHKIRJOITA goto NAPPIOFF ;Kun FLASHKIRJOITA nappia ei enää paineta tullaan tähän kohtaan. btfsc FLASHLIPUT,fraja goto NAPPIOFF ;Kun FLASH-muistiin ei mahdu enempää, niin tullaan tähän. goto FLASHTALLENNUSL ;return NAPPIOFF ;Kun tallennusnappi päästetään, niin kirjoitetaan FLASH-muistiin myös lopetusdata. MOVLW 0xA0 ;initialize pointer MOVWF FSR ;to RAM ;Ladataan epäsuoralla osoituksella lopetusdata RAM-muistiin. MOVLW 0x3F MOVWF INDF ;clear INDF register INCF FSR,F ;inc pointer MOVLW 0x3F MOVWF TEMP SWAPF TEMP MOVF TEMP,W MOVWF INDF ;clear INDF register INCF FSR,F ;inc pointer MOVLW 0x3F MOVWF INDF ;clear INDF register INCF FSR,F ;inc pointer MOVLW 0x3F MOVWF TEMP SWAPF TEMP MOVF TEMP,W MOVWF INDF ;clear INDF register INCF FSR,F ;inc pointer MOVLW 0x3F MOVWF INDF ;clear INDF register INCF FSR,F ;inc pointer MOVLW 0x3F MOVWF TEMP SWAPF TEMP MOVF TEMP,W MOVWF INDF ;clear INDF register INCF FSR,F ;inc pointer MOVLW 0x3F MOVWF INDF ;clear INDF register INCF FSR,F ;inc pointer MOVLW 0x3F MOVWF TEMP SWAPF TEMP MOVF TEMP,W MOVWF INDF ;clear INDF register INCF FSR,F ;inc pointer ;************************ call FLASHK ;Kun 4 tavua on saatu, niin käydään kirjoittaan ne muistiin FLASH:iin KIRJOITUSSEISLOOP movlw A'N' movwf ETUMERKKI call NAYTTO_PAIVITYS call ADVIIVE btfsc PORTA,FLASHKIRJOITA goto KIRJOITUSSEISLOOP call ADVIIVE return ;***************************************************************************************** FLASHERASE BANKSEL EECON1 ; Select Bank of EECON1 BSF EECON1, EEPGD ; Point to PROGRAM memory BSF EECON1, WREN ; Enable Write to memory BSF EECON1, FREE ; Enable Row Erase operation ; BCF INTCON, GIE ; Disable interrupts (if using) MOVLW 0x55 ; MOVWF EECON2 ; Write 55h MOVLW 0xAA ; MOVWF EECON2 ; Write AAh BSF EECON1, WR ; Start Erase (CPU stall) NOP ; Any instructions here are ignored as processor ; halts to begin Erase sequence NOP ; processor will stop here and wait for Erase complete ; after Erase processor continues with 3rd instruction BCF EECON1, WREN ; Disable writes BCF INTCON, GIE ; Enable interrupts (if using) RETURN ;------------------------------------------------------------------------------ ; MAIN PROGRAM ;------------------------------------------------------------------------------ PROGRAM CODE MAIN ;call KOKEILUERASE GOTO CONTINUE movlw 0x0F ;Ladataan w rekisteriin korkeimpaan muistipaikan osoituspaikan korkein ;sallittu paikka. banksel OSOITEK MOVWF OSOITEK ;prepare for 4 words to be written movlw 0x0c xorwf OSOITEK,W ;Katsotaan onko OSOITEK rekisterin sisältö sama kuin w rekisterin sisältö. btfss STATUS,Z ;Testataan Z lippu STATUS rekisteristä.Jos se on yksi sisältö oli sama. nop nop ;incf eeadr-100 ;skpnz CONTINUE ;yes continue call ALUSTUS call FLASHALUSTUS ;call FLASH_INI BANKSEL word_block MOVLW .4 MOVWF word_block ;prepare for 4 words to be written MOVLW 0xA0 ;initialize pointer MOVWF FSR ;to RAM movlw A'N' ;Ladataan w rekisteriin tyhjä merkki. movwf ETUMERKKI ;Ladataan w rekisteri ETUMERKKI rekisteriin. call ALOITUSTEKSTI ;*************************************************************** LOOP ; call ADLTAPWMLLE ;Käydään hakemassa PWM:lle AD-muuntimelta arvo. btfsc PORTA,FLASHKIRJOITA call FLASHTALLENNUS btfsc PORTA,FLASHLUE call FLASHTOISTA;FLASHERASOIDAAN;KOKEILUERASE ;FLASHERASOIDAAN movlw A'N' ;Ladataan w rekisteriin tyhjä merkki. movwf ETUMERKKI ;Ladataan w rekisteri ETUMERKKI rekisteriin. call ADLTALLASKENTAAN movlw 0xA ;Ladataan w rekisteriin luku 10 hexana A.NAYTON_OHJAUS aliohjelmaa varten. movwf AYKKOSET ;Ladataan arvo AYKKOSET rekisteriin. movlw 0xA ;Ladataan w rekisteriin luku 10 hexana A.NAYTON_OHJAUS aliohjelmaa varten. movwf AKYMMENET ;Ladataan arvo AKYMMENET rekisteriin. movlw 0xA ;Ladataan w rekisteriin luku 10 hexana A.NAYTON_OHJAUS aliohjelmaa varten. movwf ASADAT ;Ladataan arvo ASADAT rekisteriin. movlw 0xA ;Ladataan w rekisteriin luku 10 hexana A.NAYTON_OHJAUS aliohjelmaa varten. movwf ATUHANNET ;Ladataan arvo ATUHANNET rekisteriin. CALL JAKOLASKU call HAE_UUSI_LUKU movlw 0xA ;Ladataan w rekisteriin luku 10 hexana A.NAYTON_OHJAUS aliohjelmaa varten. movwf AYKKOSET ;Ladataan arvo AYKKOSET rekisteriin. movlw 0xA ;Ladataan w rekisteriin luku 10 hexana A.NAYTON_OHJAUS aliohjelmaa varten. movwf AKYMMENET ;Ladataan arvo AKYMMENET rekisteriin. movlw 0xA ;Ladataan w rekisteriin luku 10 hexana A.NAYTON_OHJAUS aliohjelmaa varten. movwf ASADAT ;Ladataan arvo ASADAT rekisteriin. movlw 0xA ;Ladataan w rekisteriin luku 10 hexana A.NAYTON_OHJAUS aliohjelmaa varten. movwf ATUHANNET ;Ladataan arvo ATUHANNET rekisteriin. call PWM_NAYTTEEN_MUOKKAUS call PWMSUHDE call HAE_UUSI_LUKU_PWM call NAYTTO_PAIVITYS GOTO LOOP END