teacup. [ 掲示板 ] [ 掲示板作成 ] [ 有料掲示板 ] [ ブログ ]

 投稿者
  題名
  内容 入力補助 youtubeの<IFRAME>タグが利用可能です。(詳細)
    
 URL
[ ケータイで使う ] [ BBSティッカー ] [ 書込み通知 ] [ 検索 ]


H8/3664 のCプログラム リンカー

 投稿者:ty  投稿日:2015年10月 1日(木)19時49分33秒
  H8/3664 のCプログラム リンカー の
SUBファイルのご紹介をいたします。

1行目で 実行ファイル TMA.MAR の 指定
2行目 リストファイルの出力命令
3行目 64Rres,tma オブジエファイル リンク
4行目 ライブラリー指定
5行目 プログラム書き込みアドレスF790指定RAMアドレスFD40指定
F780Hは64Rresが入ります。
64Rres で スタック設定 、仮想割り込みベクタ設定をします。
----- tma.sub --------------
OUTPUT tma
PRINT tma
INPUT 64Rres,tma
LIB c:\3664\h8_c\lib\c38hn
START P,C(0F790),B,D(0FD40)
EXIT
ーーーーーーーーーーーーーー
DOS版のソフトでアセンブラを使用してエラーが多くでたときは
スクロールして先の方がわかりません。
私はフリーソフトのDosExecを使用してウィンドウズ上
でやっています。DosExecをウィンドウズで起動させて
DosExecからDOSプログラムを直に実行できます。
アセンブラ結果などもDosExecのウィンドウ上でスクロール
アップ、ダウンができエデターと行き来してエラーの修正が
できます。
私のCのコンパイルとリンクをするバッチファイルです
EはRAMデスクでここで作業すると余分なファイルは
電源を落すと消えるので楽です。
ーーー H8c.BAT ーーーーーー
@echo off
copy c:\3664\h8_c\test\*.* e:\
e:\
c:\3664\h8_c\ch38 -cpu=300hn  -include=c:\3664\h8_c\include  e:\%1.c
if errorlevel 1 goto eend
c:\3664\h8_c\ch38 -cpu=300hn -code=asmcode -include=c:\3664\h8_c\include  e:\%1.c
if errorlevel 1 goto eend
c:\3664\asm\lnk.exe -sub=e:\%1.sub
if errorlevel 1 goto eend
copy e:\*.abs c:\3664\writer
:eend
 
 

2相ユニポーラパルスモーター制御

 投稿者:ty  投稿日:2015年 4月30日(木)17時54分22秒
  今月は 2相ユニポーラパルスモーター制御
のサンプル を 12C509Aのソースファイルです。
回路図とうはホームページのパルスモータのページをご覧ください。
;-------------------------------------------
include 12c5xx.h
.12c509
.osc intrc ;内部クロック 4MHz
.mclre disable ;MCLR を 入力ポ-ト GP3 で使う
.wdt off
id 1208h
; 1相励磁パルスモータコントローラ  t.yamahara
;
;

;
;                GND     s1    s2    s3
;         ┌────────────┐
; │⑧    ⑦    ⑥    ⑤    │
; │VSS  GP0    GP1   GP2   │
; │   PIC12C509            │
; │VDD   GP5   GP4   GP3   │
; │①    ②    ③    ④    │
; └────────────┘
; DC5V   ccw    s4     cw
;                       IN            IN
s1 equ gpio.0 ;パルスモターφ1出力
s2 equ gpio.1 ;パルスモターφ2出力
s3 equ gpio.2 ;パルスモターφ3出力
s4 equ gpio.4 ;パルスモターφ4出力
org 08h
stc ds 1 ;モーター位置カウンター
tmdt ds 1 ;タイマーデーター
cu1 ds 1 ;汎用
cu2 ds 1
bf ds 1
gpbf ds 1 ;GPIOnoバッファ
ccwin equ gpbf.5 ;CCW回転司令負パルス入力
cwin equ gpbf.3 ;CCW回転司令負パルス入力
     org 0
goto start
; GPIOの読み込み
; 12C509Aを内部RC発振で使用しますので1サイクル4MHz/4
;  1usで約10usの間にgpioの値が変化すると読み直しとなり
;  CCW,CW制御パルスに入る10us以下のノイズをカットできます。
;   NOPを1つ増やす事で1usフイルターを伸ばせます。
ingp mov gpbf,gpio ;gpbf に gpio の 値を 入れる。
nop ; 1us
nop
nop
cjne gpbf,gpio,ingp ;gpioの値が変わっていればingpへジャンプ
ret
;   電源立ち上がり時の誤動作防止タイマー
start           clr     cu1
                clr     cu2

                mov     bf,#2
start1          nop
                djnz    cu1,start1
                djnz    cu2,start1
djnz bf,start1
                mov     !gpio,#101000b     ; gpio i/o set
                clr     gpio
