(кратковременные изменения длительностей крайне нежелательны)
Формирование импульсов и вывод на ЖКИ (2313).
Вот задача - формирование двух импульсов, один короткий 0,1 мс потом пауза 0,9 мс и на другую ножку один импульс 1 мс. Вот весь цыкл 2 милисекунды. Даже 2313 для такой задачи жалко грузить, если через паузы сделать. Как бы его разгрузить что бы он ещё чем-нить полезным занимался? Хотя бы на ЖК что-нить выводил? Не только же паузы гонять. Что лучше прочитать? Работу в ШИМ или может UART или ещё чего?
(кратковременные изменения длительностей крайне нежелательны)
(кратковременные изменения длительностей крайне нежелательны)
Последний раз редактировалось kolyay Пт мар 23, 2007 19:34:17, всего редактировалось 1 раз.
- Реклама
Я уж думал, пришла пара контейнеров с последними складскими остатками 2313, надо помочь разгрузить...
Видимо, товарищ, все таки плохо читали тему про многозадачность...
Если хотите решать свою проблему именно таким путем - пишем туда, этат ема будет удалена.
Если Вам просто надо решить эту проблему - переименовываем тему и не ссылаемся на многозадачность.
А вообще, такие вещи делаются прерыванием по таймеру, а чем будет заниматься контроллер все остальное время - его личное дело.
Видимо, товарищ, все таки плохо читали тему про многозадачность...
Если хотите решать свою проблему именно таким путем - пишем туда, этат ема будет удалена.
Если Вам просто надо решить эту проблему - переименовываем тему и не ссылаемся на многозадачность.
А вообще, такие вещи делаются прерыванием по таймеру, а чем будет заниматься контроллер все остальное время - его личное дело.
Оптимизм х (Опыт + Знания) = const
- Сообщения: 232
- Зарегистрирован: Ср фев 28, 2007 17:48:07
Советую почитать и проделать задачи курса.kolyay писал(а):Как бы его разгрузить что бы он ещё чем-нить полезным занимался?
Хотя бы на ЖК что-нить выводил?
Что лучше прочитать?
Работу в ШИМ или может UART или ещё чего?
pro av r.na rod .r u/ 0 6. h tm
По таймерам задача-упражнение 6.
USART и LCD - упражнение 5 и 4
ШИМ - задача-упражнение 8.
Всё подробно и с работающими примерами.
Про прерывания и про таймеры наслышан. Если всё это запихать в прерывание, то по окончании прерывания проц опять должен уйти в прерывание. Что там останется для остального?
Задачи курса тоже делать ни к чему. У меня две программы (пока) написаны на СИ. Может конечно и не оптимально, но работают. С ЖКИ (20S4), с меню, с АЦП. На Меге 8535. Но там было проще. Там несколько импульсов в начале цикла, а потом такое же время "перекур". Вот в этот перекур и делалось всё остальное процом самостоятельно. А здесь весь цикл занят. Вот и хотел бы выяснить может как то по-другому такие дела делаюца?
Задачи курса тоже делать ни к чему. У меня две программы (пока) написаны на СИ. Может конечно и не оптимально, но работают. С ЖКИ (20S4), с меню, с АЦП. На Меге 8535. Но там было проще. Там несколько импульсов в начале цикла, а потом такое же время "перекур". Вот в этот перекур и делалось всё остальное процом самостоятельно. А здесь весь цикл занят. Вот и хотел бы выяснить может как то по-другому такие дела делаюца?
Зачем?
Настраиваешь прерывание по таймеру раз в 0.1мс. Внутри вспомогательный счетчик - j.
Первый раз попал в перывание - if (j==0) поднимаешь в 1 ногу, на которой нужен импульс 0.1мс , сделал ++j, вышел
Второй раз if (j==1) выставляешь 0 на ногу - тем самым сгенерировал 0.1мс, увеличил счетчик
Третий и т.д. раз только увеличиваешь счетчик
Десятый раз if (j==10) поднимаешь в 1 ногу, на которой нужен 1мс импульс
Одиннадцаты и т.д. раз только увеличиваешь счетчик
Двадцатый раз if (j==20) выставляешь 0 на ногу - тем самым сгенерировал 1мс, обнулил счетчик
Примерный код для обработчика прерывания будет:
Переменная j - глобальная!
Настраиваешь прерывание по таймеру раз в 0.1мс. Внутри вспомогательный счетчик - j.
Первый раз попал в перывание - if (j==0) поднимаешь в 1 ногу, на которой нужен импульс 0.1мс , сделал ++j, вышел
Второй раз if (j==1) выставляешь 0 на ногу - тем самым сгенерировал 0.1мс, увеличил счетчик
Третий и т.д. раз только увеличиваешь счетчик
Десятый раз if (j==10) поднимаешь в 1 ногу, на которой нужен 1мс импульс
Одиннадцаты и т.д. раз только увеличиваешь счетчик
Двадцатый раз if (j==20) выставляешь 0 на ногу - тем самым сгенерировал 1мс, обнулил счетчик
Примерный код для обработчика прерывания будет:
Код: Выделить всё
..Здесь надо переинициализировать таймер
switch (j)
{
case 0: нога1 = 1; break;
case 1: нога1 = 0; break;
case 10: нога2 = 1; break;
case 20: нога2 = 0;
}
if (++j == 21) j = 0;
Оптимизм х (Опыт + Знания) = const
- Реклама
Спасибо. Всё нормально работает. А не подскажите ли ещё до кучи? Вот собрался драйвер писАть для ЖКИ Хитачи 16х2 но по 4-х битной шине. Еле добился что бы команды толкал в порт. ИАР не желает выполнять SWAP, просто проскакивает строчку и дальше идёт (симулятор имею ввиду). По 8-ми битной шине как то быстро получилось. Написал сначала для команды, потом для данных, потом для инициализации (чтение не делал) и сразу всё заработало. Частоту кварца правда сначала понизил (в Протеусе пока). Но и ЖКИ там был 20х4 (в железе тоже работал). Вот где косяк?Aheir писал(а):Зачем?
!
Код: Выделить всё
void LCD_COM (unsigned char com)
{
unsigned char temp;
LCD_E=1;
LCD_RS=0;
temp = com & 0xf0;
LCD_PORT &= 0x0f;
LCD_PORT |= temp;
LCD_E=0;
delay(5);
LCD_E=1;
LCD_PORT &= 0x0f;
//__swap_nibbles (temp);
com=((com<<4>>4));
temp = com & 0xf0;
LCD_PORT |= temp;
LCD_E=0;
delay(5);
LCD_E=1;
}- Сообщения: 232
- Зарегистрирован: Ср фев 28, 2007 17:48:07
Эту строчку я с конфы взял
Во даёт форум. Сам код меняет. Вот так же писАл com = ( ( com < < 4 ) | ( com > > 4 ) ) ; Потому что SWAP не работал. В библиотеках тож не нашол. Наверна в какой-нить CLIB, хотя компилятор не ругался что типа файла нет (instrinsics.h прицеплен.)
delay сам быстренько написАл, а то стандартные паузы там как то заумно.
Меняя "Т" можно хоть под милисекунды подогнать.
Ладно спасибо, потом ещё попробую. Или лучше на другой камень "сяду", где нет недостатка в портах.
Код: Выделить всё
com=((com<<4>>4));
delay сам быстренько написАл, а то стандартные паузы там как то заумно.
Код: Выделить всё
void delay (unsigned long int t)
{
while (t)
{
t--;
unsigned char T;
for(T=25;T>0;T--);
}
}Ладно спасибо, потом ещё попробую. Или лучше на другой камень "сяду", где нет недостатка в портах.
Разобрался. Надо писАть
а не просто __swap_nibbles (temp);
Функция эта находится в интринсик.h , точнее прототип, саму функцию не нашол. Теперь ещё инициализацию перепишу, может заработает.
Код: Выделить всё
temp = __swap_nibbles (temp);
Функция эта находится в интринсик.h , точнее прототип, саму функцию не нашол. Теперь ещё инициализацию перепишу, может заработает.
- Сообщения: 232
- Зарегистрирован: Ср фев 28, 2007 17:48:07
в IAR есть пауза в тактах процессора. тоже в "интринсик"kolyay писал(а):delay сам быстренько написАл,
а то стандартные паузы там как то заумно.
А разве можно в IAR объявлять глобальную переменнуюkolyay писал(а):Код: Выделить всё
void delay (unsigned long int t) { while (t) { t--; unsigned char T; for(T=25;T>0;T--); } }
не в начале функции ???
Это правильно ИМХО. Я советую начинать с ATmega16.kolyay писал(а):лучше на другой камень "сяду", где нет недостатка в портах.


