Генератор кода библиотеки axlib


• О проекте
• Обратная связь
• Полезные ссылки
• Полезные программы
• Друзья сайта


Последние комментарии

Аби: Подключение микроконтроллеров к шине RS-485
написано просто о...

Анатолий: Джойстик для денди на stm32
Автору 100500 рес...




           

Библиотека для AVR





AXLIB Генератор





Помощь сайту


				

Генератор кода библиотеки axlib

	
	
	

Дата: 25 Апреля 2016. Автор: Алексей

	
	
Эволюция axlib продолжается.
Начиная с самого начала я хотел максимально интегрировать данную библиотеку в AtmelStudio 6.x, но к сожалению мне этого сделать не удалось. По началу было неудобно под каждый проект править конфигурационный файл main_init.h. После его переноса в корень проекта, стало немного поудобнее, но с увеличением количества поддерживаемых девайсов, а как не странно они будут пополнятся, конфигурационный файл раздулся и стал походить на свалку мусора. Из-за этого начались проблемы. Добавился новый девайс, файл подправил, а в этот момент написал кто-то с жалобой или предложением. Письмо изучил, внес изменения. Пока занимался с каким-нибудь устройством забыл поправить main_init.h, а так как он в каждом проекте свой, то в архив библиотеки выкладывал без предыдущих изменений. В итоге мне это надоело и я причесал данный файл по типам и устройствам. Вроде все пошло на поправку, но опять же появились косяки. Окончательно разозлившись я решил убить двух зайцев одновременно. Первый заяц - это интеграция во всю ту же AtmelStudio 6.x, а второй - это генератор кода с окошечным интерфейсом. За основу были взяты лучшие стороны CVAVR и STM32CubeMX. Что из этого получилось. Ниже картинка главного окна программы.

Axlib Генератор

Заяц номер один. Данная программа, а зовут ее Axlib Генератор, создает все необходимые файлы проекта для AtmelStudio 6.x. То есть после создания проекта, его можно открыть в студии, собрать и залить в МК. Всю рутинную работу по подтягиванию необходимых файлов и написания кода на себя берет программа. Эдакий визард кодвижена.

Заяц номер два. Все те настройки, которые нужно было в ручную вводить в конфигурационный файл, теперь не нужны. Программа сама создаст этот файл и внесет туда только те изменения, которые необходимы для данного проекта с данными функциями. То есть если выбрать работу с ЖК дисплеем, то программа загрузить файлы для ЖК дисплея и внесет настройки в конфигурационный файл.
Какие плюсы.
Во первых теперь можно переносить проект с машины на машину и не задумываясь есть ли библиотека в корне студии или нет, все файлы в корне проекта.
Второй плюс, конфигурационный файл будет содержать настройки только тех функций и устройств, которые были выбраны и ничего больше. Отсюда пропал бардак.
Ну и естественно минус. После генерации проекта поправить его уже будет нельзя. Если нужно будет что-то добавить, то это нужно будет делать либо в ручную, добавляя необходимые файлы и пополняя конфигурационный файл, либо создавать проект заново. А теперь хватит лирики, давайте же что-нибудь запрограммируем.
Упс. А как программировать без программы))) Вот архивчик для установки. Качаем и устанавливаем.

Axlib Генератор v1.0

Axlib Генератор v1.0.1

Документация на библиотеку Axlib в формате pdf

Если программа не хочет запускаться, то необходимо установить Microsoft .NET Framework 4. Скачать его можно на официальном сайте Microsoft по этой ссылке.

Ну и конечно же видео.

Генератор Кода с библиотекой axlib часть 1



Генератор Кода с библиотекой axlib часть 2



Генератор Кода с библиотекой axlib часть 3



Генератор Кода с библиотекой axlib часть 4



Генератор Кода с библиотекой axlib часть 5

Программа для UART



Генератор Кода с библиотекой axlib часть 6

Шпаргалка для подключение дополнений к функции sprintf();

в AVR/GNU Linker поставить галку в самом низу
в AVR/GNU Linker добавить libprintf_flt.a







Евгений    11.05.16 18:06

Здравствуй, молодец, популяризируешь занятия с микроконтроллерами! Хотел узнать на чем писал программу Axlib Генератор v1.0 ?

Алексей    11.05.16 19:26

VisualStudio 12 C# Microsoft .NET Framework 4

Степа    17.05.16 19:38

Ачепятка :) во вкладке MAX7229, на рисунке СтандАртное

Алексей    17.05.16 20:06

Это картинка. Не буду менять))) Эдакое ХауНоу)))

Алексей    17.05.16 20:13

