Выложил код формирования рабочей таблицы --> http://www.caxapa.ru/mcu/wwwboard.html?id=68699
Вот вы положили в массив 24 упорядоченные (одинаковые=55) уставки. Вот счетчик досчитал до 55. Он совпал с первой уставкой и вы сгенерили прерывание. Давайте начнем танцевать от печки. Есть входной массив уставок, состоящий из таблицы времен time[24] и таблицы каналов channel[24], каждая пара которых однозначно указывает в каком канале в какое время происходит смена состояния с 0 в 1. Для создания рабочей таблицы необходимо упорядочить времена в таблице уставок, что и делается в первом фрагменте представленного кода. Далее, есть рабочий массив pwmtable[4,24], с которым собственно и работает программа обработки прерывания по совпадению. Массив состоит из 24 записей по 4 байта каждый. Первый байт записи это просто время прерывания из таблицы time[i], второй-третий-четвертый байты это образы портов 1, 2 и 3 соответственно. Три байта образов портов формируются путем логического сложения элемента постоянной таблицы образов портов pattern[3,24] (см. ниже), соответствующего номеру обрабатываемого канала и предыдущего значения pwmtable[4,24]. Отмечу, новая запись в рабочую таблицу не создается, а просто осуществляется логическое сложение текущего образа порта и предыдущего. Но. Потом вы должны проверить на совпадение все оставшиеся 23 уставки, верно? Обработать все оставшиеся 23 совпадения. И сделать это надо, пока счетчик не досчитал до 56. Я ничего не упустил? Немного не так. Рассмотрим пример. Пусть таблица упорядоченных входных уставок имеет следующий вид
Вот вы положили в массив 24 упорядоченные (одинаковые=55) уставки. Вот счетчик досчитал до 55. Он совпал с первой уставкой и вы сгенерили прерывание. Давайте начнем танцевать от печки. Есть входной массив уставок, состоящий из таблицы времен time[24] и таблицы каналов channel[24], каждая пара которых однозначно указывает в каком канале в какое время происходит смена состояния с 0 в 1. Для создания рабочей таблицы необходимо упорядочить времена в таблице уставок, что и делается в первом фрагменте представленного кода. Далее, есть рабочий массив pwmtable[4,24], с которым собственно и работает программа обработки прерывания по совпадению. Массив состоит из 24 записей по 4 байта каждый. Первый байт записи это просто время прерывания из таблицы time[i], второй-третий-четвертый байты это образы портов 1, 2 и 3 соответственно. Три байта образов портов формируются путем логического сложения элемента постоянной таблицы образов портов pattern[3,24] (см. ниже), соответствующего номеру обрабатываемого канала и предыдущего значения pwmtable[4,24]. Отмечу, новая запись в рабочую таблицу не создается, а просто осуществляется логическое сложение текущего образа порта и предыдущего. Но. Потом вы должны проверить на совпадение все оставшиеся 23 уставки, верно? Обработать все оставшиеся 23 совпадения. И сделать это надо, пока счетчик не досчитал до 56. Я ничего не упустил? Немного не так. Рассмотрим пример. Пусть таблица упорядоченных входных уставок имеет следующий вид
time[24]= {50,51,52,53,100,100,100,100,100,..}; channel[24]={ 0, 2, 3, 6, 7, 1, 4, 5, 8,..};Без потери общности, просто для простоты изложения, здесь предполагается, что шим только первых четырех каналов (0,2,3 и 6) начинается в разное время, а шим всех остальных каналов начинается при time=100. Давайте теперь попробуем ручками получить все рабочие записи в рабочей таблице. Начнем с записи х=0. Копируем time[0]=50 в таблицу. Копируем в таблицу три байта pattern[0,0], pattern[1,0] и pattern[2,0] в соответствии с номером канала (0). Перейдем к записи х=1 и проделаем то же самое за исключением того, что 2-4 байты будут образованы логическим сложением 3-х байт записи 0 и текущего образа канала. В результате мы получим следующую таблицу.
x [0,x] [1,x] [2,x] [3,x] 0 50 00000001 00000000 000000000 1 51 00000101 00000000 000000000 2 52 00001101 00000000 000000000 3 53 01001101 00000000 000000000 4 100 11111101 11111111 111111111Программа начала(конца) шим занесет первый элемент записи в регистр сравнения таймера0 и заснет. При совпадении значения таймера и регистра сравнения сработает программа обработки прерывания по совпадению, выведет оставшиеся 3 байта в порты 1,2 и 3, затем занесет новое время сравнения в регистр сравнения и заснет до следующего совпадения. В конце периода шим сработает программа обработки прерывания по переполнению, обнулит все порты и занесет первый элемент записи рабочей таблицы в регистр сравнения. Процесс будет повторяться до тех пор, пока не будет указан адрес новой подготовленной рабочей таблицы.
ТАБЛИЦА ОБРАЗОВ ОТДЕЛЬНЫХ КАНАЛОВ char pattern[3,24]= { 0b00000001,0b00000000,0b00000000, 0b00000010,0b00000000,0b00000000, 0b00000100,0b00000000,0b00000000, 0b00001000,0b00000000,0b00000000, 0b00010000,0b00000000,0b00000000, 0b00100000,0b00000000,0b00000000, 0b01000000,0b00000000,0b00000000, 0b10000000,0b00000001,0b00000000, 0b00000000,0b00000010,0b00000001, 0b00000000,0b00000100,0b00000000, 0b00000000,0b00001000,0b00000000, 0b00000000,0b00010000,0b00000000, 0b00000000,0b00100000,0b00000000, 0b00000000,0b01000000,0b00000000, 0b00000000,0b10000000,0b00000000, 0b00000000,0b00000000,0b00000001, 0b00000000,0b00000000,0b00000010, 0b00000000,0b00000000,0b00000100, 0b00000000,0b00000000,0b00001000, 0b00000000,0b00000000,0b00010000, 0b00000000,0b00000000,0b00100000, 0b00000000,0b00000000,0b01000000, 0b00000000,0b00000000,0b10000000 }
-
- Это не код, а его описание. Полный ассемблерный листинг с подсчетом циклов на бочку! - AVR(13.09.2006 14:34, )