До этого проэкта писал только в иаре на си.... Мне поставили задачу на меге 16 получить частоту синусоидального сигнала 50 кГц (Восемь точек на период).... Я на порт А повесил самый простейший цап (R-2-R цепочку).... Организовал на асемблере масив из восьми точек..... В программе также использую два вектора прерывания... Первый 0-й... Он у меня используется для организации прерывания в одну милисекунду... За это прерывание я вызываю все системные функции(работа с индикатром, функция опроса кнопок, ну функция определяющая логику работы программы)... Второй вектор прерывания он 1-й(их всего 4{0,1,2,3}).... В этом векторе я вызываю первую точку из масива... Отпраляю это значение в в порт А... При следующем прерывании вызываю следующую точку и так по кругу.... Меняется частота за щет того что я в функции отвечающей за логику программы в зависимости от нажатия кнопок изменяю значение регистров OCR1AL и OCR1AH....
Но есть баг... Если я начинаю повышать частоту то понятно что не хватает времени на обработку прерывания по 1-му вектору прерывания и программа зависает.... Но как объснить то что я понижаю частоту а при некоторых значениях которые я заношу в OCR1AL и OCR1AH программа зависает.... Прерывание происходит по переполнению при максимальной частоте в OCR1AH находится 0x00, а в OCR1AL значение 0x1B(минимальное значение при котором все работает)... Так вот я начинаю увиличивать значение регистра OCR1AL а программа (заметьте только при некоторых значениях) зависает... Или когда я работаю в далике от максимальной частоты к примеру значение OCR1AL равно 0xF0.... Я увиличиваю это значение на 1... Тоесть в OCR1AL заношу 0xF1... Частота должна уменьшиться.... А она наоборот увеличилась.... Как такое объяснить???
Выше я описал как я организовал рабту всей программы... Порсьба в следующем или подсказать что это за Баг и как с ним бороться... Или может Программы для написания генераторов организовываются по другому принципу... Поделитесь пожалуйста опытом.... Ну собственно буду очень благодарен за любую помощь....