Не, не красиво. Подправил.

Степан    01.06.16 11:14

Пытаюсь через генератор создать проект с MAX7219, но студия выдает ошибку ------ Build started: Project: main, Configuration: Debug AVR ------ Build started. Project "main.cproj" (default targets): Target "PreBuildEvent" skipped, due to false condition; ('$(PreBuildEvent)'!='') was evaluated as (''!=''). Target "CoreBuild" in file "C:\Program Files (x86)\Atmel\Atmel Studio 6.0\Vs\Compiler.targets" from project "D:\max7219\max7219\main\main.cproj" (target "Build" depends on it): Task "RunCompilerTask" ========== Build: 0 succeeded or up-to-date, 1 failed, 0 skipped ==========

Алексей    01.06.16 12:29

Какая студия?

Степан    01.06.16 14:34

6.0 У меня при открытии проекта, в правом списке нет папки библиотеки, может я что то не подключил? Как я понял генератор сам все делает

Алексей    01.06.16 14:41

Могу лишь предложить скачать у меня студию 6.2 и обновить ее до версии 1331. Должно все заработать. Скачать можно в разделе Полезные программы. Она в самом низу.

Дмитрий    08.06.16 10:21

Привет Алексей пожелания^ Сделать обработку внешних прерываний по INT и русифицировать LCD

Алексей    08.06.16 13:36

Я уже думал над этим. Хочу объединить с энкодером.

Дмитрий    12.06.16 20:07

сделал поправку для DS3231 считывание температуры как положительного так и отрицательного значения //------------------------------------------------------------------------- // Функция возвращает измеренную температуру // // Принимает аргумент указатель на первый элемент знаковый массив. // // После вызовы данной функции в массиве будет лежать прочитанное температура. // В первом целое знаковое чесло температуры, во втором дробное число температуры. // //------------------------------------------------------------------------- void ds3231_read_temp(SBYTE *str) { BYTE temp = 1; SBYTE temp1; // Ожидание сброса BSY while(temp) { temp = ds3231_read_reg(DS3231_STATUS); temp &= (1 << DS3231_BSY); } // Чтение регистра CONTROL и установка бита CONV temp = ds3231_read_reg(DS3231_CONTROL); temp |= (1 << DS3231_CONV); ds3231_write_reg(DS3231_CONTROL, temp); // Чтение температуры temp1=ds3231_read_reg(DS3231_T_MSB); temp=ds3231_read_reg(DS3231_T_LSB); if (IS_CLR_B(temp1,7)) { *str = temp1; str++; temp>>=6; *str = temp*25; } else { if (temp==0) { *str=-128+(CLR_B(temp1,7)); } else { *str=(-128+(CLR_B(temp1,7)))+1; } str++; temp>>=6; if (temp==0) { *str = 0; } else { *str = 100-(temp*25); } } }

Алексей    13.06.16 10:33

Дмитрий, убедительная просьба, пишите пожалуйста код на форуме. Я пока не написал обработчик кода для комментов, а из-за этого как Вы видите в тексте бардак. В таком виде очень сложно разбирать код. Я постараюсь в ближайшее время написать скрипт для выведения кода в комментах. А пока можно все тоже самое писать на форуме. В редакторе есть теги для выведения кода. Заранее спасибо за понимание.

Игорь    24.06.16 22:22

Здравствуйте уважаемый разработчик. Совместим ли код, генерируемый программой с winavr?

Алексей    25.06.16 17:35

Да, так как компилятор у студии и у WinAVR один и тот же AVR GCC. Одно лишь дополнение, нужен Atmel Toolchain для работы библиотек. А не проще установит студию и не искать для себя приключений?

Kebato    28.09.16 11:44

Благодарю. Дай Бог Вам здоровья!

Роман    20.11.16 22:48

Добрый вечер увидел программу был доволен но не долго . Пытался вывести информацию на LCD 16x2 но увы библиотека под 74hc595 , а у меня hd44780 . А ведь эти два вида контроллеров распространенные . Было б здорово добавить еще и такую библиотеку .

Алексей    20.11.16 23:40

74hc595 это не контроллер, а простой сдвиговый регистр. Для того чтоб выводить на дисплей с контроллером hd44780, нужно выбрать вкладку ЖК 1602 и подключаться к дисплею по 4-х битной шине. Для удобства внизу вкладки присутствует картинка со схемой подключения.

Роман    21.11.16 01:03

Странно у меня ничего не работает в таком случае

Алексей    21.11.16 02:02

Посмотрите видео вторую часть. Возможно что-то неправильно сделали.