mov w,#000111b    ; trm0 i/o Pul up
option
loop0 clr gpio ;motor  off
setb s1 ;モターを0ポジションに セット
clr stc
loop1           call    ingp ;10usソフトフイルターをとうして入力監視
jnb cwin,incs ;CWパルスIN
jnb ccwin,decs ;CCWパルスIN
goto loop1
;CWパルスIN
incs inc stc ;位置カウンター+1(1ステップ時計回り位置)
cjne stc,#4,tmset
clr stc
goto tmset
;   CCWパルスIN
decs sub stc,#1 ;位置カウンター+1(1ステップ反時計回り位置)
jc      tmset
mov stc,#3
;             位置カウンターに合わせて励磁
tmset cje stc,#1,p1
cje stc,#2,p2
cje stc,#3,p3
setb s1 ;モータ位置 0 励磁
clrb s2
clrb s3
clrb s4
jmp tmon
p1 clrb s1 ;モータ位置 1 励磁
setb s2
clrb s3
clrb s4
jmp tmon
p2 clrb s1 ;モータ位置 2 励磁
clrb s2
setb s3
clrb s4
jmp tmon
p3 clrb s1 ;モータ位置 3 励磁
clrb s2
clrb s3
setb s4
jmp tmon
;    負入力のパルスがOFF(電圧H)になるまで待つ。
tmon call    ingp
jnb cwin,tmon
jnb ccwin,tmon
goto loop1
 

16F84を使用した周波数カウンタ-1/2

 投稿者:ty  投稿日:2015年 4月 4日(土)18時24分47秒
  16F84を使用した周波数カウンタ-の紹介です。

T0CK1を入力に、TMR0割込みでオバ-フロウカウント。
表示には2桁16行 液晶表示器を使用
定時間TOCK1に入ったパルス数を数え1S分に変換し
10進数変換、アスキー変換してLCD表示します。
約1.22KHzのテスト出力ピン付き。
;
; PIC16F84/16文字×2行対応
; カウンター液晶表示プログラム;
;                2001年6月24日 山原
; 使用環境
; PIC PIC16F84-10/P(それ以外にも応用可能)
; 液晶 M1632,M1672,SC1602B等
; クロック 10MHz
;
;
; ピンアサイン:(電源・クリスタル・コントラスト調整VR等の配線は省略)
;
; PIC16F84 液晶モジュール
; ()内はピン番号
; RA3(2) = EN(ENABLE)
; RA2(1) = RS
; RA0(17)                  =      cunter test 1.22KHz
; GND(0V) = R/~W
; rb7(13) = DB7
; rb6(12) = DB6
; rb5(11) = DB5
; rb4(10) = DB4
; rb3(19) = DB3
; rb2(9) = DB2
; rb1(7) = DB1
; rb0(6) = DB0
; ra4(3)                  =      t0ck カウンター入力
; ◆PIC16F84用にコーディングしてありますが、
; 一部改造すればそれ以外のデバイスでも使用可能です。
; ◆20文字や4行の液晶にも応用できます。
; ◆クロックは10MHzを想定してあります。それ以外のクロックでは
; ウェイト数を多少変更してください。
; ◆ ROMライターデバッグ機能を使用の時にはできるだけrb6を入力ポート
;        で使用してください。OUT同士でHとLがぶつかるのをふせぐためです。
;         または rbポートプルアップをしないようOPTION設定してください。
include 16f84.h ; ここでは16F84を選択
.osc hs ; オシレータXT
.wdt off ; ウォッチドッグOFF
.pwrt on ; パワーアップタイマON
.protect off ; プロテクトOFF
id 0205h
eeorg 0
eedata 'Yamahara'
;include rd84_ak.asm ;デバック時使う ;rom writer debug
; LCD制御
EN equ ra.3
RS equ ra.2
;------------------------------
;dbugファイル なし
cn equ 0eh ;dbug 時";"で削除
wait_cn2 ds 12h ;rd84_ak.asmにかいてあるのでダブり
wait_cn ds 11h
tris_rb ds 10h
;------------------------------
org 15h

x ds 4
y ds 4
cu1 ds 1
cu2 ds 1
cu3 ds 1
dd ds 10
yy ds 4 ;
xx ds 5 ;
zz ds 4 ; 演算結果(4bytes)
crc ds 1

tmdt ds 4
wk0 ds 1
wk1 ds 1
wk2 ds 1

org 0
goto start

org 4
;   timer 割り込み
inttm           movwf   wk0             ;push w
                swapf   wk0,1
                swapf   status,0        ;     status
                movwf   wk1
                movf    fsr,0           ;     fsr
                movwf   wk2
;               init wark
call clr_gie
clrb t0if
add tmdt[2],#1
movlw 1
btfsc c
addwf tmdt[1]
btfsc c
addwf tmdt[0]

setb gie
;               init end          pop     fsr status w
                btfsc   wk1,1           ;bank 0 ?
                setb    rp0             ;no bank 1
                movf    wk2,0           ;pop  fsr
                movwf   fsr
                swapf   wk1,0           ;pop status
                movwf   status
                swapf   wk0,0           ;pop  w
                retfie

start clr dd[0]
clr dd[1]
mov dd[2],2
start1 nop
nop
djnz dd[0],start1
djnz dd[1],start1
djnz dd[2],start1
mov tris_rb,#00000000b ;tris_b buffa

setb rp0
mov rb,#0 ; DB7-DB0ピンをOUTに All 0
mov ra,#10010b ; E,RS,test_out ピンをOUTに,rxd in


mov option,#10111000b ;デバック時Rbプルアップしない(RS232C OUTとぶつかるため)
clrb rp0
clr ra
clr rb
call init_lcd ; LCD初期化
mov intcon,#10100000b
main0 clr tmdt[0]
clr tmdt[1]
clr tmdt[2]
clr     tmdt[3]
clr tmr0
main setb gie

; 周波数カウント
call tm1s
call tm1s
mov tmdt[3],tmr0
;-----dbug------

;mov dbd,tmdt[2] ;tmdt[2]の値をROMライターに出力
;call dbug
;---------------
call    cuntdsp
goto main0

