Телесистемы
 Разработка, производство и продажа радиоэлектронной аппаратуры
На главную   | Карта сайта | Пишите нам | В избранное
Требуется программист в Зеленограде
- обработка данных с датчиков; ColdFire; 40 тыс.
e-mail:jobsmp@pochta.ru

Телесистемы | Электроника | Конференция «Микроконтроллеры и их применение»

Zilog Z8F6403, вывод синуса с помощью ШИМ

Отправлено mike 06 апреля 2007 г. 16:39


В следующей программе на синусоиде на каждом периоде проявляется всплеск(что соответствует выводу 1 на всем периоде ШИМ'а). Вариант программы написанный полностью на асме работает нормально.

#include

const unsigned char sndData[/*sndDataSize*/] = {
0xe4, 0xe3, 0xe2, 0xdf, 0xdc, 0xd7, 0xd2, 0xcc, 0xc5, 0xbe,
0xb6, 0xad, 0xa4, 0x9a, 0x90, 0x87, 0x7d, 0x73, 0x69, 0x5f,
0x56, 0x4d, 0x45, 0x3d, 0x36, 0x2f, 0x2a, 0x25, 0x21, 0x1e,
0x1d, 0x1c, 0x1c, 0x1d, 0x1f, 0x22, 0x26, 0x2b, 0x30, 0x37,
0x3e, 0x46, 0x4e, 0x57, 0x61, 0x6a, 0x74, 0x7e, 0x88, 0x92,
0x9c, 0xa5, 0xae, 0xb7, 0xbf, 0xc6, 0xcd, 0xd3, 0xd8, 0xdc,
0xe0, 0xe2, 0xe3
};
#define sndDataSize sizeof(sndData)
unsigned int index = 0;
unsigned char count = 0;
unsigned char width;


#pragma interrupt
void isr_timer2(void)
{
width = sndData[index];

T2PWMH = 0;
T2PWML = width;

++count;
if (count == 4)
{
count = 0;
++index;
if (index >= sndDataSize)
index=0;
}
}

void initSound(void)
{
T2CTL = 0x43; // PWM mode, Prescale 1, not enabled.
T2H = 0x00; // Стартовое значение
T2L = 0x01;
T2RH = 0x02; // Перегружаемое значение =(18432000/16000)/1=0х480
T2RL = 0x40;
T2PWMH = 0;
T2PWML = 1;
T2CTL = 0xC3; // enable, prescale=1, PWM
SET_VECTOR(TIMER2, isr_timer2);

// Настройка прерываний
IRQ0ENH = 0x80; // Приоритет прерывания: high
IRQ0ENL = 0x80;

// Настройка PWM-выхода
PCADDR = 0x01; // Выбираем под-регистр "Data Direction"
PCCTL = 0x7F; // port C.7 - вывод
PCADDR = 0x02; // Выбираем Alternate Function
PCCTL = 0x80; // port C.7 - Alternate Function
PCADDR = 0x04; // Port C output control
PCCTL = 0x80; // Timer(PWM output) High Drive Enable
}


void main(void)
{
DI();
initSound();
EI();
for ( ; ; );
}



Составить ответ | Вернуться на конференцию

Ответы


Отправка ответа
Имя*: 
Пароль: 
E-mail: 
Тема*:

Сообщение:

Ссылка на URL: 
URL изображения: 

если вы незарегистрированный на форуме пользователь, то
для успешного добавления сообщения заполните поле, как указано ниже:
отымите от 2 единицу:

Перейти к списку ответов | Конференция | Раздел "Электроника" | Главная страница | Карта сайта

Rambler's Top100 Рейтинг@Mail.ru
 
Web telesys.ru