Loading [MathJax]/extensions/tex2jax.js

2020年9月12日土曜日

Z8536 CIO

 Z8536の初期化手順と割込み処理のメモです。カウンタタイマ3で10mS周期の割り込みをかけます。

Z8536にはRESETピンがなく、ハードウェアリセットはRDピンとWRピンを同時にLにすることで行います。今回はハードウェアを手抜きしているので、ソフトウェアでリセットしています。A0, A1ピンをHにしてリードし、つづいて、レジスタ0に1を書き込んだのちレジスタ0に0を書き込みます。これで初期化されます。

レジスタのアクセスは、A0, A1ピンをHにしアクセスするレジスタ番号を書き込み、つづいて目的のレジスタに書き込みか読み込みをします。Z8536を初期化するのにレジスタ設定の順番を変えたりすると、なぜか動かなくなったりします。正しい手順はよく理解できていないのですが、手探りで見つけた手順が下のコードです。


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
    .equ    CIOPRTC, 0x0011
    .equ    CIOPRTB, 0x0015
    .equ    CIOPRTA, 0x0019
    .equ    CIOCTRL, 0x001d
 
 
init_cio:
    ld  r1, #CIOCTRL
    inb rl0, #CIOCTRL
    lda r2, ciocmds
    ld  r3, #(ciocmde - ciocmds)
    otirb   @r1, @r2, r3
    ret
 
ciointr:
    push    @r15, r0    ! レジスタ保存
    push    @r15, r1
 
    ! 割り込み処理
    !
    !
     
    ldb rl0, #0x0c
    outb    #CIOCTRL, rl0
    ldb rl0, #0x24
    outb    #CIOCTRL, rl0   ! Clear IP and IUS
     
    pop r1, @r15    ! レジスタ復帰
    pop r0, @r15
    iret
 
!------------------------------------------------------------------------------
 
ciocmds:
    .byte   0x00, 0x01      ! Reset
    .byte   0x00, 0x00      ! Clear reset
    .byte   0x01, 0x00      ! Reset PortC and C/T3
    .byte   0x01, 0x10      ! Enable PortC and C/T3
    .byte   0x1e, 0xc2      ! Continuous, Ext Output, Square wave
    .byte   0x1a, 0x30      ! Set timer constant
    .byte   0x1b, 0xd4      ! Set timer constant
    .byte   0x00, 0x84      ! MIE and VIS
    .byte   0x04, 0x00      ! Set Interupt vector
    .byte   0x0c, 0xc0      ! Set Interupt Enable bit
    .byte   0x0c, 0x06      ! Gate and Triger
ciocmde:


割り込み処理は、最後にレジスタ12のIPとIUSをクリアして戻れば、続けて割り込みが発生します。これを忘れると、割り込みが単発になったり、他のチップからの割り込みが発生しなくなります。

Z8530もそうでしたが、Zilogの周辺チップはプログラムが難しい印象です。さらにデータシートが不親切で、読んだだけでは理解できないことが多々あります。ネット上にもあまり情報がないので、手探りがで動かすことになるのですが、動いた時の高揚感は格別です。

0 件のコメント:

コメントを投稿