Автор Тема: Исходники, алгоритмы.  (Прочитано 9134 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Azumi

  • .
  • *
  • Сообщений: 18
Re: Исходники , алгоритмы.
« Ответ #15 : 23 Март 2012, 15:45:50 »
Прошу прощения, забыл уточнить) Для символьного.
А библиотека подоидет от винавр к кодвижну?
Что-то все фанатеют по винавр и примеров в сети для него больше... Неужели он и правда лучше, или это просто дело привычки? Как-то раз пробовал, так мне оно показалось слишком усложненным.

slav0n

  • Администратор
  • .
  • *****
  • Сообщений: 4578
(Нет темы)
« Ответ #16 : 23 Март 2012, 17:55:48 »
В общем-то библиотеки как таковой нет. Надо еще подумать - как представить то что написано в удобоваримом виде.  :-)
А пока вот нашел - готовая библиотека AVR-GCC LCD library – mixed pin support
while(1||!1);
зберігай спокій

Azumi

  • .
  • *
  • Сообщений: 18
Re: Исходники , алгоритмы.
« Ответ #17 : 23 Март 2012, 19:00:42 »
Завтра на работе попробую, спасибо.
А сделать так, чтоб RW (пятую ногу), можно было повесить на землю - это сложно?
Вообще, планируется написать прошивку, чтобы проверить уже готовыи примус, но без карты. + попутно разобраться с дисплеем)

Я просто дисплеи недавно получил, специально для сборки примуса, а до этого не писал под них. Пытаюсь понять, что к чему)

Пока еще не разобрался, как вписывать свои знаки в свободные ячеики памяти, и как ножки в произвольные порты подключать.
Также, непонятно, зачем нужен 8 битныи режим, если 4 битныи прекрасно работает (я вообще далек от программирования, потому для меня это не очевидно).

slav0n

  • Администратор
  • .
  • *****
  • Сообщений: 4578
WinAVR подключение LCD HD44780
« Ответ #18 : 24 Март 2012, 09:14:40 »
Вот немного кода. Можно настроить на любые ноги МК.
RW на корпус, 4-битный режим.
//===== определяем порты подключенные к индикатору ========
#define set_RS  PORTD |= (1<< 5)
#define clr_RS  PORTD &=~(1<< 5)

#define set_E   PORTD |= (1<< 4)
#define clr_E   PORTD &=~(1<< 4)

#define set_D4  PORTD |= (1<< 0)
#define clr_D4  PORTD &=~(1<< 0)

#define set_D5  PORTD |= (1<< 1)
#define clr_D5  PORTD &=~(1<< 1)

#define set_D6  PORTD |= (1<< 7)
#define clr_D6  PORTD &=~(1<< 7)

#define set_D7  PORTD |= (1<< 6)
#define clr_D7  PORTD &=~(1<< 6)

 #define COM  0
 #define DAT  -1

 
 // =================== запись тетрады ======================
void Write4bit(char tetr)
{
set_E;                   // устанавливаем бит Е

if(tetr & 0x01) set_D4;
else clr_D4;
if(tetr & 0x02) set_D5;
else clr_D5;
if(tetr & 0x04) set_D6;
else clr_D6;
if(tetr & 0x08) set_D7;
else clr_D7;

clr_E;                // сбрасываем бит Е
_delay_us(25);                      
}

 // ====================запись команд/данных===============
void WriteComDat(char byte_wr, char rs)
{
if(rs== COM)clr_RS;     // rs=0 - команды
else set_RS;     // иначе rs=1 - данные

Write4bit(byte_wr>>4);  // записываем старшую тетраду          
Write4bit(byte_wr);     // записываем младшую тетраду
_delay_us(100);         // ждем 100 микросекунд

if(rs==COM) _delay_ms(1);  // если была команда, то ждем еще 1 милисекунду
}

 // ================= инициализация индикатора ============================
void InitLcd(void)    
{
// массив данных инициализации ЖКИ-индикатора
const char byte_init[]={0x10,0x10,0x10,0x02,0x01,0x14,0x0C,0x2c};

for(unsigned char i=0;i<8;i++) WriteComDat(byte_init[i], COM);
}

//=================== очистка экрана ====================================
 void ClrScr(void)
{
WriteComDat(1,COM);
_delay_ms(5); // ждем 5 милисекунд
}

// ================== инициализация области CGRAM ========================
void InitCGram(unsigned char *buf)
{
WriteComDat(0x40, COM); // установка видео-адреса в области CGRAM
for(unsigned char i=0;i<64;i++) WriteComDat(*buf++, DAT); // загрузка символов в CGRAM
}

//=================== печать символа =====================================
void PrintSymbol(unsigned char symbol,unsigned char Position)
{
WriteComDat(Position|0x80, COM); // установка видео-адреса
WriteComDat(symbol, DAT);          // передача символа
}

while(1||!1);
зберігай спокій

AlekseiKO

  • .
  • *
  • Сообщений: 40
Re: Исходники, алгоритмы.
« Ответ #19 : 18 Апрель 2016, 03:48:10 »
Мужики не знал где написать, вот решил тут! Так что не пинайте за вопрос. Я не профи, просто любитель.
Вопрос не относится к примусу!
Значит так:
Есть мега 8, есть прошивка в hex , схема....
Короче собрал все в кучу, спаял, прошил мегу , выставил фьзы как требовалось.
Программа запустилась на меге.
3 кнопки. 1 меню, 2 +, 3 -
В меню выбираю значение "частоту" и начинаю ее повышать или уменьшать. Но при нажатии на кнопку значение прыгает через 1 и даже больше. (Пример: 20, 23, 25, 27, 30)
И если быстро быстро, резко резко , нажать на кнопку то только тогда как положено на 1 деление переключается.

