;****************************************************************************************** ; AVRサンプル ; Project : ; Program Name : ; Programer : ; Create date : Version 1.0 H23.02.01 ; History : ;****************************************************************************************** ; (1)Description ; RXD:PB3, TXD;PB4 ; ADC1(PB2):Input A/D-Converter-data ;****************************************************************************************** .include "tn13adef.inc" .equ COU0 = $0060 ; カウンタ0桁目 .equ COU1 = $0061 ; カウンタ1桁目 .equ COU2 = $0062 ; カウンタ2桁目 .equ COU3 = $0063 ; カウンタ3桁目 .equ CCOU0 = $0064 ; キャラクタ数字0桁目 .equ CCOU1 = $0065 ; キャラクタ数字1桁目 .equ CCOU2 = $0066 ; キャラクタ数字2桁目 .equ CCOU3 = $0067 ; キャラクタ数字3桁目 .equ TMPADCL = $0068 ; キャラクタ数字3桁目 .equ TMPADCH = $0069 ; キャラクタ数字3桁目 ; .equ PI_RXD = 3 ; Define RXD .equ PI_TXD = 4 ; Define TXD .cseg LDI R16,RAMEND OUT SPL,R16 ; ; ****************************** ; 1.初期設定 ; ****************************** ; (1)ポートを初期化 LDI R16,0b00010000 ; PORTB(4)を出力にする OUT DDRB,R16 ; PORTB(4)を出力にする LDI R16,0x00 ; PORTBを初期化 OUT PORTB,R16 ; PORTBを初期化 ; SBI PORTB,PI_TXD ; TXDを初期化 ; ; (2)A/C Converterを初期化 RCALL INITADC ; ADCを初期化 ; ****************************** ; 2.メインプログラム ; ****************************** ; (0)デモメッセージを送信する RCALL DEMO01 MAIN: ; (1)A/D Converterがらデータを得る RCALL GETADC STS TMPADCL,R16 STS TMPADCH,R17 ; (2)10bit16進=>キャラクタ10進に変換 RCALL CNVBD ; 10進表示バージョン ; (3)結果を出力 RCALL OUTADC ; (4)少し待つ RCALL WAT1S ; 少し待つ RJMP MAIN ;****************************************************************************************** ; Function Name : DEMO01 ; Title : 初期メッセージ出力 ; Input : ; Output : ; Description : ;****************************************************************************************** DEMO01: ; LDI R16,' ' RCALL SERTRN LDI R16,' ' RCALL SERTRN LDI R16,' ' RCALL SERTRN LDI R16,'A' RCALL SERTRN LDI R16,'T' RCALL SERTRN LDI R16,'T' RCALL SERTRN LDI R16,'I' RCALL SERTRN LDI R16,'N' RCALL SERTRN LDI R16,'Y' RCALL SERTRN LDI R16,'1' RCALL SERTRN LDI R16,'3' RCALL SERTRN LDI R16,'A' RCALL SERTRN LDI R16,' ' RCALL SERTRN LDI R16,'C' RCALL SERTRN LDI R16,'o' RCALL SERTRN LDI R16,'n' RCALL SERTRN LDI R16,'n' RCALL SERTRN LDI R16,'e' RCALL SERTRN LDI R16,'c' RCALL SERTRN LDI R16,'t' RCALL SERTRN LDI R16,'e' RCALL SERTRN LDI R16,'d' RCALL SERTRN LDI R16,' ' RCALL SERTRN LDI R16,'O' RCALL SERTRN LDI R16,'K' RCALL SERTRN LDI R16,'>' RCALL SERTRN LDI R16,' ' RCALL SERTRN RET ;****************************************************************************************** ; Function Name : OUTADC ; Title : 結果を出力 ; Input : ; Output : ; Description : ;****************************************************************************************** OUTADC: LDI R16,' ' RCALL SERTRN LDI R16,' ' RCALL SERTRN LDI R16,'V' RCALL SERTRN LDI R16,'o' RCALL SERTRN LDI R16,'l' RCALL SERTRN LDI R16,'t' RCALL SERTRN LDI R16,'[' RCALL SERTRN LDI R16,'m' RCALL SERTRN LDI R16,'V' RCALL SERTRN LDI R16,']' RCALL SERTRN LDI R16,'=' RCALL SERTRN LDS R16,CCOU3 RCALL SERTRN LDS R16,CCOU2 RCALL SERTRN LDS R16,CCOU1 RCALL SERTRN LDS R16,CCOU0 RCALL SERTRN LDI R16,'0' RCALL SERTRN RET ;****************************************************************************************** ; Function Name : CNVBH ; Title : 16進数バイナリ=>16進数キャラクタ変換 ; Input : ; Output : ; Description : 16進表示バージョン ;****************************************************************************************** CNVBH: ; (1)16進数バイナリを16進数に変換 ; 1)3桁目 LDI R16,0x00 STS COU3,R16 ; 2)2桁目 LDS R16,TMPADCH STS COU2,R16 ; 3)1,0桁目 LDS R16,TMPADCL MOV R17,R16 LSR R17 LSR R17 LSR R17 LSR R17 ANDI R17,0x0F STS COU1,R17 ANDI R16,0x0F STS COU0,R16 ; (2)16進数をキャラクタに変換 RCALL CNVCHAR RET ;****************************************************************************************** ; Function Name : CNVBD ; Title : 16進数バイナリ=>10進数キャラクタ変換 ; Input : ; Output : ;****************************************************************************************** CNVBD: ; (1)キャラクタ変数の初期化 RCALL INTCOU ; カウンタ変数の初期化 ; (2)16進数バイナリを10進数に変換 ; 1)ADCHから設定 LDS R17,TMPADCH LDI R18,0x01 CPSE R17,R18 RJMP CNVBD1A LDI R16,0x02 STS COU2,R16 LDI R16,0x05 STS COU1,R16 LDI R16,0x06 STS COU0,R16 RJMP CNVBD2 CNVBD1A: LDI R18,0x02 CPSE R17,R18 RJMP CNVBD1B LDI R16,0x05 STS COU2,R16 LDI R16,0x01 STS COU1,R16 LDI R16,0x02 STS COU0,R16 RJMP CNVBD2 CNVBD1B: LDI R18,0x03 CPSE R17,R18 RJMP CNVBD2 LDI R16,0x07 STS COU2,R16 LDI R16,0x06 STS COU1,R16 LDI R16,0x08 STS COU0,R16 CNVBD2: ; 2)ADCLから設定 LDS R16,TMPADCL LDI R17,0x01 ADD R16,R17 CNVBD2A: PUSH R16 LDI R17,0x01 CPSE R16,R17 RCALL CNTDEC POP R16 DEC R16 BRNE CNVBD2A ; (3)10進数をキャラクタに変換 RCALL CNVCHAR RET ;****************************************************************************************** ; Function Name : CNTDEC ; Title : 4桁10進カウンタ ; Input : ; Output : ;****************************************************************************************** CNTDEC: ; (1)0桁目の処理 LDS R17,COU0 LDI R16,0x01 ADD R17,R16 LDI R18,0x0a CPSE R17,R18 RJMP CNTDEC1A RJMP CNTDEC2 CNTDEC1A: STS COU0,R17 RET CNTDEC2: ; (2)1桁目の処理 LDI R17,0x00 STS COU0,R17 LDS R17,COU1 LDI R16,0x01 ADD R17,R16 LDI R18,0x0a CPSE R17,R18 RJMP CNTDEC2A RJMP CNTDEC3 CNTDEC2A: STS COU1,R17 RET CNTDEC3: ; (2)2桁目の処理 LDI R17,0x00 STS COU1,R17 LDS R17,COU2 LDI R16,0x01 ADD R17,R16 LDI R18,0x0a CPSE R17,R18 RJMP CNTDEC3A RJMP CNTDEC4 CNTDEC3A: STS COU2,R17 RET CNTDEC4: ; (3)3桁目の処理 LDI R17,0x00 STS COU2,R17 LDS R17,COU3 LDI R16,0x01 ADD R17,R16 LDI R18,0x0a CPSE R17,R18 RJMP CNTDEC4A RJMP CNTDEC5 CNTDEC4A: STS COU3,R17 RET CNTDEC5: LDI R16,0x00 STS COU0,R16 STS COU1,R16 STS COU2,R16 STS COU3,R16 RET ;****************************************************************************************** ; Function Name : CNVCHAR ; Title : 数値=>キャラクタ変換 ; Input : ; Output : ; Description : ;****************************************************************************************** CNVCHAR: ; LDS R16,COU3 ORI R16,0x30 RCALL CNVCHARS STS CCOU3,R16 ; LDS R16,COU2 ORI R16,0x30 RCALL CNVCHARS STS CCOU2,R16 ; LDS R16,COU1 ORI R16,0x30 RCALL CNVCHARS STS CCOU1,R16 ; LDS R16,COU0 ORI R16,0x30 RCALL CNVCHARS STS CCOU0,R16 ; RET ;****************************************************************************************** ; Function Name : CNVCHARS ; Title : 数値=>キャラクタ変換(2) ; Input : R16 ; Output : R16 ; Description : 0x3a=>'A',,,,,0x3f=>'F'に補正する ;****************************************************************************************** CNVCHARS: MOV R17,R16 ; LDI R18,0x3a CPSE R17,R18 RJMP CNVCHARS1 LDI R16,'A' RET CNVCHARS1: ; LDI R18,0x3b CPSE R17,R18 RJMP CNVCHARS2 LDI R16,'B' RET CNVCHARS2: ; LDI R18,0x3c CPSE R17,R18 RJMP CNVCHARS3 LDI R16,'C' RET CNVCHARS3: ; LDI R18,0x3d CPSE R17,R18 RJMP CNVCHARS4 LDI R16,'D' RET CNVCHARS4: ; LDI R18,0x3e CPSE R17,R18 RJMP CNVCHARS5 LDI R16,'E' RET CNVCHARS5: ; LDI R18,0x3f CPSE R17,R18 RJMP CNVCHARS6 LDI R16,'F' RET CNVCHARS6: RET ; ;****************************************************************************************** ; Function Name : INTCOU ; Title : 4桁10進カウンタ変数の初期化 ; Input : ; Output : ;****************************************************************************************** INTCOU: LDI R16,0x00 STS COU0,R16 LDI R16,0x00 STS COU1,R16 LDI R16,0x00 STS COU2,R16 LDI R16,0x00 STS COU3,R16 ; LDI R16,'*' STS CCOU0,R16 LDI R16,'*' STS CCOU1,R16 LDI R16,'*' STS CCOU2,R16 LDI R16,'*' STS CCOU3,R16 RET ;****************************************************************************************** ; Function Name : INITADC ; Title : A/D Converterを初期化する (AN1) ; Input : ; Output : ; Description : ;****************************************************************************************** INITADC: ; ********************************************** ; ADMUX(ADC Multiplexer Selection Register) ; ADMUX[7] Reserved Bit ; ADMUX[6] REFS0: Reference Selection Bit ; 0: VCC used as analog reference. ; 1: Internal Voltage Reference ; ADMUX[5] ADLAR: ADC Left Adjust Result ; 0: Right justified ; 1: Left justified ; ADMUX[4:2] Reserved Bits ; ADMUX[1:0] MUX1,MUX0: Analog Channel Selection Bits ; 00:ADC0 (PB5) ; 01:ADC1 (PB2) ; 10:ADC2 (PB4) ; 11:ADC3 (PB3) ; ********************************************** LDI R16,(0<1000(Step) ; ;****************************************************************************************** SERREC: ; 1.スタートビットを待つ(1000) * 1.5 ===> 1500 SERREC_1A: SBIC PINB,PI_RXD ;(1/2,3)PORTB(0)をチェック RJMP SERREC_1A ;(2)PORTB(0)をチェック ; LDI R17,149 ;(1) SERREC_1B: RJMP PC+1 ;(2) RJMP PC+1 ;(2) RJMP PC+1 ;(2) NOP ;(1) DEC R17 ;(1) BRNE SERREC_1B ;(1/2) ; RJMP PC+1 ;(2) RJMP PC+1 ;(2) RJMP PC+1 ;(2) ; ; 2.データ受信 ; (1)データを8ビット受信する LDI R16,0 ;(1)R16を初期化 LDI R18,8 ;(1) SERREC_2A: LSR R16 ;(1) SBIC PINB,PI_RXD ;(1/2,3)データチェック ORI R16,0x80 ;(1)データがHならビットを1にする SBIS PINB,PI_RXD ;(1/2,3)PORTB(0)をチェック ANDI R16,0x7f ;(1)データがLならビットを0にする ; 3.1ビット分待つ LDI R17,99 ;(1) SERREC_2B: ; RJMP PC+1 ;(2) RJMP PC+1 ;(2) RJMP PC+1 ;(2) NOP ;(1) DEC R17 ;(1) BRNE SERREC_2B ;(1/2) ; RJMP PC+1 ;(2) NOP ;(1) DEC R18 ;(1) BRNE SERREC_2A ;(1/2) ; 4.送信終了 LDI R17,100 ;(1) SERREC_4: ; RJMP PC+1 ;(2) RJMP PC+1 ;(2) RJMP PC+1 ;(2) NOP ;(1) DEC R17 ;(1) BRNE SERREC_4 ;(1/2) RJMP PC+1 ;(2) ; RET ;****************************************************************************************** ; Function Name : SERTRN ; Title : シリアルデータを送信する ; Input : R16(送信データ) ; Output : ; Description : OSC 9.6MHz, 9600BPS;1パルス長は、9.6MHz/9600=>1000(Step) ; ;****************************************************************************************** SERTRN: ; 1.スタートビットを送信(1000) CBI PORTB,PI_TXD ;(2)TXDを設定 LDI R17,100 ;(1) SERTRN_1: RJMP PC+1 ;(2) RJMP PC+1 ;(2) RJMP PC+1 ;(2) NOP ;(1) DEC R17 ;(1) BRNE SERTRN_1 ;(1/2) ; ; ; 2.データを送信(8Bit) ; (1)データを8ビット送信する LDI R18,8 ;(1) SERTRN_2: ; ; (2)ビットデータを送信する ; 2-1)ビット設定 SBRC R16,0 ;(1/2,3)R16(0)が'1'の時、'H'にする SBI PORTB,PI_TXD ;(2) SBRS R16,0 ;(1/2,3)R16(0)が'0'の時、'L'にする CBI PORTB,PI_TXD ;(2) LSR R16 ;(1) ; ; 2-2)1パルス作成 LDI R17,99 ;(1) SERTRN_2A: ; RJMP PC+1 ;(2) RJMP PC+1 ;(2) RJMP PC+1 ;(2) NOP ;(1) DEC R17 ;(1) BRNE SERTRN_2A ;(1/2) ; RJMP PC+1 ;(2) NOP ;(1) DEC R18 ;(1) BRNE SERTRN_2 ;(1/2) ; ; 3.ストップビットを送信 SBI PORTB,PI_TXD ;(2)TXDを設定 LDI R17,100 ;(1) SERTRN_3: ; RJMP PC+1 ;(2) RJMP PC+1 ;(2) RJMP PC+1 ;(2) NOP ;(1) DEC R17 ;(1) BRNE SERTRN_3 ;(1/2) ; 4.送信終了 SBI PORTB,PI_TXD ;(2)TXDを初期化 LDI R17,100 ;(1) SERTRN_4: ; RJMP PC+1 ;(2) RJMP PC+1 ;(2) RJMP PC+1 ;(2) NOP ;(1) DEC R17 ;(1) BRNE SERTRN_4 ;(1/2) ; ; 5.少し待つ LDI R17,100 ; SERTRN_5: ; RJMP PC+1 ;(2) RJMP PC+1 ;(2) RJMP PC+1 ;(2) DEC R17 ; BRNE SERTRN_5 RET ;****************************************************************************************** ; Function Name : WAT1S ; Title : タイマー関数 ; Input : ; Output : ;****************************************************************************************** WAT1S: LDI R18,100 WAT1S_A: LDI R17,100 WAT1S_B: LDI R16,110 WAT1S_C: RJMP PC+1 RJMP PC+1 RJMP PC+1 DEC R16 BRNE WAT1S_C DEC R17 BRNE WAT1S_B DEC R18 BRNE WAT1S_A RET ;****************************************************************************************** ; Function Name : WATLP ; Title : タイマー関数 ; Input : ; Output : ;****************************************************************************************** WATLP: LDI R17,10 WATLP_B: LDI R16,100 WATLP_C: RJMP PC+1 RJMP PC+1 RJMP PC+1 DEC R16 BRNE WATLP_C DEC R17 BRNE WATLP_B RET