Роман    21.11.16 18:53

Делал как в видео 1в1 но результата 0

Алексей    21.11.16 20:20

В чем выражается ноль. Не выводит на дисплей. Ножку W/R к GND прижали? Схема регулировки контраста правильная? Чудес не бывает.

Cаша    30.11.16 22:29

Доброй ночи пытался повторить часть 6 , так при компиляции есть ошибка BYTE str[20] = (0); ругается компилятор на это , в чем проблема ?

Алексей    30.11.16 23:40

А перед этой строчкой что написано?

Алексей    30.11.16 23:41

Да ежкин кот! А слона-то и не заметил. Кто же так обнуляет массив. О нужно записать в фигурные скобки.

Cаша    01.12.16 12:55

Просто было б не плохо еще к урокам выкладывать исходник под видео .

Саша    02.12.16 22:40

BYTE str[20] = {0}; Вот так заработало спасибо за подсказку

Игорь    20.01.17 15:49

Подскажите.Что надо сделать чтобы два датчика 18b20 работали на разных пинах одного порта c Вашей библиотекой 1W.

Алексей    20.01.17 16:47

Две шины сделать?

Игорь    21.01.17 10:00

Да.

Алексей    21.01.17 13:44

Нет. Так не получится. Библиотека поддерживает одну шину. Для опроса более одного датчика, необходимо опрашивать по их rom-кодам. В библиотеке есть функции для чтения rom-кода и запроса температуры с rom-кодом

Игорь    21.01.17 14:31

Представь простейшую ситуацию. У котла надо измерять температуру подачи и обратки ну и дымовых газов по SPI.
Кнопки в принципе не нужны и как поступить. Особенно при замене датчика.Компьютер подключать к МК?

Алексей    21.01.17 15:52

А куда эта температура идет? Или он ее измеряет для себя)))

Игорь    21.01.17 16:49

Пока ни куда.Просто посмотреть как горят различные виды топлива.Сигнализировать о превышении температуры. Можно сказать для себя.

Алексей    21.01.17 16:59

Ну, а в чем проблема повесить на одну ножку кнопку. Нажал и держишь более 3 сек, МК считал ром код. Короткое нажатие система пошла работать. Датчик котрый 10 раз не ответил, значит сдох. Стерли его ром код из базы автоматом. Таким образом можно ещё и температуру воздуха в котельне измерить.

PavelZ    29.01.17 07:47

Здравствуйте!
Вы ещё занимаетесь программой кодогенератора?
Если да, то хотелось узнать почему нет возможности задействовать компаратор и как это можно реализовать?

Алексей    29.01.17 08:34

Занимаюсь, но в данный момент нет времени. Задействовать его можно в коде программы для МК. Компаратор это периферия.

Игорь    10.02.17 12:52

Решил я проблему нескольких 1W шин добавив три строчки в 1W.h.
volatile uint8_t pin_w=0;
#define OWIRE_0 PORTB_OUT(pin_w)
#define OWIRE_1 PORTB_IN(pin_w)
При обращении к датчику меняю pin_w на нужный в порту.

Алексей    10.02.17 17:40

Таким макаром можно 8 датчиков прикрутить. Вообще это не правильно. По стандарту если больше одного датчика, то опрос должен производиться по ROM-коду.

Игорь    10.02.17 18:38

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

Игорь    18.02.17 11:24

Библиотеку для кнопок не планируете?

Алексей    18.02.17 12:27

А что там писать? Проверяем пин на наличие нужного уровня и сделав задержку миллисекунд на 100, для гашения дребезга, получаем наличие нажатой кнопки. Три строчки. Или нужна какая! То уникальная задача.

Игорь    19.02.17 10:29

Да нет. Но хотелось бы получить не одно событие от одной кнопки. А то приходится к Вашему генератору прикручивать другие библиотеки именно для кнопок.Остальное Вы вроде бы все для начинающих сделали. Ну может быть еще описали как Вы видите организацию меню на основе генератора.

Алексей    19.02.17 11:37

А какие еще могут быть события от кнопки? Разные обработчики по периуду удержания кнопок? Я просто не могу уловить суть вопроса.

Игорь    19.02.17 15:11

Насколько я понимаю генератор предназначен больше для начинающих пользователей.А все,что для Вас понятно и элементарно, не всегда понятно начинающим. Насколько я понимаю, с начала происходит какое-то событие(нажатие кнопки, длительное нажатие,нажатие одновременно двух кнопок и др.) которое надо зафиксировать и записать в некоторую переменную. Что потом программа будет делать с этой переменной дело десятое. Библиотек кнопок в интернете много, но хочется какого-то однообразия хотя бы в обозначении переменных и типов данных.

