Mega8 Door Bell

AVR Project 조회 수 27548 추천 수 64 2004.08.26 14:24:35


http://www.microsyl.com

초인종

-줄거리
초인종은 간단해 보이나 그렇지 않다!
펄스폭변조로 정현파를 발생시키는 것은 매우 까다롭다,
ATMega8의 발진으로 부터 OC1A를 출력하고 정현파 참조표로 부터 펄스폭이 정의된다.
1.8khz의 저역통과필터는 32khz를 제거하며, 그것의 결과는 순수한 정현파형이다.
나는 다른 음역(옥타브)의 같은 음정(노트)의 정현파를 2개 사용하여 좋은 소리를 실현했다.
당신은 이노래를 이곳에서 들을 수 있다.
감쇄되는 한개의 음정(note)은 또하나의 출력 증폭도 제어용 PWM에 의해서 종료된다.


-특징
많은 틀린 노래를 낼 수 있다.
듣기 좋은 소리

-연속된 음의 파형


-단위 음의 파형


-PDF 포맷의 회로도
http://www.microsyl.com/doorbell/DoorBell.pdf
-노래를 들어보자
http://www.microsyl.com/doorbell/Audio.mp3

-소스 리스트
//**************************************************************************
// AVRDoorBell
// Version 1.0 Fev 2003
// 1.0 -> -First Release
// Sylvain Bissonnette
//**************************************************************************

/*********************************************************/
/*                   I N C L U D E                     */
/*********************************************************/
#include "macros.h"        //마크로 표준 정의를 사용
#include "iom8v.h"         //ATmega8의 표준 정의를 사용

/*********************************************************/
/*                   P R O T O T Y P E                    */
/*********************************************************/
void Delay(int del);       //함수의 입력변수에 대한 앞선정의  
void Timer1_CompA(void);        //타이머 컴패어는 입력변수 없음
void Note(unsigned char N1,unsigned char N2,unsigned char Time);    //음정함수용 변수      
void Song(const unsigned char *Ptr);    //노래함수용 입력변수(멜로디 포인터)
void main(void);         //주함수는 입력 매개변수 없음

/*********************************************************/
/*                   D E F I N E                       */
/*********************************************************/
#define  TRUE     1
#define  FALSE     0

//다음은 음정에 대한 정의들이다 //숫자는 음정 주파수이다.
#define  A2       57     // 220hz                          
#define  A2d      60    // 233hz
#define  B2       64    // 247hz
#define  C2       68    // 262hz
#define  C2d      72    // 277hz
#define  D2       76    // 294hz
#define  D2d      80    // 311hz
#define  E2       85    // 330hz
#define  F2       90    // 349hz
#define  F2d      96    // 370hz
#define  G2       101   // 392hz
#define  G2d      107   // 415hz

#define  A3       114   // 440hz
#define  A3d      120   // 466hz
#define   B3      128   // 494hz
#define  C3       136   // 523hz
#define  C3d      144   // 554hz
#define  D3       152   // 587hz
#define  D3d      160   // 622hz
#define  E3       170   // 659hz
#define  F3       180   // 698hz
#define  F3d      192   // 740hz
#define  G3       202   // 784hz
#define  G3d      214   // 830hz

//다음은 Sustain(음의 뒷부분으로 진폭이 서서히 줄어드는 시간)의 정의이다.
#define  N0       0
#define  T1       1
#define  T2       2
#define  T3       3
#define  T4       4
#define  T5       5
#define  T6       6
#define  T7       7
#define  T8       8
#define  T9       9

/*********************************************************/
/*           C O N S T A N T                     */
/*********************************************************/
// SineTable
// 정현음정의 테이블이며 []안의 숫자는 1차원 배열변수의 갯수이다)
const unsigned char SineTable[256] = {133,136,139,142,
                             145,149,152,155,
                             158,161,164,167,
                             169,172,175,178,
                             181,184,186,189,
                             192,194,197,200,
                             202,205,207,209,
                             212,214,216,218,
                             220,222,224,226,
                             228,230,232,233,
                             235,237,238,240,
                             241,242,243,245,
                             246,247,248,248,
                             249,250,251,251,
                             252,252,252,253,
                             253,253,253,253,
                             253,253,252,252,
                             252,251,251,250,
                             249,248,248,247,
                             246,245,243,242,
                             241,240,238,237,
                             235,233,232,230,
                             228,226,224,222,
                             220,218,216,214,
                             212,209,207,205,
                             202,200,197,194,
                             192,189,186,184,
                             181,178,175,172,
                             169,167,164,161,
                             158,155,152,149,
                             145,142,139,136,
                             133,130,127,124,
                             121,118,115,112,
                             109,105,102,99,
                             96,93,90,87,
                             85,82,79,76,
                             73,70,68,65,
                             62,60,57,54,
                             52,49,47,45,
                             42,40,38,36,
                             34,32,30,28,
                             26,24,22,21,
                             19,17,16,14,
                             13,12,11,9,
                             8,7,6,6,
                             5,4,3,3,
                             2,2,2,1,
                             1,1,1,1,
                             1,1,2,2,
                             2,3,3,4,
                             5,6,6,7,
                             8,9,11,12,
                             13,14,16,17,
                             19,21,22,24,
                             26,28,30,32,
                             34,36,38,40,
                             42,45,47,49,
                             52,54,57,60,
                             62,65,68,70,
                             73,76,79,82,
                             85,87,90,93,
                             96,99,102,105,
                             109,112,115,118,
                             121,124,127,127};

