;------------------------------------------------------------------------------------------------------- ; ; Filename: 877test1.asm ; Date: 06/12 2004 ; File Version: 0.1 ; ; Author: Matti Järvinen ; Company: ; ;------------------------------------------------------------------------------------------------------- ; ; Files required: ; PIC16F877 testiohjelma. ; ;------------------------------------------------------------------------------------------------------- ; ; Notes: ; Testiohjelmia. ; Tämä tiedosto muutaman erilaisen testiohjelman jolla testataan painikkeet ja valot. ; Tiedostossa alkuasetukset käytettäessä PIC16F877 ohjainkorttia. ; LCD modulin alustus ja muutama rivi tekstiä modulin näytölle. ; PWM osan testi jos PWM porttiin 2 on kytketty moottori sitä voi pyöritellä. ; ;------------------------------------------------------------------------------------------------------- list p=16f877 ; Prosessoripiirin määritys #include ; Sisällytetään tähän ohjelmaan tiedosto joka sisältää ; valmiiksi määritellyt muuttujat ;------------------------------------------------------------------------------------------------------- ; Määritetään piirin sisäiset konfiguraatio (hieno sana) asetukset. ; Selitetään mitä saadaan selville, tai ainakin siihen suuntaan. ; _CONFIG tämä rivi määrittää konfigurointi asetukset ; _CP_OFF ; _WDT_OFF Vahtikoira Watch Dog ON tai OFF ; _BODEN_OFF ; _PWRTE_ON Ohjelmamuistin kirjoituksen salliminen. ; _HS_OSC Oskillaattorin valinta RC, XT, HS, LP ; _WRT_ENABLE_ON ; _LVP_OFF Määrittää piirin pienellä jännitteellä ohjelmoitavaksi. ; _DEBUG_OFF Debuggerin käyttö. ; _CPD_OFF EEPROM muistin suojaus. ;------------------------------------------------------------------------------------------------------- __CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _HS_OSC & _WRT_ENABLE_ON & _LVP_OFF & _DEBUG_OFF & _CPD_OFF ;------------------------------------------------------------------------------------------------------- ; Rivin alussa määritelty rekisterin nimi seuraavaksi EQU (varmaan tarkoittaa myös jotain, eipä ; sillä sitten niin väliä kunhan nyt siihen kuuluu) ja seuraavana paikka ohjainpiirin muistissa. ; Muuten kaikki kommentit erotellaan puolipisteellä, sen oikealla puolella olevat tekstit ovat kaikki ; kommentteja, ja kääntäjä ei ota niitä mitenkään mukaan käännökseen. Niitä kannattaa käyttää ; mahdollisimman paljon, vaikka ohjelmaa kirjoittaessa ja miettiessä ei niitä tule aina kirjoitettua. ; Siinä vaiheessa on syytä kommentit kirjoittaa kun on saanut jonkin osan toimimaan ja siistii ; muutenkin koodia, jos vielä sattuu muistamaan miksi mikin käsky on siinä kun se on. ;------------------------------------------------------------------------------------------------------- ; Muuttujien nimeäminen ja osoitteitten määritys. w_temp EQU 0x70 ; Keskeytyksissä käytettävät muttujat status_temp EQU 0x71 ; ; Annetaan nimet porteille ja jokaiselle portin bitille erikseen. Samoin rekisterien osoitteille annetaan ; ihan yksilöllinen nimi. Tällä saavutetaan se että, jos rekisterin osoitetta täytyy muuttaa jostain syystä ; ei tarvitse käydä koko ohjelmaa läpi, ja muuttaa jokaista erikseen, vaan se käy ainoastaan yhdessä paikassa. ; PORTA:n nimeäminen ; Koska PORTA on analogitulojen käytössä sille voidaan antaa valmiiksi määritetyn PORTA nimen ; tilalle kuvaavampi nimi JANNITE, ja kaikille eri sisääntuloille hienosti CH ja numero kuvaamaan ; että kyseessä on CANAL, eli kanava ja numero osoittamassa kanavaa. ; Esim. JANNITE,CH0 tarkoittaa määrityksen jälkeen samaa kuin PORTA,0 ja vielä jännittä kanavalla 0. JANNITE EQU PORTA ; Portti A CH0 EQU 0 ; Portti A:n CH1 EQU 1 ; bittien CH2 EQU 2 ; nimitykset CH3 EQU 3 DIN4 EQU 4 ; Digitaali tulo, portti DIN4 kuuluu porttiin A ; Määritetään I/O tuloksi toisaalla ohjelmassa. CH5 EQU 5 ; PORTE:n nimeäminen ; Samalla periaatteella on nimetty PORTE ja sen eri bitit. ; Eli DTULO,DIN0 vastaa PORTE,0 ja digitaalitulo digital in 0. DTULO EQU PORTE ; Portti E DIN0 EQU 0 ; Portti E:n DIN1 EQU 1 ; bittien DIN2 EQU 2 ; nimitykset ; PORTB:n nimeäminen ; Sama jatkuu TULO,NAPPI1 vastaa PORTB,1 ja tuloportin nappi 1 TULO EQU PORTB ; Portti B NAPPI0 EQU 0 ; Portti B:n NAPPI1 EQU 1 ; bittien NAPPI2 EQU 2 ; nimitykset NAPPI3 EQU 3 NAPPI4 EQU 4 NAPPI5 EQU 5 NAPPI6 EQU 6 NAPPI7 EQU 7 ; PORTD:n nimeäminen ; Sama juttu myös tässä LAHTO,VALO4 on yhtäkuin PORTD,4 tai lähtöportin valo 4 LAHTO EQU PORTD ; Portti D VALO0 EQU 0 ; Portti D:n VALO1 EQU 1 ; bittien VALO2 EQU 2 ; nimitykset VALO3 EQU 3 VALO4 EQU 4 VALO5 EQU 5 VALO6 EQU 6 VALO7 EQU 7 ; PORTC:n nimeäminen ; PORTC:tä käytetään LCD:n ohjaukseen joten voidaan käyttää portille nimeä LCD_PORT ja ohjauksille ; LCD-modulin ohjauksien nimiä LCD_E = ENABLE = bit0 ja LCD_RS = Register Select = bit3 ; Koska LCD-moduli käyttää 4 bitin ohjausmoodissa 4 ylintä bittiä niin samoin voidaan käyttää ; myös tässä 4 ylintä databittiä datalinjana, niitä ei ole erikseen nimetty. ; PWM lähdöt menevät hieman nimen osalta poskelleen, mutta hällä väliä. ; Eli LCD_PORT,MOOTTORI1 on yhtäkuin Moottorin PWM ohjaus 1 ; Hieman hämäävästi LCD_PORT,MOOTTORI1 samaa vastaa PORTC,MOOTTORI1 ihan sama kumpaa käyttää. ; LCD_PORT EQU PORTC ; Portti C LCD:n ohjausportti ; 4 datalinjaa ; RC4,5,6,7 PIN 22,23,24,25 - LCD 11,12,13,14 LCD_E EQU 0 ; LCD Enable RC0 pin15 - LCD/6 LCD_RS EQU 3 ; LCD Rekisterivalinta RC3 pin18 - LCD/4 ; Portti C PWM lähdöt MOOTTORI1 EQU 1 ; Moottorin1 ohjaus PWM lähdöllä MOOTTORI2 EQU 2 ; Moottorin2 ohjaus PWM lähdöllä ;------------------------------------------------------------------------------------------------------- ; Rekisterien nimeäminen. ; Voidaan antaa jollekkin nimitykselle pelkästään sisältö, kuten seuraavat rivit ; Käytössä olevassa LCD-modulissa on kaksi tekstiriviä ja tässä annetaan kummallekkin riville ; ensimmäisen merkin osoite LCD-modulilla LCD_LINE0 = 000 ; ensimmäisen rivin toisen merkin osoite taas on LCD_LINE0+1 = 001 jne. LCD_LINE0 EQU 0x000 ; Annetaan LCD:n rivin 1 aloitusosoite LCD_LINE1 EQU 0x040 ; Annetaan LCD:n rivin 2 aloitusosoite ; Osoitteelle annetaan yksilöllinen nimi ; Eli LCD_TEMP1 on osoitteessa 021 tai DELAY on osoitteessa 02A. LCD_TEMP1 EQU 0x021 ; LCD:n ohjauksen tilapäisrekisteri MRK1 EQU 0x022 ; Näytön kirjoituksen muisti TABLE_INDEX EQU 0x023 ; Tekstitaulukon osoitusrekisteri DELAY EQU 0x02A ; Viiveitten muodostuksessa käytetyt rekisterit DELAY2 EQU 0x02B ; X_DELAY EQU 0x02C ; MOTNOPH EQU 0x040 ; Moottorin nopeus rekisteri 2 ylempää bittiä MOTNOPL EQU 0x041 ; Moottorin nopeus rekisteri 8 alempaa bittiä COUNT EQU 0x02D ; BCD muunnoksen käyttämä laskija R0 EQU 0x050 ; Muunnoksen tuloksen talletus R1 EQU 0x051 ; Muunnoksen tuloksen talletus R2 EQU 0x052 ; Muunnoksen tuloksen talletus R3 EQU 0x053 ; Muunnoksen tuloksen talletus R4 EQU 0x054 ; Muunnoksen tuloksen talletus TMP0 EQU 0x05A ; Muunnokselle annettava luku (H_BYTE) TMP1 EQU 0x05B ; Muunnokselle annettava luku (MH_BYTE) TMP2 EQU 0x05C ; Muunnokselle annettava luku (ML_BYTE) TMP3 EQU 0x05D ; Muunnokselle annettava luku (L_BYTE) TMP EQU 0x05F ; Muunnoksen tilapäisrekisteri ;------------------------------------------------------------------------------------------------------- ; Määrityksien jälkeen varsinainen ohjelma alkaa näillä toimilla. ORG 0x000 ; Ohjelmalaskurin nollaus. CLRF PCLATH ; Nollataan muistisivun osoitus GOTO MAIN ; Aloitetaan ohjelman suoritus paikasta MAIN ;------------------------------------------------------------------------------------------------------- ; Ohjelmassa sattuva keskeytys aiheuttaa hypyn tänne jossa talletetaan W-rekisterin sisältö ; samoin kuin STATUS-rekisterin sisältökin, keseytyksessä suoritettavan ohjelman ajaksi. ORG 0x004 ; Keskeytyksen aloitus osoite movwf w_temp ; W-rekisterin sisällön tallennuspaikka movf STATUS,w ; siiretään STATUS-rek. W-rekisteriin. movwf status_temp ; STATUS-rekisterin sisällön tallennuspaikka ; keskeytyksen ohjelmat BSF LAHTO,VALO3 ; Sytytetään valo movf status_temp,w ; Palautetaan rekisterit movwf STATUS ; keskeytyksen jälkeen. swapf w_temp,f swapf w_temp,w ; retfie ; palataan takaisin keskeytyneeseen ohjelmaan ;------------------------------------------------------------------------------------------------------- NUMERO_TABLE ; Taulukko josta haetaan ASCII koodi numeroille ADDWF PCL,F RETLW A'0' RETLW A'1' RETLW A'2' RETLW A'3' RETLW A'4' RETLW A'5' RETLW A'6' RETLW A'7' RETLW A'8' RETLW A'9' ;------------------------------------------------------------------------------------------------------- ; Tästä alkaa ohjelman suorittaminen rekisterien alkuasetuksilla joilla saadaan porttien ; ominaisuudet ja alkutilat. MAIN ; Ohjelman aloitus. CLRF LCD_PORT ; Tyhjennetään LCD-portin lähtö. BSF STATUS,RP0 ; Asetellaan Bank1:ssä (STATUS rekisterin bitti RP0 = 1) MOVLW 0x3F ; W-rekisteriin asetetaan bittikuvio 00111111 MOVWF TRISA ; jolla määrätään Portti A sisäänmenoksi. MOVLW 0xFF ; Bittikuvio 11111111 MOVWF TRISB ; portti B kokonaan SISÄÄNMENO, KYTKIMET MOVLW 0x00 ; Bittikuvio 00000000 MOVWF TRISC ; portti C kokonaan ULOSTULO ; LCD ja PWM MOVLW 0X00 ; Bittikuvio 00000000 MOVWF TRISD ; portti D kokonaan ULOSTULO, VALOT(RELEOHJAUS) MOVLW 0X07 ; Bittikuvio 00000111 MOVWF TRISE ; portti E kokonaan SISÄÄNMENO, ULKOISET KYTKIMET MOVLW 0x82 ; Bittikuvio 10000010 MOVWF ADCON1 ; ADCON1 rekisteriin BCF STATUS,RP0 ; Palataan Bank0:aan(STATUS rekisterin bitti RP0 = 0) CLRF LAHTO ; porttiin D 00000000 CLRF LCD_PORT ; porttiin C 00000000 ;======================================================================================================= ; PWM modulin alustus ;======================================================================================================= ; Piirin PWM moduli käyttää ajastinta Timer2, seuraavassa sen asetukset BCF T2CON, TMR2ON ; TMR2ON: Timer2 ON bitti ; 0 = Timer2 off = voidaan muuttaa Timer2 asetuksia ; TIMER2 Prescaler: ESIJAKAJAn asetus BCF T2CON, T2CKPS0 ; Timer2 Clock Prescale Select bits BCF T2CON, T2CKPS1 ; 00 = "1" Prescaler value = 1 ; TIMER2 PostScaler: EI KÄYTÖSSÄ BCF T2CON, TOUTPS0 ; on yhtä kuin 0000 BCF T2CON, TOUTPS1 BCF T2CON, TOUTPS2 BCF T2CON, TOUTPS3 ; LADATAAN TIMER2 JAKSO REKISTERI BSF STATUS,RP0 ; Asetellaan Bank1:ssä (STATUS rekisterin bitti RP0 = 1) MOVLW d'255' ; W-rekisteriin "255"=FF MOVWF PR2 ; Siirretään PR2-rekisteriin BCF STATUS,RP0 ; Palataan Bank0:aan (STATUS rekisterin bitti RP0 = 0) ; Asetetaan CCP1 PWM Modeen BSF CCP1CON, CCP1M3 ; 11xx PWM Mode BSF CCP1CON, CCP1M2 ; Asetetaan CCP2 PWM Modeen BSF CCP2CON, CCP1M3 ; 11xx PWM Mode BSF CCP2CON, CCP1M2 BSF T2CON, TMR2ON ; TMR2ON: Timer2 On bitti ; 1 = Timer2 on - Estetään Timer2 asetuksien muuttaminen ; SET THE LSB OF THE 10 BIT DUTY CYCLE From MOTNOPH BCF CCP2CON,CCP1X BTFSC MOTNOPH,6 BSF CCP1CON,CCP1X BCF CCP2CON,CCP1Y BTFSC MOTNOPH,7 BSF CCP1CON,CCP1Y ; SET THE MSB OF THE 10 BIT DUTY CYCLE From MOTNOPL MOVLW 0X05 MOVFW MOTNOPL MOVF MOTNOPL,W ; Moottorin nopeusrekisterin tieto MOVWF CCPR1L ; siirretään PWM1 nopeustiedoksi MOVWF CCPR2L ; siirretään PWM2 nopeustiedoksi ; SET AD-MUUNNIN ASETUKSET BSF STATUS,RP0 ; Asetellaan Bank1:ssä BCF PIE1,6 ; Estetään muuntimen keskeytys BCF STATUS,RP0 ; Palataan Bank0:aan CLRF INTCON ; Nollataan keskeytysliput ; Keskeytyksiä ei ole tässä ohjelmassa käytössä. ;======================================================================================================= ; Seuraavaksi alustetaan LCD-moduli. ; Voidaan käyttää myös aliohjelmana poistamalla puolipisteet ensimmäisestä ja viimeisestä rivistä. ; Käyttämällä aliohjelmakutsua: ; CALL LCDINIT ; Silloin tarvitaan myös hyppykäsky aliohjelmakutsun jälkeen. ; GOTO ja osoite minne ollaan menossa. ;======================================================================================================= ; LCDINIT ; Alustetaan LCD-näyttömoduli ; Voidaan vaikuttaa näytön ominaisuuksiin ja näyttömodulin toimintaan ; ( näytön tyyppi, kursori käytössä tai pois, yms.) ;------------------------------------------------------------------------------------------------------- ; LCDINIT CLRF LCD_PORT ; LCD_PORTIN portin bitit alas MOVLW D'15' CALL X_DELAY1 ; 15 ms käynnistysviive. MOVLW b'00110000' ; 4-bit liitäntä (8bit mode) CALL LCDPUTCMDX ; siirretään vain yläosa MOVLW D'5' CALL X_DELAY1 ; 5 ms odotus. MOVLW b'00110000' ; 4-bit liitäntä (8bit mode) CALL LCDPUTCMDX ; siirretään vain yläosa CALL DELAY1 ; 1 ms odotus. MOVLW b'00100000' ; 4-bit liitäntä (4bit mode) CALL LCDPUTCMDX ; siirretään vain yläosa CALL DELAY1 ; 1 ms odotus. MOVLW b'00101000' ; LCD näytön alkuasetukset bitti5 ; bitti4 = 0 = data leveys 4 bit (1=8 bit) ; bitti3 = 1 = 2 riviä (0=1 rivinen näyttö) ; bitti2 = 0 = 5x7 merkit (1=5x10 merkit) ; bitit 1 ja 0 ei merkitystä CALL LCDPUTCMD ; siirretään kokonaan CALL DELAY1 ; 1 ms odotus. MOVLW b'00001000' ; Näyttön ja kursorin määritys bitti 3=1 ; bitti2 = 0 = näyttö pois (1=näyttö päällä) ; bitti1 = 0 = kursori pois (1=kursori käytössä) ; bitti0 = 0 = vilkutus pois (1=vilkutus käytössä) CALL LCDPUTCMD ; siirretään kokonaan CALL DELAY1 ; 1 ms odotus. MOVLW b'00000110' ; Näytön toiminta asetukset bitti 2=1 ; bitti1 = 1 = osoitteen lisäys (0=osoitteen vähennys) ; bitti0 = 0 = näytön siirto off (1=näytön siirto on) CALL LCDPUTCMD ; siirretään kokonaan CALL DELAY1 ; 1 ms odotus. MOVLW b'00000001' ; Tyhjennetään koko LCDn näyttö ja muisti ; siirretään kursori alkuun CALL LCDPUTCMD ; siirretään kokonaan CALL DELAY1 ; 2 ms odotus. CALL DELAY1 ; Tarvitaan muuten ei teksti näy. MOVLW b'00001100' ; Näyttön ja kursorin määritys bitti 3=1 ; bitti2 = 1 = näyttö päällä (0=näyttö pois) ; bitti1 = 0 = kursori pois (1=kursori käytössä) ; bitti0 = 0 = vilkutus pois (1=vilkutus käytössä) CALL LCDPUTCMD ; siirretään kokonaan CALL DELAY1 ; 1 ms odotus. ; RETURN ; Ei käytetä koska alustus suoritetaan osana ohjelmaa. ;======================================================================================================= CALL TEKSTI ; LCD:lle aloitusteksti aliohjelma. ;======================================================================================================= GOTO VALIKKO ; Tästä siirrytään valikko ohjelmaan. ;======================================================================================================= ; Tästä eteenpäin on aliohjelmia jotka suoritetaan niitä kutsuttaessa. ;======================================================================================================= ; LCD:n aliohjelmat PIC16F877 kortille. ;======================================================================================================= ; LCDDMODE ; Asetetaan LCD modulin toiminta ; Seuraavat toiminnat muutettavissa W rekisterin b0, b1 ja b2 biteillä ; b0 : 0 = vilkkuva kursori pois käytöstä 1 = vilkkuva kursori käytössä ; b1 : 0 = kursori pois käytöstä 1 = kursori käytössä ; b2 : 0 = tekstiä ei näytetä 1 = näytetään teksti ; (näytön data talletettu DDRAM) ; b3-7 : ei merkitystä ;------------------------------------------------------------------------------------------------------- LCDDMODE ANDLW b'00000111' ; Leikkaa ylemmät bitit IORLW b'00001000' ; Funktio asetus CALL LCDPUTCMD ; siirretään LCD moduliin CALL DELAY1 ; 1 ms odotus. RETURN ;======================================================================================================= ; LCDSDDA ; Asetetaan näyttö RAM osoite. DDRAM data on luettavissa/kirjoitettavissa ; asetuksen jälkeen ; Asetetaan DDRAM osoite W rekisteriin ; b0-6 : käytettävä DDRAM osoite ; b7 : ei merkitystä ;------------------------------------------------------------------------------------------------------- LCDSDDA IORLW b'10000000' ; Funktio asetus CALL LCDPUTCMD ; siirretään LCD moduliin CALL DELAY1 ; Odotellaan 1ms RETURN ;======================================================================================================= ; LCDCLEAR ; Tyhjentää näytön ja siirtää kursorin ensimmäisen rivin alkuun. ;------------------------------------------------------------------------------------------------------- LCDCLEAR MOVLW b'00000001' ; W rekisteriin 01 CALL LCDPUTCMD ; siirretään LCD moduliin CALL DELAY1 ; 1 ms odotus. RETURN ;======================================================================================================= ; LCDPUTCHAR ; Lähetetään merkki LCD näytölle ; Merkki oltava W rekisterissä ;======================================================================================================= LCDPUTCHAR MOVWF LCD_TEMP1 ; W -> LCD_TEMP1 rekisteriin MOVLW b'00001111' ; W rekisterin alaosa "1111" ANDWF LCD_PORT,F ; Tyhjennetään LCD_PORTin yläosa BSF LCD_PORT, LCD_RS ; RS bitti "1" BSF LCD_PORT, LCD_E ; E bitti "1" MOVFW LCD_TEMP1 ; Siirretään LCD_TEMP1 rekisteristä ; W rekisteriin ANDLW b'11110000' ; W rekisterin alaosaan "0000" IORWF LCD_PORT,F ; ja siirretään LCD_PORTin kautta LCD:lle NOP BCF LCD_PORT, LCD_E ; E bitti "0" MOVLW b'00001111' ; W rekisterin alaosa "1111" ANDWF LCD_PORT,F ; Tyhjennetään LCD_PORTin yläosa BSF LCD_PORT, LCD_E ; E bitti "1" SWAPF LCD_TEMP1, W ; Siirretään LCD_TEMP1 rekisterin alaosa ; W rekisteriin yläosaksi ANDLW b'11110000' ; W rekisterin alaosaan "0000" IORWF LCD_PORT,F ; ja siirretään LCD_PORTin kautta LCD:lle NOP BCF LCD_PORT, LCD_E ; E bitti "0" BCF LCD_PORT, LCD_RS ; RS bitti "0" MOVLW b'00001111' ; W rekisterin alaosa "1111" ANDWF LCD_PORT,F ; Tyhjennetään LCD_PORTin yläosa RETURN ;======================================================================================================= ; LCDPUTCMD ; Lähetetään käsky LCD modulille ; Merkki oltava W rekisterissä ;======================================================================================================= LCDPUTCMD MOVWF LCD_TEMP1 ; Käsky siirretään w rekisteristä ; LCD_TEMP1 rekisteriin MOVLW b'00001111' ; W rekisterin alaosa "1111" ANDWF LCD_PORT,F ; Tyhjennetään LCD_PORTin yläosa BCF LCD_PORT, LCD_RS ; RS bitti "0" BSF LCD_PORT, LCD_E ; E bitti "1" MOVFW LCD_TEMP1 ; Siirretään LCD_TEMP1 rekisteristä ; W rekisteriin ANDLW b'11110000' ; W rekisterin alaosaan "0000" IORWF LCD_PORT,F ; ja siirretään LCD_PORTin kautta LCD:lle NOP BCF LCD_PORT, LCD_E ; E bitti "0" MOVLW b'00001111' ; W rekisterin alaosa "1111" ANDWF LCD_PORT,F ; Tyhjennetään LCD_PORTin yläosa SWAPF LCD_TEMP1, W ; Siirretään LCD_TEMP1 rekisterin alaosa ; W rekisteriin yläosaksi LCDPUTCMDX ANDLW b'11110000' ; W rekisterin alaosaan "0000" BSF LCD_PORT, LCD_E ; E bitti "1" NOP IORWF LCD_PORT,F ; W siirretään LCD_PORTin kautta LCD:lle NOP BCF LCD_PORT, LCD_E ; E bitti "0" BCF LCD_PORT, LCD_RS ; RS bitti "0" MOVLW b'00001111' ; W rekisterin alaosa "1111" ANDWF LCD_PORT,F ; Tyhjennetään LCD_PORTin yläosa RETURN ;======================================================================================================= ; Viiveitten muodostus aliohjelmat. (noista kommenteista en kyllä mitään ymmärrä, mutta kai siinä ; lasketaan jotenkin aikaa, joka kuluu tuon silmukan pyörittämiseen) ; ;------------------------------------------------------------------------------------------------------- ; Delay_time = ((DELAY_value * 3) + 4) * Cycle_time (0,4us) ; DELAY_value = (Delay_time - (4 * Cycle_time)) / (3 * Cycle_time) ; ; i.e. (@ 10MHz crystal) ; Delay_time = ((207 * 3) + 4) * 0,4uSec ; = 250uSec ; DELAY_value = (250uSec - (4*0,4uSec)) / (3*0,4uSec) ; = 207 ; ;======================================================================================================= DELAY1 ; Aika 1ms = 4 X 250us MOVLW D'04' MOVWF DELAY2 DELAY250 MOVLW D'207' ; +1 1 cycle MOVWF DELAY ; +2 1 cycle DELAY250_LOOP DECFSZ DELAY, F ; step 1 1 cycle GOTO DELAY250_LOOP ; step 2 2 cycles DELAY250_END DECFSZ DELAY2, F ; step 1 1 cycle GOTO DELAY250 ; step 2 2 cycles DELAY1_END RETURN ; +3 2 cycles ;------------------------------------------------------------------------------------------------------- X_DELAY1 MOVWF X_DELAY ; +1 1 cycle X_DELAY1_LOOP CALL DELAY1 ; step1 wait 1mSec DECFSZ X_DELAY, F ; step2 1 cycle GOTO X_DELAY1_LOOP ; step3 2 cycles X_DELAY1_END RETURN ; +2 2 cycles ;------------------------------------------------------------------------------------------------------- DELAY05 ; Aika 0,5ms = 2 X 250us MOVLW D'02' MOVWF DELAY2 DELAY050 MOVLW D'207' ; +1 1 cycle MOVWF DELAY ; +2 1 cycle DELAY05_LOOP DECFSZ DELAY, F ; step 1 1 cycle GOTO DELAY05_LOOP ; step 2 2 cycles DELAY05_END DECFSZ DELAY2, F ; step 1 1 cycle GOTO DELAY050 ; step 2 2 cycles DELAY050_END RETURN ; +3 2 cycles ;------------------------------------------------------------------------------------------------------- DELAY50 ; Aika 50ms = 200 X 250us MOVLW D'200' MOVWF DELAY2 DELAY51 MOVLW D'207' ; +1 1 cycle MOVWF DELAY ; +2 1 cycle DELAY51_LOOP DECFSZ DELAY, F ; step 1 1 cycle GOTO DELAY51_LOOP ; step 2 2 cycles DELAY51_END DECFSZ DELAY2, F ; step 1 1 cycle GOTO DELAY51 ; step 2 2 cycles DELAY50_END RETURN ; +3 2 cycles ;======================================================================================================= ;======================================================================================================= ; Teksti joka ilmestyy näytölle ohjelman käynnistyttyä, merkki kerrallaan. ; -------------------- ; | Matti Järvinen | ; | 27130 EURAJOKI | ; -------------------- ;------------------------------------------------------------------------------------------------------- AIKA70 MOVLW D'70' CALL X_DELAY1 ; 70 ms odotus. RETURN TEKSTI MOVLW LCD_LINE0 ; asetetaan rivin 0 ensimmäisen merkin osoite CALL LCDSDDA ; kursori ensimmäisen rivin alkuun CALL AIKA70 ; 70 ms odotus. MOVLW a'M' CALL LCDPUTCHAR ; näytetään merkki CALL AIKA70 ; 70 ms odotus. MOVLW a'a' CALL LCDPUTCHAR ; näytetään merkki CALL AIKA70 ; 70 ms odotus. MOVLW a't' CALL LCDPUTCHAR ; näytetään merkki CALL AIKA70 ; 70 ms odotus. MOVLW a't' CALL LCDPUTCHAR ; näytetään merkki CALL AIKA70 ; 70 ms odotus. MOVLW a'i' CALL LCDPUTCHAR ; näytetään merkki CALL AIKA70 ; 70 ms odotus. MOVLW a' ' CALL LCDPUTCHAR ; näytetään merkki CALL AIKA70 ; 70 ms odotus. MOVLW a'J' CALL LCDPUTCHAR ; näytetään merkki CALL AIKA70 ; 70 ms odotus. MOVLW a'á' ; ( á = ä LCD:n merkkitaulukossa ) CALL LCDPUTCHAR ; näytetään merkki CALL AIKA70 ; 70 ms odotus. MOVLW a'r' CALL LCDPUTCHAR ; näytetään merkki CALL AIKA70 ; 70 ms odotus. MOVLW a'v' CALL LCDPUTCHAR ; näytetään merkki CALL AIKA70 ; 70 ms odotus. MOVLW a'i' CALL LCDPUTCHAR ; näytetään merkki CALL AIKA70 ; 70 ms odotus. MOVLW a'n' CALL LCDPUTCHAR ; näytetään merkki CALL AIKA70 ; 70 ms odotus. MOVLW a'e' CALL LCDPUTCHAR ; näytetään merkki CALL AIKA70 ; 70 ms odotus. MOVLW a'n' CALL LCDPUTCHAR ; näytetään merkki CALL AIKA70 ; 70 ms odotus. MOVLW a' ' CALL LCDPUTCHAR ; näytetään merkki CALL AIKA70 ; 70 ms odotus. MOVLW LCD_LINE1 ; asetetaan rivin 1 ensimmäisen merkin osoite CALL LCDSDDA ; kursori ensimmäisen rivin alkuun CALL AIKA70 ; 70 ms odotus. MOVLW a'2' CALL LCDPUTCHAR ; näytetään merkki CALL AIKA70 ; 70 ms odotus. MOVLW a'7' CALL LCDPUTCHAR ; näytetään merkki CALL AIKA70 ; 70 ms odotus. MOVLW a'1' CALL LCDPUTCHAR ; näytetään merkki CALL AIKA70 ; 70 ms odotus. MOVLW a'3' CALL LCDPUTCHAR ; näytetään merkki CALL AIKA70 ; 70 ms odotus. MOVLW a'0' CALL LCDPUTCHAR ; näytetään merkki CALL AIKA70 ; 70 ms odotus. MOVLW a' ' CALL LCDPUTCHAR ; näytetään merkki CALL AIKA70 ; 70 ms odotus. MOVLW a'E' CALL LCDPUTCHAR ; näytetään merkki CALL AIKA70 ; 70 ms odotus. MOVLW a'U' CALL LCDPUTCHAR ; näytetään merkki CALL AIKA70 ; 70 ms odotus. MOVLW a'R' CALL LCDPUTCHAR ; näytetään merkki CALL AIKA70 ; 70 ms odotus. MOVLW a'A' CALL LCDPUTCHAR ; näytetään merkki CALL AIKA70 ; 70 ms odotus. MOVLW a'J' CALL LCDPUTCHAR ; näytetään merkki CALL AIKA70 ; 70 ms odotus. MOVLW a'O' CALL LCDPUTCHAR ; näytetään merkki CALL AIKA70 ; 70 ms odotus. MOVLW a'K' CALL LCDPUTCHAR ; näytetään merkki CALL AIKA70 ; 70 ms odotus. MOVLW a'I' CALL LCDPUTCHAR ; näytetään merkki CALL AIKA70 ; 70 ms odotus. MOVLW a' ' CALL LCDPUTCHAR ; näytetään merkki MOVLW D'250' CALL X_DELAY1 ; 2s odotus. MOVLW D'250' CALL X_DELAY1 ; MOVLW D'250' CALL X_DELAY1 ; MOVLW D'250' CALL X_DELAY1 ; MOVLW D'250' CALL X_DELAY1 ; MOVLW D'250' CALL X_DELAY1 ; MOVLW D'250' CALL X_DELAY1 ; MOVLW D'250' CALL X_DELAY1 ; RETURN ;======================================================================================================= ; Aliohjelmien osuus päättyy tähän. Niitä voi lisätä tarpeen mukaan. ; ;======================================================================================================= ; Tähän voi kirjoittaa oman ohjelmansa. ; Ylempänä ollut hyppykäsky muutetaan osoittamaan kohtaan OMA. Kun ohjelma on käännetty kääntäjällä ; tähän väliin kirjoitettu ohjelma suoritetaan ja jäädään suorittamaan vain sitä mitä tähän väliin on ; kirjoitettu. Loput sotkut voi poistaa kun niitä on aikansa tutkinut ja tehnyt em. muutokset. OMA ; Nämä tekstit voi poistaa ja kirjoittaa tilalle oman ohjelmansa. ; Tila omalle koodille, muutetaan GOTO TEST1 teksti, GOTO OMA tekstiksi, sen jälkeen kun oma ; ohjelma on valmis testiin. Käännetään koko systeemi MPLAB ohjelmalla, ja testataan aluksi ; MPLAB ohjelman DEBUG osassa, jos toimii niinkuin pitäisi, niin siirretään piiriin ja ; taas kokeillaan toimiiko siinäkin. Jos kaikki toimii niinkuin suunniteltiin. Niin voi ; onnitella itseään ohjelma on valmis. GOTO OMA ;======================================================================================================= ; Suoritettava ohjelma on tästä eteenpäin. aikaisemmin ollut hyppykäsky GOTO VALIKKO osoittaa tänne. ; Ohjelman suoritusta jatketaan tästä eteenpäin. ;======================================================================================================= ; Tämä osa kirjoittaa näytön toiselle riville tekstin "TESTI 1 2 3 4" ja jatkaa VALIKKO1 osaan. VALIKKO MOVLW LCD_LINE1 ; asetetaan rivin 1 ensimmäisen merkin osoite CALL LCDSDDA ; kursori ensimmäisen rivin alkuun CALL DELAY1 ; 1 ms odotus. MOVLW a' ' CALL LCDPUTCHAR ; näytetään merkki CALL DELAY1 ; 1 ms odotus. MOVLW a'T' CALL LCDPUTCHAR ; näytetään merkki CALL DELAY1 ; 1 ms odotus. MOVLW a'E' CALL LCDPUTCHAR ; näytetään merkki CALL DELAY1 ; 1 ms odotus. MOVLW a'S' CALL LCDPUTCHAR ; näytetään merkki CALL DELAY1 ; 1 ms odotus. MOVLW a'T' CALL LCDPUTCHAR ; näytetään merkki CALL DELAY1 ; 1 ms odotus. MOVLW a'I' CALL LCDPUTCHAR ; näytetään merkki CALL DELAY1 ; 1 ms odotus. MOVLW a' ' CALL LCDPUTCHAR ; näytetään merkki CALL DELAY1 ; 1 ms odotus. MOVLW a'1' CALL LCDPUTCHAR ; näytetään merkki CALL DELAY1 ; 1 ms odotus. MOVLW a' ' CALL LCDPUTCHAR ; näytetään merkki CALL DELAY1 ; 1 ms odotus. MOVLW a'2' CALL LCDPUTCHAR ; näytetään merkki CALL DELAY1 ; 1 ms odotus. MOVLW a' ' CALL LCDPUTCHAR ; näytetään merkki CALL DELAY1 ; 1 ms odotus. MOVLW a'3' CALL LCDPUTCHAR ; näytetään merkki CALL DELAY1 ; 1 ms odotus. MOVLW a' ' CALL LCDPUTCHAR ; näytetään merkki CALL DELAY1 ; 1 ms odotus. MOVLW a'4' CALL LCDPUTCHAR ; näytetään merkki CALL DELAY1 ; 1 ms odotus. MOVLW a' ' CALL LCDPUTCHAR ; näytetään merkki CALL DELAY1 ; 1 ms odotus. MOVLW a' ' CALL LCDPUTCHAR ; näytetään merkki CALL DELAY1 ; 1 ms odotus. ;------------------------------------------------------------------------------------------------------- ; Yksinkertainen valikko. Saattaa toisinaan toimiakin. ;------------------------------------------------------------------------------------------------------- VALIKKO1 BCF LAHTO,VALO7 ; Sammutetaan VALO7 BTFSS TULO,NAPPI0 ; Tarkistetaan NAPPI0 jos ei painettuna ohitetaan seuraava. GOTO TEST1 ; Testiohjelma 1 BTFSS TULO,NAPPI1 ; Tarkistetaan NAPPI1 jos ei painettuna ohitetaan seuraava. GOTO TEST2 ; Testiohjelma 2 BTFSS TULO,NAPPI2 ; Tarkistetaan NAPPI2 jos ei painettuna ohitetaan seuraava. GOTO TEST3 ; Testiohjelma 3 BTFSS TULO,NAPPI3 ; Tarkistetaan NAPPI3 jos ei painettuna ohitetaan seuraava. GOTO PILA ; Testiohjelma 4 GOTO VALIKKO1 ; Takaisin VALIKKO1 ;------------------------------------------------------------------------------------------------------- ; Näppäimien ja valojen testaus ohjelma. ; Ohjelma tarkistaa koko portin tilan kerralla ei bitti kerrallaan. Samoin ohjaus lähtöön, koko portti ; kerralla. ; Näytölle " 2 " ;------------------------------------------------------------------------------------------------------- TEST2 MOVLW LCD_LINE1+07 ; asetetaan rivin 1 ensimmäisen merkin osoite CALL LCDSDDA ; kursori ensimmäisen rivin alkuun CALL DELAY1 ; 1 ms odotus. MOVLW a' ' CALL LCDPUTCHAR ; näytetään merkki CALL DELAY1 ; 1 ms odotus. MOVLW a' ' CALL LCDPUTCHAR ; näytetään merkki CALL DELAY1 ; 1 ms odotus. MOVLW a'2' CALL LCDPUTCHAR ; näytetään merkki CALL DELAY1 ; 1 ms odotus. MOVLW a' ' CALL LCDPUTCHAR ; näytetään merkki CALL DELAY1 ; 1 ms odotus. MOVLW a' ' CALL LCDPUTCHAR ; näytetään merkki CALL DELAY1 ; 1 ms odotus. MOVLW a' ' CALL LCDPUTCHAR ; näytetään merkki CALL DELAY1 ; 1 ms odotus. MOVLW a' ' CALL LCDPUTCHAR ; näytetään merkki CALL DELAY1 ; 1 ms odotus. MOVLW a' ' CALL LCDPUTCHAR ; näytetään merkki CALL DELAY1 ; 1 ms odotus. TEST21 BTFSS TULO,NAPPI7 ; Jos nappia NAPPI7 painetaan palataan GOTO VALIKKO ; VALIKKOon. MOVLW 0x000 ; Tyhjennetään W-rekisteri. BCF STATUS,Z ; Asetetaan STATUS rekisterin bit Z = 0 XORWF TULO,W ; TULO portin sisältöä verrataan W-rekisteriin, BTFSC STATUS,Z ; jos tulos on 0 niin STATUS rekisterin bit Z ; on 1 ja GOTO TEST21 ; aloitetaan alusta. COMF TULO,W ; TULOn komplementti W-rekisteriin, MOVWF LAHTO ; ja edelleen LAHTOon. GOTO TEST21 ; Aloitetaan alusta. ;------------------------------------------------------------------------------------------------------- ; Näppäimien ja valojen testaus ohjelma ; Tässä ohjelman pätkässä tarkistetaan TULOn kaikki bitit yksitellen ja sytytetään myös vastaava ; LAHTO valo jos nappi on painettuna, tai sammutetaan jos nappi on ylhäällä. ; Näytölle 1 ;------------------------------------------------------------------------------------------------------- TEST1 MOVLW LCD_LINE1+07 ; asetetaan rivin 1 ensimmäisen merkin osoite CALL LCDSDDA ; kursori ensimmäisen rivin alkuun CALL DELAY1 ; 1 ms odotus. MOVLW a'1' CALL LCDPUTCHAR ; näytetään merkki CALL DELAY1 ; 1 ms odotus. MOVLW a' ' CALL LCDPUTCHAR ; näytetään merkki CALL DELAY1 ; 1 ms odotus. MOVLW a' ' CALL LCDPUTCHAR ; näytetään merkki CALL DELAY1 ; 1 ms odotus. MOVLW a' ' CALL LCDPUTCHAR ; näytetään merkki CALL DELAY1 ; 1 ms odotus. MOVLW a' ' CALL LCDPUTCHAR ; näytetään merkki CALL DELAY1 ; 1 ms odotus. MOVLW a' ' CALL LCDPUTCHAR ; näytetään merkki CALL DELAY1 ; 1 ms odotus. MOVLW a' ' CALL LCDPUTCHAR ; näytetään merkki CALL DELAY1 ; 1 ms odotus. MOVLW a' ' CALL LCDPUTCHAR ; näytetään merkki CALL DELAY1 ; 1 ms odotus. TEST11 BTFSS TULO,NAPPI7 ; Jos nappia NAPPI7 painetaan palataan GOTO VALIKKO ; VALIKKOon. BTFSC TULO,NAPPI0 ; Jos NAPPI0 on 0 ohita seuraava BCF LAHTO,VALO0 ; sammutetaan VALO0 BTFSS TULO,NAPPI0 ; Jos NAPPI0 on 1 ohita seuraava BSF LAHTO,VALO0 ; sytytetään VALO0 BTFSC TULO,NAPPI1 ; Jos NAPPI1 on 0 ohita seuraava BCF LAHTO,VALO1 ; sammutetaan VALO1 BTFSS TULO,NAPPI1 ; Jos NAPPI1 on 1 ohita seuraava BSF LAHTO,VALO1 ; sytytetään VALO1 BTFSC TULO,NAPPI2 ; Jos NAPPI2 on 0 ohita seuraava BCF LAHTO,VALO2 ; sammutetaan VALO2 BTFSS TULO,NAPPI2 ; Jos NAPPI2 on 1 ohita seuraava BSF LAHTO,VALO2 ; sytytetään VALO2 BTFSC TULO,NAPPI3 ; Jos NAPPI3 on 0 ohita seuraava BCF LAHTO,VALO3 ; sammutetaan VALO3 BTFSS TULO,NAPPI3 ; Jos NAPPI3 on 1 ohita seuraava BSF LAHTO,VALO3 ; sytytetään VALO3 BTFSC TULO,NAPPI4 ; Jos NAPPI4 on 0 ohita seuraava BCF LAHTO,VALO4 ; sammutetaan VALO4 BTFSS TULO,NAPPI4 ; Jos NAPPI4 on 1 ohita seuraava BSF LAHTO,VALO4 ; sytytetään VALO4 BTFSC TULO,NAPPI5 ; Jos NAPPI5 on 0 ohita seuraava BCF LAHTO,VALO5 ; sammutetaan VALO5 BTFSS TULO,NAPPI5 ; Jos NAPPI5 on 1 ohita seuraava BSF LAHTO,VALO5 ; sytytetään VALO5 BTFSC TULO,NAPPI6 ; Jos NAPPI6 on 0 ohita seuraava BCF LAHTO,VALO6 ; sammutetaan VALO6 BTFSS TULO,NAPPI6 ; Jos NAPPI6 on 1 ohita seuraava BSF LAHTO,VALO6 ; sytytetään VALO6 BTFSC TULO,NAPPI7 ; Jos NAPPI7 on 0 ohita seuraava BCF LAHTO,VALO7 ; sammutetaan VALO7 BTFSS TULO,NAPPI7 ; Jos NAPPI7 on 1 ohita seuraava BSF LAHTO,VALO7 ; sytytetään VALO7 GOTO TEST11 ; siirrytään paikkaan TEST11 ; takaisin alkuun ;------------------------------------------------------------------------------------------------------- ; Sytytetään ja sammutetaam kaikki valot vuoronperään, kumpaankin suuntaan. ; Näytölle teksti VAUTSI ; toimintojen väli 100ms ;------------------------------------------------------------------------------------------------------- AIKA100 ; Aliohjelma 100 ms MOVLW d'100' ; Asetetaan 100 W-rekisterin kautta CALL X_DELAY1 ; aika aliohjelmaan ja kulutetaan aika RETURN ; paluu pääohjelmaan ;------------------------------------------------------------------------------------------------------- PILA MOVLW LCD_LINE1+07 ; asetetaan rivin 1 ensimmäisen merkin osoite CALL LCDSDDA ; kursori ensimmäisen rivin alkuun CALL DELAY1 ; 1 ms odotus. MOVLW a' ' CALL LCDPUTCHAR ; näytetään merkki CALL DELAY1 ; 1 ms odotus. MOVLW a'V' CALL LCDPUTCHAR ; näytetään merkki CALL DELAY1 ; 1 ms odotus. MOVLW a'A' CALL LCDPUTCHAR ; näytetään merkki CALL DELAY1 ; 1 ms odotus. MOVLW a'U' CALL LCDPUTCHAR ; näytetään merkki CALL DELAY1 ; 1 ms odotus. MOVLW a'T' CALL LCDPUTCHAR ; näytetään merkki CALL DELAY1 ; 1 ms odotus. MOVLW a'S' CALL LCDPUTCHAR ; näytetään merkki CALL DELAY1 ; 1 ms odotus. MOVLW a'I' CALL LCDPUTCHAR ; näytetään merkki CALL DELAY1 ; 1 ms odotus. MOVLW a' ' CALL LCDPUTCHAR ; näytetään merkki CALL DELAY1 ; 1 ms odotus. PILA1 BTFSS TULO,NAPPI7 ; Jos nappia NAPPI7 painetaan palataan GOTO VALIKKO ; VALIKKOon. BTFSC TULO,NAPPI0 ; Jos NAPPI0 on 0 ohita seuraava GOTO PILA1 ; Takaisin PILA CALL AIKA100 ; kulutetaan aika 100 ms BSF LAHTO,VALO7 ; Sytytetään VALO7 CALL AIKA100 ; kulutetaan aika 100 ms BSF LAHTO,VALO6 ; Sytytetään VALO6 CALL AIKA100 ; kulutetaan aika 100 ms BCF LAHTO,VALO7 ; Sammutetaan VALO7 BSF LAHTO,VALO5 ; Sytytetään VALO5 CALL AIKA100 ; kulutetaan aika 100 ms BCF LAHTO,VALO6 ; Sammutetaan VALO6 BSF LAHTO,VALO4 ; Sytytetään VALO4 CALL AIKA100 ; kulutetaan aika 100 ms BCF LAHTO,VALO5 ; BSF LAHTO,VALO3 ; CALL AIKA100 BCF LAHTO,VALO4 BSF LAHTO,VALO2 CALL AIKA100 BCF LAHTO,VALO3 BSF LAHTO,VALO1 CALL AIKA100 BCF LAHTO,VALO2 BSF LAHTO,VALO0 CALL AIKA100 BCF LAHTO,VALO1 CALL AIKA100 BCF LAHTO,VALO0 CALL AIKA100 ; Vaihdetaan suunta CALL AIKA100 BSF LAHTO,VALO0 CALL AIKA100 BSF LAHTO,VALO1 CALL AIKA100 BCF LAHTO,VALO0 BSF LAHTO,VALO2 CALL AIKA100 BCF LAHTO,VALO1 BSF LAHTO,VALO3 CALL AIKA100 BCF LAHTO,VALO2 BSF LAHTO,VALO4 CALL AIKA100 BCF LAHTO,VALO3 BSF LAHTO,VALO5 CALL AIKA100 BCF LAHTO,VALO4 BSF LAHTO,VALO6 CALL AIKA100 BCF LAHTO,VALO5 BSF LAHTO,VALO7 CALL AIKA100 BCF LAHTO,VALO6 CALL AIKA100 BCF LAHTO,VALO7 CALL AIKA100 GOTO PILA1 ;======================================================================================================= ; Tähän asti ohjelmat toimivat myös ilman lisäkortteja, myös jäljenpänä olevat, mutta niillä ei saa ; mitään näkyvää aikaiseksi pelkällä ohjainpiirikortilla. Tekstit tietenkin näkyvät LCD näytöllä. ; Relekortille liittyvät ohjelmat. ;======================================================================================================= ;------------------------------------------------------------------------------------------------------- ; Moottorin PWM lähdön testiohjelmasähläys. ; Ensteksikin kirjoitetaan näytölle tekstiä "MOT 1" ja sen jälkeen mitä tehdään. ; B0 napilla nopeus hidastuu ja B1 napilla kiihtyy. suunnan vaihdot seuraavilla napeilla. ; Saattaa olla hieman sotkuinen makaroonisalaatti, pompitaan sinne tänne ja välillä takaisin. ;------------------------------------------------------------------------------------------------------- TEST3 MOVLW LCD_LINE1+07 ; asetetaan rivin 1 ensimmäisen merkin osoite CALL LCDSDDA ; kursori ensimmäisen rivin alkuun CALL DELAY1 ; 1 ms odotus. MOVLW a'M' CALL LCDPUTCHAR ; näytetään merkki CALL DELAY1 ; 1 ms odotus. MOVLW a'O' CALL LCDPUTCHAR ; näytetään merkki CALL DELAY1 ; 1 ms odotus. MOVLW a'T' CALL LCDPUTCHAR ; näytetään merkki CALL DELAY1 ; 1 ms odotus. MOVLW a' ' CALL LCDPUTCHAR ; näytetään merkki CALL DELAY1 ; 1 ms odotus. MOVLW a'1' CALL LCDPUTCHAR ; näytetään merkki CALL DELAY1 ; 1 ms odotus. MOVLW a' ' CALL LCDPUTCHAR ; näytetään merkki CALL DELAY1 ; 1 ms odotus. MOVLW a' ' CALL LCDPUTCHAR ; näytetään merkki CALL DELAY1 ; 1 ms odotus. MOVLW a' ' CALL LCDPUTCHAR ; näytetään merkki CALL DELAY1 ; 1 ms odotus. MOVLW a' ' CALL LCDPUTCHAR ; näytetään merkki CALL DELAY1 ; 1 ms odotus. GOTO TEST31 MOTSTOP MOVFW MOTNOPL ; Siirretään rekisteristä MOVWF CCPR2L ; PWM rekisteriin MOVLW d'2' ; asetetaan aika 2ms CALL X_DELAY1 ; kulutetaan aika DECFSZ MOTNOPL,F ; Vähennetään rekisteristä(nopeutta) GOTO MOTSTOP ; jos ei nolla, uusi kierros. INCF MOTNOPL,F ; jos nolla lisätään 1 ja odotetaan BTFSC TULO,NAPPI7 ; Jos nappi7 ei ole painettuna ohitetaan seuraava. GOTO VALIKKO ; VALIKKOon. BCF LAHTO,VALO0 GOTO MOTSTOP TEST31 BTFSS TULO,NAPPI7 ; Jos NAPPI7 on 0 GOTO MOTSTOP ; siirrytään paikkaan MOTSTOP BTFSS TULO,NAPPI0 ; Jos NAPPI0 on 0 GOTO MOT1E ; siirrytään paikkaan MOT1E MOT1ET BTFSS TULO,NAPPI1 ; Jos NAPPI1 on 0 GOTO MOT1D ; siirrytään paikkaan MOT1D MOT1DT BTFSS TULO,NAPPI2 ; Jos NAPPI2 on 0 GOTO MOT1SV1 ; siirrytään paikkaan MOT1SV1 MOT1SVT BTFSS TULO,NAPPI3 ; Jos NAPPI3 on 1 GOTO MOT1SV2 ; siirrytään paikkaan MOT1SV2 MOT1SVT2 GOTO TEST31 ;-------------------------------- MOT1E MOVLW LCD_LINE1+0D ; asetetaan rivin 1 ensimmäisen merkin osoite CALL LCDSDDA ; kursori ensimmäisen rivin alkuun CALL DELAY1 ; 1 ms odotus. MOVLW a'H' CALL LCDPUTCHAR ; näytetään merkki CALL DELAY1 ; 1 ms odotus. MOVLW a'I' CALL LCDPUTCHAR ; näytetään merkki CALL DELAY1 ; 1 ms odotus. MOVLW a'D' CALL LCDPUTCHAR ; näytetään merkki CALL DELAY1 ; 1 ms odotus. MOTSEIS MOVFW MOTNOPL ; Siirretään rekisteristä MOVWF CCPR2L ; PWM rekisteriin MOVLW d'15' ; asetetaan aika 10ms CALL X_DELAY1 ; kulutetaan aika BTFSC TULO,NAPPI0 ; Jos nappi on painettuna ohitetaan seuraava. GOTO MOT1ETT ; Siirrytään paikkaan MOT1ET DECFSZ MOTNOPL,F ; Vähennetään rekisteristä(nopeutta) GOTO MOTSEIS ; jos ei nolla, uusi kierros. INCF MOTNOPL,F ; jos nolla lisätään 1 ja odotetaan GOTO MOTSEIS ; kunnes nappi päästetään ylös. MOT1ETT GOTO MOT1ET ;-------------------------------- MOT1D MOVLW LCD_LINE1+0D ; asetetaan rivin 1 ensimmäisen merkin osoite CALL LCDSDDA ; kursori ensimmäisen rivin alkuun CALL DELAY1 ; 1 ms odotus. MOVLW a'N' CALL LCDPUTCHAR ; näytetään merkki CALL DELAY1 ; 1 ms odotus. MOVLW a'O' CALL LCDPUTCHAR ; näytetään merkki CALL DELAY1 ; 1 ms odotus. MOVLW a'P' CALL LCDPUTCHAR ; näytetään merkki CALL DELAY1 ; 1 ms odotus. MOTKAY MOVFW MOTNOPL ; Siirretään rekisteristä MOVWF CCPR2L ; PWM rekisteriin MOVLW d'15' ; asetetaan aika 10ms CALL X_DELAY1 ; kulutetaan aika BTFSC TULO,NAPPI1 ; Jos nappi on painettuna pysytään tässä. GOTO MOT1DTT ; siirrytään paikkaan MOT1DT INCFSZ MOTNOPL,F ; Lisätään rekisteriä(nopeutta) GOTO MOTKAY ; Jos ei nolla, uusi kierros DECF MOTNOPL,F ; Jos nolla vähennetään 1 ja odotetaan GOTO MOTKAY ; kunnes nappi päästetään ylös. MOT1DTT GOTO MOT1DT ;-------------------------------- MOT1SV1 BCF LAHTO,VALO0 MOVLW LCD_LINE1+0D ; asetetaan rivin 1 ensimmäisen merkin osoite CALL LCDSDDA ; kursori ensimmäisen rivin alkuun CALL DELAY1 ; 1 ms odotus. MOVLW a'T' CALL LCDPUTCHAR ; näytetään merkki CALL DELAY1 ; 1 ms odotus. MOVLW a'A' CALL LCDPUTCHAR ; näytetään merkki CALL DELAY1 ; 1 ms odotus. MOVLW a' ' CALL LCDPUTCHAR ; näytetään merkki CALL DELAY1 ; 1 ms odotus. MOT1SV BTFSS TULO,NAPPI2 ; Jos NAPPI2 on 0 GOTO MOT1SV ; siirrytään paikkaan MOT1SV MOTSUUNT MOVFW MOTNOPL ; Siirretään rekisteristä MOVWF CCPR2L ; PWM rekisteriin MOVLW d'5' ; asetetaan aika 4ms CALL X_DELAY1 ; kulutetaan aika DECFSZ MOTNOPL,F ; Vähennetään rekisteriä(nopeutta) GOTO MOTSUUNT ; Jos ei nolla, uusi kierros INCF MOTNOPL,F ; Jos nolla lisätään 1 ja BSF LAHTO,VALO0 ; käännetään moottorin suunta GOTO MOT1SVT ;-------------------------------- MOT1SV2 MOVLW LCD_LINE1+0D ; asetetaan rivin 1 ensimmäisen merkin osoite CALL LCDSDDA ; kursori ensimmäisen rivin alkuun CALL DELAY1 ; 1 ms odotus. MOVLW a'E' CALL LCDPUTCHAR ; näytetään merkki CALL DELAY1 ; 1 ms odotus. MOVLW a'T' CALL LCDPUTCHAR ; näytetään merkki CALL DELAY1 ; 1 ms odotus. MOVLW a' ' CALL LCDPUTCHAR ; näytetään merkki CALL DELAY1 ; 1 ms odotus. MOT1SV3 BTFSS TULO,NAPPI3 ; Jos NAPPI3 on 0 GOTO MOT1SV3 ; siirrytään paikkaan MOT1SV2 MOTSUUNT2 MOVFW MOTNOPL ; Siirretään rekisteristä MOVWF CCPR2L ; PWM rekisteriin MOVLW d'5' ; asetetaan aika 4ms CALL X_DELAY1 ; kulutetaan aika DECFSZ MOTNOPL,F ; Vähennetään rekisteriä(nopeutta) GOTO MOTSUUNT2 ; Jos ei nolla, uusi kierros INCF MOTNOPL,F ; Jos nolla lisätään 1 ja BCF LAHTO,VALO0 ; käännetään moottorin suunta GOTO MOT1SVT2 ;======================================================================================================= END ; Ohjelmarivien loppu. Ilmoitus kääntäjälle että ohjelmarivit loppuu ; tähän. Tätä ei saa poistaa. ;=======================================================================================================