Подскажите пожалуйста как сконфигурировать мегу128 для работы с тремя шимами.
нашел пример под CodeVision в принципе там всё понятно, но на баскоме не могу таймер правильно настроить
вот пример на С
/*****************************************************
Chip type : ATbanned28
Program type : Application
Clock frequency : 16,000000 MHz
Memory model : Small
External SRAM size : 0
Data Stack size : 1024
*****************************************************/
#include <banned28.h>
// Declare your global variables here
void main(void)
{
// выводы PB5 PB6 PB7 нужно сконфигурировать как выходы
DDRB=0xE0;
// настройка 16 битного Таймера_1
//TIMER1 initialize - prescale:64 (делитель тактовой частоты)
// WGM: 10) PWM phz correct, TOP= ICRn
// desired value: 50Hz
// actual value: 50,000Hz (0,0%)
TCCR1B = 0x00; //stop - остановить таймер
TCNT1H = 0xF6; //setup - эти числа
TCNT1L = 0x3C; // нам не нужны
/*
В двухбайтные регистры OCR1х нужно вписывать величину ШИМ.
Расчет:
OCR1х = целое [(длина импульса в мкС) * 2501 / 20000]
пример: для среднего положения Servo нужен импульс 1500 мкС
OCR1х = 1500 * 2501 / 20000 = 187,575 целое число 188
по симуляции и вреале возможно пойдет 187
OCR1х = целое [(нужный ШИМ в %) * 2501 / 100 ]
пример: расчет ШИМ в 10 % - у нас это импульс 2000 мкС
OCR1х = 10 * 2501 / 100 = 250,1 целое число 250
*/
OCR1AH = 0; // ШИМ на PB5 1500 uS
OCR1AL = 188;
OCR1BH = 0; // ШИМ на PB6 10% или 2000 uS
OCR1BL = 250;
OCR1CH = 0; // ШИМ на PB7 (VMLAB не симулирует) 1000 uS
OCR1CL = 125; // число 250
// ICR1 = 2500 это ШИМ 100% равный периоду в 20000 мкС
ICR1H = 0x09;
ICR1L = 0xC4;
// ===============================
TCCR1A = 0xAA; // Установка режима работы выходов - PB5 PB6 PB7
TCCR1B = 0x13; //start Timer
// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;
while (1)
{
// Place your code here
#asm("wdr")
};
}Отредактировано FlashKiller (2012-10-08 15:32:59)
