BASIC4MCU | 질문게시판 | atmega128 산토끼+fndstopwatch+led
페이지 정보
작성자 홍석찡 작성일2020-12-13 22:53 조회3,577회 댓글0건본문
밑 코드에 //주석친 부분을 채워야 하는데 도저히 모르겠습니다. 알려주실분 계신가요 ㅠㅠ
#include
#define LENGTH 40
#define LA_FREQ 110.
#define MULTIPLICATION_FACTOR 1.059463
#define T2_OCR 16000000.*0.005/1024.
unsigned short cs[8] = {0, 1, 8, 32, 64, 128, 256, 1024};
unsigned char fndDispHoldVal[4] = {1,2,3,4};
const unsigned char fndHexCode[16] = { 0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D,
0x27, 0x7F, 0x6F, 0x77, 0x7C, 0x39, 0x5E, 0x79, 0x71};
const unsigned char fndOnVal[4] = {0x01, 0x02, 0x04, 0x08};
unsigned char tccr0_set[LENGTH];
unsigned char ocr0_set[LENGTH];
unsigned char timer3Flag;
unsigned short remainCnt;
int seq;
unsigned char sw1mode = 0;
unsigned char sw2mode = 1;
unsigned long time10Millisec;
typedef enum {la_0, lasharp_0, si_0, do_1, dosharp_1, re_1, resharp_1, mi_1, fa_1,
fasharp_1, sol_1, solsharp_1, la_1, lasharp_1, si_1, do_2, dosharp_2, re_2,
resharp_2, mi_2, fa_2, fasharp_2, sol_2, solsharp_2, la_2, lasharp_2, si_2, do_3,
dosharp_3, re_3, resharp_3, mi_3, fa_3, fasharp_3, sol_3, solsharp_3, la_3,
lasharp_3, si_3, rest} melody_code;
typedef struct{
melody_code tone;
float leng;
} MUSIC_CODE;
const MUSIC_CODE musicCode1[]={{sol_2, 1}, {mi_2, 0.5}, {mi_2, 0.5}, {sol_2, 0.5},
{mi_2, 0.5}, {do_2, 1},{re_2, 1}, {mi_2, 0.5}, {re_2, 0.5}, {do_2, 0.5}, {mi_2, 0.5}, {sol_2,
1},{do_3, 0.75}, {sol_2, 0.25}, {do_3, 0.5}, {sol_2, 0.5}, {do_3, 0.5}, {sol_2, 0.5}, {mi_2,
1},{sol_2, 1}, {re_2, 0.5}, {fa_2, 0.5}, {mi_2, 0.5}, {re_2, 0.5}, {do_2, 1}, {0, 0}
};
void MakeTone(unsigned char sharp){
float reqFreq;
int i, j;
float num, freq;
int steps;float reqClks;
reqFreq = LA_FREQ;
for (i=0; i reqFreq = LA_FREQ;
steps = i;
for (j=0; j reqFreq *= MULTIPLICATION_FACTOR;
freq = reqFreq * 2;
reqClks = (16.0E6/ freq);
for (j=1; j<8; j++) {
num = reqClks / ((float) cs[j]);
if (num<=256.) {
tccr0_set[i] = j | 0b00011000;
ocr0_set[i] = ((unsigned char) num)-1;
break;
}
}
if (i==(LENGTH-1)) {
tccr0_set[i] = 0b000011000;
ocr0_set[i] = 0;
}
}
}
void SetTone(unsigned char n) {
TCCR0 = tccr0_set[n];
OCR0 = ocr0_set[n];
DDRB.4 = 1;
}
void InitTimer3(unsigned char tempo) {
TCCR3A = 0;
TCCR3B = (1< TCCR3B |= (1< if (tempo == 0) {
OCR3AH = (19999>>8) & 0xFF;
OCR3AL = (19999) & 0xFF;
}
else if (tempo == 1) {
//함수 내용 채워야됨
}
else if (tempo == 2) {);
);
;>//함수 내용 채워야됨
}
ETIFR = (1< ETIMSK = (1<}
interrupt [TIM3_COMPA] void Timer3A_cmp_isr(void){
++timer3Flag;
}
void InitTimer1(){ // 10ms 측정
TCCR1A = 0;
TCCR1B = (1< OCR1A = 24999;
}
interrupt [TIM1_COMPA] void Timer1A_cmp_isr(void){
++time10Millisec;
}
void InitTimer2(){
TCCR2 = (1< OCR2 = (unsigned char)(T2_OCR) - 1;
TIMSK |= 0x80;
}
interrupt [TIM2_COMP] void Timer2_cmp_isr(void){
static unsigned char currFndPos = 0;
PORTG = 0x00;
PORTC = fndDispHoldVal[currFndPos];
if (currFndPos == 1)
PORTC |= 0x80;
PORTG = fndOnVal[currFndPos];
currFndPos = (++currFndPos) % 4;
}
void StopTimer(){
ETIMSK &= ~(1< TCCR3B &= ~(1< DDRB.4=0;);
);
)>);
);
);TIMSK &= ~(1< TCCR1B &= ~((1<})>);
void RestartTimer(){
ETIMSK |= (1< TCCR3B |= (1< DDRB.4=1;);
);TIMSK |= (1< TCCR1B |= (1<}
interrupt [EXT_INT4] void ext4_isr() {
if (sw1mode == 0) {
remainCnt = 1;
DDRB.4=1;
ETIFR |= (1< ETIMSK |= (1< TCCR3B |= (1< seq = 0;);
);
);
)>);time10Millisec = 0;
TCNT1 = 0;
TIFR = (1< TIMSK |= (1< TCCR1B |= (1<//해당되는 PORTA 출력 입력할것
MakeTone(sw1mode);)>);
);sw1mode = 1;
}
else if (sw1mode == 1) {
// 함수 내용 채워야됨
}
else if (sw1mode == 2) {
// 함수 내용 채워야됨
}
else if (sw1mode == 3) {
// 함수 내용 채워야됨
}
}interrupt [EXT_INT5] void ext5_isr() {
if (sw2mode == 0) {
RestartTimer();
InitTimer3(sw2mode);
//해당되는 PORTA 출력 입력할것
sw2mode++;
}
else if (sw2mode == 1) {
//함수 내용 채워야됨
}
else if (sw2mode == 2) {
//함수 내용 채워야됨
}
else if (sw2mode == 3) {
//함수 내용 채워야됨
}
}
void main(void) {unsigned char i;
unsigned short us;unsigned char sharp0 = 0;
unsigned char tempo0 = 0;MakeTone(sharp0);
InitTimer1();
InitTimer2();
InitTimer3(tempo0);
EICRB = 0x0A;
EIMSK = 0x30;
SREG |= 0x80;
DDRC = 0xFF;
DDRG = 0x0F;
DDRA = 0xFF;
PORTA = 0x00;while (1) {
if (timer3Flag) {
timer3Flag = 0;
if (remainCnt) {
if (remainCnt == 10) {
DDRB.4 = 0;}
else if (remainCnt == 1) {
if (musicCode[seq].leng != 0.0) {
SetTone(musicCode[seq].tone);
remainCnt = (unsigned short)(musicCode[seq].leng * 100.);
++seq;
}
}
}
--remainCnt;
}us = time10Millisec;
for (i=0; i<4; i++){
fndDispHoldVal[i] = fndHexCode[us%10];
us = us/10;
}
}
}
댓글 0
조회수 3,577등록된 댓글이 없습니다.