Jump to content
COKPOWEHEU

Блог Cokpoweheu

Recommended Posts

Оставлю свои наработки на сайте. Вдруг потеряются или пригодятся кому.

bootloader

Самозагрузчик для AVR минимального размера, использующий UART. Запускается автоматически при старте программы, если в течении определенного времени по UART ничего не пришло, возвращается в основную программу. Написан на ассемблере.

Используемые константы:

F_CPU - тактовая частота контроллера (Гц)

TIMEOUT_SEC - время до перехода в рабочий режим (сек)

UART_BAUD - скорость UART (бод)

.

pinmacro.h

Набор макросов на Си для удобного назначения и использования портов.

Пример объявления:

#define ANY_PORT C,2

Пример использования:

PORT_0( ANY_PORT ) - установить PORTC2 в лог.0, эквивалентно PORTC &=~(1<<2);

DDR_1( ANY_PORT ) - установить DDRC2 в лог.1, эквивалентно DDRC |= (1<<2);

PIN_1( ANY_PORT ) - возвращает логическое значение, равное уровню на PINC2, эквивалентно (PINC & (1<<2))

PIN_0( ANY_PORT ) - возвращает значение, противоположное уровню на PINC2, эквивалентно (!(PINC & (1<<2)))

И другие.

.

lcd.h

Библиотека на Си для работы с дисплеем на контроллере HD44780 по 4-проводной шине. Требуется набор макросов pinmacro.h. Линии RS и E могут располагаться на любых портах, RW не используется.

Используемые макросы:

#define LCD_DATA С,2 - куда подключены линии данных D4-D8 дисплея. В данном случае, это PC2-PC5

#define LCD_RS B,0 - куда подключена линия RS. В данном случае PB0

#define LCD_E D,3 - куда подключена линия E. В данном случае PD3

#define LCD_NUM_STR 4 - сколько строк поддерживает дисплей. В настоящее время реализованы 2-х и 4-х строчные дисплеи. Этот макрос используется для получения адресов строк LCD_STR_1, LCD_STR_2, LCD_STR_3, LCD_STR_4, их и рекомендуется использовать.

Функции:

lcd_init(); - в комментариях не нуждается

lcd_cur_*(); - установка формы и размера курсора. На выбор 4 варианта:

cd_cur_small(); - нижнее подчеркивание

lcd_cur_large(); - мигающее знакоместо, здоровенный прямоугольник

lcd_cur_two(); - оба вместе

lcd_cur_hide(); - курсор не виден

lcd_goto(unsigned char addr); - позиционирование в нужной точке. Адресация абсолютная, так что для обращения к отдельным строкам придется использовать макросы lcd_goto(LCD_STR_2+8); - 2 строка 8-й символ.

lcd_enable() / lcd_disable(); - перевод линий, используемых дисплеем в рабочее / нерабочее состояние, на случай, если на них висит что-нибудь еще.

lcd_str(const char *ch) / lcd_str_P(const char *ch); - вывод строки (стандарта Си, то есть заканчивающейся \0), из ОЗУ или из flash. Названия

сделаны по шаблону strcmp / strcmp_P и подобных стандартных библиотек.

lcd_data(char data) - посылка байта данных. Осторожно! устанавливает бит RS в лог.1

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

lcd_send(unsigned char data); - посылка байта в дисплей. Биты RS и E, как и настрокйи порта (DDR) не меняются

lcd_cmd(char cmd); - посылка команды. Обычно не нужна, так как написаны более специализированные макросы, вроде lcd_goto или lcd_cur_* Осторожно! Устанавливает RS в лог.0.

bootloader.tar.gz

pinmacro.tar.gz

lcd.tar.gz

Share this post


Link to post
Share on other sites

Делал часы. Вроде в AVR-контроллерах разбираюсь, а обычные часы ни разу не делал, непорядок. И вот, когда прошивка была написана, посетила меня идея поменять ориентацию 7-сегментных индикаторов, были с общим анодом, а станут с общим катодом. Или и вовсе ключи на катоды поставить? В оригинальной прошивке придется менять в десятке мест одновременно, а это неудобно, да и накосячить раз плюнуть. После чего я решил вынести всю динамическую индикацию в отдельную библиотеку, сделав ее достаточно гибкой, но и не слишком раздутой. Собственно, вот что получилось, может кому-то будет интересно или полезно посмотреть некоторые решения.

.

7seg.h

Библиотека для динамической 7-сегментной индикации. Из соображений оптимизации и лени, линии сегментов и линии разрядов должны занимать каждый по одному порту. Например, сегменты PB0-PB7, а разряды PD2, PD3 и PD5. Сами сегменты и разряды могут быть расположены внутри своих портов произвольно, как будет удобнее для разводки платы.

Настройки

SEG_PORT, DIG_PORT - буква порта, на котором висят сегменты или разряды. Только буква, а не полное название!

SEG_A - SEG_G, SEG_DOT - номера линий порта SEG_PORT, на которых висят соответствующие сегменты. Только номера!

DIG_0, DIG_1 <...-DIG_7> - номера линий порта DIG_PORT, на которых висят разряды. Количество может меняться от 2 до 8.

SEG_POL, DIG_POL - полярность активного уровня сегментов и разрядов. Какой логический уровень соответствует светящемуся сегменту, 0 или 1.

SEG_HEX - расширенный набор кодов, добавлены шестнадцатеричные буквы A-F.

USE_PROGMEM - использование массивов в flash-памяти вместо ОЗУ. Крайне рекомендуется.

SEG_BLINK - возможность выделения нужного разряда миганием

