;************************************************************************* ; Copyright 2004 Hata Akihiro ; ; 第1章 電子工作初心者のためのハードウェア入門 ; 1−12 応用回路の実例 ; D-Aコンバータ ;------------------------------------------------------------------------- ;プログラムの説明 ;<概要> ; R2Rラダー抵抗によるD-Aコンバータのテストプログラム。 ; ;<動作> ; 電源ONでのこぎり波を連続出力する。 ; ;------------------------------------------------------------------------- ; 2004/06/10 V1.00 初回リリース ; ; ; ; ;------------------------------------------------------------------------- ; CONFIGRATION FUSE ; WDT:Disable OSC:Int RC Code Protect:OFF Power up timer:ON ; OSCILLATOR ; 4MHz ;************************************************************************* ; LIST P=16F628A, R=DEC ;Target Processor INCLUDE P16F628A.INC ; __CONFIG _BODEN_OFF & _WDT_OFF & _INTOSC_OSC_NOCLKOUT & _CP_OFF & _PWRTE_ON & _DATA_CP_OFF & _LVP_OFF & _MCLRE_OFF & _DATA_CP_OFF __idlocs H'0100' ;V1.00 2004/06/10 ; ;------------------------------------------------------------------------- ; DEFINE I/O Port ;------------------------------------------------------------------------- ; PortA ; RA0 input ; RA1 input ; RA2 input ; RA3 input ; RA4 input ; RA5 input ; ; PortB ; RB0 DA data(LSB) output ; RB1 output ; RB2 output ; RB3 output ; RB4 output ; RB5 output ; RB6 output ; RB7 DA data(MSB) output ; ;------------------------------------------------------------------------- ; Variables ;------------------------------------------------------------------------- ; ; ; ;------------------------------------------------------------------------- ; Registers ;------------------------------------------------------------------------- ; ST_TEMP EQU H'20' ; Status Reg. Temp. for Interupt W_TEMP EQU H'21' ; Work Reg. Temp. for Interupt W_CNT0 EQU H'22' ; COUNTER for Wait W_CNT1 EQU H'23' ; COUNTER for Wait DA_DATA EQU H'24' ; DA Converter Data ;------------------------------------------------------------------------- ; Program code ;------------------------------------------------------------------------- ; ORG H'00' ; Power ON GOTO START ; ; ORG H'04' ; Go Interupt GOTO INTERUPT ;------------------------------------------------------------------------- ; Initialize ;------------------------------------------------------------------------- START MOVLW 0x20 ; BANK1 Data Clear MOVWF FSR REG_CLEAR CLRF INDF INCF FSR,F MOVF FSR,W XORLW 0x7F BTFSS STATUS,Z GOTO REG_CLEAR ; BSF STATUS,RP0 MOVLW B'10000111' ; PORTB Not Pull Up MOVWF OPTION_REG MOVLW B'11111111' ; Set I/O Port INPUT/OUTPUT MOVWF TRISA MOVLW B'00000000' MOVWF TRISB BSF PIE1,2 ; CCP1 Interupt Enable BCF STATUS,RP0 MOVLW H'FF' MOVWF CMCON ; Set CMCON MOVLW B'00000000' MOVWF T1CON ; Set T1CON MOVLW B'00001011' MOVWF CCP1CON ; Set CCP1CON MOVLW LOW 39 MOVWF CCPR1L MOVLW HIGH 39 MOVWF CCPR1H ;---------------------- ; OUTPUT Initialize ;---------------------- MOVLW B'00000000' MOVWF PORTB ;---------------------- ; Interupt Setting ;---------------------- MOVLW B'01000000' MOVWF INTCON ;******************************************************* ; MAIN PROGRAM ;******************************************************* MAIN BSF T1CON,0 ; Timer1 Start BSF INTCON,GIE ; Interupt Enable MAIN_LOOP GOTO MAIN_LOOP ; ;******************************************************* ; INTERUPT ;******************************************************* INTERUPT ;**** save W register & status register MOVWF W_TEMP ;save w reg SWAPF STATUS,W ;status to wreg MOVWF ST_TEMP ;save status ; BTFSS PIR1,CCP1IF ;CCP1 Interupt? GOTO INT_END BCF PIR1,CCP1IF ;Clear Flag INCF DA_DATA,F ;Increment DA Data MOVF DA_DATA,W MOVWF PORTB ;OUT DA Data to PORTB INT_END ;**** register restore and return SWAPF ST_TEMP,W ;get saved status MOVWF STATUS SWAPF W_TEMP,F ;get saved wreg SWAPF W_TEMP,W RETFIE ; END