Ревич, Ю.В. Программирование микроконтроллеров AVR: от Arduino к ассемблеру

260 Часть 111. Практическое программирование микроконтроллеров АVR lj при начальной инициализации Reset : • выводы ОС 1 А и ОС 1 В - на выход; • задать режим Fast РWМ на выводе OC l A при ТОР = $ FF (8 разрядов), и ре- жим вывода ОС 1 А -установка в о при совпадении (неинверсная ШИМ); • вывод ОС 1 В установить в низкий уровень; • включить таймер с предделителем 1 : 1 ; • разрешить прерывание по сравнению Тimer 1 Compare А; lj в прерывании Timer l Compare А: • отсчитать 3 1 2 прерываний, меняя каждый раз значение регистра OCRl A в соответствии с таблицей в памяти; • вывод ОС 1 А установить в низкий уровень; • задать режим Fast РWМ на выводе ОС I В при ТОР = $ FF (8 разрядов), и ре­ жим вывода ОС 1 В - установка в о при совпадении (неинверснаяШИМ); • запретить прерывание по сравнению Timer l Compare А, разрешить прерыва­ ние по сравнению Timer l Compare В; lj в прерывании Тimer l Compare В: • отсчитать 3 1 2 прерываний, меняя каждый раз значение регистра OCR l B в соответствии с таблицей в памяти; • вывод ОС 1 В установить в низкий уровень; • задать режим Fast РWМ на выводе OC l A при ТОР = $ FF (8 разрядов), и ре­ жим вывода ОС 1 А -установка в о при совпадении (неинверсная ШИМ); • запретить прерывание по сравнению Timer l Compare В, разрешить прерыва- ние по сравнению Тimer 1 Compare А. Таблицу из 3 1 2 значений функции 255 · sin(x) в пределах полупериода (от О до 1t) можно рассчитать в Excel или любым другим способом, который вам по вкусу. Мы ее разместим в памяти программ и будем добывать значения с помощью одного из вариантов команды lpm, подобно тому, как это делалось для маски цифр в процеду­ рах индикации . Заметим, что в Arduino такая операция соответствовала бы дирек­ тиве PROGМEM, и большие таблицы (шрифтов, например) там тоже хранят в памяти программ, - а куда денешься? ПОДРОБНОСТИ С канонической точки зрения таблицу следовало бы разместить в EEPROM, но есть у нас любимый ATt iпy231 3, который вполне справится со всеми операциями управле­ ния ШИМ, но, увы, имеет всего по 1 28 байтов и SRAM , и EEPROM. Так что пойдем наиболее универсальным путем - читать байт из флеш-памяти программ даже на один такт быстрее, чем из EEPROM (см . главу 10) . Прерывание будет длиться какое­ то время , и по идее мы должны иметь небольшое искажение синуса вблизи макси­ мальных значений из-за того, что в этом случае прерывание может перекрывать мо­ мент достижения максимума счета , и обновление регистров сравнения не успеет про-

RkJQdWJsaXNoZXIy MTExODQxMg==