Алексей    19.02.17 15:35

Ну есть же макросы для чтения пинов. PORTB_RD(0) вернет состояние пина 0 порта В. А дальше можно с ним делать все что угодно. Можно написать функции для матричных клавиатур.

Игорь    11.04.17 10:53

Создал проект в Axlib Генератор студия 6,2

main_init.h
#include <util/delay.h>

компилируется с варнингом
delay_ms(zaslon_time*1000);// неправильно
Warning 1 implicit declaration of function 'delay_ms' [-Wimplicit-function-declaration]

не компилируется
_delay_ms(zaslon_time*1000); //правильно
Error 4 __builtin_avr_delay_cycles expects a compile time integer constant

Подскажите как правильно сделать задержку если в ней надо использовать не константу, а переменную.

Алексей    11.04.17 16:00




UBYTE temper = 100;

// Задержка в 100 мс
for(UBYTE i=0; i<temp; i++)
{
delay_ms(1);
}


Александр    11.05.17 15:01

Алексей, а как можно переделать библиотеку для UART так, чтобы можно было принимать строки разной длины? Мои устройства выдают команды длиной от 4 до 40 символов и конец строки не '0'. Хотя, наличие последнего '0' не является проблемой. Интересны ещё и программный UART, иногда надо два потока принимать, управление луговыми движками через драйверы по трём проводам.
Кстати, библиотека для опроса матричной клавиатуры с анализом длительности нажатия кнопок тоже не помешала бы

Александр    11.05.17 15:03

Ну очень доходчиво рассказываете!

Александр    11.05.17 15:06

Блин, шаговыми двигателями! Автокорректор наиспрвлял :-)

Степан    11.05.17 15:50

Не плохо бы увидеть в генераторе еще вкладочку с каким-нибудь модулем для дистанционного управления(радио,вайфай,блютуз). В одном из видео в конце был показан вайфай модуль, но так и не дождался я видео по нему. Будет ли по нему снят видос?

Алексей    11.05.17 16:31

Я думаю да.

Алексей    11.05.17 16:42

Александр-> Для того чтобы получить неизвестное количество байт, а именно с 4 по 40, то нужно сначала вызвать функцию


BYTE usart_data(void)
,
которая вернет количество принятых байт. Если возвращаемое значение больше нуля, значит идут данные. Далее делим битрейт на 10 и получаем количество байт в секунду. Затем единицу делим на это число и умножаем на 40(максимальное количество байт). Полученное число умножаем на 1000 и получаем количество миллисекунд на гарантированное получение 40 байт. После того как функция

BYTE usart_data(void)
вернула число больше нуля, делаем задержку на расчетное выше время, а потом повторяем вызов функции

BYTE usart_data(void)
. Теперь она вернет количество принятых байт и уже это значение передаем функции чтения строки.

Евгений    04.06.17 11:14

Алексей, а на чем сделана инсталляшка у генератора кода ?

Алексей    05.06.17 05:24

Ни на чем. Просто есть программа для создания инсталятора.

Олег    07.08.18 12:06

Здравствуйте Алексей!Недавно начал плотно изучать СИ ,ваша
библиотека очень понравилась мне в работе с проектами .
Существенно упрощается процесс написания кода.Спасибо за
труды ваши !Скажите вы будете усовершенствовать генератор,
(добавлять новые камни , с mega328p разобраться с регистрами). С уважением Олег.

Алексей    07.08.18 13:24

Наверное нет. STM32 давно потеснили AVR контроллеры и поддерживать, практически, мертвую платформу нет особого желания. Рекомендую, коль начали с нуля, взять сразу STM32 и библиотеку HAL. На сайте st.com скачайте STM32CubeMX и будет вам счастье.

Олег    07.08.18 13:26

Спасибо!

Сергей    14.11.18 18:44

Здравствуйте. Попытался вывести информацию на матрицу 8х8 через MAX7219. В режиме UNDECODE почему то не смог нормально зажечь светодиоды в последних, старших разрядах (точка в режиме семисегментников). Их можно зажечь записав
MAX7219_POINT_ON и погасить MAX7219_POINT_OFF. Если записываю MAX7219_POINT_NO - (Не обрабатывать разряд D7), то сегменты не зажигаются вообще. Хотя в описании написано "Если режим кодирования отключен, то состояние точки нужно отключить и можно управлять любым сегментом." Как пример, выводил шахматку. что я неправильно делаю?



