Jump to content
romaadereyko

Помощь по CVAVR

Recommended Posts

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

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

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

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

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

new.c

Share this post


Link to post
Share on other sites
35 минут назад, romaadereyko сказал:

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

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

 

Share this post


Link to post
Share on other sites

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

Но сначала пара советов: выкиньте автоконфигуратор 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 раз.

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

Share this post


Link to post
Share on other sites

Импульсный источник питания - расчет за 10 минут в eDesignSuite

Как ориентироваться в огромном количестве существующих вариантов, чтобы выбрать наиболее подходящий для конкретного случая. «Ручной» перебор всех вариантов может оказаться весьма трудоемким процессом, а полученный результат – далеко не оптимальным. Специализированное программное обеспечение, позволяет уменьшить количество рутинных операций при проектировании.

Подробнее

Подскажите почему не показывает дисплей. Надеялся увидеть "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"); }
 }
 

Share this post


Link to post
Share on other sites
                     

Как упростить выбор ИП для промышленного применения?

Компания Mean Well выпускает широкий перечень встраиваемых источников питания с креплением на шасси, имеющих, на первый взгляд, схожие характеристики. Статья расскажет о ключевых особенностях выпускаемых семейств и упростит выбор источника питания для промышленного применения.

Подробнее

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

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

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

:wacko:

 

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

Share this post


Link to post
Share on other sites
                     

Преимущества новых высоковольтных SOI-драйверов Infineon

При производстве драйверов силовых транзисторов компания Infineon использует различные технологии: JI, SOI, CT. Драйверы, выполненные с применением технологии SOI, имеют целый ряд преимуществ по сравнению с классическими JI-драйверами. В статье рассматриваются эти преимущества на примере новых семейств драйверов 650 В 2ED210x и 2ED218x.

Подробнее

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

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

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


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

Share this post


Link to post
Share on other sites
11 час назад, Alex сказал:

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

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

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

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

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

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

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

Edited by Igor-13

Share this post


Link to post
Share on other sites
5 минут назад, Igor-13 сказал:

но экран чист

Совсем чист, или что-то на нём есть ? 
Без инициализации экран не будет чистым.
 

Share this post


Link to post
Share on other sites

да, совсем чист. причем, вначала даже не реагировал, то есть загружал другую программу а потом эту и ничего не менялось. потом влез в 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
после этого экран стал очищаться от предыдущей программы. то есть стал реагировать. 

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites
4 минуты назад, Igor-13 сказал:

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

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

Share this post


Link to post
Share on other sites
5 минут назад, BARS_ сказал:

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

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites
3 минуты назад, BARS_ сказал:

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

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites
1 минуту назад, Igor-13 сказал:

строчки с RD

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

 

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

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

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

Share this post


Link to post
Share on other sites

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

#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

Share this post


Link to post
Share on other sites

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

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

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

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

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


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

Share this post


Link to post
Share on other sites
1 час назад, солар сказал:

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

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

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

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

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

Share this post


Link to post
Share on other sites

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

 

Share this post


Link to post
Share on other sites

нет не проще. я учусь. и надо преодолеть эту бяку. Буду искать дальше.

 

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites
9 часов назад, Igor-13 сказал:

RW мне не надо

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

 

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

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

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


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

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...

  • Сообщения

  • Similar Content

    • By Trute
      Цена 700 р.
      Доставка по России Почтой России от 250 р. до 400 р. зависит от региона.
       
       Продаётся Плата в Сборе с Прошитым Микроконтроллером.
      ОПИСАНИЕ:
      Это устройство запитывается от любого источника питания 5 вольт, например, USB порт ПК или ноутбука, зарядка для телефона и т. п..., и не нуждается в подключении к источнику 12 вольт, в отличии от других прототипов.
      Предназначено для восстановления "убитых" микроконтроллеров AVR ATmega и ATtiny путем записи в них корректных значений бит фьюзов.
      Atmega Fusebit Doctor исправит Ваши брикнутые микроконтроллеры за доли секунды.
      Поддерживаемые контроллеры:
       
       



       
    • By Gor_Th
      Доброго времени суток.

      Есть ли здесь знатоки, кто мог бы на пальцах объяснить работу минут в часах с видео? а еще лучше подсказать, где можно найти схему и код на подобное. (Имеются часы: плоская дощечка длинною в 30см на которой зажигаются минуты. То есть нужна схема, при которой индикаторы зажигаются поочередно.)
      Я в этом деле полный профан и начал копаться в "ардуинах" с неделю назад. Если я правильно понимаю можно получить данный эффект с помощью часов реального времени (например DS 3231) подключенных к arduino и 60 светодиодов подключенных через сдвиговые резисторы плюс, разумеется, должен быть будильник и кнопки которые этим всем оркестром будут управлять, так?
      Реально ли найти готовые схему подключения и сам код работы подобных часов?
      PS: Если кто даст буду крайне благодарен (мало ли у кого-то завалялось).

      lineclock1.mp4
    • By Kirill_Alehin
      На схеме имеются три электродвигателя вентиляторов. Не очень понимаю что с ними делать... Их нужно вынести с платы или на ней оставить? Объясните начинающему 


    • By Kirill_Alehin
      Помогите, пожалуйста, разобраться с двумя вещами:
      1. Приложил кусок схемы, где дорожки ведут "к выводам..." . Т.е мне буквально нужно просто проложить туда дорожки? Если да, то почему на схеме не нарисовано обычным способом, а именно так?
      2.  Что такое "разборное соединение XT"? Как оно выглядит, как его найти в интернете? Сколько искал, ничего не нашел. Скриншот также приложил . Предложите какое-нибудь конкретное соединение, чтобы нагляднее было...
      Заранее извиняюсь за глупые вопросы и низкое качество скриншотов) 
    • By Kisliy
      Приветствую! 
      Установил новые батареи для ИБП CyberPower Value 1200ELCD и он отработал 1 день без проблем. Далее стало происходить следующее: на дисплее загорается значок перегрузки (причём я уже снял всю нагрузку с него) и далее он пищит и вырубается. Даже не знаю с чем это связано, в логах ругается на повышенное напряжение, но отображает перегрузку. Нужны дельные советы!
      Вот блохи с него.
      Из справки:
      Power Outage: Blackout, indicates outage of AC utility power.
      Boost*: The functionality that increases the voltage close to normal voltage.
×
×
  • Create New...