.include"m8515def.inc" ;インクルードファイルの呼び出し .def STATUS0 =r17 ;ユーザー用ステータス .def USB_FIFO=r18 ;USBからの受信データ .def MAT_ADR =r19 ;マトリクスのアドレス .def MAT_UNIT=r20 ;マトリクスのUNIT数x6 ;******割り込みベクタテーブル********** ;※割り込み系は全て禁止にしてます .org $000 rjmp i_reset ;Reset rjmp i_err01 ;i_Err rjmp i_err02 ;i_Err rjmp i_err03 ;i_Err rjmp i_err04 ;i_Err rjmp i_err05 ;i_Err rjmp i_err06 ;i_Err rjmp i_err07 ;i_Err rjmp i_err08 ;i_Err rjmp i_err09 ;i_Err rjmp i_err0a ;i_Err rjmp i_err0b ;i_Err rjmp i_err0c ;i_Err rjmp i_err0d ;i_Err rjmp i_err0e ;i_Err rjmp i_err0f ;i_Err rjmp i_err10 ;i_Err ;*************プログラム*************** .org $011 ;***********割り込み処理系************* ;※万一割り込みが発生した場合ポートDに繋いだLEDで状態表示 i_err: ldi r16,0b11111111 ;ポートD PD0-PC7=[OUT] rjmp lp3 i_err01: ldi r16,0b11111111 ;ポートD PD0-PC7=[OUT] out DDRD,r16 ldi r16,0b00000010 ;ポートD 初期値$FE out PORTD,r16 rjmp lp3 i_err02: ldi r16,0b11111111 ;ポートD PD0-PC7=[OUT] out DDRD,r16 ldi r16,0b00000100 ;ポートD 初期値$FE out PORTD,r16 rjmp lp3 i_err03: ldi r16,0b11111111 ;ポートD PD0-PC7=[OUT] out DDRD,r16 ldi r16,0b00000110 ;ポートD 初期値$FE out PORTD,r16 rjmp lp3 i_err04: ldi r16,0b11111111 ;ポートD PD0-PC7=[OUT] out DDRD,r16 ldi r16,0b00001000 ;ポートD 初期値$FE out PORTD,r16 rjmp lp3 i_err05: ldi r16,0b11111111 ;ポートD PD0-PC7=[OUT] out DDRD,r16 ldi r16,0b00001010 ;ポートD 初期値$FE out PORTD,r16 rjmp lp3 i_err06: ldi r16,0b11111111 ;ポートD PD0-PC7=[OUT] out DDRD,r16 ldi r16,0b00001100 ;ポートD 初期値$FE out PORTD,r16 rjmp lp3 i_err07: ldi r16,0b11111111 ;ポートD PD0-PC7=[OUT] out DDRD,r16 ldi r16,0b00001110 ;ポートD 初期値$FE out PORTD,r16 rjmp lp3 i_err08: ldi r16,0b11111111 ;ポートD PD0-PC7=[OUT] out DDRD,r16 ldi r16,0b00010000 ;ポートD 初期値$FE out PORTD,r16 rjmp lp3 i_err09: ldi r16,0b11111111 ;ポートD PD0-PC7=[OUT] out DDRD,r16 ldi r16,0b00010010 ;ポートD 初期値$FE out PORTD,r16 rjmp lp3 i_err0a: ldi r16,0b11111111 ;ポートD PD0-PC7=[OUT] out DDRD,r16 ldi r16,0b00010100 ;ポートD 初期値$FE out PORTD,r16 rjmp lp3 i_err0b: ldi r16,0b11111111 ;ポートD PD0-PC7=[OUT] out DDRD,r16 ldi r16,0b00010110 ;ポートD 初期値$FE out PORTD,r16 rjmp lp3 i_err0c: ldi r16,0b11111111 ;ポートD PD0-PC7=[OUT] out DDRD,r16 ldi r16,0b00011000 ;ポートD 初期値$FE out PORTD,r16 rjmp lp3 i_err0d: ldi r16,0b11111111 ;ポートD PD0-PC7=[OUT] out DDRD,r16 ldi r16,0b00011010 ;ポートD 初期値$FE out PORTD,r16 rjmp lp3 i_err0e: ldi r16,0b11111111 ;ポートD PD0-PC7=[OUT] out DDRD,r16 ldi r16,0b00011100 ;ポートD 初期値$FE out PORTD,r16 rjmp lp3 i_err0f: ldi r16,0b11111111 ;ポートD PD0-PC7=[OUT] out DDRD,r16 ldi r16,0b00011110 ;ポートD 初期値$FE out PORTD,r16 rjmp lp3 i_err10: ldi r16,0b11111111 ;ポートD PD0-PC7=[OUT] out DDRD,r16 ldi r16,0b00100000 ;ポートD 初期値$FE out PORTD,r16 rjmp lp3 lp3: rjmp lp3 ;※実際の開始位置はここから i_reset: cli ;---- スタック設定 ---- ldi r16,low(RAMEND) out SPL,r16 ldi r16,high(RAMEND) out SPH,r16 ;---- ポート設定 ---- ldi r16,0b01111111 ;ポートA PA0-PA6=[OUT] PA7=[IN] out DDRA,r16 ldi r16,0b10011111 ;ポートB PB0-PB4=[OUT] PB5-PB7=[IN] out DDRB,r16 ldi r16,0b00000000 ;ポートC PC0-PC7=[IN] out DDRC,r16 ldi r16,0b11111111 ;ポートD PD0-PC7=[OUT] out DDRD,r16 ldi r16,0b00000101 ;ポートE PE0[OUT] PE1[IN] PE2[OUT] out DDRE,r16 ldi r16,0b00000000 ;ポートA 初期値$00 out PORTA,r16 ldi r16,0b00000000 ;ポートB 初期値$00 out PORTB,r16 ldi r16,0b00000001 ;ポートD 初期値$01 ;※不定で良し。改造前の名残 out PORTD,r16 ldi r16,0b00000100 ;ポートE 初期値$04 out PORTE,r16 ;---- 変数設定 ---- ldi STATUS0,$00 ldi MAT_ADR,$00 rcall debug_reset ;※リセットが掛かったかどうか確認する為のLEDパターン(ナイトライダー風) ;無くても良い main: ;************************************ メイン in r16,PINE ;ポートE センス sbrc r16,1 ; チェック rjmp main ;無限ループ rcall usb_recv out PORTD,USB_FIFO ;※無くて良い(デバッグ用にLEDモニタ表示) rcall data_proc rjmp main ;無限ループ usb_recv: ;************************************ USBデータ受信 cbi PORTE,2 ; = [L]にする nop ;8MHz:120ns 16MHz:60ns nop in USB_FIFO,PINC ;ポートC センス sbi PORTE,2 ; = [H]にする nop nop nop ret data_proc: ;************************************ データ解析 sbrs STATUS0,0 ;データシーケンス中? rjmp mat_ctrl mat_data: ;************************************ データ解析(データシーケンス)1バイトで4ドットx2色のデータが設定ユニット分だけ続く ;--- #0 --- ldi r16,0b00000000 ; sbrc USB_FIFO,0 ; ori r16,0b00000100 ; = [H] sbrc USB_FIFO,1 ; ori r16,0b00100000 ; = [H] out PORTA,r16 sbi PORTA,3 ; = [H] cbi PORTA,3 ; = [L] ;--- #1 --- ldi r16,0b00000000 ; sbrc USB_FIFO,2 ; ori r16,0b00000100 ; = [H] sbrc USB_FIFO,3 ; ori r16,0b00100000 ; = [H] out PORTA,r16 sbi PORTA,3 ; = [H] cbi PORTA,3 ; = [L] ;--- #2 --- ldi r16,0b00000000 ; sbrc USB_FIFO,4 ; ori r16,0b00000100 ; = [H] sbrc USB_FIFO,5 ; ori r16,0b00100000 ; = [H] out PORTA,r16 sbi PORTA,3 ; = [H] cbi PORTA,3 ; = [L] ;--- #3 --- ldi r16,0b00000000 ; sbrc USB_FIFO,6 ; ori r16,0b00000100 ; = [H] sbrc USB_FIFO,7 ; ori r16,0b00100000 ; = [H] out PORTA,r16 sbi PORTA,3 ; = [H] cbi PORTA,3 ; = [L] ;--- --- dec MAT_UNIT brne _jp1 rcall mat_addadr ;ラッチとアドレス加算 処理 _jp1: ret mat_ctrl: ;************************************ データ解析(コントロールシーケンス) command_0: ;<$40>アドレスリセットコマンド cpi USB_FIFO,$40 brne command_1 ldi MAT_ADR,$00 ;0Lineに戻す mov r16,MAT_ADR ;アドレス値をに出力 sbrc STATUS0,1 ;電源ON? ori r16,0b10000000 ; = H out PORTB,r16 ;PORTB出力 andi STATUS0,0b11111110 ;CLR ret command_1: ;<$41>1ユニット設定/ラインスタート cpi USB_FIFO,$41 brne command_1_2 ldi MAT_UNIT,$06 ;UNIT数x6 ori STATUS0,0b00000001 ;SET ret command_1_2: ;<$42>2ユニット設定/ラインスタート cpi USB_FIFO,$42 brne command_1_4 ldi MAT_UNIT,$0c ;UNIT数x6 ori STATUS0,0b00000001 ;SET ret command_1_4: ;<$44>4ユニット設定/ラインスタート cpi USB_FIFO,$44 brne command_1_6 ldi MAT_UNIT,$18 ;UNIT数x6 ori STATUS0,0b00000001 ;SET ret command_1_6: ;<$46>6ユニット設定/ラインスタート cpi USB_FIFO,$46 brne command_1_8 ldi MAT_UNIT,$24 ;UNIT数x6 ori STATUS0,0b00000001 ;SET ret command_1_8: ;<$48>8ユニット設定/ラインスタート cpi USB_FIFO,$48 brne command_1_10 ldi MAT_UNIT,$30 ;UNIT数x6 ori STATUS0,0b00000001 ;SET ret command_1_10: ;<$4A>10ユニット設定/ラインスタート cpi USB_FIFO,$4A brne command_1_12 ldi MAT_UNIT,$3c ;UNIT数x6 ori STATUS0,0b00000001 ;SET ret command_1_12: ;<$4C>12ユニット設定/ラインスタート cpi USB_FIFO,$4C brne command_50 ldi MAT_UNIT,$48 ;UNIT数x6 ori STATUS0,0b00000001 ;SET ret command_50: ;<$50>ラッチとアドレス加算 cpi USB_FIFO,$50 brne command_51 rcall mat_addadr andi STATUS0,0b11111110 ;CLR ret command_51: ;<$51>ユニット電源ON cpi USB_FIFO,$51 brne command_52 ori STATUS0,0b00000010 ;SET ldi r16,0b10000000 ; = H out PORTB,r16 ;PORTB出力 ret command_52: ;<$52>ユニット電源OFF cpi USB_FIFO,$52 brne command_53 andi STATUS0,0b11111101 ;CLR ldi r16,0b00000000 ; = L out PORTB,r16 ;PORTB出力 ret command_53: ;<$53>ユニットテストパターン表示 cpi USB_FIFO,$53 brne command_5F rcall mat_test rcall mat_test ret command_5F: ;<$5F>デバック用LED全クリア cpi USB_FIFO,$5F brne command_end ldi r16,0b00000000 out PORTD,r16 ret command_end: ret mat_addadr: ;************************************ アドレス加算処理 mov r16,MAT_ADR ;アドレス値をに出力 sbrc STATUS0,1 ;電源ON? ori r16,0b10000000 ; = H out PORTB,r16 ;PORTB出力 sbi PORTA,6 ; = [H] sbi PORTA,3 ; = [H] cbi PORTA,3 ; = [L] sbi PORTA,4 ; = [H] sbi PORTA,3 ; = [H] cbi PORTA,3 ; = [L] sbi PORTA,3 ; = [H] cbi PORTA,3 ; = [L] cbi PORTA,4 ; = [L] cbi PORTA,6 ; = [L] sbi PORTA,3 ; = [H] sbi PORTA,3 ; = [H] cbi PORTA,3 ; = [L] cbi PORTA,3 ; = [L] inc MAT_ADR cpi MAT_ADR,$18 ;24Lineですか? brne _jp2 ldi MAT_ADR,$00 ;0Lineに戻す _jp2: mov r16,MAT_ADR ;アドレス値をに出力 sbrc STATUS0,1 ;電源ON? ori r16,0b10000000 ; = H out PORTB,r16 ;PORTB出力 andi STATUS0,0b11111110 ;CLR ret mat_test: ;************************************ MATRIX テストパターン ldi r23,$18 ldi MAT_ADR,$00 ldi USB_FIFO,0b11100100 _lp1_0: ldi MAT_UNIT,$48 ;UNIT数x12 ldi r24,$48 _lp1_1: rcall mat_data dec r24 brne _lp1_1 dec r23 brne _lp1_0 ret wait_1ms: ;************************************ ウエイトルーチン(16MHz用) ldi r16,$0a wlp2: mov r10,r16 ldi r16,$c2 wlp1: nop nop nop nop nop dec r16 brne wlp1 mov r16,r10 dec r16 brne wlp2 ldi r16,$47 wlp3: nop nop nop dec r16 brne wlp3 nop nop nop nop ret wait_100ms: ldi r16,$64 wlp4: mov r11,r16 rcall wait_1ms mov r16,r11 dec r16 brne wlp4 ret wait_1s: ldi r16,$0a wlp5: mov r12,r16 rcall wait_1ms mov r16,r12 dec r16 brne wlp5 ret debug_reset: ;************************************ リセット時のデバック用LEDパターン(ナイトライダー風) ldi r16,0b00000001 out PORTD,r16 rcall wait_100ms ldi r16,0b00000010 out PORTD,r16 rcall wait_100ms ldi r16,0b00000100 out PORTD,r16 rcall wait_100ms ldi r16,0b00001000 out PORTD,r16 rcall wait_100ms ldi r16,0b00010000 out PORTD,r16 rcall wait_100ms ldi r16,0b00100000 out PORTD,r16 rcall wait_100ms ldi r16,0b01000000 out PORTD,r16 rcall wait_100ms ldi r16,0b10000000 out PORTD,r16 rcall wait_100ms ldi r16,0b01000000 out PORTD,r16 rcall wait_100ms ldi r16,0b00100000 out PORTD,r16 rcall wait_100ms ldi r16,0b00010000 out PORTD,r16 rcall wait_100ms ldi r16,0b00001000 out PORTD,r16 rcall wait_100ms ldi r16,0b00000100 out PORTD,r16 rcall wait_100ms ldi r16,0b00000010 out PORTD,r16 rcall wait_100ms ldi r16,0b00000001 out PORTD,r16 rcall wait_100ms ldi r16,0b00000000 out PORTD,r16 ret