// Инициализация MAX7219
max7219_init(MAX7219_TEST_ON, MAX7219_UNDECODE, 8);
// Настройка яркости сегментов
max7219_light(9);
// Очистка дисплея
max7219_clear();

max7219_data_out(1, 0b01010101, MAX7219_POINT_NO);
max7219_data_out(2, 0b10101010, MAX7219_POINT_NO);
max7219_data_out(3, 0b01010101, MAX7219_POINT_NO);
max7219_data_out(4, 0b10101010, MAX7219_POINT_NO);
max7219_data_out(5, 0b01010101, MAX7219_POINT_NO);
max7219_data_out(6, 0b10101010, MAX7219_POINT_NO);
max7219_data_out(7, 0b01010101, MAX7219_POINT_NO);
max7219_data_out(8, 0b10101010, MAX7219_POINT_NO);
while(1)
{

// Здесь должен находиться ваш код
}
}


Алексей    14.11.18 23:11

Мне нужна матрица для проверки. Закажу у китайцев и проверю.

Сергей    15.11.18 11:47

Можно на семисегментник вывести и посмотреть как включается точка.

Матвей    03.01.19 00:07

Алексей, а есть возможность написания драйвера для графических дисплеев например: OLED 128x64 SSD1306(I2C) и ILI9525 170x220(SPI)

Алексей    03.01.19 08:48

Есть. Именно для AVR?

Матвей    03.01.19 12:02

Да, на C для aTmega16

Матвей    03.01.19 12:14

Алексей, давно хотел понять как писать либы мб помножите теорией? Вы когда нибудь сталкивались с модулем GY-521 3 осевым акселерометром и 3 осевым гироскопом? Там есть такая штука как дрейф координат и поиск оси Z

Алексей    03.01.19 16:20

Да, лежит дома года два. До сих пор в антистатическом пакете)) Нет надобности, некуда применить.
По поводу написания библиотек вот ссылка на мои видосы. Там все разжёвано. Если у меня найдутся эти дисплеи, то напишу под них функционал. Я давно хочу написать библиотеку под графические дисплеи.

Матвей    03.01.19 18:07

Алексей, у тебя почта есть ?

Матвей    03.01.19 18:08

"C для самых маленьких" XD окей

Алексей    03.01.19 20:48

Справа на верху синий почтовый ящик висит.

Николай    30.03.19 15:22

в теме про I2C нет раскрытых функций, хотелось бы код их:



i2c_read_byte(NACK);


с байтом nack и с ack

Алексей    31.03.19 00:54

А файле i2c.h можно посмотреть все функции.

Артем    14.04.19 23:55

Доброго времени.
Не планируется-ли добавить работу с к155ид1?

Алексей    15.04.19 18:01

А где его применять? Да и еще ТТЛ.

Артем    15.04.19 22:59

Часики на индикаторах ИН:}

Алексей    15.04.19 23:25

Понятно. Все новое это хорошо забытое старое.

Алексей    16.04.19 21:45




#define K155ID1_DDR DDRC
#define K155ID1_PORT PORTC

#define K155ID1_INIT() K155ID1_DDR |= 0x0F
#define K155ID1_HIGH(x) (K155ID1_PORT |= (1 << x))
#define K155ID1_LOW(x) (K155ID1_PORT &= ~(1 << x))

void k155id1_byte(unsigned char b)
{
for(unsigned char i = 0; i < 4; i++)
{
if(b & (1 << i))
{
K155ID1_LOW(i);
}
esle
{
K155ID1_HIGH(i);
}
}
}


Вот и весь функционал)))

Aleksei_bird    20.04.19 11:46

Алексей, добрый день! Отладил устройство, уже хотел
ставить его, но решил сменить дисплей, захотелось синюю подсветку)). Купил я на али дисплей, установил, но вместо букв - две строчки квадратов(дисплей 20*4). Ставлю МЭЛТовский дисплей, всё норм, а вот китаец чёт упрямится и не хочет работать(. Подскажите куда копать, может тайминги ему не нравятся? Заливал голый код, который генерится вашей библиотекой с надписью lcd_str_out("Hello World!"); ситуация не поменялась(

Aleksei_bird    20.04.19 14:03

Вопрос решил, оказывается на новых МК JTAG включен по умолчанию

Алексей    20.04.19 17:25

Если МК с jtag-ом то он включен с нуля. Я сам подрывался на этом не раз.




Чтобы вставить ссылку используйте форму вида[url]http://www.адрес.ru[/url][text]текст ссылки[/text]
Чтобы вставить код используйте форму вида[code]код[/code]

Имя:   





  







Рейтинг@Mail.ru Яндекс.Метрика