Guest User

Untitled

a guest
Feb 21st, 2018
331
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. ;------------------------------------------------------------------
  2. ; File:         Main.asm
  3. ; Title:       
  4. ; Hardware:     APIC-DE board
  5. ;               Proteus Simulation also possible
  6. ; Controller:   PIC16F877A
  7. ; Frequency:    4MHz
  8. ; Version:      2.2
  9. ; MPLAB         8.53
  10. ; Date:         19.10.2010
  11. ; Author:       Aurel GONTEAN, aurel.gontean@etc.upt.ro
  12. ; -----------------------------------------------------------------
  13. ; Revision history
  14. ;  - Ver 1.0, 28.09.2004, Author: Aurel GONTEAN
  15. ;  - Ver 2.2, 19.10.2010, adapted for the current MPLAB Linker
  16. ;                         version  
  17. ; -----------------------------------------------------------------
  18. ; Description:
  19. ; APIC jumpers: RS, R/W, E, D4, D5, D6, D7
  20. ;
  21. ; -----------------------------------------------------------------
  22.  
  23.  
  24.     list p=16F877A
  25.     #include p16F877A.inc
  26.  
  27.  
  28.     __CONFIG _CP_OFF & _WDT_OFF & _XT_OSC & _LVP_OFF & _BODEN_OFF ;& _DEBUG_ON
  29.  
  30.     EXTERN  LCDInit, LCDClear, temp_wr, d_write, i_write, LCDLine_1, LCDLine_2
  31.     EXTERN  DelayW, LCDClear
  32.  
  33. ; --------------------------------------------------------------------------------------------
  34. ; Variable Defintions
  35. ; --------------------------------------------------------------------------------------------
  36.  
  37. variables   UDATA
  38. ptr_pos     RES     1
  39. ptr_count   RES     1
  40. temp_1      RES     1
  41. temp_2      RES     1
  42. temp_3      RES     1
  43. temp_4      RES     1
  44. temp_5      RES     1
  45. temp_w      RES     1
  46. temp_stat   RES     1
  47. Contor      RES     1
  48. HexTemp     RES     1
  49. x           RES     1
  50. y           RES     1
  51. DuCy        RES     1
  52. DuCyR       RES     1
  53. DuCyG       RES     1
  54. DuCyB       RES     1
  55. freq        RES     1
  56.  
  57. ; --------------------------------------------------------------------------------------------
  58. ; Code
  59. ; --------------------------------------------------------------------------------------------
  60.  
  61. org 0x00
  62. ;PROG1      CODE   
  63.     nop
  64.     goto    Start
  65.    
  66. ;ISR            CODE    0x04
  67. org 0x04
  68.  ; -- save the status register
  69.     movwf   temp_w
  70.     swapf   STATUS,w
  71.     movwf   temp_stat
  72.    
  73.     BANKSEL INTCON
  74.     bcf     INTCON,INTF
  75.     BANKSEL PIR1
  76.     clrf    PIR1
  77. ;   call     SoftwarePWM
  78.     btfss   PORTC,3
  79.     goto    set_bit
  80.     bcf     PORTC,3
  81.     goto    isr_end
  82. set_bit
  83.     bsf     PORTC,3
  84.     ; -- restore the status register
  85. isr_end
  86.     swapf   temp_stat,w
  87.     movwf   STATUS
  88.     movfw   temp_w
  89.     retfie
  90.  
  91. stan_t                              ;start standard table  
  92. stan_table                          ;table for standard code
  93.         addwf   PCL,f
  94.     ;   "XXXXXXXXXXXXXXXX"
  95.     ;                       ptr:
  96.     dt  "== PixelToLED =="  ;   .0
  97.  
  98.    
  99. Table64
  100.         addwf   PCL,F           ; Add offset in W to PCL to calc. goto.
  101. Char0
  102.         retlw   B'00011111'     ;
  103.         retlw   B'00011111'     ;
  104.         retlw   B'00011111'     ;
  105.         retlw   B'00011111'     ;
  106.         retlw   B'00011111'     ;
  107.         retlw   B'00011111'     ;
  108.         retlw   B'00011111'     ;
  109.         retlw   B'00011111'     ;
  110. Char1
  111.         retlw   B'00011111'     ;
  112.         retlw   B'00010011'     ;
  113.         retlw   B'00010101'     ;
  114.         retlw   B'00010111'     ;
  115.         retlw   B'00010101'     ;
  116.         retlw   B'00010101'     ;
  117.         retlw   B'00011001'     ;
  118.         retlw   B'00011111'     ;
  119. Char2
  120.         retlw   B'00011111'     ;
  121.         retlw   B'00010011'     ;
  122.         retlw   B'00010101'     ;
  123.         retlw   B'00010011'     ;
  124.         retlw   B'00010101'     ;
  125.         retlw   B'00010101'     ;
  126.         retlw   B'00010011'     ;
  127.         retlw   B'00011111'     ;
  128. Char3
  129.         retlw   B'00011111'     ;
  130.         retlw   B'00010011'     ;
  131.         retlw   B'00010101'     ;
  132.         retlw   B'00010101'     ;
  133.         retlw   B'00010011'     ;
  134.         retlw   B'00010101'     ;
  135.         retlw   B'00010101'     ;
  136.         retlw   B'00011111'
  137. Char4
  138.         retlw   B'00000000'     ;
  139.         retlw   B'00000000'     ;
  140.         retlw   B'00000000'     ;
  141.         retlw   B'00011111'     ;
  142.         retlw   B'00011111'     ;
  143.         retlw   B'00011111'     ;
  144.         retlw   B'00011111'     ;
  145.         retlw   B'00011111'     ;
  146. Char5
  147.         retlw   B'00000000'     ;
  148.         retlw   B'00000000'     ;
  149.         retlw   B'00011111'     ;
  150.         retlw   B'00011111'     ;
  151.         retlw   B'00011111'     ;
  152.         retlw   B'00011111'     ;
  153.         retlw   B'00011111'     ;
  154.         retlw   B'00011111'     ;
  155. Char6
  156.         retlw   B'00000000'     ;
  157.         retlw   B'00011111'     ;
  158.         retlw   B'00011111'     ;
  159.         retlw   B'00011111'     ;
  160.         retlw   B'00011111'     ;
  161.         retlw   B'00011111'     ;
  162.         retlw   B'00011111'     ;
  163.         retlw   B'00011111'     ;
  164. Char7
  165.         retlw   B'00011111'     ;
  166.         retlw   B'00011111'     ;
  167.         retlw   B'00011111'     ;
  168.         retlw   B'00011111'     ;
  169.         retlw   B'00011111'     ;
  170.         retlw   B'00011111'     ;
  171.         retlw   B'00011111'     ;
  172.         retlw   B'00011111'     ;
  173.  
  174. ; --------------------------------------------------------------------------------------------
  175. ; Main Code
  176. ; -------------------------------------------------------------------------------------------- 
  177.  
  178. Start  
  179.         clrf    Contor
  180.        
  181.         call    Init
  182.        
  183.         call    LCDInit
  184.         movlw   D'5'
  185.         call    Table64
  186.         call    Custom_Char8    ; init custom symbols
  187.         call    LCDClear
  188.    
  189. ;   movlw   B'00001111'     ; Display Control
  190. ;   movwf   temp_wr         ; Display On; Cursor ON
  191. ;   call    i_write         ; Blink ON
  192.    
  193.         banksel ADCON0
  194. Loop    bsf     ADCON0,GO       ; start ADC
  195.  
  196.         btfsc   ADCON0,GO       ; waiting on ADC Conversion
  197.         goto    $-1
  198.    
  199.         movfw   ADRESH          ; get the duty cycle
  200.         movwf   CCPR1H
  201.         movwf   CCPR2H 
  202.         movwf   CCPR1L          ; set duty cycle
  203.         movwf   CCPR2L
  204.         movwf   DuCyR
  205.         movwf   DuCyG
  206.         movwf   DuCyB
  207.         movwf   DuCy            ; duty cycle for software PWM
  208.  
  209.     ;   call    SoftwarePWM
  210.         bsf     PORTC,3
  211.    
  212.         call    LCDLine_1
  213.        
  214.         BANKSEL ptr_pos        
  215.         movlw   .0              ; send msg
  216.         movwf   ptr_pos
  217.         call    stan_char_1
  218.    
  219.         call    LCDLine_2
  220.        
  221.         movlw   A' '            ; seperator
  222.         movwf   temp_wr
  223.         call    d_write
  224.        
  225.         movlw   .3              ; Red Values
  226.         movwf   temp_wr
  227.         call    d_write
  228.        
  229.         movfw   DuCyR
  230.         call    WriteDec
  231.        
  232.         movlw   A' '            ; seperator
  233.         movwf   temp_wr
  234.         call    d_write
  235.        
  236.         movlw   .1              ; Green Values
  237.         movwf   temp_wr
  238.         call    d_write
  239.        
  240.         movfw   DuCyG
  241.         call    WriteDec       
  242.        
  243.         movlw   A' '            ; seperator
  244.         movwf   temp_wr
  245.         call    d_write
  246.        
  247.         movlw   .2              ; Blue Values
  248.         movwf   temp_wr
  249.         call    d_write
  250.        
  251.         movfw   DuCyB           ; display Duty Cycle
  252.         call    WriteDec
  253.    
  254.         ;movlw  D'40'
  255.         ;call   DelayW
  256.         goto    Loop
  257.  
  258. ; --------------------------------------------------------------------------------------------
  259. ; Subroutines
  260. ; -------------------------------------------------------------------------------------------- 
  261.  
  262. ; ----- Init ----------------------------------------------------
  263. Init
  264.         banksel ADCON1
  265.         bcf     ADCON1,PCFG0    ;Port Configuration Control bits
  266.         bcf     ADCON1,PCFG1
  267.         bcf     ADCON1,PCFG2
  268.         bcf     ADCON1,PCFG3
  269.         bcf     ADCON1,ADFM     ;Format selet left justified
  270.        
  271.         banksel ADCON0
  272.         bcf     ADCON0,CHS2     ; Select Channel 0 (AN0)
  273.         bcf     ADCON0,CHS1
  274.         bcf     ADCON0,CHS0
  275.         bsf     ADCON0,ADCS0    ; Set conversion Clock
  276.         bsf     ADCON0,ADCS1
  277.        
  278.         bsf     ADCON0,ADON     ; ADC ON
  279.        
  280.         ; Init Timer Interrupt
  281.         BANKSEL PIE1
  282.         bsf     PIE1,TMR2IE
  283.         BANKSEL INTCON
  284.         clrf    INTCON
  285.         bsf     INTCON,PEIE
  286.         bsf     INTCON,GIE
  287.  
  288.         ; Initialisation for the PWMs
  289.         banksel PR2
  290.         movlw   H'FF'           ; frequency to PR2
  291.         movwf   PR2
  292.        
  293.         banksel TRISC           ; configure PORTC outputs
  294.         bcf     TRISC,1         ; pwm 1 - hardware
  295.         bcf     TRISC,2         ; pwm 2 - hardware
  296.         bcf     TRISC,3         ; pwm 3 - software
  297.        
  298.         banksel freq
  299.         movwf   freq            ; freq. for software PWM
  300.        
  301.         banksel T2CON           ; timer2 configuration
  302.         bsf     T2CON,T2CKPS1   ; prescaler 16
  303.         bcf     T2CON,T2CKPS0  
  304.         bsf     T2CON,TMR2ON    ; start timer
  305.        
  306.         bsf     CCP1CON,CCP1M3  ; pwm 1
  307.         bsf     CCP1CON,CCP1M2
  308.        
  309.         bsf     CCP2CON,CCP2M3  ; pwm 2
  310.         bsf     CCP2CON,CCP2M2
  311.        
  312.         bcf     PORTC,3
  313.  
  314.         return
  315.        
  316. ; --Underflow-Check------------
  317. UChk
  318.         btfsc   STATUS,C
  319.         retlw   D'0'
  320.         retlw   D'1'
  321.  
  322. ; --test0----------------------
  323. test0                           ; test if accu is 0
  324.         movwf   temp_5
  325.         incf    temp_5
  326.         decfsz  temp_5          ; test for 0
  327.         retlw   D'0'            ; if not 0, return 0
  328.         retlw   D'1'            ; if 0 return 1
  329.            
  330. ; ----- SoftwarePWM ---------------------------------------------
  331. SoftwarePWM
  332.         movfw   TMR2            ; subtract timer val w/ duty cycle
  333.         subwf   DuCy,0
  334.         movwf   temp_1
  335.        
  336.         call    UChk            ; check if overflow happened
  337.         movwf   temp_2                  
  338.         btfsc   temp_2,0        ; go on if test returned 1
  339.         goto    sPWMcop
  340.        
  341.         movfw   temp_1          ; check if subtraction produced 0
  342.         call    test0
  343.         movwf   temp_2
  344.         btfsc   temp_2,0          ; go on if 0-test returned 1
  345.         goto    sPWMcop
  346.        
  347.         bsf     PORTC,3
  348.         return
  349. sPWMcop bcf     PORTC,3        
  350.         return;    
  351.  
  352. ; ----- Custom_Char8 --------------------------------------------  
  353. Custom_Char8
  354.         movlw   B'01000000' ;set CGRAM Address = 0
  355.         movwf   temp_wr
  356.         call    i_write
  357. Reia    movfw   Contor
  358.         call    Table64
  359.         movwf   temp_wr
  360.         call    d_write
  361.         incf    Contor
  362.         btfss   Contor,6
  363.         goto    Reia
  364.  
  365.         return
  366.    
  367. ; ----- stan_char_1 -----------------------------------------------
  368. stan_char_1                     ; Standard code, Place characters on line-1
  369.         call    LCDLine_1       ;move cursor to line 1
  370.         BANKSEL ptr_count
  371.         movlw   .16             ;1-full line of LCD
  372.         movwf   ptr_count
  373. stan_next_char_1
  374.         movlw   HIGH stan_table
  375.         movwf   PCLATH
  376.         movf    ptr_pos,w       ;character table location
  377.         call    stan_table      ;retrieve 1 character
  378.         movwf   temp_wr        
  379.         call    d_write         ;send character to LCD
  380.         BANKSEL ptr_pos         ;get next character for LCD
  381.         incf    ptr_pos,f
  382.         decfsz  ptr_count,f     ;move pointer to next char
  383.         goto    stan_next_char_1
  384.    
  385.         BANKSEL PORTA           ;bank 0
  386.    
  387.         return
  388.  
  389. ; ----- WriteDec --------------------------------------------------
  390. WriteDec
  391.         movwf   temp_4      ; backup our number
  392.         ; 1st: get hundreds
  393.         movwf   x           ; set x for division
  394.         movlw   .100       
  395.         movwf   y           ; set y for division, divide by 100
  396.         call    intDiv      ; divide
  397.         movwf   temp_2      ; store result
  398.         addlw   .48
  399.         movwf   temp_wr    
  400.         call    d_write
  401.    
  402.         ; 2nd: get tens
  403.         movfw   temp_2      ; restore last result
  404.         movwf   x           ; set x for multiplication
  405.         movlw   .100
  406.         movwf   y           ; set y for multiplication, multiply by 100
  407.         call    intMult     ; multiply
  408.         subwf   temp_4,0    ; subtract the product from our number
  409.         movwf   temp_4      ; backup this number
  410.         movwf   x           ; set x for division
  411.         movlw   .10
  412.         movwf   y           ; set y for division, divide by 10
  413.         call    intDiv
  414.         movwf   temp_3      ; store result
  415.         addlw   .48
  416.         movwf   temp_wr
  417.         call    d_write
  418.    
  419.         ; 3rd: get ones
  420.         movfw   temp_3      ; restore last result
  421.         movwf   x           ; set x for multiplication
  422.         movlw   .10
  423.         movwf   y           ; set y for multiplication, multiply by 10
  424.         call    intMult     ; multiply
  425.         subwf   temp_4,0
  426.         addlw   .48
  427.         movwf   temp_wr
  428.         call    d_write
  429.    
  430.         return
  431.  
  432. ; ----- Integer Multiplication ------------------------------------
  433. intMult
  434.         BANKSEL temp_1
  435.         movlw   D'0'
  436.         movwf   temp_1
  437. mulTy   incf    y
  438.         decfsz  y           ; check for multiplication by 0
  439.         goto    mulTx           ; y != 0
  440.         goto    mulEnd      ; y = 0
  441. mulTx   incf    x
  442.         decfsz  x           ; check for multiplication by 0
  443.         goto    mulLoop     ; x != 0
  444.         goto    mulEnd      ; x = 0
  445. mulLoop movfw   x
  446.         addwf   temp_1,1
  447.         decf    y
  448.         goto    mulTy
  449. mulEnd  movfw   temp_1
  450.         return
  451.  
  452. ; ----- Dividieren ------------------------------------------------
  453. intDiv
  454.         movlw   D'0'
  455.         movwf   temp_1
  456.         movfw   x
  457.         movwf   temp_2
  458.         incf    y
  459.         decfsz  y           ; check for div / 0
  460.         goto    divLoop
  461.         goto    divErr      ; div/0, goto error condition
  462. divLoop movfw   y
  463.         subwf   temp_2,1  
  464.         btfss   STATUS,C
  465.         goto    divEnd
  466.         incf    temp_1
  467.         movfw   temp_2
  468.         goto    divLoop
  469. divErr  bcf     STATUS,Z
  470. divEnd  movfw   temp_1
  471.         return  
  472.        
  473.     END
Add Comment
Please, Sign In to add comment