Re: 用 16F877 輸出 PWM + LCD 顯示
|
||||
---|---|---|---|---|
新會員
|
恩...
我的設計是LCD 相關程式都放在 BANK1 裡面 處理PWM 在 BANK0 裡 中斷程式 是在 BANK0 中執行 沒有中斷時 因該一直在 BANK 1中執行 所以在 PUSH 中 有清除 STATUS,RP0、RP1 是要使用 BANK0 的暫存器 有 PCLATH 是要告速它 要去BANK 0 執行程式 因為程式位址 在BANK0中 ------------------------------------------------------------- 相對的 POP 中 PCLATH 因該是多的 ------------------------------------------------------------------- 剛剛用你的說法以DEBUGGER>> MPLAB SIM 測試 還是會卡在 LINE1_4 查表中 *__* ------------------------------------------------------------------
發表於: 2006/4/19 23:52
|
|||
|
Re: 用 16F877 輸出 PWM + LCD 顯示
|
||||
---|---|---|---|---|
資深會員
|
中斷裡...
PUSH: ;儲存目前狀態 MOVWF W_BAK ;BCF STATUS,RP0 <-此兩行不要用,主程式執行至跨頁時會出錯 ;BCF STATUS,RP1 SWAPF STATUS,W <-已經存好了, CLRF STATUS <-再清status跟status,rp0、rp1也清掉了 MOVWF STATUS_BAK MOVF PCLATH,W MOVWF PCLATH_BAK BCF PCLATH,3 <-為何要清掉此三bits呢? BCF PCLATH,4 BCF PCLATH,1 ... POP: ;回覆之前的狀態 ;BSF PCLATH,3 ;BCF PCLATH,4 ;BSF PCLATH,1 MOVF PCLATH_BAK,W <-回覆之前的狀態,那前三行無意義 MOVWF PCLATH SWAPF STATUS_BAK,W MOVWF STATUS SWAPF W_BAK,F SWAPF W_BAK,W ;還原暫存器之數值 <-此要再SWAP一次,內容值才會正確 RETFIE ;回覆中斷發生 中斷裡面沒需要的話應該不用備份PCLATH。 請問這個程式執行起來有什麼地方的問題可以形容嗎?
發表於: 2006/4/19 21:55
|
|||
|
Re: 用 16F877 輸出 PWM + LCD 顯示
|
||||
---|---|---|---|---|
新會員
|
;lcd 輸出資料
;------------------------------------------------------- LIST P=16F877, R=DEC INCLUDE <P16F877.INC> ORG 0X1A00 ;-----LINE---DATA--------------------- LINE1_4: MOVF TEMP_LINE,W ADDWF PCL,F RETLW 0X80 ;1000 0000 RETLW 0XC0 ;1100 0000 RETLW 0X94 ;1001 0100 RETLW 0XD4 ;1101 0100 DT "#" ;-----CHAR----DATA-------------------- T_CHAR: MOVF TEMP_REG,W ADDWF PCL,F RETLW 0X38 ;1000 0000 RETLW 0X0D ;1100 0000 RETLW 0X06 ;1001 0100 RETLW 0X01 ;1101 0100 DT "#" DT "Kun Shan University#" DT "Vo: Io: #" DT "Fo: sin 256 D#" DT "DC 30 v >>> AC 60 v#
發表於: 2006/4/19 18:27
|
|||
|
Re: 用 16F877 輸出 PWM + LCD 顯示
|
||||
---|---|---|---|---|
新會員
|
;SIN波表
;---------------------------------------------------- LIST P=16F877, R=DEC INCLUDE <P16F877.INC> ORG 0X1200 SIN_TABLE: ADDWF PCL ;PCL+=W RETLW 1 RETLW 1 RETLW 1 RETLW 1 RETLW 1 RETLW 2 RETLW 2 RETLW 2 RETLW 3 RETLW 3 RETLW 3 RETLW 4 RETLW 4 RETLW 5 RETLW 6 RETLW 6 RETLW 7 RETLW 8 RETLW 9 RETLW 10 RETLW 11 RETLW 11 RETLW 12 RETLW 13 RETLW 15 RETLW 16 RETLW 17 RETLW 18 RETLW 19 RETLW 21 RETLW 22 RETLW 23 RETLW 25 RETLW 26 RETLW 27 RETLW 29 RETLW 30 RETLW 32 RETLW 34 RETLW 35 RETLW 37 RETLW 38 RETLW 40 RETLW 42 RETLW 44 RETLW 45 RETLW 47 RETLW 49 RETLW 51 RETLW 53 RETLW 54 RETLW 56 RETLW 58 RETLW 60 RETLW 62 RETLW 64 RETLW 66 RETLW 68 RETLW 70 RETLW 72 RETLW 74 RETLW 76 RETLW 78 RETLW 80 RETLW 82 RETLW 83 RETLW 85 RETLW 87 RETLW 89 RETLW 91 RETLW 93 RETLW 95 RETLW 97 RETLW 99 RETLW 101 RETLW 103 RETLW 105 RETLW 107 RETLW 109 RETLW 110 RETLW 114 RETLW 116 RETLW 118 RETLW 119 RETLW 121 RETLW 123 RETLW 125 RETLW 126 RETLW 128 RETLW 129 RETLW 131 RETLW 133 RETLW 134 RETLW 136 RETLW 137 RETLW 138 RETLW 140 RETLW 141 RETLW 142 RETLW 144 RETLW 145 RETLW 146 RETLW 147 RETLW 148 RETLW 150 RETLW 151 RETLW 152 RETLW 152 RETLW 153 RETLW 154 RETLW 155 RETLW 156 RETLW 157 RETLW 157 RETLW 158 RETLW 159 RETLW 159 RETLW 160 RETLW 160 RETLW 160 RETLW 161 RETLW 161 RETLW 161 RETLW 162 RETLW 162 RETLW 162 RETLW 162 RETLW 162
發表於: 2006/4/19 18:25
|
|||
|
Re: 用 16F877 輸出 PWM + LCD 顯示
|
||||
---|---|---|---|---|
新會員
|
主程式
;------------------------------------------------------- ;PORTD -> B'E RW RS 0 0000' LIST P=16F877, R=DEC #INCLUDE P16F877.INC ;----------暫存器放至位址--------------------------- CBLOCK 0X20 W_BAK STATUS_BAK PCLATH_BAK SIN_T SIN_INDEX ;查表指標 V_AD I_AD T1S ENDC CBLOCK 0X0A0 VAD IAD V_OUT I_OUT F_OUT LCD_INT TEMP_REG TEMP_CHAR TEMP_LINE HURD_REG TEN_REG ONE_REG ENDC ;------LCD---設定------------------- LCD_SET MACRO BCF STATUS,RP0 ;BANK0 MOVLW 0X80 ;B'1000 0000' MOVWF PORTD NOP NOP NOP MOVLW 0X00 ;B'0000 0000' MOVWF PORTD BSF STATUS,RP0 ;BANK1 ENDM ;------LCD---送字------------------- LCD_SEND MACRO BCF STATUS,RP0 ;BANK0 MOVLW 0XA0 ;B'1010 0000' MOVWF PORTD NOP NOP NOP MOVLW 0X00 ;B'0000 0000' MOVWF PORTD BSF STATUS,RP0 ;BANK1 ENDM ;-------起始設定---------------------------- ORG 0 GOTO INITIAL ;--------中斷----------------------------------- ORG 4 PUSH: ;儲存目前狀態 MOVWF W_BAK BCF STATUS,RP0 BCF STATUS,RP1 SWAPF STATUS,W CLRF STATUS MOVWF STATUS_BAK MOVF PCLATH,W MOVWF PCLATH_BAK BCF PCLATH,3 BCF PCLATH,4 BCF PCLATH,1 BTFSC PIR1,TMR2IF GOTO PWM_OUT BTFSC PIR1,ADIF GOTO AD_CONT BTFSC PIR1,TMR1IF GOTO CHECK_SIN POP: ;回覆之前的狀態 BSF PCLATH,3 BCF PCLATH,4 BSF PCLATH,1 MOVF PCLATH_BAK,W MOVWF PCLATH SWAPF STATUS_BAK,W MOVWF STATUS SWAPF W_BAK,F MOVF W_BAK,W ;還原暫存器之數值 RETFIE ;回覆中斷發生 ;----------PIC設定--------------------------- INITIAL: BCF STATUS,RP0 ;BANK0 BCF STATUS,RP1 BSF INTCON,PEIE BSF INTCON,GIE ;中斷控制 MOVLW 0XE0 ;E1 ;設定49999*100 MOVWF TMR1L MOVLW 0X0B ;3C MOVWF TMR1H MOVLW B'00110000' ; TIMER1預除器為 1:8 MOVWF T1CON MOVLW B'00001000' ; TIMER2預除器為 1:2 MOVWF T2CON MOVLW B'00000001' MOVWF CCPR2L MOVLW B'00001111' ; CCP2 為 PWM模式 MOVWF CCP2CON MOVLW B'10001001' MOVWF ADCON0 ;設AD暫存器 ;------------------------------------------------ BSF STATUS,RP0 ;BANK1 MOVLW B'00000110' ;設定TMR0為1:128 MOVWF OPTION_REG MOVLW B'00000011' ;設定PORTA、B、C、D的接腳用途 MOVWF TRISA CLRF TRISB CLRF TRISC CLRF TRISD BSF PIE1,TMR2IE ;啟動 TIME 2 中斷 BSF PIE1,TMR1IE ;啟動 TIME 1 中斷 BSF PIE1,ADIE ;啟動 AD 中斷 MOVLW 162 ;PR2設為162-->>約15Khz MOVWF PR2 MOVLW B'00000100' MOVWF ADCON1 ;------------暫存器--內容--設定--------------------- MOVLW .3 MOVWF LCD_INT CLRF VAD CLRF IAD CLRF TEMP_REG CLRF TEMP_CHAR CLRF TEMP_LINE BCF STATUS,RP0 ;BANK0 MOVLW .10 MOVWF T1S MOVLW 0X01 MOVWF SIN_T CLRF SIN_INDEX CLRF V_AD CLRF I_AD CLRF TMR0 ;----------設定結束--------------------------- BSF PCLATH,3 BCF PCLATH,4 BSF PCLATH,1 GOTO LCD_INITIAL ;-------BANK---0--------------------------------------- CHECK_SIN: BCF PIR1,TMR1IF MOVLW 0XE0 ;E1 ;設定49999*100 MOVWF TMR1L MOVLW 0X0B ;0X3C MOVWF TMR1H DECFSZ T1S GOTO POP MOVLW .10 MOVWF T1S MOVF SIN_T,W ;讀取頻率 BSF STATUS,RP0 MOVWF F_OUT BCF STATUS,RP0 MOVLW 0X01 ;頻率清除 MOVWF SIN_T MOVF VAD,W ;讀取電壓 BSF STATUS,RP0 MOVWF V_OUT BCF STATUS,RP0 MOVF IAD,W ;讀取電流 BSF STATUS,RP0 MOVWF I_OUT BCF STATUS,RP0 CLRF VAD ;清除電壓 CLRF IAD ;清除電流 GOTO POP PWM_OUT: ;計算輸出修正 MOVF SIN_INDEX,W BSF PCLATH,4 BCF PCLATH,3 BSF PCLATH,1 CALL SIN_TABLE ;查表 BCF PCLATH,4 BCF PCLATH,1 MOVWF CCPR2L ;儲存查表結果 BSF ADCON0,GO BCF PIR1,TMR2IF GOTO POP AD_CONT: ;AD轉換判定 BTFSS ADCON0,CHS0 GOTO AD_I AD_V: ;電壓回授轉換 BCF PIR1,ADIF BCF ADCON0,CHS0 MOVF ADRESH,W MOVWF V_AD SUBWF CCPR2L,1 BSF ADCON0,GO SUBWF VAD,TEMP_REG BTFSC STATUS,C GOTO SIN_PWM BSF STATUS,RP0 MOVF V_AD,W MOVWF VAD BCF STATUS,RP0 SIN_PWM: BTFSC SIN_T,7 GOTO SIN_DEC SIN_INC: INCF SIN_INDEX,F ;累計查表次數加一 BTFSC SIN_INDEX,7 BSF SIN_T,7 ;= 128 執行 PWM 下降 GOTO POP ;X 128 離開中斷 等待下次遞增 SIN_DEC: DECFSZ SIN_INDEX,F ;累計查表次數加一 GOTO POP ;X 0 離開中斷 等待下次遞減 INCF SIN_T BCF SIN_T,7 ;= 0 執行 PWM 上升 GOTO POP AD_I: ;電流回授轉換 BCF PIR1,ADIF BSF ADCON0,CHS0 MOVF ADRESH,W MOVWF I_AD SUBWF CCPR2L,1 SUBWF IAD,TEMP_REG BTFSC STATUS,C GOTO POP MOVF I_AD,W BSF STATUS,RP0 MOVWF IAD BCF STATUS,RP0 GOTO POP ;-------BANK--1----------------------------------------- ORG 0XB00 LCD_INITIAL: CALL CHECK_4MS CALL LCD_BF MOVLW 0X30 BCF STATUS,RP0 MOVWF PORTB MOVLW 0X20 MOVWF PORTB NOP NOP MOVLW 0X00 MOVWF PORTD BSF STATUS,RP0 CALL DELAY_4MS DECFSZ LCD_INT,F GOTO LCD_INITIAL CLRF TEMP_LINE CLRF TEMP_REG GOTO LCD_LX_CHAR LCD_L: BSF PCLATH,4 BSF PCLATH,3 BSF PCLATH,1 CALL LINE1_4 BCF PCLATH,4 BSF PCLATH,3 BCF PCLATH,1 BCF STATUS,RP0 MOVWF PORTB BSF STATUS,RP0 INCF TEMP_LINE,F BCF STATUS,Z SUBLW '#' ;確認是否結束 BTFSC STATUS,Z GOTO LCD_END CALL CHECK_4MS LCD_SET CALL DELAY_4MS LCD_LX_CHAR: BSF PCLATH,4 BSF PCLATH,3 BSF PCLATH,1 CALL T_CHAR BCF PCLATH,4 BSF PCLATH,3 BCF PCLATH,1 BCF STATUS,RP0 MOVWF PORTB BSF STATUS,RP0 INCF TEMP_REG,F BCF STATUS,Z SUBLW '#' ;確認是否結束 BTFSC STATUS,Z GOTO LCD_L CALL CHECK_4MS LCD_SEND CALL DELAY_4MS GOTO LCD_LX_CHAR ;------LCD---BF---檢查-------------- LCD_BF: BCF STATUS,RP0 CLRF PORTB BSF STATUS,RP0 MOVLW 0XFF MOVWF TRISB BCF STATUS,RP0 BCF PORTD,5 BSF PORTD,6 RECHECK: BSF PORTD,7 NOP BCF PORTD,7 MOVWF PORTB BTFSC PORTB,7 GOTO RECHECK BSF STATUS,RP0 CLRF TRISB RETURN LCD_END: BCF STATUS,RP0 BCF STATUS,RP1 BSF T1CON,TMR1ON BSF T2CON,TMR2ON CHANG16TO10: MOVF VAD MOVWF TEMP_REG MOVLW 0XC4 MOVWF TEMP_LINE CALL DIVISION MOVF IAD MOVWF TEMP_REG MOVLW 0XCE MOVWF TEMP_LINE CALL DIVISION MOVF F_OUT MOVWF TEMP_REG MOVLW 0X98 MOVWF TEMP_LINE CALL DIVISION GOTO CHANG16TO10 DIVISION: ;16轉10進制 CLRF HURD_REG CLRF TEN_REG CLRF ONE_REG MOVLW 0X0A SUBWF TEMP_REG,W BTFSS STATUS,C MOVF TEMP_REG,W BTFSS STATUS,C MOVWF ONE_REG BTFSS STATUS,C GOTO DISPLAY TENLOOP: MOVLW 0X0A SUBWF TEMP_REG,F INCF TEMP_REG,F MOVLW 0X0A SUBWF TEMP_REG,W BTFSS STATUS,C MOVF TEMP_REG,W BTFSS STATUS,C MOVWF ONE_REG BTFSC STATUS,C GOTO TENLOOP MOVLW 0X0A SUBWF TEN_REG,W BTFSS STATUS,C GOTO DISPLAY HURDLOOP: MOVLW 0X0A SUBWF TEN_REG,F INCF HURD_REG,F MOVLW 0X0A SUBWF TEN_REG,W BTFSS STATUS,C GOTO HURDLOOP DISPLAY: ;輸出轉換結果 MOVLW 0X01 SUBWF HURD_REG,W BTFSS STATUS,C GOTO TEN_LOOP MOVF TEMP_LINE,W MOVWF PORTB CALL CHECK_4MS LCD_SET CALL DELAY_4MS MOVLW 0X30 ADDWF HURD_REG,W CALL SENDCHAR TEN_LOOP: MOVLW 0X01 SUBWF TEN_REG,W BTFSS STATUS,C GOTO ONE_LOOP MOVLW 0X30 ADDWF TEN_REG,W CALL SENDCHAR ONE_LOOP: MOVLW 0X30 ADDWF ONE_REG,W SENDCHAR: BCF STATUS,RP0;BANK0 MOVWF PORTB CALL CHECK_4MS LCD_SEND CALL DELAY_4MS RETURN ;-----延遲---4MS--------------------- DELAY_4MS: BCF STATUS,RP0 CLRF TMR0 ;OPTION_REG BSF STATUS,RP0 RETURN CHECK_4MS: BTFSS INTCON,T0IF GOTO CHECK_4MS BCF INTCON,T0IF RETURN #INCLUDE<LCD_TEXT.INC>;單晶片基礎設定檔 #INCLUDE<SIN_256.INC>;單晶片基礎設定檔 END
發表於: 2006/4/19 18:23
|
|||
|
用 16F877 輸出 PWM + LCD 顯示
|
||||
---|---|---|---|---|
新會員
|
請大家幫我看一下
我自己已經除錯過了 程式也會跑 可是沒有東西輸出 請 高手們 幫我看看程式哪還有錯 我使用DEBUGGER>> MPLAB SIM 測試 會卡在 LINE1_4的查表中 ------------------------ 時脈 >> 20M 20P ccp2 >> PWM PORTA >> 0腳 電流回授 PORTA >> 1腳 電壓回授 PORTB >> LCD 資料 PORTD >> LCD 控制 -------------------------
發表於: 2006/4/19 18:21
|
|||
|