TA8428はモータドライブICである
これはIN、IN2のHigh.Low 入力で、正逆切り替えができる。12vを加える

PB0ーーー> 正、逆切り替え
PB3−−−> FAST SLOW 切り替え
PB4−−−> スタート ストップ

ATTiny13Aは ポートが少ないので、FAST/SLOW の2段階の切り替え
を行う

制御方法は、H、Lのパルス制御でスピードをコントロールする

以下 アセンブラのプログラムである
C言語で 正確にパルス制御できないわけではないが、
アセンブラの方が簡単なので、下記に製作する

スローは ON-10us  ,OFF- 600us
FAST   ON-10us  , OFF-250uS

スタート時は 100ms ONさせて 起動させる。
Zゲージはスタートの起動トルクが必要だ

-----------------------------------------
しばらくしてから、3か月後 に列車を動かした
途中で止まる。
線路を磨いた、接点復活剤を使った、
途中で止まる。

市販のコントローラーでは、動く、、、、、、
PWMモードを 検討する必要がありそうだ。
ON時間をいろいろ振ってみよう、、









ーーーーーーーーーーーーーーーーーーーーーーーーーーーー
/*
* Zゲージ 在来線用
*  Z12-Z*
* Created: 2019/01/14
* Author: kmv70sky
* 内部クロック 9.6M
*
* stop LOW MID HI
* PB0 0 1 0 1
* PB1 0 0 1 1
*/

;******************************************************************************************

.include "tn13adef.inc"

.def wariF = R3
.def CGD = R4
.def CGDH = R5
.def fuF = R6
.def w8 = R7
.def carabuf = R8
.def ffuF = R9 ; zitta マイナスフラグ
.def Dtest = R10 ;test
.def ascbuf = R11

.def PULSEL = R14 ; パルスデータL
.def PULSEH = R15 ; パルスデータH


.def W = R16
.def W1 = R17
.def W2 = R18
.def T1MSEC = R19
.def TW1 = R20
.def TW2 = R21
.def TW3 = R22
.def sreg_save = R23
.def cnt = R24
.def cntr = R25

; Y= R28 R29, Z= R30,R31 予約

;****************************************
; Control (PORTB)

.equ K_S = 4
.equ S_F = 3
.equ OUT1 = 1
.equ OUT2 = 2
.equ K_REV = 0

;---------------- macro ----------------------
;LDIW
; LDIW Z,SRAM
;
.macro LDIW

ldi @0H,high(@1)
ldi @0L,low(@1)
.endm
;------ timer-------------
; TIME_COUNT @0 @1
;

;--------------------------------------------
.cseg
.org 0


RJMP RESET ;各種リセット
RJMP EXT_INT0 ;外部割り込み要求0
RJMP PCINT00 ;ピン変化割り込み要求0
RJMP TIM0_OVF ;タイマ/カウンタ溢れ
RJMP EE_RDY ;EEPROM操作可
RJMP ANA_COMP ;アナログ比較器出力遷移
RJMP TIM0_COMPA ;タイマ/カウンタ比較A一致
RJMP TIM0_COMPB ;タイマ/カウンタ比較B一致
RJMP WATCHDOG ;ウォッチドッグ計時完了
RJMP ADC1 ;A/D変換完了

EXT_INT0: ;外部割り込み要求0
PCINT00: ;ピン変化割り込み要求0
TIM0_OVF: ;タイマ/カウンタ溢れ
EE_RDY: ;EEPROM操作可
ANA_COMP: ;アナログ比較器出力遷移
TIM0_COMPA: ;タイマ/カウンタ比較A一致
TIM0_COMPB: ;タイマ/カウンタ比較B一致
WATCHDOG: ;ウォッチドッグ計時完了
ADC1: ;A/D変換完了




;
RESET: LDI w,LOW(RAMEND) ;RAM最終アドレス下位を取得
OUT SPL,w ;スタック ポインタ(下位)を初期化

;---------------------------------------------------------------

LDI w,0x06 ; PORTB(0-0110)を1=出力にする
OUT DDRB,w ;