Так вот вопрос. Время нажатия на кнопку чем определятся ? В коде программы? Или же номиналами деталей какими то?

Спасибо

lizard66

  • .
  • *
  • Сообщений: 145
(Нет темы)
« Ответ #20 : 18 Апрель 2016, 08:24:17 »
Цитата: "AlekseiKO"
В меню выбираю значение "частоту" и начинаю ее повышать или уменьшать. Но при нажатии на кнопку значение прыгает через 1 и даже больше. (Пример: 20, 23, 25, 27, 30)
И если быстро быстро, резко резко , нажать на кнопку то только тогда как положено на 1 деление переключается.

Так вот вопрос. Время нажатия на кнопку чем определятся ? В коде программы? Или же номиналами деталей какими то?

Спасибо
С дребезгом можно бороться как программно, так и аппаратно, чаще программно. В данном случае его побороли плохо, либо кнопки убитые.
Схему покажите.

AlekseiKO

  • .
  • *
  • Сообщений: 40
(Нет темы)
« Ответ #21 : 18 Апрель 2016, 12:23:17 »
Кнопки вроде нормальные. пробывал ставить другую. так же было.
схемку накидал почти от руки,на скоряк. За исключение некоторых мелочей стандартных.

slav0n

  • Администратор
  • .
  • *****
  • Сообщений: 4578
(Нет темы)
« Ответ #22 : 18 Апрель 2016, 13:12:12 »
Самое простое, если писатель прошивки не забыл включить встроенные в мегу подтягивающие резисторы, то внешние на 1к можно вообще убрать, а параллельно кнопкам поставить конденсаторы. Если же внутренние подтяжки не задействованы, то внешние надо поставить на 20-50к, чтобы не завышать емкость сглаживающих кондеров. Эту емкость подобрать экспериментально, начиная примерно от 0.01мкФ.
while(1||!1);
зберігай спокій

lizard66

  • .
  • *
  • Сообщений: 145
Re: Исходники, алгоритмы.
« Ответ #23 : 18 Апрель 2016, 14:56:05 »
Ну, аппаратным антидребезгом тут не пахнет, а на PORTC автор мог и АЦП с медлинным тактом задействовать в качестве борьбы с дребезгом. Тут либо с софтом копаться, либо на каждую кнопку по Шмидту или RS-триггеру и кнопки с трехконтактные (с перемыканием), либо как Славка рекомендует емкости подобрать

slav0n

  • Администратор
  • .
  • *****
  • Сообщений: 4578
(Нет темы)
« Ответ #24 : 18 Апрель 2016, 16:34:35 »
Цитата: "lizard66"
а на PORTC автор мог и АЦП с медлинным тактом задействовать в качестве борьбы с дребезгом.
обычно делаем счетчик итераций главного цикла.
При нажатии на кнопку счетчик запускается, при отпускании - сбрасывается.
В зависимости от содержимого счетчика решаем что делать.
Например код на сях
while(1)
{
if(btn_prs)//проверяем кнопку
{
if(cnt ==10 ||//первое нажатие, антидребезг 10 циклов
( cnt >= 70 && (cnt % 20)==10 ))//длительность паузы перед автоповтором (70)
//и  период автоповтора (20)
{
//здесь исполняем нажатие

}

cnt++;//инкремент счетчика
}
else cnt=0;//сброс счетчика

//бла-бла
}
while(1||!1);
зберігай спокій

AlekseiKO

  • .
  • *
  • Сообщений: 40
Re: Исходники, алгоритмы.
« Ответ #25 : 19 Апрель 2016, 01:11:30 »
Попробывал еще одну кнопку от мышки. Такая же хня...
Попробывал поставить сначало :
кондер 0.01- без изменений
Выпаял 1к - без изм.
Впаял 27к -без изм.
Поменял кондер 0.1-без изм.

Я так понимаю автар прошивки решил поглумиться...

slav0n

  • Администратор
  • .
  • *****
  • Сообщений: 4578
(Нет темы)
« Ответ #26 : 19 Апрель 2016, 03:56:42 »
Цитата: "AlekseiKO"
Я так понимаю автар прошивки решил поглумиться...
возможно просто сбацал по-быстрому в протеусе и всё
while(1||!1);
зберігай спокій

AlekseiKO

  • .
  • *
  • Сообщений: 40
Re: Исходники, алгоритмы.
« Ответ #27 : 19 Апрель 2016, 05:25:13 »
Кстати в архиве есть фаил протеуса. Только я в нем ни разу не работал!
Он своего рода исходник?

slav0n

  • Администратор
  • .
  • *****
  • Сообщений: 4578
Re: Исходники, алгоритмы.
« Ответ #28 : 19 Апрель 2016, 07:00:57 »
Цитата: "AlekseiKO"
Он своего рода исходник?
нет
while(1||!1);
зберігай спокій

slav0n

  • Администратор
  • .
  • *****
  • Сообщений: 4578
энкодер, код обработки
« Ответ #29 : 31 Июль 2017, 16:56:56 »
весьма простой код обработки энкодера,
вставляется в тело прерывания (ну, или куда вам вздумается).

static u8 old;
u8 clk=PINC&(1<<5),dir=PINC&(1<<4);//смотрим ноги
if(old&&clk==0){//ловим задний фронт
if(dir)DATA++;//тудом
else DATA--;//сюдом
}
old=clk;
while(1||!1);
зберігай спокій