목차
제 Ⅰ 장 개요
1.1 작품개요
제 Ⅱ 장 작 품 설 계
2.1 작 품 설 계
2.1.1 전 원 부
2.1.2 음 향 부
2.1.3 Keyboard 부
2.1.4 LED 부
제 Ⅲ 장 동 작 원 리
3.1 Flow Chart
3.2 음계 발생 원리
3.2.1 CTC Mode를 이용한 음계 발생
3.3 Timer/Counter
3.3.1 CTC Mode
3.3.2 레지스터
제 Ⅳ 장 결 론 및 토 의
4.1 제작실험결과
4.2 제작후기
부 록
회로도
프로그램
참고문헌
1.1 작품개요
제 Ⅱ 장 작 품 설 계
2.1 작 품 설 계
2.1.1 전 원 부
2.1.2 음 향 부
2.1.3 Keyboard 부
2.1.4 LED 부
제 Ⅲ 장 동 작 원 리
3.1 Flow Chart
3.2 음계 발생 원리
3.2.1 CTC Mode를 이용한 음계 발생
3.3 Timer/Counter
3.3.1 CTC Mode
3.3.2 레지스터
제 Ⅳ 장 결 론 및 토 의
4.1 제작실험결과
4.2 제작후기
부 록
회로도
프로그램
참고문헌
본문내용
TCCR3B,AL
; WGM13 = 1, WGM12 = 1, WGM11 = 0, WGM = 0
; CTC 모드, Prescale CS 2:0 =0 : Speaker Off
LDI AL,0b00000000; FOC3 Disable
STS TCCR3C,AL
CLR AL; TCNT3 , T/C3 데이터 초기화
STS TCNT3H,AL
STS TCNT3L,AL
READ_KEY:CALLKEY_IN; OK128SUB.INC 에 키 체크함수 존재
CPIAL,0b11111110; if SW1, 'do' sound
BRNECK_SW2
; SW1이 아닌 경우 SW2인지 확인하는 루틴으로 분기
LDIAH,high(1910); ICR3 = 1910 입력
LDIAL,low(1910); 5옥타브 ‘도(C)' 출력
CALLSET_TIMER3; 출력 주파수 523.286Hz 출력
CALL D200MS
CALL SPEAKER_OFF; 스피커 OFF 하는 루틴으로 CALL 한다.
JMPREAD_KEY
CK_SW2:CPIAL,0b11111101; if SW2, 're' sound
BRNECK_SW3
; SW2이 아닌 경우 SW3인지 확인하는 루틴으로 분기
LDIAH,high(1702); ICR3 = 1702 입력
LDIAL,low(1702); 5옥타브 ‘레(D)' 출력
CALLSET_TIMER3; 출력 주파수 587.199Hz 출력
CALL D200MS
CALL SPEAKER_OFF; 스피커 OFF 하는 루틴으로 CALL 한다.
JMPREAD_KEY
CK_SW3:CPIAL,0b11111011; if SW3, 'mi' sound
BRNECK_SW4
; SW3이 아닌 경우 SW4인지 확인하는 루틴으로 분기
LDIAH,high(1516); ICR3 = 1516 입력
LDIAL,low(1516); 5옥타브 ‘미(E)' 출력
CALLSET_TIMER3; 출력 주파수 659.196Hz 출력
CALL D200MS
CALL SPEAKER_OFF; 스피커 OFF 하는 루틴으로 CALL 한다.
JMPREAD_KEY
CK_SW4:CPIAL,0b11110111; if SW4, 'pa' sound
BRNECK_SW5
; SW4이 아닌 경우 SW5인지 확인하는 루틴으로 분기
LDIAH,high(1431); ICR3 = 1431 입력
LDIAL,low(1431); 5옥타브 ‘파(F)' 출력
CALLSET_TIMER3; 출력 주파수 698.324Hz 출력
CALL D200MS
CALLSPEAKER_OFF; 스피커 OFF 하는 루틴으로 CALL 한다.
JMPREAD_KEY
CK_SW5:CPIAL,0b11101111; if SW5, 'sol' sound
BRNECK_SW6
; SW5이 아닌 경우 SW6인지 확인하는 루틴으로 분기
LDIAH,high(1275); ICR3 = 1275 입력
LDIAL,low(1275); 5옥타브 ‘솔(G)' 출력
CALLSET_TIMER3; 출력 주파수 783.699Hz 출력
CALL D200MS
CALL SPEAKER_OFF; 스피커 OFF 하는 루틴으로 CALL 한다.
JMPREAD_KEY
CK_SW6:CPIAL,0b11011111; if SW6, 'ra' sound
BRNECK_SW7
; SW6이 아닌 경우 SW7인지 확인하는 루틴으로 분기
LDIAH,high(1135); ICR3 = 1135 입력
LDIAL,low(1135); 5옥타브 ‘라(A)' 출력
CALLSET_TIMER3; 출력 주파수 880.282Hz 출력
CALL D200MS
CALL SPEAKER_OFF; 스피커 OFF 하는 루틴으로 CALL 한다.
JMPREAD_KEY
CK_SW7:CPIAL,0b10111111; if SW7, 'si' sound
BRNECK_SW8
; SW7이 아닌 경우 SW8인지 확인하는 루틴으로 분기
LDIAH,high(1011); ICR3 = 1011 입력
LDIAL,low(1011); 5옥타브 ‘시(B)' 출력
CALLSET_TIMER3; 출력 주파수 988.142Hz 출력
CALL D200MS
CALL SPEAKER_OFF; 스피커 OFF 하는 루틴으로 CALL 한다.
JMPREAD_KEY
CK_SW8:CPIAL,0b01111111; if SW8, 'do' sound
BRNEREAD_KEY1
; SW8이 아닌 경우 처음부터 확인하는 루틴으로 분기
LDIAH,high(955); ICR3 = 955 입력
LDIAL,low(955); 6옥타브 ‘도(C)' 출력
CALLSET_TIMER3; 출력 주파수 1046.025Hz 출력
CALL D200MS
CALL SPEAKER_OFF; 스피커 OFF 하는 루틴으로 CALL 한다.
JMPREAD_KEY
READ_KEY1 : JMP READ_KEY
SPEAKER_OFF:
LDIAL,0b00011000 ; Prescale 파트를 CS2:0 = 0 으로 하여
; OC출력 하지 않음
STSTCCR3B,AL
;CALLD200MS; 2ms 딜레이를 걸려고 했으나 빠른 키 ; 입력을 위해 생략 하였습니다.
RET
SET_TIMER3:
STSICR3H,AH
; 키 입력시 지정되는 A레지스터를 ICR3로 입력
STSICR3L,AL
LDIAL,0; TCNT3을 초기화
STSTCNT3H,AL
STSTCNT3L,AL
LDIAL,0b00011010
; CTC 13번 모드, Prescale CS2:0= 2 => 8분주
STSTCCR3B,AL
RET
;====================================================================
;Include User Subroutine File
;====================================================================
.include "OK128SUB.INC"; include OK-128 subroutine file
참고문헌
저자 윤덕용, “AVR ATmega 128 마스터”
저자 이무영, “ATmega128 Microcontroller"
저자 김종부, “ATmega128 이론 및 실험“
Internet, "http://alldatasheet.co.kr"
; WGM13 = 1, WGM12 = 1, WGM11 = 0, WGM = 0
; CTC 모드, Prescale CS 2:0 =0 : Speaker Off
LDI AL,0b00000000; FOC3 Disable
STS TCCR3C,AL
CLR AL; TCNT3 , T/C3 데이터 초기화
STS TCNT3H,AL
STS TCNT3L,AL
READ_KEY:CALLKEY_IN; OK128SUB.INC 에 키 체크함수 존재
CPIAL,0b11111110; if SW1, 'do' sound
BRNECK_SW2
; SW1이 아닌 경우 SW2인지 확인하는 루틴으로 분기
LDIAH,high(1910); ICR3 = 1910 입력
LDIAL,low(1910); 5옥타브 ‘도(C)' 출력
CALLSET_TIMER3; 출력 주파수 523.286Hz 출력
CALL D200MS
CALL SPEAKER_OFF; 스피커 OFF 하는 루틴으로 CALL 한다.
JMPREAD_KEY
CK_SW2:CPIAL,0b11111101; if SW2, 're' sound
BRNECK_SW3
; SW2이 아닌 경우 SW3인지 확인하는 루틴으로 분기
LDIAH,high(1702); ICR3 = 1702 입력
LDIAL,low(1702); 5옥타브 ‘레(D)' 출력
CALLSET_TIMER3; 출력 주파수 587.199Hz 출력
CALL D200MS
CALL SPEAKER_OFF; 스피커 OFF 하는 루틴으로 CALL 한다.
JMPREAD_KEY
CK_SW3:CPIAL,0b11111011; if SW3, 'mi' sound
BRNECK_SW4
; SW3이 아닌 경우 SW4인지 확인하는 루틴으로 분기
LDIAH,high(1516); ICR3 = 1516 입력
LDIAL,low(1516); 5옥타브 ‘미(E)' 출력
CALLSET_TIMER3; 출력 주파수 659.196Hz 출력
CALL D200MS
CALL SPEAKER_OFF; 스피커 OFF 하는 루틴으로 CALL 한다.
JMPREAD_KEY
CK_SW4:CPIAL,0b11110111; if SW4, 'pa' sound
BRNECK_SW5
; SW4이 아닌 경우 SW5인지 확인하는 루틴으로 분기
LDIAH,high(1431); ICR3 = 1431 입력
LDIAL,low(1431); 5옥타브 ‘파(F)' 출력
CALLSET_TIMER3; 출력 주파수 698.324Hz 출력
CALL D200MS
CALLSPEAKER_OFF; 스피커 OFF 하는 루틴으로 CALL 한다.
JMPREAD_KEY
CK_SW5:CPIAL,0b11101111; if SW5, 'sol' sound
BRNECK_SW6
; SW5이 아닌 경우 SW6인지 확인하는 루틴으로 분기
LDIAH,high(1275); ICR3 = 1275 입력
LDIAL,low(1275); 5옥타브 ‘솔(G)' 출력
CALLSET_TIMER3; 출력 주파수 783.699Hz 출력
CALL D200MS
CALL SPEAKER_OFF; 스피커 OFF 하는 루틴으로 CALL 한다.
JMPREAD_KEY
CK_SW6:CPIAL,0b11011111; if SW6, 'ra' sound
BRNECK_SW7
; SW6이 아닌 경우 SW7인지 확인하는 루틴으로 분기
LDIAH,high(1135); ICR3 = 1135 입력
LDIAL,low(1135); 5옥타브 ‘라(A)' 출력
CALLSET_TIMER3; 출력 주파수 880.282Hz 출력
CALL D200MS
CALL SPEAKER_OFF; 스피커 OFF 하는 루틴으로 CALL 한다.
JMPREAD_KEY
CK_SW7:CPIAL,0b10111111; if SW7, 'si' sound
BRNECK_SW8
; SW7이 아닌 경우 SW8인지 확인하는 루틴으로 분기
LDIAH,high(1011); ICR3 = 1011 입력
LDIAL,low(1011); 5옥타브 ‘시(B)' 출력
CALLSET_TIMER3; 출력 주파수 988.142Hz 출력
CALL D200MS
CALL SPEAKER_OFF; 스피커 OFF 하는 루틴으로 CALL 한다.
JMPREAD_KEY
CK_SW8:CPIAL,0b01111111; if SW8, 'do' sound
BRNEREAD_KEY1
; SW8이 아닌 경우 처음부터 확인하는 루틴으로 분기
LDIAH,high(955); ICR3 = 955 입력
LDIAL,low(955); 6옥타브 ‘도(C)' 출력
CALLSET_TIMER3; 출력 주파수 1046.025Hz 출력
CALL D200MS
CALL SPEAKER_OFF; 스피커 OFF 하는 루틴으로 CALL 한다.
JMPREAD_KEY
READ_KEY1 : JMP READ_KEY
SPEAKER_OFF:
LDIAL,0b00011000 ; Prescale 파트를 CS2:0 = 0 으로 하여
; OC출력 하지 않음
STSTCCR3B,AL
;CALLD200MS; 2ms 딜레이를 걸려고 했으나 빠른 키 ; 입력을 위해 생략 하였습니다.
RET
SET_TIMER3:
STSICR3H,AH
; 키 입력시 지정되는 A레지스터를 ICR3로 입력
STSICR3L,AL
LDIAL,0; TCNT3을 초기화
STSTCNT3H,AL
STSTCNT3L,AL
LDIAL,0b00011010
; CTC 13번 모드, Prescale CS2:0= 2 => 8분주
STSTCCR3B,AL
RET
;====================================================================
;Include User Subroutine File
;====================================================================
.include "OK128SUB.INC"; include OK-128 subroutine file
참고문헌
저자 윤덕용, “AVR ATmega 128 마스터”
저자 이무영, “ATmega128 Microcontroller"
저자 김종부, “ATmega128 이론 및 실험“
Internet, "http://alldatasheet.co.kr"
소개글