LDI w,0x19 ; 1-1001 1=pull 10k
OUT PORTB,w ; PORTBを初期化
;-----アナログ比較器 初期化
sbi ACSR,ACD




MAIN:
cbi portB,OUT1 ;1
cbi portB,OUT2

start:
rcall t10ms
sbis pinB,K_S ;tact sW
rjmp start_0
rjmp start

;---FWD LOW -------------------
start_0:
sbis pinB,K_REV ;High = REV
rjmp fwd_st1
;------- REV mode -----------------
rev_st1: ;start up
sbi portB,OUT2
rcall t100ms
cbi portB,OUT2 ;1
rev_st2:
sbi portB,OUT2
rcall t10us
cbi portB,OUT2 ;1
rcall t600us
sbis pinB,S_F ;low = fast
rjmp rev_st4 ;Fast
sbis pinB,K_S ;stop
rjmp rev_st2
rjmp main
;---- REV FAST -------------
rev_st4: ;slow
sbi portB,OUT2
rcall t10us
cbi portB,OUT2 ;1
rcall t250us
sbis pinB,K_S ;stop
rjmp rev_st5
rjmp main
rev_st5:
sbis pinB,S_F ;slow-fast
rjmp rev_st4
rjmp rev_st2

;--- FWD -----------
fwd_st1:
sbi portB,OUT1
rcall t100ms
cbi portB,OUT1 ;1
fwd_st2:
sbi portB,OUT1
rcall t10us
cbi portB,OUT1 ;1
rcall t600us
sbis pinB,S_F ;slow-fast
rjmp fwd_st4 ;high
sbis pinB,K_S ;1.5SEC
rjmp fwd_st2
rjmp main

fwd_st4:
sbi portB,OUT1
rcall t10us
cbi portB,OUT1 ;1
rcall t250us
sbis pinB,K_S ;1.5SEC
rjmp fwd_st5
rjmp main
fwd_st5:
sbis pinB,S_F ;slow-fast
rjmp fwd_st4
rjmp fwd_st2





;-------------タイマー-ATtyny 13A----------------------------
t10us:
rjmp pc+1
ret

t20us:
rjmp pc+1
rjmp pc+1
rjmp pc+1
rjmp pc+1
rjmp pc+1
rjmp pc+1
rjmp pc+1
ret
;---------------------
t30us:
ldi w,4
loop30us:
rjmp pc+1
rjmp pc+1
dec w ;
BRNE loop30us
ret
;---------------------
t40us:
ldi w,5
loop40us:
rjmp pc+1
rjmp pc+1
dec w ;
BRNE loop40us
ret
;-------------------
t50us:
ldi w,6
loop50us:
rjmp pc+1
rjmp pc+1
dec w ;
BRNE loop50us
ret
;-------------------
t60us:
ldi w,7
loop60us:
rjmp pc+1
rjmp pc+1
dec w ;
BRNE loop60us
ret


;----------------
t70us:
ldi w,9
loop70us:
rjmp pc+1
rjmp pc+1
dec w ;
BRNE loop70us
ret


t80us:
ldi w,11
loop80us:
rjmp pc+1
rjmp pc+1
dec w ;
BRNE loop80us
ret

t100us:
ldi w,15
loop100us:
rjmp pc+1
rjmp pc+1
dec w ;
BRNE loop100us
ret
;-----------------------
t150us:
ldi w,20
loop150us:
rjmp pc+1
rjmp pc+1
dec w ;
BRNE loop150us
ret
;-----------------------
t200us:
ldi w,30
loop200us:
rjmp pc+1
rjmp pc+1
dec w ;
BRNE loop200us
ret
;-----------------------
t250us:
ldi w,39
loop250us:
rjmp pc+1
rjmp pc+1
dec w ;
BRNE loop250us
ret
;-----------------------
t300us:
ldi w,45
loop300us:
rjmp pc+1
rjmp pc+1
dec w ;
BRNE loop300us
ret
;-----------------------
t350us:
ldi w,50
loop350us:
rjmp pc+1
rjmp pc+1
dec w ;
BRNE loop350us
ret
;-----------------------
t400us:
ldi w,60
loop400us:
rjmp pc+1
rjmp pc+1
dec w ;
BRNE loop400us
ret
;-----------------------
t500us:
ldi w,75
loop500us:
rjmp pc+1
rjmp pc+1
dec w ;
BRNE loop500us
ret
;-----------------------
t600us:
ldi w,90
loop600us:
rjmp pc+1
rjmp pc+1
dec w ;
BRNE loop600us
ret

