0

私はこのコードを理解しようとしています:

#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);
}

このプログラムは、スピーカーで800Hzのサウンドを生成します。頻度の計算方法がわかりません(変数impulsとを使用したものである必要がありますtimer)。このコードはのためPIC16F628Aのもので、外部発振器が4Mhzに設定されています。

4

1 に答える 1

0

これが私がコードを理解する方法です。

タイマーは107から始まります。オーバーフロー時にタイマー割り込みがトリガーされるため、期間は256-107=149ティックです。各期間中、IMPULS=29ティック後に出力がオフになります。したがって、29/149 = 19%のデューティサイクルがあります。さらに、パルスは2つのピン間で交互になります。

OPTION = 0x81は、タイマーに1:4のプリスケーラーを設定します。したがって、クロックが4MHz(周期0.25µs)で動作している場合、タイマーは1MHz(周期1µs)で刻みます。したがって、149ティックの周期は149µsに等しく、6711Hzの周波数に対応する必要があります。実際の周波数がわずかに低くなるたびにタイマーを開始するのにかかる時間を追加します。

周波数は800Hzですか?測定しましたか?プロセッサが実際に500Hzで実行されているか、グローバルな1:8プリスケーラがどこかにあるのかもしれません。

于 2012-08-02T17:47:55.040 に答える