ログインしてさらにmixiを楽しもう

コメントを投稿して情報交換!
更新通知を受け取って、最新情報をゲット!

EC科プログラミングの会コミュのPIC用アセンブリ言語

  • mixiチェック
  • このエントリーをはてなブックマークに追加
PIC用アセンブリ言語についてです。

現在だとマイコン基礎および演習でやってます。9V角電池突っ込んだら回路ふっとぶぞ気をつけろ!

コメント(23)

>>れもん
いれるとへんなエラーを書き込み時にはくよw
最近忙しいんでちょっとあれですが近々6-2とマクロのやつのプログラムの解説っぽいのあげますね
あとPICライターとその他もろもろ買ったんで年内には作りたいかなーっておもってる
なんかPORTAの初期化がマクロからできない・・・
なんかをOFFにしろとかかいてあるけどしてもならねーよwwww

この初期化ができないからSWがうごかなくて涙目w
#include "gs25.inc"

org 0x0000
goto start
org 0x0004
goto timer0
org 0x0008
start

movlw 0x07
movwf CMCON
banksel TRISA
movlw b'0010000'
movwf TRISA
clrf TRISB
banksel PORTA
clrf PORTA
clrf PORTB

sw_init
bwait_init d'1'
postscaler_init d'15'-1
cblock
patterna
endc


timer0_init b'11011000' ; 内部クロック、 PS不使用


duty_init
movlw d'4'
movwf duty_period
movwf duty_counter
movlw d'1'
movwf duty_ratio

movlw b'00000001';LED点灯
movwf PORTA


movlw b'00000101'
movlw patterna

;porta_init



main
goto main
sw_prg swfunc
swfunc
movlw b'00000100'
movlw PORTA
bwait_prg
timer0_prg postscaler

;bwait_prg

;movlw b'00000001';LED点灯
;movwf PORTA
return


porta_off
clrf PORTA
return

porta_on
movf patterna,0
movwf PORTA
return

;porta_prg
duty_prg porta_off,porta_on
postscaler_prg duty

end#include "gs25.inc"

org 0x0000
goto start
org 0x0004
goto timer0
org 0x0008
start

movlw 0x07
movwf CMCON
banksel TRISA
movlw b'0010000'
movwf TRISA
clrf TRISB
banksel PORTA
clrf PORTA
clrf PORTB

sw_init
bwait_init d'1'
postscaler_init d'15'-1
cblock
patterna
endc


timer0_init b'11011000' ; 内部クロック、 PS不使用


duty_init
movlw d'4'
movwf duty_period
movwf duty_counter
movlw d'1'
movwf duty_ratio

movlw b'00000001';LED点灯
movwf PORTA


movlw b'00000101'
movlw patterna

;porta_init



main
goto main
sw_prg swfunc
swfunc
movlw b'00000100'
movlw PORTA
bwait_prg
timer0_prg postscaler

;bwait_prg

;movlw b'00000001';LED点灯
;movwf PORTA
return


porta_off
clrf PORTA
return

porta_on
movf patterna,0
movwf PORTA
return

;porta_prg
duty_prg porta_off,porta_on
postscaler_prg duty

end
つくってみたけど正直微妙
一応コンパイラとおります。SWが反応しないから動作確認はしてないです・・・
ちょっとへんな部分おおいですけどけずってくださいなw

一応構造だけ

用意されているマクロを使います。
SWのマクロは初期化してメインプログラム内に置きます。SWサブルーチンは∞ループでそこからスイッチがONになったのを感知して別のサブルーチンを実行します。

timer0は割り込みのサブルーチンです。この割り込みのサブルーチンは時間で割り込みをします。主に時間をwaitしたりduty比をつかったりと・・・

ってなんか描くのめんどくさくなってきたw

動作は

