Формирование импульсов и вывод на ЖКИ (2313).

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
kolyay

Сообщение kolyay »

Вот задача - формирование двух импульсов, один короткий 0,1 мс потом пауза 0,9 мс и на другую ножку один импульс 1 мс. Вот весь цыкл 2 милисекунды. Даже 2313 для такой задачи жалко грузить, если через паузы сделать. Как бы его разгрузить что бы он ещё чем-нить полезным занимался? Хотя бы на ЖК что-нить выводил? Не только же паузы гонять. Что лучше прочитать? Работу в ШИМ или может UART или ещё чего?
(кратковременные изменения длительностей крайне нежелательны)
Последний раз редактировалось kolyay Пт мар 23, 2007 19:34:17, всего редактировалось 1 раз.
Реклама
Модератор
Аватара пользователя
Сообщения: 4517
Зарегистрирован: Пн апр 03, 2006 11:43:25
Откуда: Санкт - Петербург

Сообщение Aheir »

Я уж думал, пришла пара контейнеров с последними складскими остатками 2313, надо помочь разгрузить... :)))

Видимо, товарищ, все таки плохо читали тему про многозадачность...
Если хотите решать свою проблему именно таким путем - пишем туда, этат ема будет удалена.
Если Вам просто надо решить эту проблему - переименовываем тему и не ссылаемся на многозадачность.

А вообще, такие вещи делаются прерыванием по таймеру, а чем будет заниматься контроллер все остальное время - его личное дело. :)
Оптимизм х (Опыт + Знания) = const
Контактная информация:
Реклама
Вечно гонимый
Аватара пользователя
Сообщения: 232
Зарегистрирован: Ср фев 28, 2007 17:48:07

Сообщение Abaktyсh »

kolyay писал(а):Как бы его разгрузить что бы он ещё чем-нить полезным занимался?

Хотя бы на ЖК что-нить выводил?

Что лучше прочитать?

Работу в ШИМ или может UART или ещё чего?
Советую почитать и проделать задачи курса.

pro av r.na rod .r u/ 0 6. h tm

По таймерам задача-упражнение 6.

USART и LCD - упражнение 5 и 4

ШИМ - задача-упражнение 8.

Всё подробно и с работающими примерами.
kolyay

Сообщение kolyay »

Про прерывания и про таймеры наслышан. Если всё это запихать в прерывание, то по окончании прерывания проц опять должен уйти в прерывание. Что там останется для остального?
Задачи курса тоже делать ни к чему. У меня две программы (пока) написаны на СИ. Может конечно и не оптимально, но работают. С ЖКИ (20S4), с меню, с АЦП. На Меге 8535. Но там было проще. Там несколько импульсов в начале цикла, а потом такое же время "перекур". Вот в этот перекур и делалось всё остальное процом самостоятельно. А здесь весь цикл занят. Вот и хотел бы выяснить может как то по-другому такие дела делаюца?
Реклама
Эиком - электронные компоненты и радиодетали
Модератор
Аватара пользователя
Сообщения: 4517
Зарегистрирован: Пн апр 03, 2006 11:43:25
Откуда: Санкт - Петербург

Сообщение Aheir »

Зачем?
Настраиваешь прерывание по таймеру раз в 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;
Переменная j - глобальная!
Оптимизм х (Опыт + Знания) = const
Контактная информация:
Реклама
kolyay

Сообщение kolyay »

Спасибо. Всё просто и понятно. СИ то я подучил (IAR) а вот с аппаратной частью слабовато (не программист). Не знаю просто как делаюца элементарные дела. Спасибо ещё раз.
Реклама
kolyay

Сообщение kolyay »

Aheir писал(а):Зачем?
!
Спасибо. Всё нормально работает. А не подскажите ли ещё до кучи? Вот собрался драйвер писАть для ЖКИ Хитачи 16х2 но по 4-х битной шине. Еле добился что бы команды толкал в порт. ИАР не желает выполнять SWAP, просто проскакивает строчку и дальше идёт (симулятор имею ввиду). По 8-ми битной шине как то быстро получилось. Написал сначала для команды, потом для данных, потом для инициализации (чтение не делал) и сразу всё заработало. Частоту кварца правда сначала понизил (в Протеусе пока). Но и ЖКИ там был 20х4 (в железе тоже работал). Вот где косяк?

Код: Выделить всё

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

Сообщение Abaktyсh »

вот эта строчка страшная ИМХО

com=((com<<4>>4));

наверно лучше так

com &= 0x0F;

после этого:

com=((com<<4>>4));
temp = com & 0xf0;

в temp наверно 0 будет ?

а delay (5) - это какая пауза ?
какой библиотекой в IAR включается ?

и это __swap_nibbles (temp); из интринсик.h ?
kolyay

Сообщение kolyay »

Эту строчку я с конфы взял

Код: Выделить всё

com=((com<<4>>4));
Во даёт форум. Сам код меняет. Вот так же писАл com = ( ( com < < 4 ) | ( com > > 4 ) ) ; Потому что SWAP не работал. В библиотеках тож не нашол. Наверна в какой-нить CLIB, хотя компилятор не ругался что типа файла нет (instrinsics.h прицеплен.)
delay сам быстренько написАл, а то стандартные паузы там как то заумно.

Код: Выделить всё

void delay (unsigned long int t)
{
  while (t) 
  {
    t--; 
    unsigned char T;
    for(T=25;T>0;T--);
  }
}
Меняя "Т" можно хоть под милисекунды подогнать.
Ладно спасибо, потом ещё попробую. Или лучше на другой камень "сяду", где нет недостатка в портах.
kolyay

Сообщение kolyay »

Разобрался. Надо писАть

Код: Выделить всё

temp = __swap_nibbles (temp);
а не просто __swap_nibbles (temp);
Функция эта находится в интринсик.h , точнее прототип, саму функцию не нашол. Теперь ещё инициализацию перепишу, может заработает.
Вечно гонимый
Аватара пользователя
Сообщения: 232
Зарегистрирован: Ср фев 28, 2007 17:48:07

Сообщение Abaktyсh »

kolyay писал(а):delay сам быстренько написАл,
а то стандартные паузы там как то заумно.
в IAR есть пауза в тактах процессора. тоже в "интринсик"
kolyay писал(а):

Код: Выделить всё

void delay (unsigned long int t)
{
  while (t) 
  {
    t--; 
    unsigned char T;
    for(T=25;T>0;T--);
  }
}
А разве можно в IAR объявлять глобальную переменную
не в начале функции ???
kolyay писал(а):лучше на другой камень "сяду", где нет недостатка в портах.
Это правильно ИМХО. Я советую начинать с ATmega16.
kolyay

Сообщение kolyay »

Я знаю __delay_cycles() , программист советовал не париться, а свою написать. Она работает на железе. А камень Мегу возьму 8535. К тому же на неё уже наработки есть (и сам камень тоже остался). И adc.h и lcd.h, да и из самой программы кое что подойдёт. Спасибо.
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»