tm1s mov cu3,#2
mov cu2,#0
mov cu1,#0
tm1s_l nop
djnz cu1,tm1s_l
xor ra,#1      ;ra0 test out 1.22KHz
djnz cu2,tm1s_l
djnz cu3,tm1s_l
ret

clr_gie clrb gie
jb gie,clr_gie
ret


cuntdsp call clr_gie
cjne tmdt[0],#0,ttc0
cjne tmdt[1],#0,ttc0
cjne tmdt[2],#0,ttc0
cje tmdt[3],#0,dd0
ttc0 mov xx[0],tmdt[3]
mov xx[1],tmdt[2]
mov yy[0],#56h ;5d
mov yy[1],#9h ;7
call mul_xy ;data*1885*1.23 75dh*1.268=956h
mov dd[3],zz[3]
mov dd[2],zz[2]
mov dd[1],zz[1]
mov dd[0],zz[0]
mov xx[0],tmdt[1]
clr xx[1]
mov yy[0],#5dh
mov yy[1],#7h
call mul_xy ;data*1885
mov yy[0],dd[0]
mov yy[1],dd[1]
mov yy[2],dd[2]
mov yy[3],dd[3]
clr xx[0]
clr xx[1]
mov xx[2],zz[0]
mov xx[3],zz[1]
call add_xy
mov x[0],xx[0]
mov x[1],xx[1]
mov x[2],xx[2]
mov x[3],xx[3]
call div_1000 ;/1000
mov tmdt[3],zz[0]
mov tmdt[2],zz[1]
mov tmdt[1],zz[2]
mov tmdt[0],zz[3]
dd0 call dtset_1
clr dd[0]
clr dd[1]
clr dd[2]
clr dd[3]
clr dd[4]
clr dd[5]
clr dd[6]
clr dd[7]
clr dd[8]
clr dd[9]
mov y[0],#0 ;10,0000,0000
mov y[1],#0cah
mov y[2],#9ah
mov y[3],#3bh
mov crc,x[3]
dd1 call sub_xy
jnc dd1_1
cja x[3],crc,dd1_1
inc dd[0]
call dtset_2
goto dd1
dd1_1 mov y[0],#0 ;1,0000,0000
mov y[1],#0e1h
mov y[2],#0f5h
mov y[3],#5h
mov crc,x[3]
dd2 call dtset_1
call sub_xy
jnc dd2_1
cja x[3],crc,dd2_1
inc dd[1]
call dtset_2
goto dd2
dd2_1 mov y[0],#80h ;1000,0000
mov y[1],#96h
mov y[2],#98h
mov y[3],#0h
dd3 call dtset_1
call sub_xy
jnc dd3_1
cje x[3],#0ffh,dd3_1
inc dd[2]
call dtset_2
goto dd3
dd3_1 mov y[0],#40h ;100,0000
mov y[1],#42h
mov y[2],#0fh
mov y[3],#0h
dd4 call dtset_1
call sub_xy
jnc dd4_1
cje x[3],#0ffh,dd4_1

inc dd[3]
call dtset_2
goto dd4
dd4_1 mov y[0],#0a0h ;10,0000
mov y[1],#86h
mov y[2],#1h
mov y[3],#0h
dd5 call dtset_1
call sub_xy
jnc dd5_1
cje x[3],#0ffh,dd5_1
inc dd[4]
call dtset_2
goto dd5
dd5_1 mov y[0],#10h ;1,0000
mov y[1],#27h
mov y[2],#0h
mov y[3],#0h
dd6 call dtset_1
call sub_xy
jnc dd6_1
cje x[3],#0ffh,dd6_1

inc dd[5]
call dtset_2
goto dd6
dd6_1 mov y[0],#0e8h ;1000
mov y[1],#3h
mov y[2],#0h
mov y[3],#0h
dd7 call dtset_1
call sub_xy
jnc dd7_1
cje x[3],#0ffh,dd7_1
inc dd[6]
call dtset_2
goto dd7
dd7_1 mov y[0],#64h ;100
mov y[1],#0
mov y[2],#0
mov y[3],#0
dd8 call dtset_1
call sub_xy
jnc dd8_1
cje x[3],#0ffh,dd8_1
inc dd[7]
call dtset_2
goto dd8
dd8_1 mov y[0],#0ah ;10
mov y[1],#0h
mov y[2],#0h
mov y[3],#0h
dd9 call dtset_1
call sub_xy
jnc dd10
cje x[3],#0ffh,dd10
inc dd[8]
call dtset_2
goto dd9
dd10 mov dd[9],tmdt[3]
call lcd_top


mov rb,#'F'
call write_lcd8
mov rb,#'c'
call write_lcd8
mov rb,#20h ; ' '
call write_lcd8
call write_lcd8
mov rb,dd[0]
or rb,#30h
call write_lcd8
mov rb,dd[1]
or rb,#30h
call write_lcd8
mov rb,dd[2]
or rb,#30h
call write_lcd8
mov rb,dd[3]
or rb,#30h
call write_lcd8
mov rb,dd[4]
or rb,#30h
call write_lcd8
mov rb,dd[5]
or rb,#30h
call write_lcd8
mov rb,dd[6]
or rb,#30h
call write_lcd8
mov rb,dd[7]
or rb,#30h
call write_lcd8
mov rb,dd[8]
or rb,#30h
call write_lcd8
mov rb,dd[9]
or rb,#30h
call write_lcd8

mov rb,#'H'
call write_lcd8
mov rb,#'z'
call write_lcd8

clrb RS
ret
 

16F84を使用した周波数カウンタ-2/2

 投稿者:ty  投稿日:2015年 4月 4日(土)18時23分3秒
  ;---------- sub ------------------

