2012-07-31 2 views
0

소리 :PIC 16F628A 스피커는 내가 <a href="http://pastebin.com/BvZ3TWe3" rel="nofollow">this code</a>을 이해하려고 노력 중이 야

#include <pic.h> 
#include "delay.h" 

#define brisi_flag timer_flag=0 

unsigned char timer; 
unsigned char impuls; 
unsigned char ton_koji_ne_svira; 
static bit disable @ (unsigned)&PORTA*8+4; 
static bit izlaz @ (unsigned)&PORTA*8+1; 
static bit izlaz_inv @ (unsigned)&PORTA*8+0; 
static unsigned char stanja @ 0x2e; 
static bit stanje_izlaza @ (unsigned)&stanja*8+1; 
static bit timer_flag @ (unsigned)&INTCON*8+2; 

void 
DelayMs_2(unsigned char cnt) 
{ 
    unsigned char i; 
    do { asm("CLRWDT"); 
     if(ton_1) 
     return; 
     i = 4; 
     do { 
      DelayUs(250); 
     } while(--i); 
    } while(--cnt); 
} 

void 
DelayMs(unsigned char cnt) 
{ 
    unsigned char i; 
    do { asm("CLRWDT"); 
     i = 4; 
     do { 
      DelayUs(250); 
     } while(--i); 
    } while(--cnt); 
} 

void ton_1_2(unsigned char onaj_drugi_ton) 
{ 
    izlaz=0; 
    izlaz_inv=1; 
    stanje_izlaza=0; 
    TMR0=timer; 
ton_1_2_start: 
    brisi_flag; 
    disable=0; 
ton_1_2_sviranje: 
    while(timer_flag==0) 
      { 
     if((TMR0-timer)>=impuls) 
      {izlaz=0; 
       izlaz_inv=0; 
      } 
      } 
    brisi_flag; 
    TMR0=timer; 
    if(stanje_izlaza==0) 
     izlaz_inv=1; 
    else 
     izlaz=1; 
    stanje_izlaza=stanje_izlaza+1; 
    if((PORTA&0x0c)==onaj_drugi_ton) 
     return; 
    asm("CLRWDT"); 
    goto ton_1_2_sviranje;     
} 

void main() 
{ 
    CMCON=0x07;//portA su normalni ulazi (za 16F628A) 
    TRISA=0x0c; 
    TRISB=0xff; 
    disable=1; 
    OPTION=0x81; //WDT na 18 msec, preset TMR0 sa 4 

    izlaz=0; 
    izlaz_inv=0; 

    timer=107; 
     impuls=0x1d; 

    ton_1_2(ton_koji_ne_svira); 
} 

이 프로그램은 스피커에 800 Hz에서 사운드를 생성합니다. 주파수를 계산하는 방법을 모르겠다. (변수가 impuls이고 timer이어야한다). 이 코드는 PIC16F628A이고 외부 발진기는 4Mhz으로 설정되어 있습니다.

+0

글쎄, 대부분의 경우, 특히 변수 이름이 폴란드어 또는 유사한 언어로 보이기 때문에이 중 하나를 이해하지 못합니다. –

+0

@JoachimPileborg 변수의 이름을 변환했지만이 코드의 작동 방식을 여전히 이해할 수 없습니다 ... [http://enveloper.mozilla.org/ko/default.aspx] –

답변

0

다음은 코드를 이해하는 방법입니다.

타이머는 107에서 시작합니다. 타이머 인터럽트가 오버플로에서 트리거되므로주기는 256-107 = 149 틱입니다. 각 기간 동안 IMPULS = 29 틱 후에 출력이 꺼집니다. 따라서 29/149 = 19 %의 듀티 사이클을가집니다. 또한, 펄스는 두 개의 핀 사이에서 번갈아 가며 나타납니다.

OPTION = 0x81은 타이머에 대해 1 : 4 프리스케일러를 설정합니다. 따라서 클록이 4MHz (0.25μs 기간)로 실행되면 타이머는 1MHz (1μs 기간)에 틱한다. 따라서 149 틱의주기는 149 ㎲와 같아야하고 6711Hz의 주파수와 일치해야합니다. 실제 주파수가 약간 낮을 때마다 타이머를 시작하는 데 걸리는 시간을 추가합니다.

주파수가 800Hz입니까? 그것을 측정 했습니까? 어쩌면 프로세서가 실제로 500Hz에서 실행 중이거나 어딘가에 글로벌 1 : 8 프리스케일러가있을 수 있습니다.

관련 문제