ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Вторник
26 ноября
68739 Топик полностью
GM (13.09.2006 14:29, просмотров: 1) ответил General на Благодарности -не ко мне. Это не я восстановил. Но я очень прошу вас- ответьте на мой вопрос, наконец.
Выложил код формирования рабочей таблицы --> 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. Я ничего не упустил? Немного не так. Рассмотрим пример. Пусть таблица упорядоченных входных уставок имеет следующий вид
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
                   }