dtset_1 mov x[3],tmdt[0]
mov x[2],tmdt[1]
mov x[1],tmdt[2]
mov x[0],tmdt[3]
ret
dtset_2 mov tmdt[0],x[3]
mov tmdt[1],x[2]
mov tmdt[2],x[1]
mov tmdt[3],x[0]
ret

;
; 液晶初期化ルーチン
;
init_lcd
mov wait_cn,#15 ; wait 15ms
call wait_ms

clrb RS ; RS='L'
mov rb,#00110000b
call write_lcd8
mov wait_cn,#5 ; wait 4.1ms
call wait_ms

mov rb,#00110000b
call write_lcd8
mov wait_cn,#100 ; wait 100us
call wait_us

mov rb,#00110000b
call write_lcd8 ; 0 0 0011 (3)

mov rb,#00111000b
call write_lcd8 ; 0 0 0010 (8bit)
;
mov rb,#00001000b ; duty,font set9
call write_lcd8

mov rb,#00000001b ; クリアコマンド
call write_lcd8
mov wait_cn,#2 ; クリアが終わるまで待つ
call wait_ms

mov rb,#00000110b ; entry mode set
call write_lcd8

mov rb,#00001110b ; display on,cursor on
call write_lcd8
ret
;
; 8ビットモード専用液晶ライトルーチン
;
write_lcd8 nop
nop
nop
setb EN ; Eピンを'H'
nop
clrb EN

mov wait_cn,#40
call wait_us
ret
;----------- LCD clr cursol top ---------
lcd_top clrb RS

mov rb,#00000001b ; クリアコマンド
call write_lcd8
mov wait_cn,#2 ; クリアが終わるまで待つ
call wait_ms
mov rb,#10000000b
call write_lcd8 ; カーソルを1行目に移動
setb RS
ret
;

;
; μsオーダーのウェイト
;
wait_us
wait_us0
djnz wait_cn,wait_us0
ret
div_1000 mov y[3],#3
mov y[2],#0e8h
clr y[0]
clr y[1]
clr zz[0]
clr zz[1]
clr zz[2]
clr zz[3]
div_1001 mov dd[0],x[0]
mov dd[1],x[1]
mov dd[2],x[2]
mov dd[3],x[3]
call sub_xy
jc div_1003
div_1002 mov x[0],dd[0]
mov x[1],dd[1]
mov x[2],dd[2]
mov x[3],dd[3]
goto div_1004
div_1003 cja x[3],dd[3],div_1002
add zz[2],#1
movlw 1
btfsc c
addwf zz[3],1
goto div_1001
wait_ms
wait_ms0
mov wait_cn2,#0
wait_ms1
nop
nop
nop
nop
nop
nop
nop
djnz wait_cn2,wait_ms1
djnz wait_cn,wait_ms0
ret
div_1004 mov y[2],#3
mov y[1],#0e8h
clr y[0]
clr y[3]
div_1005 mov dd[0],x[0]
mov dd[1],x[1]
mov dd[2],x[2]
mov dd[3],x[3]
call sub_xy
jc div_1007
div_1006 mov x[0],dd[0]
mov x[1],dd[1]
mov x[2],dd[2]
mov x[3],dd[3]
goto div_1008
div_1007 cja x[3],dd[3],div_1006
add zz[1],#1
movlw 1
btfsc c
addwf zz[2],1
btfsc c
addwf zz[3],1
goto div_1005

div_1008 mov y[1],#3
mov y[0],#0e8h
clr y[2]
clr y[3]
div_1009 mov dd[0],x[0]
mov dd[1],x[1]
mov dd[2],x[2]
mov dd[3],x[3]
call sub_xy
jc div_1011
div_1010 mov x[0],dd[0]
mov x[1],dd[1]
mov x[2],dd[2]
mov x[3],dd[3]
ret
div_1011 cja x[3],dd[3],div_1010
add zz[0],#1
movlw 1
btfsc c
addwf zz[1],1
btfsc c
addwf zz[2],1
btfsc c
addwf zz[3]
goto div_1009


sub_xy
sub x[0],y[0]
movlw 1
btfss c
subwf x[1],1
btfss c
subwf x[2],1
btfss c
subwf x[3],1

sub x[1],y[1]
movlw 1
btfss c
subwf x[2],1
btfss c
subwf x[3],1

sub x[2],y[2]
movlw 1
btfss c
subwf x[3],1

sub x[3],y[3]
ret

div_32 mov xx[4],#0
cjne yy[1],#0,div_320
cjne yy[0],#0,div_320
clr xx[3]
clr xx[2]
clr xx[1]
clr xx[0]
ret
div_320
mov cn,#10h
div_321
setb c
rl xx[0]
rl xx[1]
rl xx[2]
rl xx[3]
rl xx[4]
sub xx[2],yy[0]
movlw 1
btfss c
subwf xx[3],1
btfss c
subwf xx[4],1
sub xx[3],yy[1]
movlw 1
btfss c
subwf xx[4],1
jc div_322
div_3211 add xx[2],yy[0]
movlw 1
btfsc c
addwf xx[3],1
btfsc c
addwf xx[4],1
add xx[3],yy[1]
movlw 1
btfsc c
addwf xx[4],1
clrb xx[0].0
div_322 cje xx[4],#0ffh,div_3211
djnz cn,div_321
ret
mul_xy mov zz[0],xx[0]
mov zz[1],xx[1]
clr zz[2]
clr zz[3]
mov cn,#16
mul_xy0
btfss zz[0].0
goto mul_xy9