t1ms:
ldi w,3 ;0.056*1024 分周=57.3us
out TCCR0B,w
ldi w,0
out TCNT0,w
loop1ms:
in w,TCNT0
cpi w,18 ;57.3*18 =1.024 ms
BRNE loop1ms
ret
;------------------
t2ms:
ldi w,3 ;0.056*1024 分周=57.3us
out TCCR0B,w
ldi w,0
out TCNT0,w
loop2ms:
in w,TCNT0
cpi w,36 ;57.3*18 =1.024 ms
BRNE loop2ms
ret
;------------------
t3ms:
ldi w,3 ;0.056*1024 分周=57.3us
out TCCR0B,w
ldi w,0
out TCNT0,w
loop3ms:
in w,TCNT0
cpi w,52 ;57.3*18 =1.024 ms
BRNE loop3ms
ret


;------------------
t4ms:
ldi w,3 ;0.056*1024 分周=57.3us
out TCCR0B,w
ldi w,0
out TCNT0,w
loop4ms:
in w,TCNT0
cpi w,70 ;57.3*18 =1.024 ms
BRNE loop4ms
ret

;------------------
t7ms:
ldi w,3 ;0.056*1024 分周=57.3us
out TCCR0B,w
ldi w,0
out TCNT0,w
loop7ms:
in w,TCNT0
cpi w,122 ;57.3*18 =1.024 ms
BRNE loop7ms
ret


;------------------
t10ms:
ldi w,3 ;0.056*1024=57.3us
out TCCR0B,w
ldi w,0
out TCNT0,w
loop10ms:
in w,TCNT0
cpi w,174 ;57.3*174 =10.048 ms
BRNE loop10ms
ret



;------------------
t50ms:
ldi w1,5
loop50ms:
rcall t10ms
dec w1
brne loop50ms
ret
;-------------------
t100ms:
ldi w1,10
loop100ms:
rcall t10ms
dec w1
brne loop100ms
ret
;-------------------
t200ms:
ldi w1,20
loop200ms:
rcall t10ms
dec w1
brne loop200ms
ret
;--------------------
t500ms:
ldi w1,50
loop500ms:
rcall t10ms
dec w1
brne loop500ms
ret
;---------------------
t1s:
ldi w1,100
loop1s:
rcall t10ms
dec w1
brne loop1s
ret



;-------データ ----------------------------------
.dseg
.org 0x0300

Xziku: .byte 1 ;GLCD X軸データ 0〜127
Yziku: .byte 1 ;GLCD Y軸データ 0〜63
caradat: .byte 1 ;cata D0-D7 data
YLcara: .byte 1 ;Y=1-192000
YHcara: .byte 1 ; 4B00
YLcara_buf: .byte 1 ;Y=1-192000
YHcara_buf: .byte 1 ; 4B00

ra_buf: .byte 100 ; 4B00



列車コントロール

@手動で ポイント円軌道と外周軌道を切り替える
A手動で 駅方向と街軌道を切り替える
B在来線の FWDとREV方向に走らせる
C新幹線の FWDとREV方法に走らせる

工事中

Zゲージのポイント切替がコントロールできたところで、次は列車を走らせてみよう
マイコンは、ATmega1284PとAttiny13Aを使った
写真はコントロールBOXである

上のボタンは、列車のスピードを速いと遅い切り替え
A1、A2 は オートモードで、プログラムした通り走らせる

例えば、駅からスタートさせて、外周を回り、途中で停車
     円軌道を回って、逆方向に走らせ駅に戻る
     というように、、、、