[an error occurred while processing this directive]
[an error occurred while processing this directive]
|
1.Судя по программе, частота меняться и не будет.
Если период выполнения цикла FOR() больше чем период прерывания таймера, то синусоида будет почти без разрывов, а ее период определяется лишь временем выполнения цикла FOR(), в противном случае , будет выводится 1-н период с паузой.
А п/п может выглядеть примерно так:
void handler(void) interrupt 3
{
TH1 = Divide_H;
TL1 = Divide_L;
DAC1L = sine[Count_Buf];
DAC0L = cosine[Count_Buf];
Count_Buf = (Count_Buf+1) % 360;
}
Теперь, для того чтобы вырабатавать 400 Гц при длинне буфера 360, необходимо вырабатывать прерывания с частотой 400 * 360 = 14400 Гц.
Исходя из этого и частоты кварца
Divide_HL = 2^N - T * F_Quartz/K;
где
T - период прерывания (сек) (1/14400)
F_Quartz - частота кварца (Гц)
K - коэффициент деления тактовой для таймера
N - разрядность таймера
Не совсем ясно, Вы пишите "Как расчитать для 13-битного таймера значения в TH1, TL1 ". Для 13 бит max - 0x3FF.
Сделать задержку можно различными способами, самый простой:
void Delay(long count)
{
for(;count--!=0;)
}
3. Какой эквивалент комманды JB ACC.7,$-2 на С? Что такое $ ?
$ - текущее значение счетчика команд
DJNZ ACC,$
иначе
Wait: DJNZ ACC,Wait
JB ACC.7,$-2
иначе
Wait: nop
nop
JB ACC.7,Wait
E-mail: info@telesys.ru