bcf zz[0].0

add zz[2],yy[0]
movlw 1
btfsc c
addwf zz[3],1
btfsc c
addwf zz[0],1

add zz[3],yy[1]
movlw 1
btfsc c
addwf zz[0],1

mul_xy9:
movb c,zz[0].0
rr zz[3]
rr zz[2]
rr zz[1]
rr zz[0]

djnz cn,mul_xy0
ret
add_xy add xx[0],yy[0]
movlw 1
btfsc c
addwf xx[1],1
btfsc c
addwf xx[2],1
btfsc c
addwf xx[3],1

add xx[1],yy[1]
movlw 1
btfsc c
addwf xx[2],1
btfsc c
addwf xx[3],1

add xx[2],yy[2]
movlw 1
btfsc c
addwf xx[3],1

add xx[3],yy[3]
ret

;---------------------------------
dsm mov x[1],x[0]
and x[1],#0fh
call dsms
mov x[2],x[3]
mov x[1],x[0]
and x[1],#0f0h
rr x[1]
rr x[1]
rr x[1]
rr x[1]
call dsms
mov x[1],x[3]
ret

dsms cjae x[1],#10,dsms1
mov x[3],x[1]
or x[3],#30h
ret
dsms1 mov x[3],x[1]
add x[3],#37h
ret
 

電信用エレキ-を利用してリモ-ト操作をする

 投稿者:ty  投稿日:2015年 2月 5日(木)12時32分38秒
  今月は電信用エレキ-を利用してリモ-ト操作をする方法です。
モールス符号全てを、覚えるのは大変ですが、数字は簡単です。
それを利用して、短点用、長点用の2個のSWでさまざまな組み合わせの入力が可能です。

モールス符号は1:3の短点、長点同じく1:3のスペースの組み合わせで構成
されています。短点または長点を出したあと必ず短点と同じ長さのスペースが
挿入されます。当エレキーでは Eモード時、短点の1.5倍以上の時間キーイング
されないと1文字の終わりとみなし。そのコードを出力します。
コードは16ビットバッファをクリアして、
短点入力時16ビットバッファを1回左シフトして OR 1
長点入力時16ビットバッファを2回左シフトして OR 3
次の短ショートスペースでは16ビットバッファを1回左シフトして AND fffeH
ロングスペース(短点の1.5倍以上の時間キーイングされない)時
コードを送信します。
モールス信号のコード化例
文字       2進コード     16進コード   モールス符号
1     0001 0110 1101 1011 B 16db H ・ーーーー
2     0000 1010 1101 1011 B 0adb H ・・ーーー
3          0000 0101 0101 1011 B       055b H ・・・ーー
4          0000 0010 1010 1011 B 02ab H ・・・・ー
5          0000 0001 0101 0101 B 0155 H ・・・・・
6          0000 0011 0101 0101 B 0355 H ー・・・・
7     0000 0110 1101 0101 B       06d5 H ーー・・・
8          0000 1101 1011 0101 B       0db5 H ーーー・・
9          0001 1011 0110 1101 B 1b6d H ーーーー・
0          0011 0110 1101 1011 B 36db H ーーーーー

B          0000 0000 1101 0101 B 00d5 H ー・・・
F     0000 0000 1010 1101 B       00ad H ・・ー・
G     0000 0000 0110 1101 B 006d H ー・・
S          0000 0000 0001 0101 B 0015 H ・・・

RS232Cを介してエレキ-よりのコマンド実行例
モ-ルス符号ダイレクトコマンド
G モ-タ-ON        --・
F 前進モ-タ-ON    ・・-・
B 後退モ-タ-ON    -・・・
S モ-タ-OFF      ・・・
1 プログラム1実行    ・----
2 プログラム2実行    ・・---
3 プログラム3実行    ・・・--
4 プログラム4実行    ・・・・-
5 プログラム5実行    ・・・・・
6 プログラム6実行    -・・・・
 

pic12c509 CW tone 800Hz パルス ジエネレータ

 投稿者:ty  投稿日:2014年12月 4日(木)19時48分22秒
  pic12c509 CW tone 800Hz パルス ジエネレータ
       tmr0で方形波を作ります。555より低電圧で動作(3Vから5V)
       500Hzから1200Hzでクリスタルレシーバを鳴らせます。
       OPTIONでtmr0分周比をかえるか、
       EXTRC の R 、VRを調整すれば周波数を変えられます
       AMPを付ければスピーカも鳴らせます。
       またクロックを固定してtmr0の比較定数をかえ回数用カウンタ-
       (音長)を用意すれば音楽演奏もできます。

;ーーーーー     PROGRAM   ーーーーーーーーーーーーー
include 12c5xx.h
.12c509
.osc extrc ;可変外部クロック
.mclre disable ;MCLR を 入力ポ-ト GP3 で使う
.wdt off
id 0108h
;
;                     H でON
;                3v    cwon   open  PULS OUT
;         ┌────────────┐
; │⑧    ⑦    ⑥    ⑤    │
; │VSS  GP0    GP1   GP2   │
; │   PIC12C509            │
; │VDD  oscin oscout GP3   │
; │①    ②    ③    ④    │
; └────────────┘
; gnd   CR    Open   open
;                CWON Hで 800HZ発振
;    -----EXTRC------
;          *   oscin ->3 3k-> 10kVR -> 3v
;          *   oscin -> 50pF -> GND
;          -----800Hz out -------
;          50K VR にて 音量制御 クリスタルレシーバーを鳴らす

cwout equ gpio.2
org 8

