Перейти к содержанию

Помощь по CVAVR


romaadereyko

Рекомендуемые сообщения

подскажите, уважаемые форумчане, заработает ли такая программа?

суть её такова: подключаем матричную клавиатуру, 4х3, считываем с неё нажатия кнопок, которые соответствуют цифрам

собираем 3-х значное число, которое затем нужно конвертировать из 10-й в 16-ю систему счисления

p.s. только начал кодить, поэтому ОЧЕНЬ! прошу: если имеются ошибки, покажите как было и как должно быть, желательно с пояснениями

заранее благодарю

new.c

Ссылка на комментарий
Поделиться на другие сайты

35 минут назад, romaadereyko сказал:

заработает ли такая программа?

Хм... А самому попробовать, заработала она или нет, что не позволяет ? :unknw:

 

Ссылка на комментарий
Поделиться на другие сайты

А вдруг на форуме предложат решение получше. Более полезное чем указание на пропущенную кавычку и точку с запятой.

Но сначала пара советов: выкиньте автоконфигуратор cvavr - он мешает как вам научиться правильно писать, так и нам - читать. Уж больно много мусора генерирует. Кроме того, main() - тоже функция, отступы внутри ее тела стоит ставить. Стоит добавить комментарии чего вы хотели добиться тем или иным куском кода.

Конкретно по обработке кнопок: прерывание слишком затянуто. За одно прерывание нужно обрабатывать одну строку или столбец. Внутри прерывания объявляете static-переменную (чтобы случайно не изменить из какой-нибудь другой области программы) номер строки. По прерыванию считываете предыдущую строку и смотрите если хоть что-то нажато то меняете глобальную переменную. Потом меняете номер строки и переключаете на нее порт. Как-то так

#define PORT_MASK (1<<0 | 1<<1 | 1<<2 | 1<<3) //константа чтобы отсечь ненужные биты
volatile char key;

ISR(TIM2_OVF_vect){ //так в avr-gcc оформляются прерывания
  static char num=0; //номер строки
  static char work_key=12; //12 кнопки с таким номером нет, так что в качестве "пустого" кода сойдет. Правильнее, конечно, использовать ноль, но так проще
  char cur = PINB & PORT_MASK; //считываем состояние кнопок
  PORTB = cols[num];
  if(work_key != 12){ //если на предыдущих шагах что-то было нажато - сохраняем это значение
    work_key = key_func(num, cur); //ставим номер кнопки в соответствие номеру строки и значение PINB. На самом деле это соответствие лучше вставить прямо в обработчик, а не функцией.
  }
  num++;  //меняем номер строки
  if(num>3){
    num=0;
    key = symbol[ work_key ];
    work_key = 12;
  }
}

Сразу предупреждаю, это не код а образец. Не понимая как он работает, вставлять его в свою программу бесполезно. По крайней мере я на это надеюсь.

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

Ссылка на комментарий
Поделиться на другие сайты

  • 4 месяца спустя...

Сравнительное тестирование аккумуляторов EVE Energy и Samsung типоразмера 18650

Инженеры КОМПЭЛ провели сравнительное тестирование аккумуляторов EVE и Samsung популярного для бытовых и индустриальных применений типоразмера 18650. 

Для теста были выбраны аккумуляторы литий-никельмарганцевой системы: по два образца одного наименования каждого производителя – и протестированы на двух значениях тока разряда: 0,5 А и 2,5 А. Испытания проводились в нормальных условиях на электронной нагрузке EBD-USB от ZKEtech, а зарядка осуществлялась от лабораторного источника питания в режиме CC+CV в соответствии с рекомендациями в даташите на определенную модель. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Подскажите почему не показывает дисплей. Надеялся увидеть "WWW" но экран чист.

В CVAVR не работает. Вроде бы все правильно написал. С другими программами все работает, но там все прописано вручную (lcd_dat   lcd_com   lcd_init), а в стандартной #include <lcd.h> эта программа не работает. Что не так? Из за этого не могу подключать другие подпрограммы (lcd.clear   lcd.print  lcd.set и т.п.)

#include <mega8.h>        
#include <delay.h>   
#include <lcd.h>                // LCD-1602    4- провода D4-D5-D6-D7

