Простой ШИМ на AtTiny13

Доброе время суток!
Потому как иногда программирую и не просто программирую какие-то программы-калькуляторы, а прогаю (если так можно сказать) микроконтроллеры (МК). Преимущество МК в том, что от них не требуется много деталей для создания чего либо, например простого импульсного преобразователя (затея с преобразователем и МК не лучшая, потому как помехи на МК) займет меньше деталей чем, при применении той же микросхемы как TL494.
Не буду говорить, для каких устройств, а просто расскажу про ШИМ =)
Что такое ШИМ? Можно в инете найти достаточно информации. А я расскажу о простом создании ШИМ. Думаю, кто не знаком с ШИМ и ознакомился как он работает, то составил примерную схему реализации. Оформлял в AVR Studio на Си.
Первое, что нам нужно сделать так это счетчик длительности импульса — оформил через функцию delay1:


void delay1(uint8_t us)
{
while(us)
{
_delay_us(1);
us--;
}
}

В данной функции используется основная функция _delay_us(1). Которая задает задержку импульса равной в 1 микросекунду. Далее идет счетчик на уменьшение значения us. Ну так вот, когда значение us становится, например, 10, то есть delay(10), то цикл while пройдет 10 раз с функцией задержки импульса в 1 микросекунду итого общий импульс получится в 10 мкс. Круто!
А потому как мы сделали _delay_us() управляемым (так-то эта функци не управляемая), то можно сделать через цикл изменение значения в функции delay1
Собственно сам цикл изменения импульса:


for (uint8_t i=0;i<25;i++)
{
PORTB = 0x11;//включаются все порты
delay(i);
PORTB = 0x00;//выключаются все порты
_delay_us(2);
}

В этом цикле импульсы будут увеличиваться с 1 мкс до 25 мкс. Между импульсами задержка равна 2 — эту задержку в принципе можно так же оформить и в нашей управляемой функции.