Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ;------------------------------------------------------------------
- ; File: Main.asm
- ; Title:
- ; Hardware: APIC-DE board
- ; Proteus Simulation also possible
- ; Controller: PIC16F877A
- ; Frequency: 4MHz
- ; Version: 2.2
- ; MPLAB 8.53
- ; Date: 19.10.2010
- ; Author: Aurel GONTEAN, aurel.gontean@etc.upt.ro
- ; -----------------------------------------------------------------
- ; Revision history
- ; - Ver 1.0, 28.09.2004, Author: Aurel GONTEAN
- ; - Ver 2.2, 19.10.2010, adapted for the current MPLAB Linker
- ; version
- ; -----------------------------------------------------------------
- ; Description:
- ; APIC jumpers: RS, R/W, E, D4, D5, D6, D7
- ;
- ; -----------------------------------------------------------------
- list p=16F877A
- #include p16F877A.inc
- __CONFIG _CP_OFF & _WDT_OFF & _XT_OSC & _LVP_OFF & _BODEN_OFF ;& _DEBUG_ON
- EXTERN LCDInit, LCDClear, temp_wr, d_write, i_write, LCDLine_1, LCDLine_2
- EXTERN DelayW, LCDClear
- ; --------------------------------------------------------------------------------------------
- ; Variable Defintions
- ; --------------------------------------------------------------------------------------------
- variables UDATA
- ptr_pos RES 1
- ptr_count RES 1
- temp_1 RES 1
- temp_2 RES 1
- temp_3 RES 1
- temp_4 RES 1
- temp_5 RES 1
- temp_w RES 1
- temp_stat RES 1
- Contor RES 1
- HexTemp RES 1
- x RES 1
- y RES 1
- DuCy RES 1
- DuCyR RES 1
- DuCyG RES 1
- DuCyB RES 1
- freq RES 1
- ; --------------------------------------------------------------------------------------------
- ; Code
- ; --------------------------------------------------------------------------------------------
- org 0x00
- ;PROG1 CODE
- nop
- goto Start
- ;ISR CODE 0x04
- org 0x04
- ; -- save the status register
- movwf temp_w
- swapf STATUS,w
- movwf temp_stat
- BANKSEL INTCON
- bcf INTCON,INTF
- BANKSEL PIR1
- clrf PIR1
- ; call SoftwarePWM
- btfss PORTC,3
- goto set_bit
- bcf PORTC,3
- goto isr_end
- set_bit
- bsf PORTC,3
- ; -- restore the status register
- isr_end
- swapf temp_stat,w
- movwf STATUS
- movfw temp_w
- retfie
- stan_t ;start standard table
- stan_table ;table for standard code
- addwf PCL,f
- ; "XXXXXXXXXXXXXXXX"
- ; ptr:
- dt "== PixelToLED ==" ; .0
- Table64
- addwf PCL,F ; Add offset in W to PCL to calc. goto.
- Char0
- retlw B'00011111' ;
- retlw B'00011111' ;
- retlw B'00011111' ;
- retlw B'00011111' ;
- retlw B'00011111' ;
- retlw B'00011111' ;
- retlw B'00011111' ;
- retlw B'00011111' ;
- Char1
- retlw B'00011111' ;
- retlw B'00010011' ;
- retlw B'00010101' ;
- retlw B'00010111' ;
- retlw B'00010101' ;
- retlw B'00010101' ;
- retlw B'00011001' ;
- retlw B'00011111' ;
- Char2
- retlw B'00011111' ;
- retlw B'00010011' ;
- retlw B'00010101' ;
- retlw B'00010011' ;
- retlw B'00010101' ;
- retlw B'00010101' ;
- retlw B'00010011' ;
- retlw B'00011111' ;
- Char3
- retlw B'00011111' ;
- retlw B'00010011' ;
- retlw B'00010101' ;
- retlw B'00010101' ;
- retlw B'00010011' ;
- retlw B'00010101' ;
- retlw B'00010101' ;
- retlw B'00011111'
- Char4
- retlw B'00000000' ;
- retlw B'00000000' ;
- retlw B'00000000' ;
- retlw B'00011111' ;
- retlw B'00011111' ;
- retlw B'00011111' ;
- retlw B'00011111' ;
- retlw B'00011111' ;
- Char5
- retlw B'00000000' ;
- retlw B'00000000' ;
- retlw B'00011111' ;
- retlw B'00011111' ;
- retlw B'00011111' ;
- retlw B'00011111' ;
- retlw B'00011111' ;
- retlw B'00011111' ;
- Char6
- retlw B'00000000' ;
- retlw B'00011111' ;
- retlw B'00011111' ;
- retlw B'00011111' ;
- retlw B'00011111' ;
- retlw B'00011111' ;
- retlw B'00011111' ;
- retlw B'00011111' ;
- Char7
- retlw B'00011111' ;
- retlw B'00011111' ;
- retlw B'00011111' ;
- retlw B'00011111' ;
- retlw B'00011111' ;
- retlw B'00011111' ;
- retlw B'00011111' ;
- retlw B'00011111' ;
- ; --------------------------------------------------------------------------------------------
- ; Main Code
- ; --------------------------------------------------------------------------------------------
- Start
- clrf Contor
- call Init
- call LCDInit
- movlw D'5'
- call Table64
- call Custom_Char8 ; init custom symbols
- call LCDClear
- ; movlw B'00001111' ; Display Control
- ; movwf temp_wr ; Display On; Cursor ON
- ; call i_write ; Blink ON
- banksel ADCON0
- Loop bsf ADCON0,GO ; start ADC
- btfsc ADCON0,GO ; waiting on ADC Conversion
- goto $-1
- movfw ADRESH ; get the duty cycle
- movwf CCPR1H
- movwf CCPR2H
- movwf CCPR1L ; set duty cycle
- movwf CCPR2L
- movwf DuCyR
- movwf DuCyG
- movwf DuCyB
- movwf DuCy ; duty cycle for software PWM
- ; call SoftwarePWM
- bsf PORTC,3
- call LCDLine_1
- BANKSEL ptr_pos
- movlw .0 ; send msg
- movwf ptr_pos
- call stan_char_1
- call LCDLine_2
- movlw A' ' ; seperator
- movwf temp_wr
- call d_write
- movlw .3 ; Red Values
- movwf temp_wr
- call d_write
- movfw DuCyR
- call WriteDec
- movlw A' ' ; seperator
- movwf temp_wr
- call d_write
- movlw .1 ; Green Values
- movwf temp_wr
- call d_write
- movfw DuCyG
- call WriteDec
- movlw A' ' ; seperator
- movwf temp_wr
- call d_write
- movlw .2 ; Blue Values
- movwf temp_wr
- call d_write
- movfw DuCyB ; display Duty Cycle
- call WriteDec
- ;movlw D'40'
- ;call DelayW
- goto Loop
- ; --------------------------------------------------------------------------------------------
- ; Subroutines
- ; --------------------------------------------------------------------------------------------
- ; ----- Init ----------------------------------------------------
- Init
- banksel ADCON1
- bcf ADCON1,PCFG0 ;Port Configuration Control bits
- bcf ADCON1,PCFG1
- bcf ADCON1,PCFG2
- bcf ADCON1,PCFG3
- bcf ADCON1,ADFM ;Format selet left justified
- banksel ADCON0
- bcf ADCON0,CHS2 ; Select Channel 0 (AN0)
- bcf ADCON0,CHS1
- bcf ADCON0,CHS0
- bsf ADCON0,ADCS0 ; Set conversion Clock
- bsf ADCON0,ADCS1
- bsf ADCON0,ADON ; ADC ON
- ; Init Timer Interrupt
- BANKSEL PIE1
- bsf PIE1,TMR2IE
- BANKSEL INTCON
- clrf INTCON
- bsf INTCON,PEIE
- bsf INTCON,GIE
- ; Initialisation for the PWMs
- banksel PR2
- movlw H'FF' ; frequency to PR2
- movwf PR2
- banksel TRISC ; configure PORTC outputs
- bcf TRISC,1 ; pwm 1 - hardware
- bcf TRISC,2 ; pwm 2 - hardware
- bcf TRISC,3 ; pwm 3 - software
- banksel freq
- movwf freq ; freq. for software PWM
- banksel T2CON ; timer2 configuration
- bsf T2CON,T2CKPS1 ; prescaler 16
- bcf T2CON,T2CKPS0
- bsf T2CON,TMR2ON ; start timer
- bsf CCP1CON,CCP1M3 ; pwm 1
- bsf CCP1CON,CCP1M2
- bsf CCP2CON,CCP2M3 ; pwm 2
- bsf CCP2CON,CCP2M2
- bcf PORTC,3
- return
- ; --Underflow-Check------------
- UChk
- btfsc STATUS,C
- retlw D'0'
- retlw D'1'
- ; --test0----------------------
- test0 ; test if accu is 0
- movwf temp_5
- incf temp_5
- decfsz temp_5 ; test for 0
- retlw D'0' ; if not 0, return 0
- retlw D'1' ; if 0 return 1
- ; ----- SoftwarePWM ---------------------------------------------
- SoftwarePWM
- movfw TMR2 ; subtract timer val w/ duty cycle
- subwf DuCy,0
- movwf temp_1
- call UChk ; check if overflow happened
- movwf temp_2
- btfsc temp_2,0 ; go on if test returned 1
- goto sPWMcop
- movfw temp_1 ; check if subtraction produced 0
- call test0
- movwf temp_2
- btfsc temp_2,0 ; go on if 0-test returned 1
- goto sPWMcop
- bsf PORTC,3
- return
- sPWMcop bcf PORTC,3
- return;
- ; ----- Custom_Char8 --------------------------------------------
- Custom_Char8
- movlw B'01000000' ;set CGRAM Address = 0
- movwf temp_wr
- call i_write
- Reia movfw Contor
- call Table64
- movwf temp_wr
- call d_write
- incf Contor
- btfss Contor,6
- goto Reia
- return
- ; ----- stan_char_1 -----------------------------------------------
- stan_char_1 ; Standard code, Place characters on line-1
- call LCDLine_1 ;move cursor to line 1
- BANKSEL ptr_count
- movlw .16 ;1-full line of LCD
- movwf ptr_count
- stan_next_char_1
- movlw HIGH stan_table
- movwf PCLATH
- movf ptr_pos,w ;character table location
- call stan_table ;retrieve 1 character
- movwf temp_wr
- call d_write ;send character to LCD
- BANKSEL ptr_pos ;get next character for LCD
- incf ptr_pos,f
- decfsz ptr_count,f ;move pointer to next char
- goto stan_next_char_1
- BANKSEL PORTA ;bank 0
- return
- ; ----- WriteDec --------------------------------------------------
- WriteDec
- movwf temp_4 ; backup our number
- ; 1st: get hundreds
- movwf x ; set x for division
- movlw .100
- movwf y ; set y for division, divide by 100
- call intDiv ; divide
- movwf temp_2 ; store result
- addlw .48
- movwf temp_wr
- call d_write
- ; 2nd: get tens
- movfw temp_2 ; restore last result
- movwf x ; set x for multiplication
- movlw .100
- movwf y ; set y for multiplication, multiply by 100
- call intMult ; multiply
- subwf temp_4,0 ; subtract the product from our number
- movwf temp_4 ; backup this number
- movwf x ; set x for division
- movlw .10
- movwf y ; set y for division, divide by 10
- call intDiv
- movwf temp_3 ; store result
- addlw .48
- movwf temp_wr
- call d_write
- ; 3rd: get ones
- movfw temp_3 ; restore last result
- movwf x ; set x for multiplication
- movlw .10
- movwf y ; set y for multiplication, multiply by 10
- call intMult ; multiply
- subwf temp_4,0
- addlw .48
- movwf temp_wr
- call d_write
- return
- ; ----- Integer Multiplication ------------------------------------
- intMult
- BANKSEL temp_1
- movlw D'0'
- movwf temp_1
- mulTy incf y
- decfsz y ; check for multiplication by 0
- goto mulTx ; y != 0
- goto mulEnd ; y = 0
- mulTx incf x
- decfsz x ; check for multiplication by 0
- goto mulLoop ; x != 0
- goto mulEnd ; x = 0
- mulLoop movfw x
- addwf temp_1,1
- decf y
- goto mulTy
- mulEnd movfw temp_1
- return
- ; ----- Dividieren ------------------------------------------------
- intDiv
- movlw D'0'
- movwf temp_1
- movfw x
- movwf temp_2
- incf y
- decfsz y ; check for div / 0
- goto divLoop
- goto divErr ; div/0, goto error condition
- divLoop movfw y
- subwf temp_2,1
- btfss STATUS,C
- goto divEnd
- incf temp_1
- movfw temp_2
- goto divLoop
- divErr bcf STATUS,Z
- divEnd movfw temp_1
- return
- END
Add Comment
Please, Sign In to add comment