#asm
.equ __lcd_port=0x12; PORTD
#endasm   

#define RS PORTD.0         // RS = Port D0 
#define E  PORTD.1          // E  =  Port D1 

void main(void)  { unsigned char a=0; 
lcd_init(4); 
lcd_clear();

while(a<=3) { lcd_puts("W"); }
 }
 

Ссылка на комментарий
Поделиться на другие сайты

Новый аккумулятор EVE серии PLM для GSM-трекеров, работающих в жёстких условиях (до -40°С)

Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре. 

Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств. Подробнее параметры и результаты тестов новой серии PLM по ссылке.

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Что у вас с другими программаи работает ? Вот это :

4 часа назад, Igor-13 сказал:

while(a<=3) { lcd_puts("W"); }

:wacko:

 

Это же - бесконечный цикл (в вашем случае)...
 

Ссылка на комментарий
Поделиться на другие сайты

Литиевые батарейки и аккумуляторы от мирового лидера  EVE в Компэл

Компания Компэл, официальный дистрибьютор EVE Energy, бренда №1 по производству химических источников тока (ХИТ) в мире, предлагает продукцию EVE как со склада, так и под заказ. Компания EVE широко известна в странах Европы, Америки и Юго-Восточной Азии уже более 20 лет. Недавно EVE была объявлена поставщиком новых аккумуляторных элементов круглого формата для электрических моделей «нового класса» компании BMW.

Продукция EVE предназначена для самого широкого спектра применений – от бытового до промышленного. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

12 часа назад, Igor-13 сказал:

#define RS PORTD.0         // RS = Port D0 
#define E  PORTD.1          // E  =  Port D1

Прочитайте хелп по библиотеке lcd.h и откройте визард в CVAVR.

Я не раздаю удочки. Я продаю рыбу.

Ссылка на комментарий
Поделиться на другие сайты

11 час назад, Alex сказал:

while(a<=3) { lcd_puts("W"); }

ой, пропустил a++; 

while(a<=3) { lcd_puts("W"); a++; }  

вот так  будет три штуки, а без этого должно было печатать бесконечно. но экран чист. 

3 часа назад, солар сказал:

Прочитайте хелп по библиотеке lcd.h и откройте визард в CVAVR.

если б умел. но в библиотеке я не знаю что можно изменить. я думал что там все должно быть готово. видимо проблема в том что у меня команды и данные на lcd идут по одному порту (так печатную плату сделал). а что надо поменять в  lcd.h чтобы заработало?

Изменено пользователем Igor-13
Ссылка на комментарий
Поделиться на другие сайты

да, совсем чист. причем, вначала даже не реагировал, то есть загружал другую программу а потом эту и ничего не менялось. потом влез в lcd.lib и поменял там порты E  и  RS  вот так 

#asm
    .equ __lcd_direction=__lcd_port-1
    .equ __lcd_pin=__lcd_port-1
    .equ __lcd_rs=0
    .equ __lcd_rd=2
    .equ __lcd_enable=1
    .equ __lcd_busy_flag=7
#endasm
после этого экран стал очищаться от предыдущей программы. то есть стал реагировать. 

Ну это я как слепой, тыкаю потому что не знаю где тыкать. вот и вопрошаю, может поможете.

Ссылка на комментарий
Поделиться на другие сайты

1. Совсем не понятно, что за другая программа и причём тут она, если мы обсуждаем эту.
2. Если, при подаче питания, экран будет пустой, значит подключения верные и инициализация проходит ( lcd_init срабатывает). Иначе, на экране будет засвечена вся верхняя строка.
 

Ссылка на комментарий
Поделиться на другие сайты

другая, это которая без #include <lcd.h>, там вручную прописана инициализация. на ней все рисует как надо. а как подключить #include <lcd.h> чтобы инициализация шла от библиотеки?

не идет, вот в чем вопрос.

Ссылка на комментарий
Поделиться на другие сайты

4 минуты назад, Igor-13 сказал:

чтобы инициализация шла от библиотеки?

Зачем, если уже есть то, что работает с дисплеем БЕЗ этой библиотеки?

Ссылка на комментарий
Поделиться на другие сайты

5 минут назад, BARS_ сказал:

