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

Глава 9. Программирование таймеров 269 Теперь о том, как можно обеспечить эффект плавного переливания цветов друг в друга. Это гораздо красивее их раздражающего внезапного переключения, и мо­ жет быть применено и в рекламе, и в быту- например, в елочных гирляндах. При прямом подключении к каналам А и В двух разных гирлянд светодиодов они будут медленно гаснуть и загораться по очереди, но в середине возникнет пауза, когда обе гирлянды не горят. Чтобы от нее избавиться, хорошо бы сделать так, чтобы по­ ка одна гирлянда гаснет, вторая уже начинала загораться. Для этого надо включить оба вывода на непрерывную, без пауз, генерацию синуса, но инвертировать их друг относительно друга - так, чтобы второй вывод начинал сразу с максимума (т. е . генерировал бы косинус, а не синус) . Инвертировать можно вывод В, если установить оба бита: сомш1 : сомшо и сомш1 в регистре тccRlA. Установим это прямо в секции Reset и сведем установку обоих регистров сравнения в одно прерывание тrм1_СОМРА. Прерывание при этом упро­ стится . Изменения в программе (файл в архиве PWM_OC1_Led . asm) будут следую­ щими (листинги 9. 1 8 и 9. 1 9) . В секции Reset заодно устанавливаем предделитель на 1 : 256 . ldi temp , OЬ1 0 1 1 0 0 0 1 ; COM1Al=bit7 ; COM1Bl=bit 5 , COM1Bl=bit4 , WGM1 0=bit 0 out TCCRlA, temp ldi temp , ОЬ00 0 0 1 1 0 0 ; bit3=WGM12 , CS12 : CS 10=100=1 : 2 5 6 out TCCRlB, temp Прерывание т rм1_сомРв вычеркиваем, прерывание тrм1_СОМРА начинаем с выделе­ ния каждого четвертого (листинг 9 . 1 9) . TIMl СОМРА : ; каждое 4 -е прерЫБание inc t_count ; увеличиваем счетчик прерЫБаний andi t_count , ObO O O O O O l l ; выделяем младшие два бита breq set_OCR ; если резуль тат равен О - на установку OCRlx reti ; если нет - ничего не делаем set OCR : cpi count 0 , $ 3 8 ; сравниваем с 3 1 2 ldi temp , $ 0 1 ере countl , temp brlo continueA ; если меньше 3 1 2 , на продолжение ldi ZH , HIGH ( N_sin* 2 ) ; адрес таблицы sin в памяти - в Z ldi ZL , LOW ( N_s in* 2 ) clr countO

RkJQdWJsaXNoZXIy MTExODQxMg==