cu1 ds 1
cu2 ds 1
gpbf ds 1
cwon            equ     gpbf.0

bf ds 1
org 0
;-------------- timer--------------
                clr     cu1
                clr     cu2
                mov     bf,#2
start1          nop
                djnz    cu1,start1
                djnz    cu2,start1
                djnz    bf,start1
                mov     !gpio,#101011b     ; in out set

clrb cwout
clr tmr0
mov w,#00000011b ;1:
option
clr cu1
clr cu2
main         clrb cwout

main1 mov w,#3
option
clr tmr0
mov     gpbf,gpio ;in gpio
                nop
                nop
                cjne    gpbf,gpio,main1

jb cwon,main2
goto main1
main2 cjbe tmr0,#10h,main2 ;time chk
pmon setb cwout
pmonw cjbe tmr0,#20h,pmonw ;time chk
goto main
 

H8/3664 のCプログラム 1/2

 投稿者:ty  投稿日:2014年11月 1日(土)12時41分50秒
  H8/3664 のCプログラム 1/2
H8/3664 のCプログラム 時計 LCD時:分:秒表示(P8)
とRS232Cで時:分表示のTMA.Cのご紹介をいたします。
H8/3664 を 使ってまだ1カ月なので不都合の所もあるとおもいますが
お許しいただき、ご指摘いただければ幸いです。
タイマーAで基準1S時間を割り込みで作り、
ポート8で2S1回のLED点滅、液表16X12表示
RS232Cで時:分表示と時:分入力
ーーーーー TMA.Cーーーーーーーー
#include <Mytype.h>
#include <3664f.h>
#include <machine.h>
#define MHz 16
#define BAUD 19200
#define BITR (MHz*1000000)/(BAUD*32)-1
#define WAIT_1B (MHz*1000000)/6/BAUD
SInt8  DD[6];
UInt16 d8,d4,poi,tmx,tmy;
void rsout(char x) ;
SInt8 rsin(void) ;
void wait_ms(void) ; /* max 22 mS */
void wait_us(void) ;
void wait_n(void);
void init_lcd(void) ;
void init_tma(void) ;
void init_io(void) ;
void send_dt(void);
void tmset(void);
/*void tmai(void);*/
void init_sci(void);
void wr_ld8(void);
void wr_ld4(void);
void dsp_wath(void);
void main(void)
{

  int i;
  init_sci();
  init_tma(); /*initialize TimerA */
  init_io();
  init_lcd();
ms:
  and_ccr(0xff);
  for(i=0;i<=5;i++)DD[i]=0;
  tmset();
  and_ccr(0x7f);
ml:
  if(rsin()=='s')goto ms ; /* endless loop */
  goto ml;
}



void init_tma(void)
{
  TA.TMA.BYTE = 0x08 ; /* TMOW=1/32,interval=1sec */
  IRR1.BIT.IRRTA = 0 ; /* clear interrupt request flag for TMA */
  IENR1.BIT.IENTA = 1 ; /* enable Timer A overflow interrupt */

}
void init_io(void)
{
  IO.PCR8=0xdf; /*p8 bit 7 LED &LCD  0-3 DB4-7 OUT E bit4 RS bit6  */
  IO.PDR8.BIT.B7=0; /* LED ON */

}
void init_sci(void)
{
SInt16 xx;
IO.PMR1.BIT.TXD = 1;
SCI3.SCR3.BYTE = 0; /* clear all flags */
SCI3.SMR.BYTE = 0; /* Ascnc, 8bit, NoParity, (Even), stop1, 1/1 */
SCI3.BRR = 25; /* 19200baud (CPU=16MHz) */
tmx=100; /* 1us wait */
wait_us();
SCI3.SCR3.BYTE = 0x30; /* scr=0011 0000 (TE=1,RE=1) */
xx = SCI3.SSR.BYTE; /* Dummy Read */
SCI3.SSR.BYTE = 0x80; /* Clear Error Flag (TDRE=1) */
} /* initio */

void rsout(char x)
{
lp:
        if(SCI3.SSR.BIT.TDRE==0)goto lp ; /* wait can write transmit data */
   SCI3.TDR = x;
   SCI3.SSR.BIT.TDRE==0; /*割り込み処理をしないときは自分でクリアする*/

}
void tmset(void)
{
SInt8 a;
rsout('S');
rsout('e');
rsout('t');
rsout(' ');
rsout('T');
rsout('i');
rsout('m');
rsout(' ');
a=rsin();
rsout(a);
a = a & 0xf;
DD[5] = a;
a=rsin();
rsout(a);
a = a & 0xf;
DD[4] = a;
a=rsin();
rsout(a);
a = a & 0xf;
DD[3] = a;
a=rsin();
rsout(a);
a = a & 0xf;
DD[2] = a;

}
SInt8 rsin(void)
{
SInt8 x;
lpr: if(SCI3.SSR.BIT.OER==1 || SCI3.SSR.BIT.FER==1 ||  SCI3.SSR.BIT.PER==1 ){ /*error*/
SCI3.SSR.BIT.OER==0;
SCI3.SSR.BIT.FER==0;
SCI3.SSR.BIT.PER==0;
}
if(SCI3.SSR.BIT.RDRF != 1)goto lpr;
x=SCI3.RDR;
SCI3.SSR.BIT.RDRF = 0;
return(x);
}
 

H8/3664 のCプログラム 2/2

 投稿者:ty  投稿日:2014年11月 1日(土)12時38分32秒
  H8/3664 のCプログラム 2/2