Зачем, если уже есть то, что работает с дисплеем БЕЗ этой библиотеки?

без библиотеки плохо, надо дальше все процедуры прописывать самому. А с библиотекой хорошо, все команды стандартные. легко писать основную программу.

Ссылка на комментарий
Поделиться на другие сайты

Тогда надо допиливать библиотеку в соответствии с подключением дисплея. Там и переделать то всего пару функций, которые за отправку данных на дисплей отвечают.

Ссылка на комментарий
Поделиться на другие сайты

3 минуты назад, BARS_ сказал:

надо допиливать библиотеку

ну подскажите как допилить.  вот я вопрошаю, где тыкать. Вслепую тыкал в lcd.lib ничё не получается

Ссылка на комментарий
Поделиться на другие сайты

сижу, гляжу на содержимое lcd.lib и думаю, может быть удалить все строчки с RD. потому что шина чтения заземлена. я уже эту lcd.lib перепахал. надо новую скачать. или эту скинуть?

Ссылка на комментарий
Поделиться на другие сайты

1 минуту назад, Igor-13 сказал:

строчки с RD

Может RW? Так он на дисплее зовется. Но не суть, для работы дисплея он ненужен, если нет надобности читать память дисплея. Так что можно удалять.

 

3 минуты назад, Igor-13 сказал:

надо новую скачать

Лучше новую. Кстати, а настройку портов ты тоже меняешь или только в библиотеке пины сменил? Заодно покажи, как подключен дисплей к МК.

Ссылка на комментарий
Поделиться на другие сайты

В своей программе только это пишу

#define RS PORTD.0         // RS = Port D0 
#define E  PORTD.1          // E  =  Port D1

а в либе исправил только это 

    .equ __lcd_rs=0
    .equ __lcd_rd=2
    .equ __lcd_enable=1

сейчас удалил все строчки с lcd_rd .      так же все, без изменения,  экран чист.  

в CVAVR - без ошибок.  вот схема 

Буфер обмена02.png

 

lcd.lib

Ссылка на комментарий
Поделиться на другие сайты

Согласно библиотеке CVAVR lcd.h вывод RW ЖКИ должен быть подключен к биту 2 выбранного порта. Обязательно.

Процедуры общения с ЖКИ используют его для чтения готовности контроллера.

D0..D3 не нужно сажать на землю.

В либе ничего менять не надо (если, конечно, вы не затачиваете под себя).

По хелпу: нажать F1, в строке "поиск" ввести lcd и читать. Там, в частности, указано и подключение ЖКИ.

Я не раздаю удочки. Я продаю рыбу.

Ссылка на комментарий
Поделиться на другие сайты

1 час назад, солар сказал:

Согласно библиотеке CVAVR lcd.h вывод RW ЖКИ должен быть подключен к биту 2 выбранного порта. Обязательно.

RW мне не надо, он сидит на земле. у меня RS на портD0, Е на портD1. 

Перепаял Е на портD2. пока ничего не получается. может быть я испортил либу. поищу новую библиотеку и потом попробую. 

Где то прочитал, что CVAVR не позволяет назначать другие выводы для lcd. 

если это так, придется перелазить на другой компилятор.  не хотелось бы.

Ссылка на комментарий
Поделиться на другие сайты

А не проще R/W подключить к ноге и не мучиться ? 
Да и компиль менять не нужно, этих самодельных библиотек в тырнете - как грязи. На любой вкус и цвет...

 

Ссылка на комментарий
Поделиться на другие сайты

Ищите в библиотеке функцию чтения порта и ожидание 7-ого бита. И в место этой функции вставляйте задержку.
И ещё вырезайте всё, что связанно с битом __lcd_rd.
 

А лучше найдите готовую рабочую библиотеку и не мучайтесь.
 

Ссылка на комментарий
Поделиться на другие сайты

9 часов назад, Igor-13 сказал:

RW мне не надо

А библиотеке lcd.h CVAVR надо.

 

6 часов назад, Igor-13 сказал:

надо преодолеть эту бяку

В таком разе либо исследуйте родную библиотеку, либо ищите стороннюю нужную вам, либо пишите сами (библиотеку, функцию - как заблагорассудится).

Я не раздаю удочки. Я продаю рыбу.

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...