ROMを作る、の修正

ROMを作る -の修正

前はクロックの立ち上がりで割り込みをかけてデータを更新していたが、今度はアドレスの変化で割り込んでデータを更新することにする。

これでTD4の外部回路は全部出来たことになる。
f:id:ti-nspire:20201023082839p:plain:h250 f:id:ti-nspire:20201023082906j:plain:h250

#define F_CPU 8000000UL

#include <avr/io.h>
#include <avr/interrupt.h>

#define MOV_A(Im) ((0x3 << 4) | (Im)) // AレジスタにImを転送
#define MOV_B(Im) ((0x7 << 4) | (Im)) // BレジスタにImを転送
#define MOV_AB    ((0x1 << 4) | ( 0)) // AレジスタにBレジスタを転送
#define MOV_BA    ((0x4 << 4) | ( 0)) // BレジスタにAレジスタを転送
#define ADD_A(Im) ((0x0 << 4) | (Im)) // AレジスタにImを加算
#define ADD_B(Im) ((0x5 << 4) | (Im)) // BレジスタにImを加算
#define IN_A      ((0x2 << 4) | ( 0)) // 入力ポートからAレジスタへ転送
#define IN_B      ((0x6 << 4) | ( 0)) // 入力ポートからBレジスタへ転送
#define OUT(Im)   ((0xB << 4) | (Im)) // 出力ポートへImを転送
#define OUT_B     ((0x9 << 4) | ( 0)) // 出力ポートへBレジスタを転送
#define JMP(Im)   ((0xF << 4) | (Im)) // Im番地へジャンプ
#define JNC(Im)   ((0xE << 4) | (Im)) // Cフラグが1ではないときにIm番地へジャンプ

// アセンブルのようなことをして排列に格納する。
volatile const uint8_t inst[16] = {
/*0*/OUT(0b0001),
/*1*/OUT(0b0010),
/*2*/OUT(0b0100),
/*3*/OUT(0b1000),
/*4*/OUT(0b1110),
/*5*/OUT(0b1101),
/*6*/OUT(0b1011),
/*7*/OUT(0b0111),
/*8*/OUT(0b1111),
/*9*/OUT(0b0000),
/*A*/JMP(0),
/*B*/
/*C*/
/*D*/
/*E*/
/*F*/
};

ISR(PCINT1_vect){              // アドレスが変化したら、
    PORTB = inst[PINC & 0x0F]; // そのアドレスに応じたデータを出力する。
}

int main(){
    DDRC  &= ~0x0F; // PC3:0にアドレスを入力することにする。
    PORTC |=  0x0F; // PC3:0を内部プルアップする。★実際にTD4に接続するときは内部プルアップは不要。
    
    DDRB = 0xFF;   // PB7:0からデータを出力することにする。

    // PC3:0からピン変化割り込みをかける。
    PCICR  |= (1 << PCIE1);
    PCMSK1 |= ((1 << PCINT11) | (1 << PCINT10) | (1 << PCINT9) | (1 << PCINT8));
    sei();                            

    while(1);    
    return 0;
}