SEG_BL_BIT - делитель для мигалки. При каждом проходе соответствующего разряда 8-битный счетчик увеличивается. Сам разряд будет мигать с частотой изменения бита номер SEG_BL_BIT.

SEG_EX_NUMBERS - отказ от встроенных кодов цифр и подключение внешних. Внешние надо объявить как <PROGMEM> const char seg_nums[]={...}, модификатор PROGMEM зависит от макроса USE_PROGMEM. Вообще-то его использование довольно сложное, поэтому лучше бы обойтись.

SEG_DOT_SEC() - пользовательский макрос управления точкой. Должен возвращать логическое значение когда точку зажигать. Лучше его объявить до подключения этой библиотеки. В нем можно пользоваться локальным счетчиком seg_num индицируемого в данный момент разряда.

Переменные

unsigned char seg_buffer[] - буфер кадра. Объявлен в самой библиотеке, внешняя программа должна его всего лишь использовать

char seg_blink - номер мигающего сегмента. Определен только если соответствующая функция активирована (см. макрос SEG_BLINK)

Функции

inline void seg_init() - настройка DDRx, соответствующих индикатору, на выход.

inline void seg_disable() - перевод всех линий в неактивное состояние (при котором все диоды погашены)

seg_update() - сама динамическая индикация, оформлена как макрос. Вызывайте с нужной частотой - будет отображение.

7seg.tar.gz

Share this post


Link to post
Share on other sites

Немного изменил pinmacro.h

Каждому выводу можно назначить букву порта, номер пина в нем и значение по умолчанию.

#define LED C,3,1 //светодиод на PC3, подключенный к порту катодом
#define BTN D,5,0 //кнопка на PD5, коммутируемая на питание и подтянутая резистором к земле
DDR_1(LED); DDR_0(BTN); //DDRC.3=1 ; DDRD.5=0 - переключить вывод светодиода на выход, а вывод кнопки на вход
PORT_OFF(LED); PORT_0(BTN); //выключить светодиод PORTC.3=1; и выключить подтяжку кнопки PORTD.5=0;
if( PIN_ON(BTN) ) //если кнопка нажата PIND.5 == 1;
  PORT_T(LED); //изменить состояние светодиода PORTC.3 = ! PORTC.3;

Кроме того, поддерживается возможность добавления аргументов, например, конструкция #define LED C,3,1,a,0 будет корректно распознана.

Просьба модераторам заменить этим постом кусок первого поста, посвященный pinmacro.h.

pinmacro.tar.gz

Share this post


Link to post
Share on other sites

Вебинар STM32G0 – новый лидер бюджетных 32-битных микроконтроллеров от STMicroelectronics

Компания Компэл приглашает вас 25 сентября принять участие в вебинаре, который посвящен новому семейству микроконтроллеров STM32G0. Вебинар рассчитан на технических специалистов и тех, кто хорошо знаком с семейством STM32. На вебинаре будут освоены современные методы тестирования производительности микроконтроллеров на примере самых бюджетных 32-битных семейств общего назначения STM32G0 и STM32F0 и проведено их подробное сравнение.

Подробнее

                     

Литиевые батарейки Fanso в беспроводных датчиках пожарно-охранной сигнализации

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

Подробнее...

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...

  • Сообщения

    • Этот загадочный параметр - производительность вентилятора по объёму перекачиваемого воздуха, помноженная на создаваемое им разряжение. Неэлектрическая величина. К потребляемой от сети электрической мощности имеет весьма опосредованное отношение, примерно как зависимость грузоподъемности автомобиля от мощности двигателя.
    • Падает 8,5 Вольт при R44 5КОм При R44 200КОм падает 2,6В, При этом на выходе +16,3 Вольт В моем случае 0,18В, 0,79В, 1,4В при R44 5КОм При R44 200КОм - 0,14В, 0,73В, 1,35В. При этом на выходе +16,3 Вольт   Скорее всего. Был вечер и сетевое напряжение сильно гуляло.   Вы имели ввиду R18? На R17 у меня падает 0,82В при R44 5КОм При R44 200КОм все те же 0,8В. При этом на выходе +16,3 Вольт     А со вторым каналом что посоветуете делать, тоже менять или оставить как есть.
    • Автомобильные ланзароподобные видны сразу с полпинка Парень,который привез этот сабвуфер вчера,пояснил что электрики чего то там баловались с подключением и в итоге саб *упал на колени* Я спросил так может предохранитель помер и все? На что он грустно ответил типа я то себя знаю и предохранителем мол никогда в жизни не обходились))) Вам придется его делать. Смех и только. Ну чего,бум ваять
    • А детишки там на кой по садику слоняются?
    • Думаю на фильтрах, шланге и щётках оставляет. Все они такие, те что бытовые. Жрать киловатты горазды, а вот пыль и другой мусор затягивать, не особо. Я когда этот пылесос лет 5 назад выбирал, то проверил штук 6 разных, единственное в чем ступил, не узнал стоимость расходки)) А так, по эффективности уборки и цене, был лучшим вариантом. У меня у родителей есть пылесос витек, у него потребляемая заявляется под 2 квт, а эффективная, в районе 400вт с копейками. В сравнении с моим, он действительно кажется раза в 2 хуже собирает мусор.
    • 15 Вольт как раз и равняется напряжению полностью заряженной 12 Вольтовой батареи (10 банок по 1,5 Вольта). Т.е. батарея заряжается нормально. Цель какая замеров напряжения? Ну а то, что скачет на холостом ходу и при полном заряде - так это зависит от алгоритма заряда батареи, заложенного производителем, который нам неведом.
    • Никак. Вам придётся жить с этим позором до самого конца.  
×
×
  • Create New...