Предыстория:
Учился в институте давно, преподавали толком только Бейсик да и тот один семестр + самообразование со Спектрумом так что особого выбора при освоении микроконтролеров небыло...
В качестве основы взял готовую прогу из интернета, где нарыл не помню вот ее кусок:

Код:
'------------------------------------------
' Программа "AVR-WATCH" (версия 2)
'------------------------------------------
' Микроконтроллер типа ATMEGA8
'------------------------------------------
' Программируемые Fuses:
' CKSEL3...CKSEL0 = 1001 - низкочастотный кварцевый резонатор
' CKOPT=0 - внутренние конденсаторы подключены к кварцевому резонатору
' RSTDISBL=1 - порт PC6 используется как сброс
' WDTON=1 - сторожевой таймер разрешен
' SPIEN=0 - последовательное программирование разрешено
' BOOTSZ1,BOOTSZ0 = 00, BOOTRST=1 - параметры загрузчика
' EESAVE = 1 - НЕ ОЧИЩАТЬ EEPROM при программировании
' BODLEVEL=1, BODEN=1 - ПАРАМЕТРЫ СБРОСА
' SUT1=1,SUT1=0 - ВРЕМЯ СТАРТА
'------------------------------------------
' Ресурсы:
' Генератор RC - внутренний 1 МГц, а к TOSC1 and TOSC2 подключен кристалл 32768 Гц
' На выходе PB3 (OC2) импульсы длительностью 1 с (0.5 Гц)
' На выходе PB1 (OC1A) звуковой сигнал
' Порт Portd выход сегментов
' Portc0...Portc3 - код знакоместа (позиционный) он же порт сканирования клавиатуры
' Четыре кнопки: Port0...Portc3 - код сканирования клавиатуры, Portc4 - линия возврата клавиатуры
'------------------------------------------
$regfile = "m8def.dat"                  'определить тип микроконтроллера
'------------------------------------------

'Объявлена куча переменных которые выкинуты дабы не мусорить текст, к делу они отношения не имеют

Dim Bufr As String * 10                 'текстовая строка
'------------------------------------------
$crystal = 1000000                      'генератор 1 МГц, необходим компилятору для правильного
                                        ' вычисления задержек и других временных параметров
'------------------------------------------
'    назначение векторов прерывания.
On Timer0 Timer0_int Nosave                                 'вектор прерывания от таймера 0
On Timer2 Timer2_int Nosave             'вектор прерывания от таймера 2
'------------------------------------------
Mcucr = &B10000000                      'режим IDLE - разрешить
'    ТАЙМЕРЫ
Tccr0 = &B00000011                      'режим таймера 0: Fкв/64 - часы реального времени
'---------------------
                                        'режим таймера 1:
Tccr1a = &B01000000                     'генератор звука 2 кГц с выходом на PB1 (OC1A)
Tccr1b = &B00001000                     'делитель Fкв / 1 и с выходам Oc1a
Ocr1ah = 0 : Ocr1al = 250               'и коэффициетном Fкв/250*2
'---------------------
                                        'режим таймера 2: генератор секундых импульсов
Assr.3 = 1 : Wait 1                     'включить НЧ-генератор AS2 и подождать стабилизации амплитуды
Tcnt2 = 0 : Waitms 10                   'очистить счетчик и подождать пока значение
                                        'перепишется из временного буфера
Ocr2 = 128 : Waitms 10                  'установить значение сравнения
                                        'установить коэффициент деления прескалера К=128
Tccr2 = &B00010101                      'и выход секундных импульсов на PB3 (OC2)
'---------------------
'    прерывания.
Timsk = &B010000001
Enable Timer0                           'разрешить прерывание от переполнения таймера 0
Enable Timer2                           'разрешить прерывание от переполнения таймера 2
Enable Interrupts                       'разрешить прерывания.


On Timer0 Pulse

On Timer2 Secund


Do
' хххххх
Loop


End


Pulse:
Return

Secund:
Return

На ее основе сделанна своя:

Код:
' Выставленные фюзы (в понипроге стоят галки на):CKOPT,BOOTSZ1,BOOTSZ0
',SUT1,SUT0,CKSEL3,CKSEL1,CKSEL0
' Кварц 32768 гц


'Данная программа реализует работу часов и переключение режимов

$regfile = "m8def.dat"
$crystal = 8000000                                          ' мега8 - обьясняем компилятору какой чип програмируем


Config Adc = Single , Prescaler = Auto , Reference = Avcc   'конфигурация АЦП
Dim V1 As Word

                              'задаем всякие переменные и масивы
'//////////////////////////////////////////////////////////////////////////////
'Переменные для работы часов
'Создаем служебные масивы в котором будут хранится цифры для вывода
'на семисегментный индикатор
'и другие служебные переменные и задаем их начальные значения

Dim Sekundi As Byte                                         'переменные для работы часов
Dim Minuti As Byte
Dim Has As Byte
Dim Polusek As Byte
Dim Korektirovka As Byte                                    'Поскольку возится с подстройкой
                                                            'частоты кварца лень, предусматривается
                                                            'возможность внесения поправок в работу часов


'Конфигурируем внутреннюю переферию микроконтролера
' конфигурируем совтовые часы
Config Clock = Soft

Sekundi = 0 : Minuti = 0 : Has = 0 : Polusek = 0
' задаем конкретные значения времени, с которого часы будут начинать считать
' при включении питания

Config Timer0 = Timer , Prescale = 8
' конфигурируем таймер 0 чтоб потом на него повесить алгоритм отображения цифр

Config Timer1 = Counter , Prescale = 64
' конфигурируем таймер 1 на подсчет импульсов на кварце, припаянного
' к Xtal1 Xtal2 на 32768 гц БЕЗ КОНДЕРОВ!

     On Timer0 Pulse
'назначаем подпрограму которая будет выполнятся при прерывании от 0-го таймера

     On Timer1 Secund
' назначаем подпрограмму, которая будет запускатся по переполнению 1го таймера

     Enable Interrupts                                      'разрешаем прерывания
     Enable Timer0                                          'разрешаем таймер0
     Enable Timer1                                          'разрешаем таймер1

 Config Debounce = 30

     Start Timer0                                           'Стартуем оба таймера
     Start Timer1

'//////////////////////////////////////////////////////////////////////////////

     'Все что написанно до этого необходимо для работы любых частей програмы
     ' (переменные исключение)
     'Теперь собственно та часть ради которой было написано все предыдущее

'==============================================================================
 Start Adc
'==============================================================================

Do
' Тут собственно всякие извращения, криво/косо но работает четко
Loop


End


                   'СОБСТВЕННО ПОДПРОГРАММЫ:

'==============================================================================


' подпрограмма прерываний таймера0 - таймер реального времени вывод данных на индикатор

Pulse:
 ' Тут собственно всякие извращения, криво/косо но работает четко
Return
                                                   '

' подпрограмма прерываний таймера1 - таймер реального времени, секунды

Secund:
 ' Тут собственно всякие извращения, криво/косо но работает четко
Return

К сожалению автор базовой программы на коментарии был не особо щедр, а я точно не светило програмирования - результат:
Таймер 2 запустить не смог и был вынужден повесить прерывания отвечающие за вывод цифер на индикатор на Таймер1, с ШИМ вообще ничего сделать не смог, даташиты и интернет ясности не внесли :(

Результат часы работают и управляются, АЦП работает(волтметр/амперметр), а без ШИМ все зависло...

Может кто набросать кусок где конфигурируются таймеры и назначаются подпрограммы?
Если у кого есть нормально расписанная информаци по ШИМ буду очень признателен.