/*p8 bit 7 LED &LCD  0-3 DB4-7 OUT E bit4 RS bit6  */
void init_lcd(void)
{
  tmx=15;
  wait_ms();
  IO.PDR8.BIT.B6=0; /* RS= L */
  d8=0x3;
  wr_ld8();
  tmx=5;
  wait_ms();
  d8=0x3;
  wr_ld8();
  tmx=100;
  wait_us();
  d8=0x3;
  wr_ld8();
  d8=0x2;
  wr_ld8();
  d4=0x28;
  wr_ld4;
  d4=1; /* clr command */
  wr_ld4();
  tmx=2;
  wait_ms();
  d4=0x6; /* entry mode set */
  wr_ld4();
  d4=0xe; /* dsplay & cursor on */
  wr_ld4();
}
void wr_ld8(void)
{
  tmy=IO.PDR8.BYTE;
  tmy=tmy & 0xf0;
  tmy=tmy + d8;
  IO.PDR8.BYTE=tmy;
  wait_n();
  IO.PDR8.BIT.B4=1;   /*E = H */

  wait_n();
  IO.PDR8.BIT.B4=0;   /*E = L */
  tmx=80;
  wait_us();
}
void wait_n(void)
{
  tmy=tmy;
}
void wr_ld4(void)
{
  d8=d4 & 0xf0;
  if(d8 > 0xf )d8=d8/0x10;
  wr_ld8();
  d8=d4;
  d8=d8 & 0xf;
  wr_ld8();
}
/* 時計LCD表示 */
void dsp_wath(void)
{
  IO.PDR8.BIT.B6=0; /* RS= L */
  d4=0x80; /* cursor top */
  wr_ld4();
  IO.PDR8.BIT.B6=1; /* RS= H */
  d4=DD[5]+0x30; /* time*10 */
  wr_ld4();
  d4=DD[4]+0x30; /* time */
  wr_ld4();
  d4=':'; /* time */
  wr_ld4();
  d4=DD[3]+0x30; /* min*10 */
  wr_ld4();
  d4=DD[2]+0x30; /* min */
  wr_ld4();
  d4=':'; /* min */
  wr_ld4();
  d4=DD[1]+0x30; /* sec * 10 */
  wr_ld4();
  d4=DD[0]+0x30; /* min */
  wr_ld4();
}
void wait_ms(void)
{

    tmx=tmx*2800; /* if tmx=2800 then 1ms Wait */
    for ( tmy=0;tmy < tmx;tmy++);
}
void wait_us(void)
{

    tmx=tmx*3; /* if tmx=2.8 then 1us Wait */
    for ( tmy=0;tmy<tmx;tmy++);

}
#pragma interrupt(tmai)
void tmai(void)
{
  char i,j;
IENR1.BIT.IENTA = 0 ; /* disable Timer A overflow interrupt */
IRR1.BIT.IRRTA = 0 ; /*オバーフローフラグクリア*/
j=0;
DD[0]=DD[0]+1;
  if(DD[0]==10){
   DD[0]=0; /* sec */
   DD[1]=DD[1]+1;
   if(DD[1]==6){
   j=1;
   DD[1]=0;
   DD[2]=DD[2]+1;
   }
   if(DD[2]==10){ /* min */
   DD[2]=0;
   DD[3]=DD[3]+1;
   }
   if(DD[3]==6){
   DD[3]=0;
   DD[4]=DD[4]+1;
   }
   if(DD[4]==10){
   DD[4]=0; /* time */
   DD[5]=DD[5]+1;
   }
   if((DD[5]==2) && (DD[4]==4)){
   DD[5]=0;
   DD[4]=0;
   }
   }
   if(j == 1){
   i=5;
lp: rsout(DD[i]+0x30);
   i--;
   if(i==3)rsout(':');
   if (i > 1)goto lp;
   }
   if((DD[0] & 1) == 0){
      IO.PDR8.BIT.B7=0; /* LED ON */
      }
   else{
      IO.PDR8.BIT.B7=1; /* LED OFF */
      }
   dsp_wath();
   IENR1.BIT.IENTA = 1 ; /* enable Timer A overflow interrupt */
  }

 

光リモコン受信 1/2

 投稿者:ty  投稿日:2014年 6月30日(月)20時17分0秒
  FJCニュ-ス7月 1/2
TV用リモコンのコ-ドを読み込むソフトのMPASM版での紹介です。
PAマクロバスタ-を使用してMPASM用に秋月PA用から
変換しています。
赤外線受光ユニットで受信したコ-ドをRS232Cで
出力するソフトです。
赤外線受光ユニットはソニ-BX-1401 f0=38KHz
を使用しました。
TVリモコンのコ-ドが解析できれば
PICマイコンや他のマイコンボ-ドで
TVリモコンを自作機器の入力装置として応用出来ます。
*信号フォ-マットの違いにより読み取れない機種もあります。
Z80用に変更すれば応用範囲もさらに広がります。
;   TVリモコン コード 受信 MPASM用
;    PAマクロバスター使用で秋月PAよりMPASMに変換
      LIST    p=16F84A

       #include              "P16F84A.INC"

              __CONFIG  _CP_OFF  &  _WDT_OFF  &  _XT_OSC
              __IDLOCS H'0204'
;3.58MHZ