通常
LEDつけてる→PORTAにb'00000001'(RA0のみ出力)
SW押されたとき
LED消す、モーター動かす→PORTAにb'00000100'(RA2に(ry)
ビジーウェイトで1秒やる
割り込みでDUTYマクロを起動(25%でb'00000101'
割り込みで1秒間動かす
LEDつける、モーター消す(初期状態に戻す

こんなかんじかな?マクロとかつかってるけどマクロだんだんわかんなくなってくる・・・
割り込みについてくわしくかいてある気がするサイト
http://www.picfun.com/pic08.html

きになった方はどうぞ
作り直してみた

#include "gs25.inc"

org 0x0000
goto start
org 0x0004
goto timer0
org 0x0008

start
;ポートの初期化
enable_PAPB

;変数の初期化
postscaler_init d'15'-1
timer0_init b'11011000' ; 内部クロック、 PSX
sw_init
porta_init
duty_init
movlw d'4'
movwf duty_period
movwf duty_counter
movlw d'1'
movwf duty_ratio

movlw b'00000001'
movwf PORTA
movlw b'00000101'
movwf patterna

main
sw_prg sw_func
goto main

sw_func
call motor
movlw b'00000001'
movwf PORTA
return

motor
movlw b'00000100'
movwf PORTA
return

timer0_prg postscaler

postscaler_prg duty
duty_prg porta_off, porta_on
porta_prg

end
簡単な説明
つかうマクロ
sw
timer0
postscaler
duty
porta

構想
いんくるーど
番地と割り込み場所設定
startサブルーチン
*変数の初期化
mainサブルーチン
*主にループ
swfuncサブルーチン
*スイッチが押されたときの動作
*callでmotorサブルーチンを呼び出し
*その後PORTAに値を代入<LEDが光ってるだけの状態=SW抜けたあとの状態にもどしておく
motorサブルーチン
*考え方はまずモーターを動かし(b'00000100')それを1秒間でわりこんでほしいなwってかんじ
*割り込んだときの動作はdutyの動作になります。dutyってこういうつかい方であってるのだろうか・・・
最後にいろいろ必要なサブルーチンを宣言します。
そしてend

このendはちょっと見逃しがちだけどTABなりスペースなりであげてください。そうしないとサブルーチンとしてコンパイラが処理しますよw


あとだれかgs25.incファイル(授業中にいろいろ書き加えたり修正したやつ)をくだしあw僕の一回けしちゃったから・・・


それと正直タイマでの割り込みのタイミングがよくわかりません。タイマもサブルーチンなんでSWに関係なく時間計算するかも・・・
だからもしかしたらビジーウェイトのほうがいいかな・・・っておもってるwあとモーターとLED両方つかったときの動作ってどう止めるの?ってなってるw

回路のほうですがLEDは抵抗とLEDのみでDUTY比をいじくれば暗くなります。モーターのほうがDUTY比いじったときにちゃんと遅くなるのかが不安ですが・・・
そのときのモーターの回路がどれつかえばいいのかよくわかんないw6−2の回路でもいいんじゃない?w
それさえ解決できればたぶん動くかと・・・ちなみにLEDがRA0、モーターはRA2です
おーずいぶん簡素になってる!
portAとportBでLEDとモーター分けずにRA0と2でやってるのねー
全部そっちでやっちまったw
さっきつくったのでようやくいいとこまでいったw
#include "gs25.inc"

org 0x0000
goto start
org 0x0004
goto timer0
org 0x0008

start
;ポートの初期化
enable_PAPB

;変数の初期化
postscaler_init d'15'-1
timer0_init b'11011000' ; 内部クロック、 PSX
movlw b'00000000'
movwf ans
sw_init
porta_init
duty_init
movlw b'00000000'
movwf duty_inc
movwf duty_inc_b
bwait_init d'3'
movlw d'4'
movwf duty_period
movwf duty_counter
movlw d'1'
movwf duty_ratio

movlw b'00000001'
movwf PORTA
movlw b'00000101'
movwf patterna

sw_prg sw_func


sw_func

call motor
movlw b'11111111'
movwf ans
movlw b'00000001'
movwf PORTA
return

motor
movlw b'00000100'
movwf PORTA
bwait_prg
; call duty

return

timer0_prg postscaler

postscaler_prg duty
duty_prg porta_off, porta_on
porta_prg

end
timer0_init macro psmode
cblock
savew
savest
ans
endc
clrwdt
banksel OPTION_REG
movlw psmode
movwf OPTION_REG
banksel INTCON
bsf INTCON,T0IE
bcf INTCON,T0IF
bsf INTCON,GIE
endm

timer0_prg macro func
timer0
movwf savew
movf STATUS,0
movwf savest
btfss INTCON,T0IF
goto nottimer0
bcf INTCON,T0IF
btfsc ans,d'1'
call func
nottimer0
movf savest,0
movwf STATUS
movf savew,0
retfie
endm



duty_init macro
cblock
duty_ratio
duty_period
duty_counter,duty_inc,duty_inc_b
endc
endm

duty_prg macro func_off, func_on
duty
movf duty_counter,0
subwf duty_ratio,0
btfsc STATUS,C
goto duty_on
call func_off
btfsc duty_inc_b,7;
call start
goto duty_end
duty_on
call func_on
incf duty_inc,1;
btfsc duty_inc,7;
incf duty_inc_b,1;
duty_end
decfsz duty_counter,1
return
movf duty_period,0
movwf duty_counter
return
endm
duty_inc_b いらないかもw最初のほう時間みじかすぎーとかおもってたけどこれあると長すぎるw
あとビジーウェイトのやつは3になってますけどもうちょっと長くてもよさげ

なにかわからないことあったらきいてくだしあ。答えられる部分は答えます(キリッ
俺用メモ

14はプログラム本文、15はgs25から定義を変えたマクロ。
<t> #include "gs25.inc"

<t> org 0x0000
<t> goto start
<t> ;********************
<t> ;org 0x0004
<t> ;goto timer0
<t> org 0x0008
start
<t> enable_PAPB

<t> sw_init

<t> sw_prg swfunc

swfunc

<t> return

<t> end

簡易的なプログラムです
<t>はタブ上げするとこです。タブ上げしたらけしてねw
このプログラムはRA、RBのポートを初期化してsw_initでRA5ポートのスイッチを初期化、そしてsw_prg sw_funcでスイッチがおされたらsw_funcのサブルーチンを実行します。
ちなみにサブルーチンは小さなプログラムの塊です。returnでサブルーチンから返ります。なのでsw_funcには最後returnがあります。

あとsw_prgは無限ループです。プログラムみるとわかりますがRA5がONならsw_funcを実行しOFFなら命令を飛ばしてます。そして最終的にsw_mainにもどり以下ループです。
#include "gs25cus.inc"

org 0x0000
goto start
;********************
;org 0x0004
;goto timer0
org 0x0008

#define time D'5'
cblock
wa0,wa1,wa2
endc

start
enable_PAPB

sw_init

movlw b'00000001'
movwf PORTA
sw_prg swfunc

swfunc
movlw b'00000100'
movwf PORTA
call wait
movlw b'00000001'
movwf PORTA
return

wait
movlw time
movwf wa0
wait0
clrf wa1
wait1
clrf wa2
wait2
nop
decfsz wa2,1
goto wait2
decfsz wa1,1
goto wait1
decfsz wa0,1
goto wait0
return


end


タブ上げ記述ないですけどまぁわかるよねw
これは店頭停止→SWON!→小党回転1sec→もとにもどる!
ってプログラムです
#include "gs25cus.inc" ってかいてあるけどwaitを加えてそっちつかってるんでbwait書いてあるgs25.incでも使えまs
#include "gs2.inc"

org 0x0000
goto start
org 0x0008

#define time D'5'
cblock
wa0,wa1,wa2
endc

start
enable_PAPB
bwait_init D'5'
sw_init

movlw b'00000001'
movwf PORTA
sw_prg swfunc

swfunc
movlw b'00000100'
movwf PORTA
call bwait
movlw b'00000101'
movwf PORTA
call wait
movlw b'00000001'
movwf PORTA
return

wait
movlw time
movwf wa0
wait0
clrf wa1
wait1
clrf wa2
wait2
;nop
movlw b'00000101'
xorwf PORTA,1
decfsz wa2,1
goto wait2
decfsz wa1,1
goto wait1
decfsz wa0,1
goto wait0
return

bwait
movlw bwait_time
movwf bwait_v0
bwait0
clrf bwait_v1
bwait1
clrf bwait_v2
bwait2
nop
decfsz bwait_v2,1
goto bwait2
decfsz bwait_v1,1
goto bwait1
decfsz bwait_v0,1
goto bwait0
return

end

デバッガーで動かすためにbwaitサブルーチンこっちにかいてありますがけしてもたぶん動くかと・・・
もしこのままつかうならbwait_prgマクロの内容だけけしてくださ
initのほうは変数宣言でつかってるんでけしちゃらめぇ////
includeはgs2.incになってるんでこれは変更してあげてください
↑動作確認とれました。
bwaitやwaitに渡す値が5だと長すぎる気がするんで3か4になるとおもいます。
機械技術系を生業にしている全くの初心者(ド素人)です、コミュ規約の「何が判らない」の約束を守れないかも知れませんがお許し下さい。寄って集ってご指導願えればと思っています。

ログインすると、みんなのコメントがもっと見れるよ

mixiユーザー
ログインしてコメントしよう!

EC科プログラミングの会 更新情報

EC科プログラミングの会のメンバーはこんなコミュニティにも参加しています

星印の数は、共通して参加しているメンバーが多いほど増えます。

人気コミュニティランキング