// Gingle Bell 
// 징글벨의 노래(song)는 50개의 음(note)으로 구성된다.                       
const unsigned char Song1[50] = {E2,E3,T3,
                                 E2,E3,T3,
                                 E2,E3,T3,
                                 N0,N0,T3,
                                 E2,E3,T3,
                                 E2,E3,T3,
                                 E2,E3,T3,
                                 N0,N0,T3,
                                 E2,E3,T3,
                                 G2,G3,T3,
                                 C2,C3,T3,
                                 D2,D3,T3,
                                 E2,E3,T3,
                                 N0,N0,N0};

// Happy Birday
// 행복한 생일                       
const unsigned char Song2[75] = {C2,C3,T2,
                                 C2,C3,T2,
                                 D2,D3,T3,
                                 C2,C3,T3,
                                 F2,F3,T3,
                                 E2,E3,T3,
                                 N0,N0,T3,
                                 C2,C3,T2,
                                 C2,C3,T2,
                                 D2,D3,T3,
                                 C2,C3,T3,
                                 G2,G3,T3,
                                 F2,F3,T3,
                                 N0,N0,N0};

// Test3 
// 시험 3             
const unsigned char Song3[10] = {C2,C3,T2,
                                 C2,C3,T2,
                                 N0,N0,N0};

// Test4
// 시험 4              
const unsigned char Song4[10] = {D2,D3,T2,
                                 D2,D3,T2,
                                 N0,N0,N0};

// Test5
// 시험 5              
const unsigned char Song5[10] = {E2,E3,T2,
                                 E2,E3,T2,
                                 N0,N0,N0};

// Test6
// 시험 6              
const unsigned char Song6[10] = {F2,F3,T2,
                                 F2,F3,T2,
                                 N0,N0,N0};

// Test7
// 시험 7              
const unsigned char Song7[10] = {G2,G3,T2,
                                 G2,G3,T2,
                                 N0,N0,N0};

// Test8
// 시험 8              
const unsigned char Song8[10] = {A2,A3,T2,
                                 A2,A3,T2,
                                 N0,N0,N0};



/*********************************************************/
/*           G L O B A L    V A R I A B L E S          */
/*********************************************************/
// 다음은 광역변수의 정의들이다.
unsigned char StepWidth1 = 0x00;
unsigned int LookUpExt1 = 0x00;
unsigned char LookUpAct1;

unsigned char StepWidth2 = 0x00;
unsigned int LookUpExt2 = 0x00;
unsigned char LookUpAct2;

unsigned int Total;