;
; ・-----------------------------------------------------・
; ・⑱    ⑰    ⑯    ⑮    ⑭    ⑬    ⑫    ⑪    ⑩   ・
; ・ra1   ra0   osc1  osc2  vdd   rb7  rb6   rb5    rb4  ・
; ・         PIC16F84                      ・
; ・ra2  ra3  ra4/to  mclr vss  rb0/int rb1  rb2   rb3   ・
; ・①    ②    ③    ④    ⑤    ⑥    ⑦    ⑧    ⑨   ・
; ・-----------------------------------------------------・
btime equ 28 ; 9600bps @3.58MHz
btimer equ 128 ; 0.7ms
txd equ 7 ;rb.7
rxld equ 0 ;rb.0
org 0ch
ch equ 12 ; 送信受信データ(8ビット)
rs equ 13 ; ウェイト時間調整用
cn equ 14 ; ビット数
stc equ 15
cu1 equ 16
cu2 equ 17
bf equ 18
wk0 equ 19 ;int push w
wk1 equ 20 ;   status
wk2 equ 21 ;         FSR
dt_0 equ 22
dt_1 equ 23
dt_2 equ 24
dt_3 equ 25
org 0
goto start
org 4
;          割り込み
inttm movwf wk0 ;push w
swapf wk0,1
swapf STATUS,0 ;     status
movwf wk1
movf FSR,0 ;     FSR
movwf wk2
;               init wark
;               init end          pop     FSR status w
btfsc wk1,1 ;bank 0 ?
bsf STATUS,RP0 ;no bank 1
movf wk2,0 ;pop  FSR
movwf FSR
swapf wk1,0 ;pop status
movwf STATUS
swapf wk0,0 ;pop  w
retfie
start
;-------------- timer--------------
clrf cu1
clrf cu2
movlw 2
movwf bf
start1 nop
decfsz cu1,1
goto start1
decfsz cu2,1
goto start1
decfsz bf,1
goto start1
movlw 11111b ; RA in set
tris PORTA
movlw 01111111b ; rb set
tris PORTB
bsf PORTB,txd
endless call lerv
movf dt_0,0 ; コード dt[0],dt[1]
movwf ch
call transmit
movf dt_1,0
movwf ch
call transmit
call tm7
movf dt_2,0 ; data  dt[2],dt[3]
movwf ch
call transmit
movf dt_3,0
movwf ch
call transmit
call tm7
movlw 0
movwf ch
call transmit
goto endless
;
; RS232C送信サブルーチン
;
transmit bcf PORTB,txd
movlw btime
movwf rs
trans10 decfsz rs,1
goto trans10
movlw 8
movwf cn
nop
transmit0 rrf ch
nop
btfss STATUS,C ; データ出力(LSBから)
bcf PORTB,txd
btfsc STATUS,C
bsf PORTB,txd

movlw btime
movwf rs
trans11 decfsz rs,1
goto trans11
decfsz cn,1
goto transmit0
nop
nop
nop
nop
nop
nop
bsf PORTB,txd
movlw btimer
movwf rs
trans12 decfsz rs,1 ; STOPビット分ウェイト
goto trans12
return
 

光リモコン受信 2/2

 投稿者:ty  投稿日:2014年 6月30日(月)20時15分17秒
  ;FJCニュ-ス7月 2/2
; 光リモコン受信サブルーチン
;
lerv btfsc PORTB,rxld
goto lerv ; STARTビットがくるまで待つ
movlw 224 ;5ms
movwf cu1
lerv0 btfsc PORTB,rxld
goto lerv
btfsc PORTB,rxld
goto lerv
btfsc PORTB,rxld
goto lerv
btfsc PORTB,rxld
goto lerv
btfsc PORTB,rxld
goto lerv
btfsc PORTB,rxld
goto lerv
btfsc PORTB,rxld
goto lerv
btfsc PORTB,rxld
goto lerv
btfsc PORTB,rxld
goto lerv
decfsz cu1,1
goto lerv0
lerv1 btfss PORTB,rxld
goto lerv1
movlw 112 ;2.5ms
movwf cu1
lerv11 btfss PORTB,rxld
goto lerv
btfss PORTB,rxld
goto lerv
btfss PORTB,rxld
goto lerv
btfss PORTB,rxld
goto lerv
btfss PORTB,rxld
goto lerv
btfss PORTB,rxld
goto lerv
btfss PORTB,rxld
goto lerv
btfss PORTB,rxld
goto lerv
btfss PORTB,rxld
goto lerv
decfsz cu1,1
goto lerv11
lerv2 btfsc PORTB,rxld
goto lerv2
lerv3 btfss PORTB,rxld
goto lerv3
movlw 8
movwf cn
call ledt
movlw 0ffh
subwf ch,0
btfsc 3,2
goto lerv5
movf ch,0
movwf dt_0
movlw 8
movwf cn
call ledt
movf ch,0
movwf dt_1
movlw 8
movwf cn
call ledt
movf ch,0
movwf dt_2
movlw 8
movwf cn
call ledt
movf ch,0
movwf dt_3
lerv4 btfss PORTB,rxld
goto lerv4
return
lerv5 clrf cu1
clrf cu2
lerv6 nop
nop
nop
nop
nop
decfsz cu1,1
goto lerv6
decfsz cu2,1
goto lerv6
goto lerv
ledt call tm7
btfss PORTB,rxld ; データ入力
bcf    STATUS,C
btfsc PORTB,rxld
bsf    STATUS,C
rrf ch
ledt1 btfsc PORTB,rxld
goto ledt3
goto ledt4
ledt3 btfsc PORTB,rxld
goto ledt3
ledt4 btfss PORTB,rxld
goto ledt4
decfsz cn,1
goto ledt
return
; 0.7ms
tm7 movlw btimer ;0.7ms wait
movwf bf
tm71 nop
decfsz bf,1
goto tm71
return
END
 

レンタル掲示板
/16