上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
--.--.-- -- l スポンサー広告 l top
TIMER0を使った基本定周期ループと、テーブルによる波形定義までできました。
出力はこんな感じです。


 
定周期ループはTIMER0割込みではなく、ループの最後でTIMER0オーバフローを待つタイプにしました。
周期は10usです。つまりこの時間分解能で出力を操作できることになります。1サイクル命令250nsなので、最大40命令実行できることになります(実際は2サイクル命令もあるのでもっと少ないです。用途によりますが、ちょっと少ないかも。。。足りなければ延ばすことになります。)
「スポンサードリンク」

style="display:block"
data-ad-client="ca-pub-0620260288102702"
data-ad-slot="9773401572"
data-ad-format="auto">



 
割込みにしなかったのは、割込みENTER/LEAVE処理に貴重なサイクルを取られるのを避けるためです。
  
波形定義はRETLWを使ったテーブルで16ステップ定義できるようにしました。あと、レジスタバンク切り替えが面倒になってきたのでマクロにしました。Cで書いてると忘れてしまいますがこれもPICのめんどくさい所でしたね。

と、ここまで簡単みたいに書きましたが、実際は結構苦労してます。特にPIC12Fでのテーブル使用方法はすっかり忘れていました。やっぱりPIC24F+C言語は偉大ですね。
 

 
現状のソースは以下の通りです。(長くなってきたので次からファイルアップロードにします。)
一番最後に波形テーブルが有ります。

;****************************************************
; PIC12F1501 DAC TEST Using TMR0 ******************
;********* 20150101 by Minarai Syokunin *************
;****************************************************

INCLUDE "P12F1501.inc"
__CONFIG _CONFIG1 , _FOSC_INTOSC & _WDTE_OFF & _PWRTE_OFF & _MCLRE_OFF & _CP_OFF & _BOREN_OFF & _CLKOUTEN_OFF
__CONFIG _CONFIG2 , _WRT_OFF & _STVREN_OFF & _BORV_HI & _LPBOR_OFF & _LVP_OFF

;************** VARIABLES *******************
TIM0 EQU 20H
TIM1 EQU 21H
DAC EQU 22H
WK0 EQU 23H

;************** MACRO *******************
SetSFR macro REG,VAL
BANKSEL REG
MOVLW VAL
MOVWF REG
endm
PutVAR macro REG
BANKSEL 0
MOVWF REG
endm
GetVAR macro REG
BANKSEL 0
MOVFW REG
endm

;************** ORG DEFINE *******************
ORG 0h
GOTO START
ORG 4h
GOTO START
;************** INITIALIZE ********************
START
SetSFR OSCCON ,B'01111010' ; Clock 16MHz
SetSFR ANSELA ,B'00000000' ; ALL digital (DAC output = digital setting)
SetSFR TRISA ,B'00000000' ; All output
SetSFR DACCON1 ,B'00000000' ; DAC value = 0
SetSFR DACCON0 ,B'11110000' ; DAC1,2 Enabled
SetSFR OPTION_REG ,B'00000000' ; CLK=FOSC/4 , Prescaler 1:2
SetSFR TMR0 ,0 ; Timer setting
CLRW
PutVAR DAC ; Set DAC initial value

;************** MAIN **************************
MAIN
SetSFR INTCON ,B'00000000' ; Timer0 overflow flag clear
SetSFR TMR0 ,D'235' ; Timer0 set for 10us (100KHz) interval
GetVAR DAC
ADDLW B'00000001'
ANDLW B'00011111'
PutVAR DAC
CALL WAVE_DEF
BANKSEL DACCON1
MOVWF DACCON1
BANKSEL INTCON
WAIT_TIM0
BTFSS INTCON,2 ; Wait for TIM0 overflow
GOTO WAIT_TIM0
GOTO MAIN

;************** Waveform define **************************
WAVE_DEF
ANDLW B'00001111'
; RETURN
ADDWF PCL,f
RETLW D'0'
RETLW D'2'
RETLW D'4'
RETLW D'8'
RETLW D'16'
RETLW D'16'
RETLW D'16'
RETLW D'8'
RETLW D'8'
RETLW D'4'
RETLW D'4'
RETLW D'8'
RETLW D'8'
RETLW D'16'
RETLW D'16'
RETLW D'16'
END


次はこの波形を指定周波数で出せるようにします。

それではまたです。
2015.01.01 Thu l PICマイコン l コメント (0) l top

コメント

コメントの投稿












上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。