// 다음은 서브루틴(보조함수)들이다.
/*********************************************************/
void Delay(int del)
{
int i,j;

for (j=0;j    {
   for (i=0;i<100;i++);
   WDR();
   }
}

// 이 함수는 타이머 비교출력 A를  위한 인터럽트를 처리한다.
// 주함수에서 OCR1A에 설정된 음의 주파수 N1과 N2의 출력주파수 함수이다.  
/*********************************************************/
#pragma interrupt_handler Timer1_CompA:7
void Timer1_CompA(void)
{
LookUpExt1 += StepWidth1;
LookUpAct1 = (char)(LookUpExt1 >> 5);

LookUpExt2 += StepWidth2;
LookUpAct2 = (char)(LookUpExt2 >> 5);

Total = (SineTable[LookUpAct1] + SineTable[LookUpAct2])>>2;
OCR1A = Total;
}

// 다음은 음정(note)을 출력하는 함수이다. 단순히 음정 테이블을 읽어서 설정만 한다.
/*********************************************************/
void Note(unsigned char N1,unsigned char N2,unsigned char Time)
// 입력되는 매개변수의 첫번째는 노트1, 두번째는 노트2, 세번째는 노트의 출력시간이다.
{
unsigned char i;

if (N1 != 0)    // N1이 0이 아니면 연주한다
   {
   StepWidth1 = N1;    //첫번째 음쨰
   StepWidth2 = N2;    //두번째쨰 음

   for (i=255;i>1;i--)   //i는 255에서 1까지 하나씩 감소한다.
      {
      Delay(Time);       //세번째 매개변수는 Time으로 설정된다
       OCR1B = i;       //타이머1의 출력비교(OCR) 레지스터에 i를 넣는다.
      }
   }

else        // N1이 0이면 단순히 시간을 지연시킨다.
   {
   for (i=255;i>1;i--) Delay(Time);    //N0가 나타마면 단순히 출력없는 시간만을 처리한다.
   }
}

// 다음은 멜로디를 출력하는 함수이다.
/*********************************************************/
void Song(const unsigned char *Ptr)
{
while (*(Ptr+2) != N0)        //현재 포인터가 가리키는 +2 위치의 데이터가 N0가 아니면 계속연주
     {
     Note(*Ptr,*(Ptr+1),*(Ptr+2));    //한번에 3개의 음정(3개의 화음이 한음을 낸다)을 출력하며
     Ptr = Ptr + 3;                     //따라서 멜로디 포인터는 3개씩 넘어간다.
     }
}

//다음은 주 함수이다.
/*********************************************************/
void main(void)
{
unsigned char i = 0;      //지역변수 i를 0으로 초기화하여 사용시작함

UCSRB = 0x00;  // Disable UART 직렬통신 사용란함
DDRB = 0x0f;   // PB0,1,2,3 as output 포트 B0, B1, B2, B3은 출력으로
PORTD = 0xff;  // 포트 D의 초기 레벨은 모두 1로 (입력으로 사용시)
DDRD = 0x00;  // 포트 D는 모두 입력으로 설정

TIMSK = 0x10;         //타이머 인터럽트 마스크 설정
TCCR1A = 0xa1;       //타이머 제어A 설정
TCCR1B = 0x09;       //타이머 제어B 설정  

WDR();                  //워치독 타이머 서브루틴을 최초로 호출
WDTCR = 0x0e;        // Enable WatchDog at 0.97 sec
SEI();                   // 광역 인터럽트 허가

// 다음은 주함수의 무한반복(Endless loop) 문이다.
while(1)
      {
      WDR();    //워치독 루틴을 반복적으로 처음에 한번씩 호출하여 리셋시킨다.

      // 다음은 입력 핀D에 대한 상태를 읽어서 해당 노래의 테이블을 선택한다.  
      if ((PIND & 0x01) == 0x00) Song(Song1);
      if ((PIND & 0x02) == 0x00) Song(Song2);
      if ((PIND & 0x04) == 0x00) Song(Song3);
      if ((PIND & 0x08) == 0x00) Song(Song4);
      if ((PIND & 0x10) == 0x00) Song(Song5);
      if ((PIND & 0x20) == 0x00) Song(Song6);
      if ((PIND & 0x40) == 0x00) Song(Song7);
      if ((PIND & 0x80) == 0x00) Song(Song8);
      }
}
// 이소스에 대한 질문은 질문답변 게시판에서 해 주시기 바랍니다.
// 번역자 ipstack@ipstack.co.kr
// 번역일 2004년 7월 12일
// 원저자 http://www.microsyl.com/


List of Articles
번호 제목 글쓴이 날짜 조회 수sort

AVR Project Stepper Motor Controller file

http://www.doc.ic.ac.uk/~ih/doc/stepper/control2/connect.html 새 페이지 2   Stepper Motor Controller Connection Diagrams The wires from the Logic PCB connector to the stepper motor in a TM100 Di...

AVR Project AVR Mega8을 사용한 PID제어 소스 file

http://www.circuitcellar.com/library/print/1002/eady147/index.htm LCD에 보이는 것은 실제 조리기의 온도와 음식3개의 온도이다. 압전 경보기가 꺼져 있으면, 조리기의 온도는 5° 간격으로 180° 에서 400°F이다. 음...

AVR Project PIC Based Serial Port Servo Controller file

http://www.digitalnemesis.com/ash/projects/picservo/ ◆ PIC Based Serial Port Servo Controller By Ashley Roll Ever wanted to use Servos in a robotics project? This project uses a PIC microcontroller and...

AVR Project 12C508 IR Proximity Detector file

http://users.frii.com/dlc/robotics/projects/botproj.htm 적외선 LED와 적외선 리모콘용 수신센서를 이용한 근접센서 프로젝트입니다. 포토센서를 사용하는 방법보다 비교적 먼거리의 물체를 한개의 IR수신 IC로 감지합니다. 첨부된 ...

AVR Project AVR 5x7 Dotmatrix LED Display file

http://www.blitzlogic.com/AVR 5x7 Dotmatrix LED Display Since we can source a maximum of 10mA per pin for PORT B and total maximum current from PORT B is 80mA, hence PORT B is just sufficient ...

AVR Project AT90S2313 디지털 용량계 file

http://elm-chan.org/works/cmc/report.htmlipstackAT90S2313 디지털 용량계 이것은 용량을 빨리 측정하는 간단한 용량계이다. 용량의 측정 원리는 임피던스 브릿지나 딥메터처럼 용량을 한번에 측정한다. 요즈음의 표준 용량계는 Cx에...

AVR Project UHF FSK PLL RF Module (NR-FPCX) file

  • eastsky
  • 2010-10-20
  • 조회 수 41632

UHF FSK PLL방식 무선 데이터 송/수신 모듈을 이용한 AVR 회로도 및 HEX 파일입니다. 기본적으로 CodeVision 에서 컴파일 한 HEX 이며, 2세트간에 10~20 Byte 이내에 데이터 송수신을 위한 회로 입니다. RF-Module ...

AVR Project Nokia LCD를 이용한 디지털시계 소스 file

함동호디스플레이는 Nokia LCD를 사용하였고 MPU는 Mega8을 이용하여 만든 디지털 시계입니다. 일단 간단하게 기본 그림과 가운데 시간:분:초 와 같은 형태로 24시간을 디스플레이 하도록 만든 소스 입니다.. 그리고 시간 설정...

AVR Project LED 전광판 file

http://home.wanadoo.nl/electro1/avr/dotmatrix.htm 개발자 사이트 : http://home.wanadoo.nl/electro1/avr/dotmatrix.htm 관련 사이트 : http://www.edaboard.com/ftopic58756-30.html 74H595 Shift Register App : http://www.kronosr...

AVR 강좌 Codevision C언어 Manual file

코드비젼 c언어 메뉴얼입니다

AVR Project AT90S2313을 사용한 IR to USB 모듈 file

http://www.cesko.host.sk/IgorPlugUSB/IgorPlug-USB (AVR)_eng.htm Universal USB interface & USB Infrared Interface with microprocessor AT90S2313-10 : 마이크로 콘트롤러로 USB를 완성 : IgorPlug-USB (AVR) 이기사의 ...

AVR Project ATmega8 - 회로도 file

간단한 회로도 입니다.

H/W 스텝모터회로 - 테스트용 file

전에 스텝모터 테스트용으로 만든 회로 입니다.. 실제로 테스트 해보니 잘 돌기는 하는데... 좀 그러네요 ^^; 학교에서 테스트용으로 사용하면 좋을 듯 합니다.. 덤으로 196 모터 회로... 추가

AVR Project Keypad & Encoder file

  • eastsky
  • 2010-10-15
  • 조회 수 32791

74HC138 을 이용한 10 * 8 Keypad 회로 입니다.. Encoder 을 사용할 때 시계방향과 반시계방향을 체크하는 방법입니다.. 여러가지가 있겠지만, 일정 시간 샘플링을 통한 방법이 가장 쉬우면서도 유효하다고 봅니다.

AVR Project Atmega16을 이용 74HC595 사용 file

http://scipia.co.kr/index.php?i_div=Its_tech_note&i_no=9이츠임베디드Atmega16을 이용 74HC595(8bit serial-in, serial or parallel-out shift register with output latches; 3-state) 사용기 입니다.. 이 자료는 이츠임베디드에...

AVR Project ATtiny26L의 AD 변환과 PWM 출력제어 file

http://www.geocities.jp/kuman2600/k2adc.html출처 : www.ipstack.co.kr 손잡이를 돌리면 모타의 회전이 바뀐다. 커다란 가변권선 저항을 직렬로 넣어 콘트롤하는 일이 있습니다. Tiny26L은 AD변환과 PWM기능이 있으므로, 가변저항으로...

AVR Project ATmega163 EDTP LittleDevice file

http://216.53.172.209/ ATmega163 EDTP LittleDevice For those of you that have twiddled the LED on the PICDEM.net board, this is a new twist. An EDTP Packet Whacker is still running the Etherne...

H/W 아이폰 충전 회로 file

  • eastsky
  • 2010-10-29
  • 조회 수 28463

iPhone Connector Info (Pin 27) USB Data (+) Pins 25 and 27 may be used in different manner. To force the iPod 5G to charge in any case, when USB Power 5 VDC (pin 23) is fed, 25 must ...

AVR Project JTAGICE mkII 상세 설명서 file [3]

안녕하세요 ⚑ 제가 JTAGICE mkII 상세 설명서를 얻었는데요 이 자료를 함동호님과 회원님들에게 드리려고해요. ★ 앞으로 많은 협조를 ★

AVR 강좌 [MEGA8] 타이머1비교인터럽트를 사용해서 주파수출력을 내는 방법 file

avrmall우선 타이머0로 주파수 입력을 받습니다. 1초동안이면 1초동안에 입력된 펄스개수를 계수하면 입력 주파수가 됩니다. 입력주파수를 다시 타이머1비교인터럽트를 사용해서 출력을 내려면 아래와 같은 방식으로 하시면 됩니다. ...