Доброго времени суток. Будьте добры, объясните нубу как можно настроить 8ми битный таймер на частоту 38 кГц. Смысл в следующем: есть ИК диод и ТСОП 4838, хочу сделать пульт на 4 кнопки чтоб управлять нагрузкой на другом контроллере. Пытаюсь мастером начального кода в CVAVR настроить таймер 0В для tiny13 по переполнению на частоту 38 кГц. Для 16 битного таймера, на сколько я понимаю, нужно установить следующие значения:
Timer's 0 Clock value - 31250 кГц, Timer value - 0, Compare A - (31250/38000)*31250= 25699= 6463 (Если не прав то поправьте.) А вот на 8ми битный таймер чего то в голову мысли не лезут... Проблема в том, что я не могу подобрать значение Compare A не более 255.
Конечно вы не правы. Объясню по простому. У вас есть МК, который работает на какой-то частоте. У вас она почему-то равна 31 МГц с копейками (сам я с этой тинькой не работал, поэтому утверждать что она на такой частоте работать не будет не могу - вдруг там PLL какой-нибудь). Ставьте нормальный кварц частотой 8 МГц, или внутренний генератор. 38 кГц - это 26 с копейками мкс. Зная длину такта переводим это время в такты. За период надо выходной бит изменить дважды, значит полученное число делим попалам. Теперь надо чтобы через это число тактов происходило прерывание по переполнению. А значит в таймер пишется число, равное максимум минус полученные ранее такты (от половины периода). При каждом вхождении в подпрограмму обработки прерывания надо инвертировать выходной бит и перезагружать таймер.
Щас некогда считать точные цифры, но вообще-то если в результате расчета получается больше, чем 255 - надо просто увеличивать прескалер и пересчитывать заново, пока не получится менее 255.
Добавлено спустя 7 минут 39 секунд: А, да, а откуда такая частота странная - 31 МГц??? У нее разве не 20 максимму? Или это типа разогнанная тиня?
For generating a waveform output in CTC mode, the OC1A output can be set to toggle its logical level on each compare match by setting the compare output mode bits to toggle mode (COM1A1:0 = 1). The OC1A value will not be visible on the port pin unless the data direction for the pin is set to output (DDR_OC1A = 1). The waveform generated will have a maximum frequency of fOC1A = fclk_I/O/2 when OCR1A is set to zero (0x0000). The waveform frequency is defined by the following equation:
Toggle mode and Phase and Frequency Correct PWM Mode: Just:
сори, частота не 31 мГц, запятую пропустил это 31,250 кГц полученные после деления тактовой частоты МК 4,0 мгц. на 128.
Добавлено спустя 29 минут 36 секунд: Спасибо, вроде разобрался. Задаю частоту МК от внутреннего генератора, например 4,8 МГц(для тини 13 эта частота выставляется фьюзами) В настройках таймера задаю делитель этой частоты 1. Теперь, fOCnx=(fclk_I/O)/(2 ⋅ N ⋅(1 + OCRnx)) fOCnx=38кГц; - необходимая частота fclk_I/O=4,8 МГц частота МК от внутреннего генератора, она же частота таймера деленная на N; N - делитель частоты МК для получения частоты таймера(в моем случае 1) OCRnx - нужно найти, т.е. неизвесная
Если все правильно то 62 (или 3Е в хекс) и есть искомое значение Compare A. Кому не лень проверьте плиз.
Добавлено спустя 1 час 27 минут 45 секунд: и еще, на сколько я понял, таймер переполняется при значении 256, поэтому в Compare A нужно записать 256-62= 194
Нет, одно дело если вы работаете через прерывания по переполнению, и совсем другое когда работаете через прерывание по совпадению. В настройках таймера настраиваем переключение ноги по совпадению, а также сброс таймера по совпадению (CTC). Так что в регистр сравнения надо писать именно 62.