ROMを作る -の修正
前はクロックの立ち上がりで割り込みをかけてデータを更新していたが、今度はアドレスの変化で割り込んでデータを更新することにする。
これでTD4の外部回路は全部出来たことになる。
#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; }