Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум разработчиков электроники ELECTRONIX.ru _ AVR _ Исходники программ и библиотек

Автор: Waso Dec 19 2005, 16:29

Предлагаю сюда скидывать (кому не жалко) свои инклюды для работы с периферийными устройствами, предназначенные для работы в IAR. Дело в том, что например для WinAVR такую библиотеку можно найти в http://electronix.ru/redirect.php?http://ccrma.stanford.edu/courses/250a/docs/avrlib/main.html. CodeVision имеет свою библиотеку. А ИАР этим не богат. Приходится либо писать свое с нуля, либо переделывать то что есть. Гемора в этих двух занятиях поровну.
Самому мне правда пока нечего выкинуь. Наоборот, нужны исходники для стандартного текстового ЖКИ-дисплея, клавиатуры 4х4, АЦП, ШИМ и пользовательского интерфейса. Так как с ИАРом (и вообще с Си) только знакомлюсь - дело идет медленно.

Автор: haker_fox Dec 20 2005, 01:03

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

Для "затравки" хочу выложить свое скромное творчество:
CRC8.ZIP - модуль для подсчета CRC8 по табличному способу (накажут меня модераторы, я уже где-то этот модуль выкладывал).
MT_10T7.ZIP - модуль для работы с дисплеем MT-10T7 фирмы "МЭЛТ" (ЖКИ 10 семисегментных знакомест + контроллер управления).
RTC.ZIP - модуль программных часов, реализована проверка високосного года. Функция rtc_service() должна вызываться каждую секунду.



P.S. В этих библиотеках, как и в любой нормальной программе, есть баги, которые я еще не встречал, просто не было удобного случая smile.gif

Есть еще библиотека для работы с протоколом WAKE (http://www.spetspribor.com/support/software/wake/wake.html), если кого заинтересует, могу выложить.

 CRC8.zip ( 1.42 килобайт ) : 17339
 MT_10T7.zip ( 1.91 килобайт ) : 17084
 rtc.zip ( 1.64 килобайт ) : 16897
 

Автор: at90 Dec 20 2005, 06:23

Вот библиотечка для работы с ЖКИ 16x2 и жк ht1611.
Взял здесь!
http://electronix.ru/redirect.php?http://www.averos.narod.ru/products/8515.htm

 8515.zip ( 80.97 килобайт ) : 47415
 

Автор: at90 Dec 20 2005, 07:46

Библиотека для работы с датафлэшем at45

 STK500_Dataflash_Routines.zip ( 27.05 килобайт ) : 17577
 

Автор: Nixon Dec 21 2005, 08:45

В данном топике предлагается выкладывать различные исходные тексты программ и библиотек (как своих так и не очень smile.gif).
Приветствуется подробный стиль изложения сути предлагаемого (но только по теме twak.gif). Сами исходные тексты выкладывать лучше аттачем к сообщению или ссылкой на них. Короткие тексты (в пределах разумного) допускается публиковать прямо в теле сообщения.
Различный флейм и бессодержательные сообщения будут пресекаться на корню.

Удачи.

Автор: at90 Dec 21 2005, 10:14

Хороший проект с Атмеловского контеста. Вэб камера и AVR

http://electronix.ru/redirect.php?http://www.circuitcellar.com/avr2004/wentries/A3694.zip

Автор: aai_m Dec 21 2005, 13:07

Любопытное применение дисплея Siemens S65 с исходниками.

http://electronix.ru/redirect.php?http://www.superkranz.de/christian/S65_Display/DisplaySoftware.html

Автор: Серега Dec 24 2005, 20:31

Библиотека для 25lc640.

 25lc640.rar ( 1.65 килобайт ) : 15696
 

Автор: *SERG Dec 26 2005, 03:14

много примеров и исходников
http://electronix.ru/redirect.php?http://www.gaw.ru/html.cgi/txt/app/micros/avr/

Автор: haker_fox Dec 27 2005, 00:49

Это архив студенческих проектов Американского университета с 1999 по 2004. Есть и радары (ИК, Ультразвук.), и GPS-приемники, и видео игры, и музыкальные синтезаторы.
http://electronix.ru/redirect.php?http://instruct1.cit.cornell.edu/courses/ee476/FinalProjects/

Тоже очень много исходников (около 300 по некоторым данным) + схемы:
http://electronix.ru/redirect.php?http://www.avrfreaks.net

Автор: Alechin Jan 11 2006, 15:22

Вот мои используемые практически в каждом проекте наработки:
1. Timer. Модуль таймеров. Использует таймер 3 (Мега128). Дискретность - 1 мсек. Предоставляет пользователю 8 таймеров, каждый из которых может быть однократным (отсчитал интервал и остановился) и циклическим (отсчитал, выставил флаг и перезапустился). По истечению каждого таймера может запускаться внешняя процедура.
2. AsyncTmr. Асинхронный таймер - использует таймер 0 в асинхронном режиме. Дискретность - 1 секунда. Функционально аналогичен предыдущему.
3. 3Wire. Драйвер шины 3-Wire (не путать с SPI!!!). Служит базой для построения драйверов устройств, подключаемых по 3-Wire (например, DS2404). Особенность - задержки подобраны под кварц 16 МГц.
4. MT12864. Драйвер графического дисплея MT12864 с набором шрифтов 6 на 8, 7 на 10 толстый и тонкий, 12 на 16 пикселов. Особенность - задержки подобраны под кварц 16 МГц.
5. PE12864. Драйвер графического дисплея PE12864 с набором шрифтов 6 на 8, 7 на 10 толстый и тонкий, 12 на 16 пикселов. Особенность - задержки подобраны под кварц 4 МГц.

 3Wire.zip ( 1.65 килобайт ) : 16433
 AsyncTmr.zip ( 2.61 килобайт ) : 16041
 Timer.zip ( 2.58 килобайт ) : 16823
 MT12864_drv.zip ( 27.4 килобайт ) : 17463
 PE12864_drv.zip ( 27.5 килобайт ) : 24154
 

Автор: DeXteR Jan 18 2006, 13:24

Написал h файл для тех кто любит записи типа 0bxxxxxxxx в АСМ
Может комуто пригодица =)  binary_c.rar ( 1.01 килобайт ) : 16413

Автор: Мах Jan 20 2006, 09:51

Не столько библиотека как исходник для подключения памяти at24c256 через twi. Проверено на железе. У меня все прекрасно работает на atmega16. biggrin.gif
Исходник взят из инета.

http://electronix.ru/redirect.php?http://nav2.livejournal.com/130205.html cool.gif

 24c256.rar ( 1.46 килобайт ) : 16981
 

Автор: Balaganov Jan 23 2006, 17:49

Цитата(Balaganov @ Jan 19 2006, 18:01) *
Хидер задержек для IAR. Использует __delay_cycles для формирования задержек от наносекунд до секунд. В параметре CPU_CLK_Hz указать тактовую частоту в герцах.[attachment=3956:attachment]


Сори не тот файл выложил, он в принципе рабочий, но до 2 с копейками МГц. Вот последний вариант  delay.h.txt ( 379 байт ) : 16475

Автор: Nikola Kirov Jan 25 2006, 00:57

Калкулатор boudrate для Usarta.
Не нашел готовъи вариант и написал ета прога. Думаю кто то поможет.

p.s
Ест какои то проблем с закачки фаилов в форуме. exe,rar,zip не хочет принимат.
Ето rar которъй переименовал на txt. Поменяите рзширение.

 BoudRateCalkulator.txt ( 17.21 килобайт ) : 14933
 

Автор: afe Jan 25 2006, 22:48

Както не хватает:

http://electronix.ru/redirect.php?http://hubbard.engr.scu.edu/avr/avrlib/


[b]Procyon AVRlib Overview[/b]
General AVR Built-In Peripheral Drivers External Hardware Device Drivers AVR Software-Emulated Devices Network Support

Автор: Proton Jan 29 2006, 17:50

Преобразователь *.ebn в *.hex. Хоть таких файлов и не очень много(jtagice,stk500), может кому-нибудь пригодиться. Замечания и предложения слать в личку.
 EBN2HEX.rar.txt ( 34.29 килобайт ) : 22830
файл переименовать в EBN2HEX.rar

Автор: haker_fox Feb 3 2006, 09:36

Прошу оценить мое сромное творчество, буду признателен, если сообщите о багах...

P.S.
i2c_soft_and_hardware.zip - там лежит драйвер как для TWI, так и программная реализация I2C, могут работать одновременно... что и реализовано в моем проекте.

 ds18b20.zip ( 2.01 килобайт ) : 18949
 ds1307.zip ( 1.39 килобайт ) : 17470
 i2c_soft_and_hardware.zip ( 2.57 килобайт ) : 19025
 

Автор: ЛЕСЯ Feb 6 2006, 11:37

haker_fox Как насчет выложить библтотеку для работы с протоколом WAKE?

Цитата
Есть еще библиотека для работы с протоколом WAKE (http://www.spetspribor.com/support/software/wake/wake.html), если кого заинтересует, могу выложить.
Цитата
Есть еще библиотека для работы с протоколом WAKE (http://www.spetspribor.com/support/software/wake/wake.html), если кого заинтересует, могу выложить.

Автор: Evgeny_CD Feb 6 2006, 17:41

Цитата(afe @ Jan 26 2006, 01:48) *
...Procyon AVRlib...
В тонкости не вдавался, но это сильно похоже на эту либу для LPC2xxx
http://electronix.ru/redirect.php?http://hubbard.engr.scu.edu/embedded/arm/armlib/

Автор: haker_fox Feb 7 2006, 00:19

Цитата(ЛЕСЯ @ Feb 6 2006, 19:37) *
haker_fox Как насчет выложить библтотеку для работы с протоколом WAKE?
Цитата
Есть еще библиотека для работы с протоколом WAKE (http://www.spetspribor.com/support/software/wake/wake.html), если кого заинтересует, могу выложить.
Цитата
Есть еще библиотека для работы с протоколом WAKE (http://www.spetspribor.com/support/software/wake/wake.html), если кого заинтересует, могу выложить.



Выкладываю... НО, там помимо самой реализации протокола, есть еще и команды, которые мой девайс выполняет по указанию компьютера, на них можно не обращать внимания. Вырезать не стал, дабы нечайно не попортить исходник. Сразу скажу, что в том виде, в котором модуль выложен, он работать не будет, т.к. часть программных счетчиков считается в другом модуле, где обрабатываются прерывания, да и ввел я их сам, для тайм-аутов... В общем исходники только для пояснения общей сути, за более подробным объяснением сюда http://electronix.ru/redirect.php?http://www.spetspribor.com/support/software/wake/wake.html.
В крайнем случае, если что, можно в PM спросить.

 wake.zip ( 7.03 килобайт ) : 15301
 

Автор: alm_ Feb 16 2006, 09:50

Модуль для работы с текстовым дисплеем 16x2

При всей изученности (если не сказать избитости) темы хочу предложить свое решение. Его особенности:
- для использования в своем проекте достаточно переписать функции чтени/записи данных и чтения команд с контроллера индикатора
- перекодировка из кодовой таблицы 1251 происходит runtime, так что можно вводить текстовые строки в своей привычной кодировке
- предварительный буфер дисплея можно заполнять, используя форматированный вывод sprintf
- для записи обработанных данных в контроллер дисплея достаточно вызывать быструю подпрограмму только в одном месте (прерывании таймера с частотой около 34 Гц)
- не загружает параллельные задачи (например подсчёт входных импульсов)

 buff16x2.txt ( 4.88 килобайт ) : 16845
 

Автор: alm_ Feb 16 2006, 11:20

Расчёт CRC16
- на С с оптимизацией по скорости (таблица 512 байт)
- на С с оптимизацией по длине
- на Pascal/Delphi

 crc16.zip ( 2.31 килобайт ) : 15921
 

Автор: Jatagan Mar 7 2006, 08:25

Вылаживаю подпрограмму (Div24.asm) для беззнакового делени 24-х битного числа.
Используется хороший алгоритм, работает быстро. Коечто можно упростить.

 Div24.zip ( 1.56 килобайт ) : 15937
 

Автор: SasaVitebsk Apr 2 2006, 10:27

В одном из моих проектов было много устройств I2C и I2C - подобных (АЦП, ЦАП, 24сХХ и тд). Необходима была также клавиатура и дисплей. А ножек контроллера катострофически не хватало.
Короче я разработал на at90s2313 устройство I2C Дисплей-клавиатура-динамик-светодиоды. Изделие получилось на редкость удачное. И я его использовал неоднократно. Один экземпляр оставил себе. Использую для отладки.
Опишу преимущества:
1) Функционально законченный блок не требующий отладки. (У меня это плата на которой запаяны клавиатура, дисплей, схема управления, I2C память, выходной разъём)
2) Занимает малое число ног основного контроллера. Частично разгружает основной контроллер.
3) Можно выбрать кодовую таблицу символов (DOS/WIN). Таким образом программа основного микроконтроллера становится более наглядна.
4) Имеются команды управления дисплеем, - прямая адресация курсора; очистка дисплея; различные звуковые сигналы.
5) Низкая стоимость микросхем обвязки.
6) Обслуживание клавиатуры опросом и по прерыванию.
7) Простота реализации I2C интерфейса позволяет быстро включить данное устройство в свой проект.
Если есть интерес, то я могу опубликовать данный проект. smile.gif

 ________________.doc ( 74 килобайт ) : 18920
 

Автор: Aquatik Apr 3 2006, 06:45

SasaVitebsk опубликуй.. Очень хотелось бы посмотреть, для развития. Иногда возникала такая же ситуация с большим количеством i2c, решалось схемным путем... Заранее благодарен..

Автор: SasaVitebsk Apr 3 2006, 21:41

Заранее извиняюсь. Всё это начиналось давно. Только появились 2313. smile.gif Схема у меня не сохранилась восстановил по памяти и программе. Проект был на avr studio 3. smile.gif

Короче перекомпильнул поновый. Может огрехи какие спрашивайте.

По схеме заметки.
1) От резета BOD. Я его не рисовал. Если возьмёте tiny2313, то он вааще не нужен.
2) Элемента "клава" я не нашёл, - поставил разъём на схеме. Клава стандартная 4х4. 4 верхних на перебор, 4 нижних на опрос.
3) Регистр типа ИР33,37 или ИР22,23.
4) Я ставил кварц 11059, хотя можно и 10М
5) Обычная ЗП-эшка
6) Озу 24сХХ стоят для примера. На плате были, хотя и не всегда запаивались
7) Индикатор любой на 44780

Существует более поздний вариант на mega8. Он без доп элементов.

Чуть позже скину прогу для PC для тестирования

Чёто не влезло. Высылаю остальное

 pult2313.sch ( 147.21 килобайт ) : 16412
 pult.rar ( 172.19 килобайт ) : 16832
 

Автор: vesago Apr 6 2006, 10:50

SasaVitebsk будь так любезен - выложи схемку в пдф или картинкой.

Автор: SasaVitebsk Apr 6 2006, 20:14

Схема была в EAGLE для быстроты. Мелочи не рисовал, - они понятны. Если не понятны можете писать на мыло sasa@c32dvina.com или завести топик в основном разделе, чтобы этот не загромождать. Да ещё пару моментов. Чтобы testi2c работала необходимо для xp поместить файл smport.sys в system32, для 95/98 smport.vxd в system. smile.gif Сразу подзабыл, - добавил.
Выбрать в проекте LPT1 и запаять SDA - 37a.0, 379.7; SCL - 37a.1

 pult.rar ( 23.85 килобайт ) : 16369
 

Автор: GOP Apr 17 2006, 15:43

Еще библиотека для разработчика есть практически все.

http://electronix.ru/redirect.php?http://hubbard.engr.scu.edu/embedded/avr/avrlib/

Всем удачи!!!

Автор: SasaVitebsk Apr 20 2006, 20:36

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

1) Схема присоединения к LPT порту PC
2) Библиотека для использования для AVR и 8051

Библиотеки правда не очень. smile.gif Я обычно в проект вкладываю. Теперь выдирать пришлось. Возможно чего-нибудь покалечил. smile.gif Но вроде там всё просто сами доработаете. Или на мыло пишите. smile.gif

 bibl.rar ( 10.35 килобайт ) : 15205
 

Автор: prottoss May 22 2006, 14:46

Выкладываю драйвер USARTа на Си, использующий кольцевые FIFO буферы. В принципе ничего нового, подобное где то есть, может даже в аппликухах Atmel, и я не претендую на изобретение чего то нового. Но может кому пригодится. Много удобных #define)))

 USART.Driver.rar ( 4.7 килобайт ) : 16943
 

Автор: defunct May 23 2006, 05:16

Программный full-duplex UART для ATtiny13. С внутренним осциллятором 9.6Mhz обеспечивает работу UART'a на скоростях 9600/19200/38400. Имеется возможность раздельной инверсии линий Tx и Rx, что позволяет откзаться от применения преобразователей уровней RS-TTL. Присоединенный проект демонстрирует эхотерминал на скорости 38400, подключение к COM порту показано на прикрепленном рисунке.

 

 Software_uart.zip ( 6.24 килобайт ) : 22522
 

Автор: prottoss May 30 2006, 14:15

Привет всем!



Стартовый исходник для символьных ЖКИ на основе HD44780. С помощью многочисленных #define перестраивается под любой мыслимый дисплей на основе HD44780 (только с одним чипом!, т.е кроме индикаторов 4х40). В исходнике только примитивы - отправить команду, прочитать статус, отправить данные, прочитать данные. Вполне достаточно, что бы приступить к плодотворной работе с дисплеем без экспериментов. Поддерживает 4-х и 8-и битную шину данных... Сварено на IAR C for AVR 4.10B. Как всегда, мои подробнейшие комментарии)))

 HD44780src.ZIP ( 4.68 килобайт ) : 17956
 

Автор: aleksey_g May 30 2006, 15:37

Цитата(prottoss @ May 30 2006, 17:15) *
Привет всем!
Стартовый исходник для символьных ЖКИ на основе HD44780.


Красиво! Молодец. Хорошо постарался!
Но рассчитывать задержки вручную?
Не лучше ли так:
#define XTALL 16.0
#define delay_us(us) __delay_cycles (XTALL * us);
#define delay_ms(ms) delay_us (1000 * ms)
По моему было бы еще удобнее.

Автор: prottoss May 30 2006, 15:50

Цитата(aleksey_g @ May 30 2006, 23:37) *
Цитата(prottoss @ May 30 2006, 17:15) *

Привет всем!
Стартовый исходник для символьных ЖКИ на основе HD44780.


Красиво! Молодец. Хорошо постарался!


Спасибо...)

Цитата(aleksey_g @ May 30 2006, 23:37) *
Но рассчитывать задержки вручную?
Не лучше ли так:
#define XTALL 16.0
#define delay_us(us) __delay_cycles (XTALL * us);
#define delay_ms(ms) delay_us (1000 * ms)
По моему было бы еще удобнее.


Может быть так и лучше)

Автор: agnedbay Jun 9 2006, 11:32

Вот поляк выложил аппаратный TWI для управления LCD (CVAVR)
http://electronix.ru/redirect.php?http://lcd.strony.pl/d-104v1.htm
Проверял нужные для меня (делал 2 i2c аппаратный и программный) куски кода все работает.
А вот взагали http://electronix.ru/redirect.php?http://lcd.strony.pl/ что есть.
Хоть и по польски, но понятно.

Автор: Stas633 Jul 1 2006, 07:47

Не смог найти готового, поэтому сделал свое....

Бегущая строка для HD44780 на Си. Выполнено в CV_AVR...

Файл в формате .html, так как пояснений больше чем собственно кода...

 beg_stroka.rar ( 2.6 килобайт ) : 17269

Автор: TamTam Jul 6 2006, 07:00

Библиотека и модель в PROTEUSE 6.9. sp4 для подключения HD44780 всего по 3 проводам с использованием сдвигового регистра 74HC164 МК. Компилятор CodeVisionAVR
Отбельная благодарность за помощь в понимание и написание программы:
1. rat - описание работы с HD44780
2. otrog - правка кода и правильный загон строк в регистр

 

 3_wire_lcd.rar ( 48.94 килобайт ) : 17534
 

Автор: SasaVitebsk Aug 31 2006, 18:41

Цитата(Wladimir_TS @ Aug 26 2006, 10:58) *
Не уверен уместно-ли здесь просить какие - либо исходники, но я попробую:

Необходима процедура вычисления логарифма с произвольным целым рснованием в диапазоне 2-10. Режим вычислений - с фиксированной точкой. требование - минимальный занимаемый объем.

Ну очень надо - может кто ссылки где видел. help.gif


Нашёл у себя математику для 8051. Но переписать несложно.

 MATHLIB.rar ( 10.28 килобайт ) : 14688
 

Автор: andr_doy Sep 19 2006, 04:42

RkLibAvr
Польская библиотека
http://electronix.ru/redirect.php?http://robkry.freepgs.com/?q=node/4

Автор: SasaVitebsk Sep 28 2006, 00:35

Например при обработке сложного последовательного протокола происходит "прокол". Как его найти? У меня есть стенд(а если не подходит стандартный, то делаю новый). И я с МК сливаю данные на PC до 8 битов (например 2 последовательных канала приём/передача). Обычно мл.битом вперёд хотя прога может и повернуть. Итак я записываю данные в файл например 100Mb.

А дальше спокойно просматриваю что происходит и где прокол. Можно искать нужные места. Ставить метки. Измерять длительность участка. Копировать и сравнивать. Можно запоминать адрес в файле (смещение от начала файла). Мне это помогало, когда данные скрэмблированные. Можно просматривать файл до и после обработки. Можно подписывать лучи и сохранять карточку. И хранить такой протокол. Чтобы в любой момент его просмотреть. Помойму где-то у меня лежит карточка телефонного автомата. smile.gif А где-то и 2323 лежит которая легко с ним общается. smile.gif

Использовал и для аналоговых данных. Хоть и не для этого делалось.

 Osc.zip ( 255.4 килобайт ) : 15458
 

Автор: Георгий Sep 28 2006, 04:31

To SasaVitebsk:
Я все таки не отказался бы от исходников пргии со стороны РС, времени нет просто сейчас разбираться. На оформление и прочие возможные огрехи закрою глаза, прекрасно понимаю, что такое тестовая программа , быстро накиданная под себя.
Можно в мыло gsb@gsb.kirov.ru

Осциллограф цифровой на компе я тоже писал, удобная штука. Я с его помощью разобрал протоколы обмена с клавиатурой, IR протоколы.

Автор: SasaVitebsk Sep 28 2006, 19:41

Цитата(vesago @ Sep 28 2006, 12:11) *
To SasaVitebsk:
Я так понял ваша программа пишет данные по битам 0 - 7 LPT порта. А драйвер какой надо для XP?


Драйвера то есть. Но на счёт пишет я другой пользуюсь. Обычно. Там описание есть маленькое. smile.gif Драйвера я в пульте выкладывал. smport.vxd, smport.sys

 St01.rar ( 177.84 килобайт ) : 14673
 

Автор: kamedi_clab Oct 8 2006, 17:01

Шаблон для быстрого программирования в CVAVR и отладки в VMLAB

В шаблоне содержится папка с проектми для компилятора CVAVR и симулятора VMLAB. Можно сразу запустить симуляцию в VMLAB программы выводящей сообщения на ПК и мигающей светодиодами.
Можно изменить программу под ваши нужды в компиляторе CVAVR - при этом удобно использовать генератор кода компилятора. После отладки окончательного варианта программы в симуляторе вы можете прошить МК прямо из компилятора CVAVR. Во время работы удобно одновременно запустить и CVAVR и VMLAB.

 codevisionavr_vmlab.rar ( 6.13 килобайт ) : 14035
 

Автор: VitPushchin Oct 23 2006, 14:23

А вот приемник ИК пульта от Самсунга (кодировка типа NEC, но со своими особенностями).
Работает на АТтини2313, у меня - 11.059 мгц кварц. Собственно, по сорсам все понятно должно быть.

 RemoconCtrl.rar ( 1.83 килобайт ) : 14409
 

Автор: SasaVitebsk Nov 21 2006, 00:01

Свой вариант библиотек LCD44780 и DS1820.

Очень понравился по стилю написания вариант работы с HD44780 от protoss, но как мне кажется он не полный. Выкладываю свой. Думаю уважаемый protoss им не воспользуется, а вот начинающие - возможно. Также вариант библиотеки для работы с DS18x20.

Возможности LCD44780. Есть вторичный вывод. Вывод символа в Win кодировке, прямая адресация курсора, сплитер и др. Поддерживаются стандартные п/п printf и outs вместе с форматированием. Форматирование расширено что позваляет легко делать меню.

Возможности DS18x20. Позволяет подключать несколько датчиков DS1820/18b20/18s20 в любом сочетании. Позволяет динамически определять их колличество и подключать новые. Позволяет работать с ними по 2-ух проводной шине.

 ds1820.zip ( 4.51 килобайт ) : 16120
 HD44780.zip ( 5.85 килобайт ) : 15899
 

Автор: Screw Nov 29 2006, 22:08

Здравствуйте!

Я вот тут решил зарегистрироваться и кое чем поделиться, ибо искал это кое что.... долго wink.gif

А именно - исходник инициализации и работы с LCD МТ-16s2 фирмы МЭЛТ по 4-х проводному интерфейсу. Написано под WinAvr, но я за 5 минут переделал под CVAVR.
Выкладываю оригинал (надеюсь автор не будет против).

Вся бякость этого LCD состоит в том, что он не совсем аналог HD44780 wink.gif

 TextLCD_2.zip ( 9.05 килобайт ) : 14276
 

Автор: yarunt Jan 4 2007, 12:14

Если кому интересно ,как я поборол жки нокиа3510и.

 farblcd.rar ( 23.83 килобайт ) : 8615
 

Автор: kuber Jan 8 2007, 23:03

Проект на Pic
MASTER-Pic16f628
Slave - Pic12f629

Monitor 2 Wire 7Adr Led

Устройство состоит из блока графической индикации 5х8 точек с формирователем 2 проводной линии связи с адресными устройствами.
Питание адресников осуществляется по тойже линии связи.
Каждый адресник имеет 2 входа замыкаемые на массу.
Блок индикации обслуживает 8 адресных устройств.
Индикация, наличие адресного устройство на линии, и о замыкании у адресного устройства входных линий на землю.
Адресники могут содержать фиксированный адрес 0-7,
или вариант адресника с 3 перемычками задающий адрес устройства.
Блок индикации является MASTEROM на линиа а адресники SLAVE.
Начало обмена- команда сброс для всех адресников, далее пакет из 4 байт.
1 -адрес устройства
2 -код команды (чтение или запись из адресника)
3 -байт данттых
4 -CRC8 контрольная сумма.


Мастер посылает пакет адреснику и читает ответ с линии и проверяя CRC пакета, если CRC не совпадает, MASTER повторяет посылку ещё 2 раза.
Если, нет то считается что адресника нет.


Весь проект с схемами, фотками и файлами -ASM,HEX

Мажет пригодится кому нибудь.
aralgen@mail.ru

 arxiv.rar ( 80.49 килобайт ) : 1662
 

Автор: Шалапут:-) Jan 11 2007, 04:56

Поделюсь своим кодом на Ассме для организации меню на буквенно цифровом дисплее HD4478 16х2.. В программе реализована отправка строк с флеш памяти. При нажатии одной из 4 кнопок происходит прерывание Int_1, затем его обработка (со звуковым сигналом). Куда подключать кнопки и дисплей, ясно из программы, динамик-через усилительный транзистор
Расчитано для работы на 4 МГц кварце. Для приминения на других частотах кварца нужно просто поменять значение, заносимое в рег r20
DELAY20MS:
wdr; sbros storozhevogo timera (mozhno zapreshat' ego raboty)
LDI R20,110; Сюда (20=1МГц, 40=2 и.т.д)
d20:
dec r20
...
если что неясно, пишите kadrum@narod.ru или ICQ#: 191-851-131
smile3046.gif

код для HD 4478 здесь

 menu_HD4478.zip ( 5.48 килобайт ) : 2486
 

Автор: Yuriy_AVR Jan 16 2007, 20:08

Может кому будет полезно очень быстрое преобразование двоичного ( 4-х байтного ) числа в двоично-десятичное число . Собственный алгоритм . Взято из рабочей программы ; некогда было окультуривать. Вполне можно перенести на Си . Очень удобно когда есть неоходимость , например , вывода на экран каких либо значений , которые считаются внутри в двоичном виде .

 Bin32BCD8.rar ( 400 байт ) : 2303
 

Автор: Fakir Jan 18 2007, 11:55

на телесисах пробегала сылка на коллекцию исходников: http://electronix.ru/redirect.php?http://faq.embedders.org/_examples_code/
и документации: http://electronix.ru/redirect.php?http://lord-n.narod.ru/walla.html#faqembedders

Автор: Сергей Борщ Jan 21 2007, 01:19

Часто появляются вопросы об удобном доступе к ножкам порта. Несколько раз выкладывал в разных темах очень удобные (как мне кажется) макросы. Решил выложить здесь наиболее свежую версию, чтобы потом долго не искать. Пользоваться ими так:

Код
#define LED1    PORTC,2,H   // output, active high (led from PC2 to GND)
#define LED2    PORTD,3,L   // output, active low (led from Vcc to PD3)
#define KEY1    PINB,5,L    // input, active low (key from PB5 to GND, pull-up resistor)
#define KEY2    PINC,7,H    // input, active high (key from Vcc to PC7, pull-down resistor)

#include "ascold.h"
unsigned char Key1Status;
unsigned char Key2Status;
void main() {
    Key1Status = signal(KEY1);
    Key2Status = signal(KEY2);
    for(;;) {
        cpl(LED1);          // toggle LED1
        if(signal(KEY1))    // if KEY1 pressed, turn on LED2
            on(LED2);
        else                // otherwice turn off LED2
            off(LED2);
    }
}}

Если в результате переразводки вывод поменялся, достаточно изменить лишь одну строчку #define

Я использую с компилятором IAR для процессоров AVR, MSP430, AT91SAM7, LPC2xxx, ADuC70xx. Но они должны работать и с любым другим компиляторм.

 ascold.zip ( 1.15 килобайт ) : 2506
 

Автор: ReAl Jan 22 2007, 14:42

Цитата(Сергей Борщ @ Jan 21 2007, 00:19) *
очень удобные (как мне кажется) макросы.

Я тоже ими пользуюсь очень давно :-)
Только signal() переименовал сразу же в bit_active() (ну и все остальные в bit_on/bit_off для однообразия).
После какого-то давнего залёта со своей переменной с именем errno в борландовском С - не рискую применять имена, могущие пересечься с чем-то "очень стандартным".

Автор: Sergei Frolov Jan 30 2007, 16:34

Код
(*
   Вычисление дня недели в приложениях автоматического вычисления
   дня недели в датах от 1996 года и старше.

   Copyright (C) Sergei Frolov, 1998.   v1.0  Jan, 4, 1998.

   Программа ориентирована на применение в приложениях, написанных
   на языке ассемблера без использования аппаратного умножения/деления
   и операций с плавающей запятой.
*)

program denned;
const
  YEARS  : array[0.. 3] of byte = (0, 2, 3, 4);
  MONTHS : array[1..12] of byte = (0, 3, 3, 6, 1, 4, 6, 2, 5, 0, 3, 5);
  DAYOFWEEKS  : array[0..6] of string =
    ('Воскресенье', 'Понедельник', 'Вторник', 'Среда', 'Четверг',
     'Пятница', 'Суббота');
var
  a, b, c, d, e, f, tmp : byte;
  day, month, year      : word;

begin
  repeat
    write('Число XX -> ');    readln(day);
    if day = 0 then break; { выход }
    write('Месяц XX -> ');    readln(month);
    write('Год XXXX -> ');    readln(year);
    tmp := year - 1996;
    a := tmp and 3;
    b := (tmp shr 2) + (tmp and $FC);
    c := MONTHS[month];
    if (a = 0) and (month > 2) then inc(c);
    a := YEARS[a];
    e := (a + b + c + day) mod 7;
    writeln('Результат: ', DAYOFWEEKS[e]);    writeln;
  until false;
end.

Автор: umup Feb 4 2007, 20:30

Сергей Борщ

Цитата
#define LED1 PORTC,2,H // output, active high (led from PC2 to GND)

Интересно, как у вас работают программы с комментариями // в #define, или компилятор это отлавливает ?

Автор: Сергей Борщ Feb 4 2007, 23:16

Цитата(umup @ Feb 4 2007, 19:30) *
Сергей Борщ
Цитата

#define LED1 PORTC,2,H // output, active high (led from PC2 to GND)

Интересно, как у вас работают программы с комментариями // в #define, или компилятор это отлавливает ?
IAR не жалуется. GCC (WinAVR) тоже. Согласно http://electronix.ru/redirect.php?http://gcc.gnu.org/onlinedocs/cpp/Initial-processing.html#Initial-processing комментарии заменяются пробелами до обработки #define

Автор: Сергей Борщ Feb 21 2007, 10:20

Цитата(svlad @ Feb 20 2007, 20:09) *
Цитата(Kuzmi4 @ Feb 20 2007, 14:21) *

2 svlad - interrupt.h и io.h надо поставить винавр тогда они появяться.
Если кому интересно могу выложить декодировку манчестера по INT0 для 8-й меги.

не уж то ни у кого нет WinAVR? smile.gif
В чем вопрос-то состоял? www.google.ru, искать по ключевому слову WinAVR. Хотя это первое, что нужно делать перед писанием в конференции.

 

Автор: Kuzmi4 Feb 21 2007, 10:57

Драсте всем!
В прикреплённом файле - ф-ция и интерупт с помощъю которых я ловил манчестер для эм-мариновских карт - у них манчестерская кодировка данных + хитрый протокол передачи,кому надо - может пообкусывать чё не надо.

 Shnyaga.txt ( 7.38 килобайт ) : 1813
 

Автор: megachip Feb 24 2007, 00:53

Шрифт от Нокии 6510 анг/рус для библиотеки http://electronix.ru/redirect.php?http://www.apetech.de/article.php?artId=1&nnId=10.

 nokia.rar ( 2.63 килобайт ) : 1427
 

Автор: prottoss Feb 25 2007, 16:21

Выложил исходники своего программатора AVR910 USB.
http://electronix.ru/redirect.php?http://pinokio3000.narod.ru/my_designs/AVR910_USB_Programmer.htm

Автор: Kuzmi4 Feb 26 2007, 15:16

2 Beer - ну бывает...

 md_.txt ( 497 байт ) : 1463
 

Автор: SasaVitebsk Feb 27 2007, 14:21

Часто при работе с АЦП приходится делать таблицу пересчёта. Например когда датчик нелинейный или когда точность надо повысить. Кроме того иногда приходится применять те или иные механизмы. Например (как в моём случае) шаговый двигатель со стрелкой. Или простой ШД. В этом случае значение АЦП должно непосредственно указывать на положение стрелки (или механизма).

Короче так или иначе, но приходится СОЗДАВАТЬ ТАБЛИЦУ ПЕРЕСЧЁТА. smile.gif Иногда она неясна. То есть не поддаётся строгому математическому моделированию. Конечно, наверное здесь поможет знание такого пакета как MATHCAD, но иногда просто устаёшь от непрерывного изучения вспомогательных пакетов. Я не люблю бегло ознакамливаться, а изучать толково - банально не хватает времени.

Короче в моём случае, я как правило, сажусь и пишу небольшую вспомогательную программку. Имея исходники, при необходимости модифицирую её под конкретную задачу. Таким образом общее число таких программок перевалило уже сотни за 3. smile.gif
Со временем оказывается, что к некоторым програмкам обращаешься не один раз. (В частности к этой). Поэтому прилагаешь некоторые усилия для оптимизации её и так сказать завершённости.

Итак данная программа:
1) по нескольким точкам создаёт таблицу
2) Позволяет её сохранить в виде файла или текста
3) Позволяет её вывести в виде графика (для визуального контроля)
4) Позволяет слегка корректировать
5) Позволяет сгладить с помощью квадратичной интерполяции

 Traktor_dw.zip ( 237.09 килобайт ) : 2773
 

Автор: Kuzmi4 Feb 27 2007, 15:30

оки... сча вот порылся , нашёл проэкт.. сча заттачу усе ф-ции - пользуйтесь,разбирайтесь.Хотя мож коряво написаны - но писал давно, работают и ладно...
файл который - "файл.Х" то там только объявы чтоб легче было...СОбсно:
/*****************************************************************************
Types definitions
******************************************************************************/
#define UCHAR unsigned char
#define UINT unsigned int
#define ULONG unsigned long
#define BOOL UCHAR
#define FALSE 0
#define TRUE 1

 pcs1.txt ( 73.3 килобайт ) : 1601
 _________.pdf ( 147.51 килобайт ) : 4691
 

Автор: yarunt Mar 20 2007, 10:22

Цитата(Waso @ Dec 19 2005, 17:29) *
Предлагаю сюда скидывать (кому не жалко) свои инклюды для работы с периферийными устройствами, предназначенные для работы в IAR. Дело в том, что например для WinAVR такую библиотеку можно найти в http://electronix.ru/redirect.php?http://ccrma.stanford.edu/courses/250a/docs/avrlib/main.html. CodeVision имеет свою библиотеку. А ИАР этим не богат. Приходится либо писать свое с нуля, либо переделывать то что есть. Гемора в этих двух занятиях поровну.
Самому мне правда пока нечего выкинуь. Наоборот, нужны исходники для стандартного текстового ЖКИ-дисплея, клавиатуры 4х4, АЦП, ШИМ и пользовательского интерфейса. Так как с ИАРом (и вообще с Си) только знакомлюсь - дело идет медленно.

Вот хочу выложить проэктик на алгоритмбилдере 4.8 . В нём инициалиация дисплея сименс сх65 тип LS020***.
При удачной сборке должны быть 3 цветных полосы ,принажатой кнопки должен сработать позификатор и нарисовать в центре квадрат(тест на длинну проводков к дисплею).

 test_ls020.zip ( 10.81 килобайт ) : 1339
 

Автор: Qwertty Mar 20 2007, 11:26

Цитата(yarunt @ Mar 20 2007, 10:22) *
Вот хочу выложить проэктик на алгоритмбилдере 4.8

В схеме включения диод повышающего конвертера для подсветки правильно нарисован? smile.gif

Автор: yarunt Mar 20 2007, 12:19

Цитата(Qwertty @ Mar 20 2007, 12:26) *
В схеме включения диод повышающего конвертера для подсветки правильно нарисован? smile.gif

ohmy.gif Диод правильно ,ошибка в том что LED_GND подключить надо на землю. Питание подсветки около 9 в.

Автор: Qwertty Mar 20 2007, 12:40

Цитата(yarunt @ Mar 20 2007, 12:19) *
ohmy.gif Диод правильно ,ошибка в том что LED_GND подключить надо на землю. Питание подсветки около 9 в.

Правильно????? Тогда по другому спрошу - зачем нужны VT1 и L1? Если диод правильно стоит.... smile.gif

Автор: yarunt Mar 20 2007, 12:51

Цитата(Qwertty @ Mar 20 2007, 13:40) *
Правильно????? Тогда по другому спрошу - зачем нужны VT1 и L1? Если диод правильно стоит.... smile.gif

Да точно диод не правильно стоял smile.gif

 

Автор: alecsvg Mar 28 2007, 07:11

Цитата(haker_fox @ Dec 20 2005, 02:03) *
Может быть сюда вообще выкладывать различные подпрограммы, для работы не только с периферией, но и например математику, сортировку, обработку данных и т.п.

Шрифты для граф.панели LCD ???help.gif help.gif
Есть панель WG12864
Интересуют русские шрифты 5х7. Где достать?
Чем сделать мультики для неё (редактор графический с промотром созданного?)

Автор: SasaVitebsk Mar 29 2007, 15:52

Фонты 6х8, 8х8 в виндовой кодировке начиная с кода 0x21. Фонты пропорциональные. (Моноширинные)

 fnt0.zip ( 1.86 килобайт ) : 1730
 

Автор: acex2 Mar 29 2007, 22:44

Цитата(SasaVitebsk @ Mar 29 2007, 16:52) *
Фонты 6х8, 8х8 в виндовой кодировке начиная с кода 0x21. Фонты пропорциональные. (Моноширинные)


Шрифт может быть или пропорциональным, или моноширинным.

Автор: Kolia Mar 30 2007, 12:11

Додрый день

Есть архивчик программ - весит 82 Мега.
http://electronix.ru/redirect.php?http://rapidshare.com/files/7450315/AVR.rar.html пароль::gevv

автор архива gevv - http://electronix.ru/redirect.php?http://hyperelektronik.com/

http://electronix.ru/redirect.php?http://www.edaboard.com/viewtopic.php?t=213262&highlight=archive

Автор: DeXteR Mar 30 2007, 13:51

Цитата(Kolia @ Mar 30 2007, 13:11) *
Додрый день
Есть архивчик программ - весит 82 Мега.
http://electronix.ru/redirect.php?http://rapidshare.com/files/7450315/AVR.rar.html пароль::gevv
автор архива gevv - http://electronix.ru/redirect.php?http://hyperelektronik.com/
http://electronix.ru/redirect.php?http://www.edaboard.com/viewtopic.php?t=213262&highlight=archive


Ктонибудь закачал ???
Если есть возможность - пожалуйста переложите куданибудь в удобный хостинг

Автор: xemul Mar 30 2007, 14:04

Цитата(DeXteR @ Mar 30 2007, 13:51) *
Ктонибудь закачал ???
Если есть возможность - пожалуйста переложите куданибудь в удобный хостинг

Через 20 минут будет в /upload/MCs/AVR/Projects/Gevv.rar
Перепаковано без пароля и странных символов в именах файлов и директорий.

.Done smile.gif

Автор: plan Apr 10 2007, 08:28

Привет ВСЕМ. Выкладываю рабочий проект для связи по радиоканалу (сс2500) для CVAVR.Может где-то чего нибудь криво так что сами подправите.Использовал библиотеки msp430.

 CC2500_modem.zip ( 83.55 килобайт ) : 2520
 

Автор: prottoss Apr 10 2007, 15:37

Цитата(VAHOO @ Apr 10 2007, 20:28) *
Привет prottoss! хочу с компилировать файл, но не компилируется
пишет #error This file should only be compiled with iccavr or aavr with processor option -v1
в чем проблема, у меня IAR v 4.21, помоги пожалуйста!
В файле stdafx.h подключен хедер io8515.h. Его лучше всего заменить на ioavr.h вот так

Код
#include <ioavr.h>


Ну и в меню Project->Options->General Options->Target выставить требуемый МК.

Enjoy!:-)

Автор: Александр Куличок Apr 10 2007, 16:32

Цитата
Не совсем исходники, но все же:
Макросы для тех, кто работает с ассемблером + раскраска комментариев и макросов в ассемблере (AVRStudio) (копировать в .\AVR Tools\AVRStudio\Edit\)
(раскраска директив компилятьра, комментариев разными цветами после ;* ;/ ;- ;+ плюс раскраска макросов)

Не удалось присоединить файлы. Повторяю.
 macros_v1.5.rar ( 743 байт ) : 1445

 AvrStudio_asm.rar ( 1.85 килобайт ) : 1388

Автор: prottoss Apr 11 2007, 14:00

Цитата(VAHOO @ Apr 11 2007, 13:48) *
а "systime.h" откудо найти ???
если нетрудно отправ примерчик скажем бегушая строка,
и если написал дока для етих библиотек, тоже отправ,
я LCD подключил на PORTC , 4 бит, спасибо!
systime.h осталься по невнимательности и в данной реализации абсолютно не нужен. Примера бегущей строки нету:-) а делать влом - некада- сорри:-) В принципе не вижу трудностей и предлагаю написать самому - мне такие задачи задавали на 4-ом курсе:-))) Делал за одну пару.

Автор: by-pass Apr 13 2007, 23:01

Класс для работы с CAN контроллера AT90CAN128.
C++.

 CAN_controller_for_AT90CAN128_.rar ( 9.85 килобайт ) : 1831
 

Автор: backa Apr 14 2007, 12:18

Цитата(Nanobyte @ Mar 31 2007, 23:12) *
Э-э-э-хх, вот если бы залить по отдельным проектам, а то интересует 3-4 темы, а качать 82 МБ тяжко... sad.gif

__tp://www.reverseelectronics.com/AVRproject/
тут в "розницу" smile.gif по-штучно
Выбирай что нравиться и качай smile.gif

а тут фотки
__tp://www.sonsivri.com/forum/index.php?topic=2303.0

Автор: umup May 15 2007, 03:22

вот немного :
http://electronix.ru/redirect.php?http://umup.narod.ru/ul_c_lib.zip

Автор: Serg_greS Jun 9 2007, 04:02

Вот нашел несколько вещей на досуге, думаю будет интересно:
на h__p://www.harbaum.org/till/index.html:
Подключение HD44780 через USB h__p://www.harbaum.org/till/lcd2usb/index.html
USB->i2c h__p://www.harbaum.org/till/i2c_tiny_usb/index.html
SPI2CF, a fast and efficient WLAN interface for the AVR h__p://www.harbaum.org/till/spi2cf/index.html

на h__p://www.ulrichradig.de/site/atmel/avr_webserver/
не немецком, но понять несложно AVR webServer - Gerдte ьber HTTP schalten

Автор: Serg_greS Jul 4 2007, 11:24

h_tp://barello.net/avrx/index.htm
AvrX is a Real Time Multitasking Kernel written for the Atmel AVR series of micro controllers

Автор: IgorKossak Jul 10 2007, 18:18

Как то пытался использовать AVRx RTOS.
Проект сырой (есть глюки) и трудно развиваемый. Не говоря уже о переносимости.
Последние обновления были два года назад.
На мой взгляд автор утратил интерес к проекту. Тем более, что существуют много более удачных альтернатив на С/С++.
Скоростные преимущества обсуждаемого проекта на мой взгляд мизерны.

Автор: Serg_greS Jul 31 2007, 09:42

Еще немного библиотек
h__p://www.ember.com/pdf/EM260/HAL

Код
adc.h     Sample A/D converter driver, for multiple users
button.h     Sample API functions for using push-buttons
buzzer.h     Sample API functions for playing tunes on a piezo buzzer
crc.h     Functions that provide access to cyclic redundancy check calculation
dev0470.h     Functions specific to the dev0470 breakout board
ember-types.h     Ember data type definitions
error-def.h     Return code definitions for EmberZNet stack API functions
error.h     Return codes for Ember API functions and module definitions
hal.h     Generic set of HAL includes for all platforms
iar.h     Compiler/platform-specific definitions and typedefs for the IAR AVR C compiler
led.h     Sample API funtions for controlling LEDs
micro.h     Functions common across all microcontroller-specific files
random.h     Functions that provide access to random numbers
reserved-ram.h     Memory allocations that allow for data sharing between the normally running application and bootloader
hal/micro/serial.h     Serial hardware abstraction layer interfaces
app/util/serial/serial.h     High-level serial communication functions
spi-protocol.h    Example AVR SPI Protocol implementation for interfacing with EM260
spi.h     Generic SPI manipulation routines
system-timer.h     Functions that provide access to the system clock
avr-atmega/32/system-timer.h     Functions that provide access to the system clock for ATmega32 microcontroller
uart.h     Prototypes and defines for the hardware-specific UARTs

h__p://www.ember.com/pdf/EM250/HAL/

Автор: Serg_greS Aug 3 2007, 11:50

Цитата
но как добраться к тем хэдерам

в смысле к самим реализациям? а не только прототипам?
наверное все остальное в их ИДЕ h__p://www.ember.com/products_zigbee_development_tools_debuggers.html
Стек EmberZNet предоставляется пользователям продукции Ember по запросу h__p://www.efo.ru/cgi-bin/go?2508#n21
и бесплатно (at90: Стэк Ембер как всегда даёт бесплатно.) http://electronix.ru/forum/index.php?s=&showtopic=12537&view=findpost&p=95173

Автор: dimka76 Aug 16 2007, 11:55

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

 test_float_good_last.rar ( 46.41 килобайт ) : 1579
 

Автор: haker_fox Aug 17 2007, 00:16

Цитата(dimka76 @ Aug 16 2007, 20:55) *
пример проекта умножения с плавающей точкой.
работает быстрее, чем стандартная Си операция благодаря использованию аппаратного умножителя.
Подходит только для серии Mega

bb-offtopic.gif Прошу прощения, а разве современные компиляторы не умеют использовать аппаратный умножитель? Или я Вас неверно понял?

Автор: at90 Oct 1 2007, 06:35

Вот куча исходников для AVR от немцев.
http://electronix.ru/redirect.php?https://141.57.27.10/svn/avr-common-source/

http://electronix.ru/redirect.php?http://www.ifas.htwk-leipzig.de/easytoweb/index.php?content=download

Автор: yarunt Oct 29 2007, 12:01

rc-5 на Алгоритм билдере.Может кому пригодится.

 rc5.rar ( 6.98 килобайт ) : 1285
 

Автор: Waso Oct 31 2007, 04:06

Выкладываю портированный мною под ИАР TCP-IP стек LwIP из демо FreeRTOS для отладочной платы AT91SAM7X-EK. Он все еще выдает некоторое количество варнингов, но они связаны с выключенным дебагом. Работает web-сервер, отвечает на пинги. Перед прошивкой нужно задать айпишники в хедере sam7_emac.h. Версия lwIP - 1.1.0. Когда попытался прикрутить более новую - удивился как много оставлено для дописывания ручками в исходниках.

Благодарю за помощь в освоении С и IAR местных гуру и особенно Сергей Борщ.

 lwIP4IAR.ZIP ( 784.67 килобайт ) : 3498
 

Автор: INT1 Oct 31 2007, 13:41

Здесь есть библиотеки для MODBUS
http://electronix.ru/redirect.php?http://freemodbus.berlios.de/index.php
Поскольку free, то естественно WinAVR, но и не только для AVR. Прошу прощения если повторяюсь, 9стр. перелистывать неохота.

Автор: INT1 Nov 6 2007, 17:51

Цитата(umup @ Nov 6 2007, 15:21) *
что-то получается слишком большой размер кода. у меня RTU поместился в 500 байт Flash и 30 ОЗУ

Дело еще в том, на сколько код "откатан" в железе. Немного поизучали эту тему, но в последствии выяснилось, что в реализации всего протокола нет необходимости, а возможные коллизии обошли таймаутами. В сети попадлись вопросы в этой связИ, вот еще ветка:
http://electronix.ru/redirect.php?http://www.fulcrum.ru/cgi-bin/bbs/mess_sel_i.pl?v=i&FID=1&TID=4245&page=&Sp=0&LID=0
Если Вы приаттачите свой исходик, то буду признателен.

Автор: umup Nov 6 2007, 19:31

вот кусок :
http://electronix.ru/redirect.php?http://www.ukpyr.narod.ru/mb_clp.c
правда там только функция 3, но при желании несложно добавить и другие.

Автор: Сергей Борщ Nov 6 2007, 22:43

Цитата(Waso @ Oct 31 2007, 06:06) *
Выкладываю портированный мною под ИАР TCP-IP стек LwIP
А как все начиналось... smile.gif
Цитата(Waso @ Dec 19 2005, 18:29) *
Предлагаю сюда скидывать
...
Самому мне правда пока нечего выкинуь. Наоборот, нужны исходники для стандартного текстового ЖКИ-дисплея, клавиатуры 4х4, АЦП, ШИМ и пользовательского интерфейса.


Пополню копилку. Даже не исходником, а полезным приемом. Навеяно несколькими вопросами в последнее время, когда "все не работает" потому что программа ушла в необъявленный обработчик прерывания. Можно поставить на все неиспользуемые обработчики заглушки, но, во-первых, это не решение, а расчалка и распорка. А во-вторых не всякий флаг прерывания сбрасывается от самого факта входа в обработчик. Т.е. попали в заглушку, вышли из нее, тут же снова попали... Заглушка позволяет локализовать проблему. Но если заглушек несколько, возникает вопрос - в какую из них попадает программа? Хорошо, если есть много свободных ног - можно в каждой заглушке махать своей ногой. Но опять же есть неудобство - искать точки на плате, куда подключиться осциллографом, и перебирать их щупом. Идея в том, чтобы использовать одну ногу, а конкретное место программы, где нога шевелится, определять по скважности генерируемого сигнала:
Код
ISR(ADC_vect)
{
    for(;;)
    {
        on(TEST);
        _nop();
        _nop();
        _nop();
        off(TEST)
    }
}
ISR(UDRE_vect)
{
    for(;;)
    {
        _nop();
        on(TEST);
        _nop();
        _nop();
        off(TEST)
    }
}
......
ISR(UDRE_vect)
{
    for(;;)
    {
        _nop();
        _nop();
        on(TEST);
        _nop();
        off(TEST)
    }
}
.......
ISR(TIMER2_COMP_vect)
{
    for(;;)
    {
        _nop();
        _nop();
        _nop();
        on(TEST);
        off(TEST)
    }
}
Отсчитать скважность можно буквально по клеткам на экране.


P.S. Тема получилась очень полезная и давно переросла подфорум AVR. Не пора ли ее переместить куда-то в более общее место?

Автор: ASZ Nov 15 2007, 06:41

Мои 0,5 копейки:

Реализация форматированного преобразования int в ASCII-строку.
Использован алгоритм, предложенный =AVR='ом:

Код
void ltoa_fmt(long val, s_char length, u_char *buff)
{
long ltemp;
int itemp;
s_char binc,atemp;
u_char *ptr1, *ptr2;

  ptr1 = buff;

  if (val<0)
   {
     val = -val;
     *buff++ = '-';
   }

  atemp='0';
  ltemp=1000000;
    while(val >= ltemp)
    {
      atemp++;
      val-=ltemp;
    };
  if(atemp != '0')
    *buff++=atemp;
  atemp='0';
  ltemp=100000;
    while(val >= ltemp)
    {
      atemp++;
      val-=ltemp;
    };
  if(atemp != '0')
    *buff++=atemp;
  atemp='0';
  itemp=10000;
    while(val >= itemp)
    {
      atemp++;
      val-=itemp;
    };
  if(atemp != '0')
    *buff++=atemp;
  atemp='0';
  itemp=1000;
    while(val >= itemp)
    {
      atemp++;
      val-=itemp;
    };
  if(atemp != '0')
    *buff++=atemp;
  atemp='0';
  itemp=100;
    while(val >= itemp)
    {
      atemp++;
      val-=itemp;
    };
  if(atemp != '0')
    *buff++=atemp;
  atemp='0';
  binc=(char)val;
    while(binc >= 10)
    {
      atemp++;
      binc-=10;
    };
  if(atemp != '0')
    *buff++=atemp;
  binc += '0';
  *buff=binc;

  atemp = buff - ptr1 + 1;
  ptr2 = ptr1 + length-1;
  while(atemp--)
    *ptr2-- = *buff--;
  atemp = ptr2 - ptr1 + 1;
  while(atemp--)          
    *ptr2-- = ' ';
}

Автор: umup Nov 15 2007, 10:35

bin2bcd AVR :

Код
u32 bin2bcd_u32(u32 data, u8 result_bytes) NAKED;
u32 bin2bcd_u32(u32 data, u8 result_bytes)
{asm volatile(
  "push __tmp_reg__ \n push r26 \n push r27 \n push r30 \n push r31 \n"
  "mov __tmp_reg__, %A1   \n" /*number of bytes in result*/
   "bin2bcd_u32_00:       \n" /*correct input number by left shifts*/
     "mov r31, %A0        \n"
     "mov %A0, %B0        \n"
     "mov %B0, %C0        \n"
     "mov %C0, %D0        \n"
     "mov %D0, r31        \n"
     "dec __tmp_reg__     \n"
     "brne bin2bcd_u32_00 \n"
  
   "eor r26, r26          \n" /*clear result*/
   "eor r27, r27          \n"
   "eor r30, r30          \n"
   "eor r31, r31          \n"
   "mov __tmp_reg__, %A1  \n"
   "lsl __tmp_reg__ \n lsl __tmp_reg__ \n lsl __tmp_reg__ \n" /*__tmp_reg__=size in bits*8*/
  
   "bin2bcd_u32_01:       \n" /*shift loop*/
    "subi r26,-0x33       \n" /*add 0x33*/
    "sbrs r26, 3          \n" /*if carry to bit 3,*/
    "subi r26, 3          \n" /*subtract 3*/
    "sbrs r26, 7          \n" /*if carry to bit 7,*/
    "subi r26, 0x30       \n" /*subtract 0x30*/
    "subi r27,-0x33       \n" /*add 0x33*/
    "sbrs r27, 3          \n" /*if carry to bit 3,*/
    "subi r27, 3          \n" /*subtract 3*/
    "sbrs r27, 7          \n" /*if carry to bit 7,*/
    "subi r27, 0x30       \n" /*subtract 0x30*/
    "subi r30,-0x33       \n" /*add 0x33*/
    "sbrs r30, 3          \n" /*if carry to bit 3,*/
    "subi r30, 3          \n" /*subtract 3*/
    "sbrs r30, 7          \n" /*if carry to bit 7,*/
    "subi r30, 0x30       \n" /*subtract 0x30*/
    "subi r31,-0x33       \n" /*add 0x33*/
    "sbrs r31, 3          \n" /*if carry to bit 3,*/
    "subi r31, 3          \n" /*subtract 3*/
    "sbrs r31, 7          \n" /*if carry to bit 7,*/
    "subi r31, 0x30       \n" /*subtract 0x30*/
    "lsl r26 \n rol r27 \n rol r30 \n rol r31 \n" /*shift out buffer*/
  
    "sbrc %D0, 7          \n" /*skip if msbit of input =0*/
    "ori  r26, 1          \n" /*set lsb of output*/
    "lsl %A0 \n rol %B0 \n rol %C0 \n rol %D0 \n"/*shift input*/
  
    "dec __tmp_reg__      \n"
    "brne bin2bcd_u32_01  \n" /*repeat for all bits*/
  
    "movw r22, r26        \n" /*move result*/
    "movw r24, r30        \n"
    "pop r31 \n pop r30 \n pop r27 \n pop r26 \n pop __tmp_reg__\n"
    "ret \n"
  : :"r"(data),"r"(result_bytes):"r0","r26","r27","r30","r31" /*input and output parameters*/
  );


bin2bcd C :
Код
u32 bin2bcd_u32(u32 data, u8 result_bytes)
{u32 result = 0; /*result*/
  u8 u8_1;
  for (u8_1 = (4 - result_bytes); u8_1; u8_1--) data <<= 8; /*adjust input bytes*/
  for (u8_1 = (result_bytes << 3); u8_1; u8_1--) /*bit shift loop*/
  {u8 u8_2, u8_3;
   /*result BCD nibbles correction*/
   result += 0x33333333;
   /*result correction loop*/
   for (u8_3 = 4; u8_3; u8_3--)
   {u8_2 = result >> 24;
    if (!(u8_2 & 0x08)) u8_2 -= 0x03;
    if (!(u8_2 & 0x80)) u8_2 -= 0x30;
    result <<= 8; /*shift result*/
    result |= u8_2; /*set 8 bits of result*/
   }
   /*shift next bit of input to result*/
   result <<= 1;
   if (((u8)(data >> 24)) & 0x80) result |= 1;
   data <<= 1;
  }
  return(result);
}


bcd2bin AVR (GCC) :
Код
u32 bcd2bin_u32(u32 data, u8 result_bytes) NAKED;
u32 bcd2bin_u32(u32 data, u8 result_bytes)
{asm("push __tmp_reg__ \n push r26 \n push r27 \n push r30 \n push r31 \n"
  "eor r26, r26           \n" /*clear result*/
  "eor r27, r27           \n"
  "eor r30, r30           \n"
  "eor r31, r31           \n"
  "mov __tmp_reg__, %A1   \n"
  "lsl __tmp_reg__ \n lsl __tmp_reg__ \n lsl __tmp_reg__ \n" /*__tmp_reg__=input parameter size in bits*/

   "bcd2bin_u32_00:       \n" /*bits shift loop*/
  
    "lsr r31 \n ror r30 \n ror r27 \n ror r26 \n" /*shift out buffer*/
  
    "sbrc %A0, 0          \n" /*move lowest bit*/
    "ori  r31, 0x80       \n"
  
    "lsr %D0 \n ror %C0 \n ror %B0 \n ror %A0 \n"
  
    "sbrc %D0, 7          \n" /*if carry to bit 7,*/
    "subi %D0, 0x30       \n" /*subtract 0x30*/
    "sbrc %D0, 3          \n" /*if carry to bit 3,*/
    "subi %D0, 3          \n" /*subtract 3*/
    "sbrc %C0, 7          \n" /*if carry to bit 7,*/
    "subi %C0, 0x30       \n" /*subtract 0x30*/
    "sbrc %C0, 3          \n" /*if carry to bit 3,*/
    "subi %C0, 3          \n" /*subtract 0x30*/
    "sbrc %B0, 7          \n" /*if carry to bit 7,*/
    "subi %B0, 0x30       \n" /*subtract 0x30*/
    "sbrc %B0, 3          \n" /*if carry to bit 3,*/
    "subi %B0, 3          \n" /*subtract 3*/
    "sbrc %A0, 7          \n" /*if carry to bit 7,*/
    "subi %A0, 0x30       \n" /*subtract 0x30*/
    "sbrc %A0, 3          \n" /*if carry to bit 3,*/
    "subi %A0, 3          \n" /*subtract 3*/
  
    "dec __tmp_reg__      \n" /*repeat for all bits*/
    "brne bcd2bin_u32_00  \n"
  
   "movw r22, r26         \n" /*adjust result bytes*/
   "movw r24, r30         \n"
    "bcd2bin_u32_01:      \n"
     "mov __tmp_reg__,r25 \n"
     "mov r25,r24         \n"
     "mov r24,r23         \n"
     "mov r23,r22         \n"
     "mov r22,__tmp_reg__ \n"
     "dec %A1             \n"
     "brne bcd2bin_u32_01 \n"
  
   "pop r31 \n pop r30 \n pop r27 \n pop r26 \n pop __tmp_reg__ \n"
   "ret \n"
   : :"r"(data),"r"(result_bytes):"r0","r26","r27","r30","r31" /*input and output parameters*/
  );
}


bcd2bin C :
Код
u32 bcd2bin_u32(u32 data, u8 input_bytes)
{u32 result = 0; /*result*/
  u8 cnt_bits, cnt_bytes, tmp_byte;
  for (cnt_bits = (input_bytes << 3); cnt_bits; cnt_bits--)
  {/*shift next bit*/
   result >>= 1;
   if (((u8)(data)) & 0x01) result |= 0x80000000;
   data >>= 1;
   {/*BCD correction of result*/
    for (cnt_bytes = 4; cnt_bytes; cnt_bytes--)
    {tmp_byte = (data >> 24);
     if (tmp_byte & 0x80) tmp_byte -= 0x30;
     if (tmp_byte & 0x08) tmp_byte -= 0x03;
     data <<= 8;
     data |= tmp_byte;
    }
   }
  }
  /*adjust result bytes*/
  for (cnt_bits = (4 - input_bytes); cnt_bits; cnt_bits--) result >>= 8;
  return(result);
}



num2asc C - форматированный вывод числа с фикс.запятой в ASCI-буфер (options&7 = общее количество знаков, (options>>4)&7 = положение запятой считая справа, options&8 = 8 - отображать начальные нули, options&80 = 80 - сначала преобразовать в BCD) :
Код
void num2asc_s32(s32 data, u8 *buf, u8 options)
{u8 cnt_chars, point_pos;
cnt_chars = (options & 7); /*number of digits*/
/*convert negative to positive, set '-' flag*/
if (data < 0) {data = -data; options |= 1;} else options &= ~1;
/*if necessary, convert to BCD*/
if (options & 0x80) data = bin2bcd_u32(data, (cnt_chars >> 1) + 1);
cnt_chars++;
/*calculate point position*/
point_pos = cnt_chars - ((options >> 4) & 7);
if (point_pos) point_pos++;
while (cnt_chars) /*digits conversion loop*/
{if ((options & 8) && (data == 0) && (cnt_chars < point_pos))
  {if (options & 1) *buf = asc_minus; else *buf = asc_space;
   options &= ~1;
  } else
   {if ((cnt_chars == point_pos) && (options & 0x70)) /*store point*/
    {*buf = asc_point;
     cnt_chars--;
     buf--;
    }
    *buf = bin2asc_u8(data); /*store ASCII digit*/
   }
  cnt_chars--;
  buf--;
  data >>= 4;
}
if (options & 1) *buf = asc_minus;
}

Автор: alekseyb Dec 7 2007, 02:58

Подсчет CRC для DALLAS 1Wire устройств.Работает очень быстро.

unsigned char crc_ib(unsigned char __crc,unsigned char data)
{
unsigned char temp;
temp=__crc^data;
__crc=0;
if (temp&(1<<7)){__crc^=0x8C;}
if (temp&(1<<6)){__crc^=0x46;}
if (temp&(1<<5)){__crc^=0x23;}
if (temp&(1<<4)){__crc^=0x9D;}
if (temp&(1<<3)){__crc^=0xC2;}
if (temp&(1<<2)){__crc^=0x61;}
if (temp&(1<<1)){__crc^=0xBC;}
if (temp&(1<<0)){__crc^=0x5E;}
return __crc;
}

Автор: SasaVitebsk Dec 16 2007, 11:11

Матричная клавиатура. Гашение дребезга. Ввод-вывод. Ввод символьной информации методом нескольких нажатий. Всё для IAR C.

Для того, чтобы не вносить дополнительных ошибок выкладываю процедуры и библиотеки "как есть" из своего проекта. Всё однозначно рабочее. Клавиатура применена 3х4 с маркировкой как для АОНа. (Использовались данные толкатели). Библиотеки будут вложены, а примеры применения и некоторые подпрограммы - здесь.

Для реализации символьного ввода используется п/п динамического ввода на клавишу из библиотеки клавиатуры. Всё реализовано для atmega8/88

Инициализация

Код
// Инициализировать таймер 0 и прерывания для опроса клавиш
#if __ATmega88__
  TCCR0A = 0x02;                                            // Режим СТС
  TCCR0B = 0x5;                                                // FCLK/1024 (14.4KHz/69.4mks)
  OCR0A = T_INT_TIM*1000000/1024/TCLK;                        // прерывание T_INT_TIM ms
  TIMSK0 = 2;                                                // Прерывания от CTC
#elif __ATmega8__
  TCCR0 = 0x05;                                                // Режим NORMAL, FCLK/1024 (14.4KHz/69.4mks)
  TIMSK |= 1;                                                // Прерывания от переполнения
#endif
// Инициализировать оборудование
  DelayInit();                                                // Инициализация таймера
  LCDInit();                                                // Инициализировать LCD дисплей
  spliter_init();                                            // Инициализировать сплитер
  KeyInit();                                                // Инициализация клавиатуры
  WakeInit();                                                // Инициализация интерфейса rs485 и протокола WakeUp
  __enable_interrupt();                                        // Разрешить прерывания


Символьный ввод
Код
const uint8_t __flash strkey[10][6] =
{
  {'0',' ','-','=','+',0},
  {'1',',','.',';',':',0},
  {'2','А','Б','В','Г',0},
  {'3','Д','Е','Ж','З',0},
  {'4','И','Й','К','Л',0},
  {'5','М','Н','О',0,0},
  {'6','П','Р','С',0,0},
  {'7','Т','У','Ф','Х',0},
  {'8','Ц','Ч','Ш','Щ',0},
  {'9','Ы','Э','Ю','Я',0}
};



uint8_t    getextchar(void)                                    // Ввести расширенную клавишу
{
  uint8_t    c, index, old, tekc, d;

  
  index=0;
  while(KeyPress()==0);                        // Если установлен бит Int_Key, то клавиша была нажата
  do
  {
    while(KeyPress()!=0);                    // ждём пока клавишу отпустят
    c = getchar();                            // прочитать код клавиши
    old=c;                                    // запомнить последнюю нажатую кнопку
    if(c < '0') return(c);                    // Если клавиши управления, то выйти
    else c -= '0';
    WaitLong = PAUZA;                        // Измерить паузу после нажатия
    tekc=strkey[c][index];                    // текущий символ
    putchar(tekc);                            // вывести
    do
      if(KeyPress()!=0)                        // Если клавиша была нажата снова
      {
        d=KeyPress();                        // прочитать код клавиши
        if(d!=old)return(tekc);                // если изменили клавишу, то выйти
        index++;                            // Следующий символ из ряда
        if(strkey[c][index]==0)index=0;        // если конец ряда, то выйти
        putchar(CR_BS);                        // Забить предыдущий символ
        break;
      }
    while(WaitLong!=0);
  }
  while(WaitLong!=0);
  return(tekc);
}


Само прерывание опроса клавиатуры и меток времени
Код
#ifdef __PORT88__
#pragma    vector=TIMER0_COMPA_vect                            // Метки времени 10 мс
#else
#pragma    vector=TIMER0_OVF_vect                                // Метки времени 10 мс
#endif
__interrupt    static void    MetkiTime10ms(void)
{

#if __ATmega8__
TCNT0 = -(T_INT_TIM*1000000/1024/TCLK);
#endif
  KeyScan();                                                // Опросить клавиши
  KeyStrSet();                                              // выставить строку
  if(WaitLong!=0)WaitLong--;                                // Высчитать задержку
}


 Kls3x4.zip ( 3.47 килобайт ) : 1579
 lcd44780.zip ( 5.18 килобайт ) : 1555
 timerhw.zip ( 1.52 килобайт ) : 1306
 

Автор: Aesthete Animus Dec 18 2007, 09:52

Вот ссылка на классную библиотеку 1-wire:
http://electronix.ru/redirect.php?http://files.dalsemi.com/auto_id/public/owpd310.zip
( http://electronix.ru/redirect.php?http://www.maxim-ic.com/products/ibutton/software/1wire/wirekit.cfm )

А здесь, если порыться, можно найти много полезного по той же части:
http://electronix.ru/redirect.php?ftp://ftp.dalsemi.com/pub/auto_id/softdev/
( http://electronix.ru/redirect.php?ftp://ftp.dalsemi.com/pub/auto_id/softdev/softdev.html )

Автор: amaora Jan 28 2008, 00:15

8бит ЦАП/АЦП, или звуко-проигрыватель PCM/ADPCM (11025Hz) с управлением по EIA-232, или тремя кнопками. писалось в целях ознакомления с AVR, надеюс будет кому то полезно. исходник на C и управляющая прожка под linux, http://electronix.ru/redirect.php?http://www.paravozeg.narod.ru/avr_prog_md.tar.gz

Автор: Kybik Feb 4 2008, 21:08

Исходник (CVAVR) для декодирования IR пульта старых телеков Goldstar.
После приема отправляет по USART. Котроллер Mega16 16МГц; выход TSOPа на INT0(PD2).

Communication Parameters: 8 Data, 1 Stop, No Parity
USART Mode: Asynchronous
USART Baud Rate: 38400

Исходник:
 goldstar.c.txt ( 4.09 килобайт ) : 1748

Автор: Genadi Zawidowski Feb 12 2008, 23:14

AvrStudio + WINAVR, чистый C

Програма управления премником с синтезатором.
С большой библиотекой подпрограмм для управления разнообразными микросхемами DDS и PLL.

Програмный SPI, в минимальном виде обслуживание RAMTRON FRAM, примитивная клавиатура и инкрементный валкодер. Еще одна версия обслуживания HD1602.
Аттачмент - TC1-....

----------------
На китайском форуме нашелся полный проект прерходника USB-RS232 - стандартное CDC устройство.
ATMEGA8 + Philips/NXP PDIUSBD12.
Исходники и схема в аттачменте. Проект минималистский, но похоже рабочий. Во всяком случае, мне помогло кое-в чем разобраться, как с USB бороться.
Оригинал лежит на
http://electronix.ru/redirect.php?http://blog.chinaunix.net/u/3272/showart_245587.html

----------------
Еще один проект ATMEGA162 + Philips/NXP PDIUSBD12.
Внешняя USB звуковая плата для воспроизведения звуком.
С кучей ошибок в коде (кое-где перепутаны выдача кода и данных в Philips), но мне помог на самом начальном этапе. Ввести звук в компютер мне так и не удалось заставить эту программу.
http://electronix.ru/redirect.php?http://www.circuitcellar.com/AVR2004/HA3553.html

A3553.ZIP

Автор: haker_fox Apr 21 2008, 07:30

Цитата(hooky-mars @ Apr 20 2008, 22:36) *
А есть не по табличному способу?

Код
unsigned char crc_8;                                  //в этой переменной считаем CRC8

//Вычисляет и возвращает crc8
void do_crc_8(unsigned char byte)
{
unsigned char ret=crc_8;
unsigned char m=1;
unsigned char l;
for (char j=0;j<8;j++)
    {
    l=((byte&m)?0x8c:0)^((ret&0x1)?0x8c:0);
    ret>>=1;
    ret^=l;
    m<<=1;
    }
crc_8=ret;
}

Автор: haker_fox May 10 2008, 05:36

Интересная http://electronix.ru/redirect.php?http://cdk4avr.sourceforge.net/ Глубоко не копал, но там содержится набор различных инструментов + библиотеки программ для AVR.
Буду рад, если окажется полезной!

Автор: artemm Jun 6 2008, 11:55

Библиотека для IAR AVR для работы с 1-wire, мож кому пригодится

 1_wire.rar ( 1.11 килобайт ) : 1194
 

Автор: Ph. Anatoliy Sep 10 2008, 09:21

Не совсем в тему, но может пригодится.

Библиотека AVR32LIb Altium (6,7)


Ссылки на поекты использующие USB и микроконтроллеры AVR (AVR-USB ).

http://electronix.ru/redirect.php?http://microcpu-info.na.by/index.php?option=com_weblinks&catid=29&Itemid=23

 AVR32LIb_Altium67.zip ( 20.61 килобайт ) : 420
 

Автор: Ph. Anatoliy Sep 10 2008, 18:56

Цитата(VDG @ Sep 10 2008, 17:30) *
Не работает ссылка. Пишет доступ закрыт.


Прошу прощения ... эти гады на na.by закрыли мой сайт ... (слов нет какие они какашки)

Вот ссылки

Проекты в сети реализованные на AVR-USB
http://electronix.ru/redirect.php?http://www.obdev.at/products/avrusb/prjall.html

A Firmware-Only USB Driver for the AVR
http://electronix.ru/redirect.php?http://avrusb.wikidot.com/

Если у вас так же плохо с английским, как и у меня, то могу предложить перевод нескольких страниц.

Собственно перевод.

 ______________________AVR.pdf ( 131.15 килобайт ) : 1167
 

Автор: ARV Nov 7 2008, 15:52

2 ссылки (на этом же форуме): библиотека поддержки AT90CANxxx и пример ее использования. WinAVR. взято из комплекта отладочной платы DVK90CAN1.

http://electronix.ru/forum/index.php?act=Attach&type=post&id=26506
http://electronix.ru/forum/index.php?act=Attach&type=post&id=26516

Автор: Andrew Lekar Nov 24 2008, 13:31

Вот дописал работу с 1-wire slave. Язык - Си.
Можете пользоваться.

Тайминги настроены на 11.059MHz, AtMega16, таймер с предделителем 32 и прерывание по фронту. Схема соединения с линией 1-wire через 2 транзистора (но это не критично).

В архиве кроме того неплохая библиотечка для работы с таймерами. Позволяет повесить несколько виртуальных таймеров на 1 реальный.

Да, у 1-wire много проверок для надёжности работы, поэтому протокол видно не очень явно. Есть код без проверок - более ясный, но он падает при отсутствии мастера.

 tm_slave.rar ( 7.92 килобайт ) : 620
 

Автор: Павлик Dec 15 2008, 11:59

Вот мой код для 44780 , понимаю что тут на асме пишущих мало ...


CODE

long_code_here = ';


// Работа с ЖКИ

// LCD PORTA

// Двухстрочный ЖКИ 16 х 2 ( 20 х 4 ) контроллер 44780 режим 4 бита 5 х 7 точек

.equ rs = PA1 // Выбор регистра ЖКИ
.equ rw = PA2 // Чтение_запись данных в ЖКИ
.equ e = PA3 // Включение разрешения команд
.equ bf = PA7 // Флаг занятости ЖКИ



init_lcd: // Инициализация ЖКИ
cbi porta,rw // RW --> 0
cbi porta,e // E --> 0
cbi porta,rs // RS --> 0
call wait_20ms // ждем 20 милисекунд
ldi data,0x28 // 4 бита режим 5 х 7 точек 2 строки
call lcd_cmd_i // передаем команду в ЖКИ
call wait_20ms // ждем 20 милисекунд
ldi data,0x0C // 4 бита режим 5 х 7 точек 2 строки
call lcd_cmd_i // передаем команду в ЖКИ
call wait_20ms // ждем 20 милисекунд
ldi data,0x28 // 4 бита режим 5 х 7 точек 2 строки
call lcd_cmd_i // передаем команду в ЖКИ
call wait_20ms // ждем 20 милисекунд
ldi data,0x00 //
call lcd_cmd // передаем команду в ЖКИ
call lcd_line1 //
ret // выход

// Register r16 tmp
wait_lcd: // Готовность ЖКИ к приему
ldi tmp,0x0F // загружаем константу
andi tmp,0x0F // выделяем старшую тетраду
out ddra,tmp // выводы 4 5 6 7 порта А - входы
cbi porta,rs // RS --> 0
nop //
sbi porta,rw // RW --> 1
nop //
lcd_busy: // E --> 1
sbi porta,e // E --> 1
nop //
in tmp1,pina // Прочитать содержимое порта А
cbi porta,e // E --> 0
nop //
sbi porta,e // E --> 1
nop //
cbi porta,e // E --> 0
sbrc tmp1,7 // пропуск след команды если сброшен бит 7
jmp lcd_busy // перейти на метку lcd_busy
cbi porta,rw // RW --> 0
ldi tmp,0xFF // загружаем константу
out ddra,tmp // все выводы порта А - выходы
ret // выход

clr_string: // Очистка строки ЖКИ
ldi data,0x20 // загружаем данные пробела
call print_char // выводим на жки
call print_char // выводим на жки
call print_char // выводим на жки
call print_char // выводим на жки
call print_char // выводим на жки
call print_char // выводим на жки
call print_char // выводим на жки
call print_char // выводим на жки
call print_char // выводим на жки
call print_char // выводим на жки
call print_char // выводим на жки
call print_char // выводим на жки
call print_char // выводим на жки
call print_char // выводим на жки
call print_char // выводим на жки
call print_char // выводим на жки
ret // выход

clr_lcd: // Очистка ЖКИ
ldi data,0x01 // загружаем данные
call lcd_cmd // подаем команду
ret // выход

clr_line1: //
call lcd_line1 //
call clr_string //
call lcd_line1 //
ret //

print_char: // Вывод символа / данных на ЖКИ
call wait_lcd //
sbi porta,rs // RS --> 1
jmp send_byte // передаем байт в ЖКИ

send_nibble: // Передача полубайта в ЖКИ
sbi porta,e // E --> 1
in tmp,porta // прочитать содержимое порта
andi tmp,0x0F // и выделить старшую тетраду
andi data,0xF0 // выделить младшую тетраду в регистре
or data,tmp // смешать регистр с данными
out porta,data // выдать в порт А результат
cbi porta,e // E --> 0
ret // выход

lcd_line1:
ldi data,0x80 // Выбор адреса первой строки данных !
call lcd_cmd // передаем команду
ret // выход

lcd_line2:
ldi data,0xC0 // Выбор адреса второй строки данных !
call lcd_cmd // передаем команду
ret // выход

lcd_line3:
ldi data,0x94 // Выбор адреса третьей строки данных !
call lcd_cmd // передаем команду
ret // выход

lcd_line4:
ldi data,0xD4 // Выбор адреса четвертой строки данных !
call lcd_cmd // передаем команду
ret // выход

lcd_cmd: // передача команды в ЖКИ
call wait_lcd //
lcd_cmd_i: // передача команды в ЖКИ при ините
cbi porta,rs // RS --> 0
send_byte: // Передача байта в ЖКИ
sts data_ram,data // сохранить data в ram
call send_nibble // вызвать передачу полубайта
lds data,data_ram // извлечь data из ram
swap data // поменять нибблы местами
call send_nibble // вызвать передачу полубайта
lds data,data_ram //
ret // выход


out_text: // Вывод текста из флеш проца
lsl ZL // Умножаем на 2
rol ZH // регистровую пару
ot_1: // Метка перехода
lpm // загружаем ячейку памяти из флэш
mov data,r0 // копируем данные для вывода
call print_char // выводим данные на ЖКИ
adiw ZL,1 // вычитываем из пары регистров 1
dec loop // отнимаем 1 от счетчика
brne ot_1 // перейти если не равно
ret // выход




Автор: _Pasha Dec 15 2008, 12:38

Цитата(Павлик @ Dec 15 2008, 15:59) *
Вот мой код для 44780 , понимаю что тут на асме пишущих мало ...

Ну, и кто так пишет ? smile.gif
Код
lcd_line1:
ldi   data,0x80       // Выбор адреса первой строки данных !
call  lcd_cmd         // передаем команду
ret                   // выход

lcd_line2:
ldi   data,0xC0       // Выбор адреса второй строки данных !
call  lcd_cmd         // передаем команду
ret                   // выход

lcdcmd:

Особенно понравилась clr_string smile.gif
Вместо call lcd_cmd поставить rjmp lcd_cmd, конечно же, низзя smile.gif
Процедура wait_ХЗ_сколько_мс намертво вешает проц, наверное smile.gif как и wait_lcd.
Так что не позорьтесь.
Лучше бы эти все wait_xxx делать под многопоточную среду типа
Код
lcd_busy:  
; далее по тексту  
cbi    porta,e     // E  --> 0
sbrc   tmp1,7      // пропуск след команды если сброшен бит 7
jmp system; и вот тут мы не вешаемся, а выходим,
                ;давая работать и другим компонентам программы
                ; а там -коррекция стека, сохранение контекста задачи
                ;(минимального - никто не просит все регистры сохранять) итд

Автор: Abrvalg Jan 24 2009, 22:38

Классы для scmRTOS ATmega128

 ATmega128_classes.rar ( 12.88 килобайт ) : 476
 

Автор: ЛеонидК Jan 29 2009, 20:38

Пользуйтесь. Моя библиотека для IAR. Синтезаторы, АЦП и др. Делал для себя под конкретную задачу.
*conf.h в директорию проекта и можно корректировать. У меня библиотека в /avr/inc/my.

 MyIAR.rar ( 49.87 килобайт ) : 971
 

Автор: ARV Feb 16 2009, 08:22

Нашел вот очень занятную ссылочку http://electronix.ru/redirect.php?http://instruct1.cit.cornell.edu/courses/eceprojectsland/STUDENTPROJ/2007to2008/blh36_cdl28_dct23/index.html(atmega32 и т.п.), но никак не удается выкачать исходник... если покопаться, то он присутствует в виде html-страниц, а одним архивом - можно вроде скачать, но при помощи специальной утилиты... если кто выкачает - прошу выложить.

Автор: at90 Feb 16 2009, 09:03

Вот там нашел

 code.zip ( 41.64 килобайт ) : 746
 

Автор: ozzy Feb 19 2009, 08:21

Замена HT1613 на ATTINY2313 c алс с общим катодом. Проэкт под CodeVisionAvr, cхемотехника скопирована с нета.

 HT1613toALS.zip ( 57.67 килобайт ) : 509
 

Автор: GedasL Feb 24 2009, 17:33

Temperature alarm
Temperature alarm with ATMega8 and DS18S20/DS18B20. Set high and low limits with rotary switches
and device will alert you with buzzer and blinking LED's when temperature is out of limits.

Triac Power Regulator/Timer
Single-phase, zero crossing power regulator/timer. Can be used for switching on load for a defined time period, controlling power applied to load, or both functions combined. For example: heater control, soldering iron temperature regulation. 7-segment LED display for time/power indication.Bresenham's algorithm used for control signal distribution.

Countdown timer
Simple timer for switching on load for a defined time period.
Set time period, push the START button and timer will turn on for
a defined time period. After time elapses it will turn off automatically.

http://electronix.ru/redirect.php?http://www.embtron.com/

Автор: artem79 Mar 19 2009, 11:55

Программа для AVR и LCD Nokia 6100.

 mega88_6100.rar ( 44.65 килобайт ) : 876
 

Автор: _Pasha Mar 19 2009, 18:37

[attachment=30862:tn2313_qenc3.rar]Преобразователь сигналов от трех квадратурных энкодеров в импульсы +/-1

Быстродействие 28 тактов. 

Начало обсуждения тут: http://electronix.ru/forum/index.php?showtopic=60502&pid=565043&st=120&#entry565043

[attachment=30879:tn2313_qenc3.zip]

Автор: Павлик Apr 14 2009, 16:55

Кусочек програмки для работы с ЖКИ Nokia 1112i . Потребление 3мА , удобный крепеж ,
с подсветкой белого цвета 7мА. Дальше все можно подавать как и на 3310.

Схемку забыл прикрепить

 

 1110.rar ( 700 байт ) : 633
 

Автор: alex1979 May 6 2009, 06:09

Посмотрите и покритикуйте "мой" наборчик шаблонов для работы с входами/выходами микроконтроллеров AVR на C++(gcc, WinAvr).
Тестировалось на gcc 4.3.0 .
При создании обьектов входа/выхода не инициализируются.

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

Код
...
__port<__port_A> port_A;
__port<__port_B> port_B;
__out<__port_A,__bit_1> out_1;
__out<__port_C,__bit_4> out_4;
__in<__port_C,__bit_5> in_0;

.....

    out_4.set();

    port_A.pin_2.as_output();
    port_A.pin_2.set();


    if(in_0.is_set())
    {
        // что то делаем
    }


 avrio.rar ( 1.73 килобайт ) : 330
 

Автор: Сергей Борщ May 6 2009, 08:33

Цитата(alex1979 @ May 6 2009, 09:09) *
Посмотрите и покритикуйте "мой" наборчик шаблонов
Имена, начинающиеся с подчеркиваний, зарезервированы за компилятором и системными библиотеками. Использовать такие имена для своих сущностей крайне не рекомендуется, можно напороться на конфликт имен. Не сейчас, так в следующей версии компилятора. Было бы интересно посмотреть на результаты компиляции.

Автор: alex1979 May 6 2009, 09:08

Цитата(Сергей Борщ @ May 6 2009, 11:33) *
Имена, начинающиеся с подчеркиваний, зарезервированы за компилятором и системными библиотеками. Использовать такие имена для своих сущностей крайне не рекомендуется, можно напороться на конфликт имен. Не сейчас, так в следующей версии компилятора. Было бы интересно посмотреть на результаты компиляции.

Вот тестовый проект(вся папка).
Проект для Eclipse, WinAVR-20090313, ATmega128

 bitTest.rar ( 14.95 килобайт ) : 360
 

Автор: Limit6715 May 25 2009, 10:21

Библиотека, написанная на С++ для AVR. Пока что позволяет работать с таймерами T1, T0, интерфейсами SPI, TWI. Скоро допишу библиотеку для работы с COM-портом. wassat.gif
http://electronix.ru/redirect.php?http://gitorious.org/avrlib-cpp
Для тех, у кого есть git: git clone git://gitorious.org/avrlib-cpp/mainline.git

Автор: x736C Jul 22 2009, 12:13

Генератор прошивки для AVR на Vbasic.

1. Формирование данных. Например подсчет коэффициентов. (В пример не входит).
2. Подстановка данных в заранее заготовленные поля программы.
3. Подсчет контрольных сумм.
4. Запись в файл.
Название файла прошивки в примере сформировано из конкретных коэффициентов.
Чтобы не было путаницы, каждая прошивка получается подписанной.

Технология очень удобная, программу можно очень быстро реализовать даже в Ворде. Доступ к программе можно закрыть.
 hex_generator.zip ( 1.27 килобайт ) : 472
Пример asm-исходника прилагается.

Автор: x736C Jul 22 2009, 16:22

Может кому-нибудь пригодится.

Кодер, декодер Меггита циклического (7,4)-кода Хемминга со стираниями.
Исправляет до двух ошибок.
На ассемблере под AVR.
 fec.zip ( 1.17 килобайт ) : 583

Кодер при желании можно сильно облегчить, заменив на табличный.

Точнее гарантированно исправляет 1 ошибку + 1 стирание.

Автор: Goodefine Aug 1 2009, 16:42

Мой вариант IR-декодера (Си), позволяющего распознавать коды пультов ДУ, для трех nec-оподобных протоколов.
Для наглядности, скрины посылок с автоповтором
nec:


JVC:

Samsung:

Формат данных: "(trigger,device_high,device_low,command)"

Разделение адресов устройств сделано для extended вариантов, когда части адресов не равны друг-другу.
Тестовый проект прикреплен. Легко переносится на любой контроллер...
 nec_ir_decoder.rar ( 6.15 килобайт ) : 1027

Автор: amaora Aug 25 2009, 18:26

RTOS, кратко: вытесняющая многозадачность, простой API ядра, отдельный стек для прерываний, язык С, компилятор GCC. В архиве весь проект в котором ОС и используется.

http://electronix.ru/redirect.php?http://paravozeg.narod.ru/avr_os-090825.tar.gz

Автор: designer Aug 30 2009, 18:52

Статья и исходники для AT90USB162 USB-CDC
http://electronix.ru/redirect.php?http://suz-avr.sblo.jp/category/780477-1.html
http://electronix.ru/redirect.php?http://www.nmj.sumomo.ne.jp/suz-avr/USB162/

Автор: Dx! Sep 9 2009, 18:55

CORDIC - быстросходящийся алгоритм, в аттаче реализован способ быстро восстановить угол по синусу и косинусу и пример применения в USB джойстике для получения угла вращения магнита с магниторезистивного двухосевого датчика 2SA-10. (библиотеки LUFA для USB AVR качайте отдельно - http://electronix.ru/redirect.php?http://www.fourwalledcubicle.com/LUFA.php )

Cod360 - Код для 360 градусов, например значение 36000.
Step - количество итераций. Чем точнее АЦП тем больше итераций имеет смысл делать. Для 10 бит АЦП, встроенного в AVR разумно делать 6-10. Таблица арктангенсов вбита для 16.

WinAVR C

 CORDIC.rar ( 20.07 килобайт ) : 841
 

Автор: injen-d Sep 13 2009, 12:48

Выкладываю первую версию своей библиотеки для работы с алфавитно-цифровыми ЖК-модулями на основе HD44780-совместимых контроллеров.
Библиотека написана на С++. Данная версия для микроконтроллеров AVR и компилятора GCC. Тестировалась с AVR-GCC 4.3.2 (WinAVR 20090313).

Цель библиотеки - максимально упростить испльзование ЖК-модулей данного типа, за счет:
- автоматической генерации кода низкоуровневых функций;
- предоставления пользователю максимальной свободы при выборе места и способа подключения ЖК-модуля;
- отсутствия ограничений на количество одновременно подключенных модулей;
- предоставления пользователю:

- набора базовых функций: get_status, wait_ready, send_cmd, wr_data_byte, rd_data_byte;
- набора типовых функций вывода: символов, чисел, строк, а так же вспомогательных функций;
- набора функций, реализующих некоторые визуальные эффекты.

Более подробное описание в файле SDL_info.txt.

Данная версия является пробной, поэтому жду вопросов, предложений и отзывов, на основе которых проэкт будет развиваться, либо уйдет в небытие, если это нафиг ни кому не надо.
Библиотека тестировалась на модуле DV16100 и на моделях Протеуса, поэтому просьба к тем, у кого есть возможность(и желание),
проверить библиотеку на реальных ЖК-модулях и написать, если возникнут проблемы.

 SDLibrary__v1.0_AVR_GCC.7z ( 38.55 килобайт ) : 808

внутри два архива:
SDLibrary++v1.0_AVR_GCC_11.09.2009.7z - содержит библиотеку с примерами,
SDLibrary++_show.7z - содержит файл проэкта Протеуса, на который расчитаны примеры.

PS: Модели Протеуса не отображают самую нижнюю строку пикселей (предназначенную для отображения курсора) при использовании пользовательских символов,
из-за чего наблюдаются искажения при отображении эффектов типа level. В реальном модуле все должно выглядеть нормально.

Автор: zltigo Sep 13 2009, 13:04

Цитата(injen-d @ Sep 13 2009, 14:48) *
либо уйдет в небытие...

Это будет правильным решением sad.gif
Посмотрел. На данный момент это графоманство чистой воды - желание писать несомненно есть, но со всем остальным, начиная с чисто ремесленных навыков, очень большой напряг sad.gif

Автор: injen-d Sep 13 2009, 13:36

Цитата(zltigo @ Sep 13 2009, 17:04) *
Посмотрел. Это будет правильным решением sad.gif

Ну, именно от Вас я ожидал подобной фразы...
Аргументируйте, если не трудно.
Пусть будет мне наукой.

Я, конечно, не претендую на звание "образец стиля" в написании программ, если Вы это имели ввиду под чисто ремесленными навыками, это оттачивается с годами.
Нельзя ли конкретней? А то Вы только интригуете подобными фразами. Мне снизу не видно! laughing.gif

Автор: sansnotfor Oct 26 2009, 13:51

для работы с инкрементным энкодером  encoder.rar ( 1.07 килобайт ) : 1019

для преобразования двоичных чисел в двоично десятичные и вывода на lcd  bcd.rar ( 1.36 килобайт ) : 839

знакогенератор для LCD от Nokia3310  DriverNokia3310Tx.rar ( 6 килобайт ) : 732

библиотека для работы с LCD от Nokia3310 с видео буфером. нужно от 1 КБ ОЗУ.  DriverNokia3310vb.rar ( 6.77 килобайт ) : 708

Автор: demiurg_spb Oct 27 2009, 15:16

Модуль доступа к 16-и битным регистрам AVR (для avr-gcc).

CODE
=======================================================================
=====
#define avr_read_word_atomic(addr) \
(__extension__({ \
uint16_t __addr16 = (uint16_t)(addr); \
uint16_t __result; \
__asm__ __volatile__ \
( \
"in __tmp_reg__,__SREG__" "\n\t" \
"cli" "\n\t" \
"ldd %A0,%a1+0" "\n\t" /*lo*/ \
"out __SREG__, __tmp_reg__" "\n\t" \
"ldd %B0,%a1+1" /*hi*/ \
: "=r" (__result) /* output operands */ \
: "e" (__addr16) /* input operands */ \
: "memory" /* list of clobbered registers */ \
); \
__result; \
}))

// ============================================================================
#define avr_write_word_atomic(addr,value) \
(__extension__({ \
uint16_t __addr16 = ((uint16_t)(addr)); \
uint16_t __value = (uint16_t)(value); \
__asm__ __volatile__ \
( \
"in __tmp_reg__,__SREG__" "\n\t" \
"cli" "\n\t" \
"std %a1+1,%B0" "\n\t" /*hi*/ \
"out __SREG__, __tmp_reg__" "\n\t" \
"std %a1+0,%A0" /*lo*/ \
: /* output operands */ \
: "r" (__value), /* input operands */ \
"e" (__addr16) \
: "memory" /* list of clobbered registers */ \
); \
}))


 avr_reg16.zip ( 706 байт ) : 278
 

Автор: Genadi Zawidowski Nov 2 2009, 22:02

Цитата(sansnotfor @ Oct 26 2009, 16:51) *
для работы с инкрементным энкодером  encoder.rar ( 1.07 килобайт ) : 1019

для преобразования двоичных чисел в двоично десятичные и вывода на lcd  bcd.rar ( 1.36 килобайт ) : 839

знакогенератор для LCD от Nokia3310  DriverNokia3310Tx.rar ( 6 килобайт ) : 732

библиотека для работы с LCD от Nokia3310 с видео буфером. нужно от 1 КБ ОЗУ.  DriverNokia3310vb.rar ( 6.77 килобайт ) : 708


Добавлю-ка я вариант с учетверением количества импульсов валкодера. indent-ы в исходном тексте съела форма ответа на сообщение...

CODE
static uint_least8_t old_val;

void spool_encinterrupt(void)
{
uint_least8_t new_val = hardware_get_encoder_bits(); /* Состояние фазы A - в бите с весом 2, фазы B - в бите с весом 1 */

// dimensions are:
// old_bits new_bits
const static int_least8_t v [4][4] =
{
{
+0, /* 00 -> 00 stopped */
-1, /* 00 -> 01 rotate left */
+1, /* 00 -> 10 rotate right */
+0, /* 00 -> 11 invalid combination */
},
{
+1, /* 01 -> 00 rotate right */
+0, /* 01 -> 01 stopped */
+0, /* 01 -> 10 invalid combination */
-1, /* 01 -> 11 rotate left */
},
{
-1, /* 10 -> 00 rotate left */
+0, /* 10 -> 01 invalid combination */
+0, /* 10 -> 10 stopped */
+1, /* 10 -> 11 rotate right */
},
{
+0, /* 11 -> 00 invalid combination */
+1, /* 11 -> 01 rotate right */
-1, /* 11 -> 10 rotate left */
+0, /* 11 -> 11 stopped */
},
};


rotate += v [old_val][new_val];

old_val = new_val;
}

ISR(INT0_vect)
{
spool_encinterrupt();
}

ISR(INT1_vect)
{
spool_encinterrupt();
}

void encoder_clear(void)
{
rotate2 = 0;
disableIRQ();
rotate = 0;
tickcount = TICKCOUNT_MAX;
enableIRQ();
}
/* получение количества шагов и времени с последнего вызова. */
int
encoder_snapshot(
uint_least8_t * ticks,
uint_least8_t derate)
{
div_t h;
int hrotate;

disableIRQ();
if (tickcount != 0)
{
* ticks = tickcount;
tickcount = 0;
hrotate = rotate;
rotate = 0;
}
else
{
* ticks = 1;
hrotate = 0;
//hrotate = rotate;
//rotate = 0;
}
enableIRQ();

/* Ументшение разрешения валкодера в зависимости от установок в меню */
h = div(hrotate + rotate2, derate);

rotate2 = h.rem;

return h.quot;
}


/* получение "редуцированного" количества прерываний от валкодера.
* То что осталось после деления на scale, остается в накопителе
*/

int getRotateLoRes(void)
{
uint_least8_t ticks;
return encoder_snapshot(& ticks, ROTATE_LORES_DIV * hiresdiv);
}

Автор: AndryG Dec 28 2009, 11:20

Простой программный UART-передатчик. http://electronix.ru/redirect.php?http://www.remexpert.com/ipb/ipb.html?automodule=blog&blogid=4&showentry=155 Удобно в Proteus нацепить на reset-вывод.
Код работает под IAR и CodeVisionAVR. (добавите WinAVR - буду рад добавить в исходник)
В архиве (функция и проекты IAR, CV, Proteus)

http://electronix.ru/redirect.php?http://www.remexpert.com/ipb/index.php?act=attach&type=blogentry&id=1914

Автор: sansnotfor Jan 2 2010, 23:31

Простой драйвер символьного lcd на основе контроллеров ks0066. Проверка флага занятости. Поддержка 4-ех и 8-ми разрядной шины. В архиве 2 варианта - для IARa и для WINAVR.
 lcd_winstar.rar ( 3.92 килобайт ) : 762

Автор: microsin Mar 2 2010, 07:20

1. http://electronix.ru/redirect.php?http://microsin.ru/Download.cnt/avr/avr-usb-russian.rar (старое название AVR-USB) - программная реализация протокола USB на AVR. Есть примеры рабочих устройств USB и компутерных программ, работающих с этими устройствами. Библиотека бесплатная. Комментарии в библиотеке и примерах переведены на русский язык.
2. Макетные платы, на которых удобно применять библиотеку V-USB: http://electronix.ru/redirect.php?http://microsin.ru/content/view/605/44/, http://electronix.ru/redirect.php?http://microsin.ru/content/view/655/44/.
3. Макетные платы с аппаратным интерфейсом USB: http://electronix.ru/redirect.php?http://microsin.ru/content/view/685/44/, http://electronix.ru/redirect.php?http://microsin.ru/content/view/779/44/.

Автор: sansnotfor Mar 14 2010, 23:57

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

 Keyboard_driver.rar ( 1.77 килобайт ) : 693
 

Автор: Kir85 Apr 4 2010, 13:28

Работа с графическим дисплеем MT-12232 на ATmega8.

 mt_12232b.rar ( 118.31 килобайт ) : 632

Автор: demiurg_spb Apr 22 2010, 10:26

Небольшая поправочка к моему сообщению №138 в этой ветке форума,
вот так будет вернее:

CODE

============================================================================
#define avr_read_word_atomic(addr) \
(__extension__({ \
uint16_t __addr16 = (uint16_t)(addr); \
uint16_t __result; \
__asm__ __volatile__ \
( \
"in __tmp_reg__,__SREG__" "\n\t" \
"cli" "\n\t" \
"ldd %A0,%a1+0" "\n\t" /*lo*/ \
"out __SREG__, __tmp_reg__" "\n\t" \
"ldd %B0,%a1+1" /*hi*/ \
: "=r" (__result) /* output operands */ \
: "b" (__addr16) /* input operands */ \
: "memory" /* list of clobbered registers */ \
); \
__result; \
}))

// ============================================================================
#define avr_write_word_atomic(addr,value) \
(__extension__({ \
uint16_t __addr16 = ((uint16_t)(addr)); \
uint16_t __value = (uint16_t)(value); \
__asm__ __volatile__ \
( \
"in __tmp_reg__,__SREG__" "\n\t" \
"cli" "\n\t" \
"std %a1+1,%B0" "\n\t" /*hi*/ \
"out __SREG__, __tmp_reg__" "\n\t" \
"std %a1+0,%A0" /*lo*/ \
: /* output operands */ \
: "r" (__value), /* input operands */ \
"b" (__addr16) \
: "memory" /* list of clobbered registers */ \
); \
}))
заменил
"e" (__addr16)
на
"b" (__addr16)

а то вдруг компилятор попытался сгенерить STD X+1,N (мой косяк)
а можно лишь
STD Y+1,N
STD Z+1,N

Автор: maxxx_x Jun 3 2010, 08:56

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;ah:al/bl 86байт 46 тактов
;ah=]ah:al/bl[ остаток
;al=[ah:al/bl] частное
div16_8:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
lsl al ;1
rol ah ;1
sbc ah,bl ;1
brsh koko7 ;2/1
add ah,bl ;1
koko7: rol al ;1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
rol ah ;1
sbc ah,bl ;1
brsh koko6 ;2/1
add ah,bl ;1
koko6: rol al ;1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
rol ah ;1
sbc ah,bl ;1
brsh koko5 ;2/1
add ah,bl ;1
koko5: rol al ;1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
rol ah ;1
sbc ah,bl ;1
brsh koko4 ;2/1
add ah,bl ;1
koko4: rol al ;1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
rol ah ;1
sbc ah,bl ;1
brsh koko3 ;2/1
add ah,bl ;1
koko3: rol al ;1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
rol ah ;1
sbc ah,bl ;1
brsh koko2 ;2/1
add ah,bl ;1
koko2: rol al ;1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
rol ah ;1
sbc ah,bl ;1
brsh koko1 ;2/1
add ah,bl ;1
koko1: rol al ;1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
rol ah ;1
sbc ah,bl ;1
brsh koko0 ;2/1
add ah,bl ;1
koko0: rol al ;1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
com al ;1
ret ;4 6+7*5+5=46
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;



;;;;;;;;;;;;СRC-CCITT_16 0x1021;;;;;;;;;
;CRC-XMODEM (0x1021) Initial value:0x0 ;
; 50 байт ;
; 18 тактов на байт
;Z-sumbol al=dlin ;
;bh:bl=crc-16 ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
crc_home: clr bh ;1
clr bl ;1
crc_plus: push al ;2
push ah ;2
push r1 ;2
push r0 ;2
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
crc_loop1: ld ah,Z+ ;2
eor bh,ah ;1
ldi ah,16 ;1
mul ah,bh ;2
eor bh,r1 ;1
mul ah,bh ;2
eor bl,r0 ;1
add r0,r0 ;1
adc r1,r1 ;1
eor r0,bh ;1
eor r1,bl ;1
movw bh:bl,r1:r0;1
dec al ;1
brne crc_loop1 ;2/1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18
pop r0 ;2
pop r1 ;2
pop ah ;2
pop al ;2
ret ;4
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

Автор: Nuts_ Jun 23 2010, 06:13

Небольшая утилита для Windows с исходниками
Позволяет осуществлять удобное кодирование таблички для 7ми сегментного (семисегментного) индикатора
Откомпилированный фал в папке realise
В программе можно визуально указать какой сегмент к какому выводу контроллера подсоединен
собственно PB и PD указанно для удобства можно читать что там и PA и PE короче PX и PY
в результирующем фале digs.inc будет табличка из .dw биты которого будут соответствовать PXn и PYn

то есть по адресу=адрестаблички+цифра*2 мы получим два байта которые можно сразу outить в PX и PY
ну моджет быть замаскировав неиспользуемые биты

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

 7SEG2.RAR ( 24.69 килобайт ) : 495
 

Автор: war4one Nov 13 2010, 18:46

Энергосчетчик 220 В. Позволяет контролировать напряжение, ток и частоту сети. Гальваническая развязка от сети, интерфейс RS-485.
http://electronix.ru/redirect.php?http://www.ecoo.smasma.com/ADE7753_Energy_meter/

Автор: war4one Nov 17 2010, 05:46

Watchdog таймер для GSM-модема, работающего под управлением внутренней прошивки (например, GE863-GPS, работающего под управлением внутренней Python-программы). Таймер ждет периодических подтверждающих импульсов от GPIO модема, в противном случае перезагружает модем.
http://electronix.ru/redirect.php?http://www.ecoo.smasma.com/GSM_GPS_Modem_Watchdog_monitor/

Комбинированный сенсор для робота. Три акселерометра + три гироскопа + АЦП + контроллер + RS232.
http://electronix.ru/redirect.php?http://www.ecoo.smasma.com/Inertial_Cluster/

Автор: war4one Nov 21 2010, 16:28

GPS GSM трекер. Трекер отправляет хозяину SMS со своими координатами, определенными при помощи GPS приемника. SMS отправляются периодически, в соответствии с заранее определенным интервалом.
http://electronix.ru/redirect.php?http://www.ecoo.smasma.com/GPS_GSM_Tracker/

Автор: sansnotfor Dec 7 2010, 21:17

Драйвер светодиодного семисегментного 4-ех разрядного индикатора. Работает с любым компилятором. Легко настраивается для индикаторов с общим катодом, анодом, включенных напрямую или через транзисторы.

 7seg_driver.rar ( 1.74 килобайт ) : 800
 

Автор: aleksey_g Dec 16 2010, 11:41

Может кому нибудь понадобится...
Драйвер трех шаговиков с шагом 1 градус (можно изменить, поменяв таблицу синусов-косинусов).
Задействован только один таймер и 6 линий одного порта.
Как-то пришлось переделать автомобильный щиток с тремя двухобмоточными шговыми движками в качестве показометров одометра, спидометра и уровня топлива. Какой-то масочный процессор, рулящий этим хозяйством, имеющий 12 PWM-выходов, не показывал никаких признаков жизни.
Упростил схему включения (прилагается) движков, выйдя на 6 PWM-выходов. Немного потерял в крутящем моменте, но для стрелок пойдет.
Таблица синусов-косинусов рассчитана с учетом некоторой нелинейности угла поворота роторов движков.
Сопротивление обмоток двигателей было более 2 килоом. Подключил прямо к ATMEGA162.
Сделано под ИАР. Легко ложится на любой контроллер, имеющий 1 таймер и 6 выходов одного порта.
 motor.rar ( 280.69 килобайт ) : 721

Автор: lsd2k Jan 28 2011, 15:19

Реализация мастера и клиента для Wake протокола. Пример использования там же.


Готовый проект под EWAVR - модуль управления вентилятором охлаждения. 3 ступени температуры, 3 датчика DS18B20, гистерезис.

 wake.rar ( 4.23 килобайт ) : 409
 fancontrol.rar ( 11.78 килобайт ) : 383
 

Автор: Леонид Иванович Feb 26 2011, 10:27

Примеры реализации WAKE для AVR (EWAVR) и PC (C++ Builder).
Старая и новая версии.
В прежних реализациях Wake были две ошибки:

1. При передаче ответа микроконтроллером CRC вычислялась для адреса с установленным старшим битом, а не для истинного адреса, как требует спецификация. Ошибка не проявляется, если используется только нулевой адрес, который в пакете не передается.

2. При передаче ответа микроконтроллером всегда передавался установленный адрес устройства, даже если обратились по нулевому адресу (адрес коллективного вызова). А надо отвечать с тем же адресом, по которому обратились. Ошибка не проявляется, если используется только нулевой адрес.


 Wake.zip ( 481.49 килобайт ) : 704
 

Автор: aleksey_g Mar 18 2011, 13:06

Может кому-то пригодится...
Сделал для себя небольшой графический визуализатор логов и стимулов Аврстудии.
Показывает графиком состояния любых двух пинов из лога или стимула.
Позволяет редактировать. После редактирования нажмите REPAINT.
Поддерживает имя открываемого файла из коммандной строки.
При любых манипуляциях с верхним графиком (увеличение, смещение вправо-влево, изменении размера окна...), нижний график по координатам подстраивается под верхний.
Манипуляции с нижним-независимы.
Думаю, будет полезным для анализа (к примеру) последовательных протоколов, шимов...
 VISILOG.rar ( 203.69 килобайт ) : 391

Автор: SZ0 Apr 1 2011, 10:30

Цитата(aleksey_g @ Mar 18 2011, 19:06) *
Сделал для себя небольшой графический визуализатор логов и стимулов Аврстудии.


В своё время хотел подобное, но только для ввода данных для симулятора. Чтобы по графику генерировался файл и его скармливать студии. Вам осталось только инвертировать работы вашей программы sm.gif

В вашей программе предлагаю расширить до 8 полос графики, т.е. для 8 бит. И сделать так, чтобы пользователь мог задавать их кол-во от 1 до 8. А черодование выводимых ножка/график оставить так же, т.е. выбор бита в окне. Ещё можно добавить в настройки соответствие цикла частоте. И выводить время на графике. При этом при наведении перекрестия курсора показывать время, где стоит курсор. А для выделенного участка показывать его длительность.

Автор: ветерок Apr 1 2011, 16:30

Исходник DELPHI программатора для ATMEL типа ATmega48
Собран на одной микрухе FT232rl +3 кондёра,частотка тож от неё
Пример заточень под ATmega48 но быстро переделывается под любой другой с подобными сигнатарами
так же показывает принципы работы FT232rl и помогает разобраться в протоколах программирования AVR микроконтроллеров
Если отсюда файл пропадёт можно скачать отсюда:
http://electronix.ru/redirect.php?http://izhbazar.ru/viewtopic.php?f=48&t=43#p389
 FT232Prog.rar ( 308.06 килобайт ) : 417

Автор: Павлик Apr 26 2011, 04:58

Код дл работы с 44780 на асме

CODE
// 25.04.2011
// Двухстрочный ЖКИ 16 х 2 (20 х 4) контроллер 44780 режим 4 бита 5 х 7 точек
// Выставляем нужные пины
// tmp1 - РОН
// data - передача данных / команд в ЖКИ
// loop - счетчик цикла при выводе текста
// Z - указатель адреса
// Частота МК 4 000 000 Hz
// если частота выше, в подпрограмме wait_lcd нужно вставить чуть больше nop-ов при дергании пинов

.equ rs = PC1 // Выбор регистра ЖКИ
.equ rw = PC2 // Чтение_запись данных в ЖКИ
.equ e = PC3 // Включение разрешения команд
.equ bf = PC7 // Флаг занятости ЖКИ
.equ LCD = PORTC // порт ЖКИ
.equ LCD_DDR = DDRC // направление порта ЖКИ
.equ LCD_PIN = PINC // вход порта ЖКИ
.equ Line1 = 0x80 // Адрес начала первой строки ЖКИ
.equ Line2 = 0xC0 // Адрес начала второй строки ЖКИ

.equ celsiy = 0x00 // код символа градуса цельсия
.equ antena = 0x01 // код символа антена


USER: // пользовательские символы ( максимум 8 штук )
.db 0x0C,0x12,0x12,0x0C,0x00,0x00,0x00,0x00 // символ градуса цельсия 0х00
.db 0x15,0x15,0x0E,0x04,0x04,0x04,0x04,0x00 // символ антены 0х01



init_lcd: // Инициализация ЖКИ
cbi LCD,rw // RW -> 0
nop //
cbi LCD,e // E -> 0
nop //
cbi LCD,rs // RS -> 0
rcall wait_20ms // ждем 20 милисекунд
ldi data,0x28 // 4 бита режим 5 х 7 точек 2 строки
rcall lcd_cmd_i // передаем команду в ЖКИ
rcall wait_20ms // ждем 20 милисекунд
ldi data,0x0C // 4 бита режим 5 х 7 точек 2 строки
rcall lcd_cmd_i // передаем команду в ЖКИ
rcall wait_20ms // ждем 20 милисекунд
ldi data,0x28 // 4 бита режим 5 х 7 точек 2 строки
rcall lcd_cmd_i // передаем команду в ЖКИ
rcall wait_20ms // ждем 20 милисекунд
rcall clr_lcd // очищаем жки
rcall set_simvols // Установка пользовательских символов
ret // выход

set_simvols: // Установка пользовательских символов для вывода на ЖКИ
ldi data,0x40 // загружаем константу
rcall lcd_cmd // посылаем команду адреса начала пользовательских символов
ldi zl,low (user*2) // загружаем адрес данных L
ldi zh,high(user*2) // загружаем адрес данных H
ldi loop,16 // загружаем количество символов * 8
celsiy_c: // начало цикла загрузки пользовательских символов
lpm data,Z+ // загружаем байт из FLASH с постинкрементом указателя адреса Z
rcall print_char // записываем байт в память ЖКИ
dec loop // счетчик цикла - 1
brne celsiy_c // если счетчик не = 0, то переходим на начало цикла
ret // выход

wait_lcd: // Готовность ЖКИ к приему
in tmp1,LCD_DDR // читаем
andi tmp1,0x0F // выделяем старшую тетраду
out LCD_DDR,tmp1 // выводы 4 5 6 7 порта ЖКИ - входы
cbi LCD,rs // RS -> 0
nop // холостой такт
sbi LCD,rw // RW -> 1
nop // холостой такт
lcd_busy: // E -> 1
sbi LCD,e // E -> 1
nop // холостой такт
in tmp1,LCD_PIN // Прочитать содержимое порта ЖКИ
cbi LCD,e // E -> 0
nop // холостой такт
sbi LCD,e // E -> 1
nop // холостой такт
cbi LCD,e // E -> 0
nop // холостой такт
sbrc tmp1,BF // пропуск след команды если сброшен BF флаг
rjmp lcd_busy // перейти на метку lcd_busy
cbi LCD,rw // RW -> 0
in tmp1,LCD_DDR // Прочитать содержимое порта ЖКИ
ori tmp1,0xF0 // выделяем младшую тетраду
out LCD_DDR,tmp1 // выводы 4 5 6 7 порта ЖКИ - выходы
ret // выход

clr_lcd: // Очистка ЖКИ
ldi data,0x01 // загружаем данные для очистки
rjmp lcd_cmd // подаем команду и очищаем ЖКИ

clr_line1: // Очистка line1
rcall lcd_line1 // выбираем начальный адрес очистки строки 1
ldi loop,16 // загружаем количество символов в строке
ldi data,' ' // загружаем пробел 0х20
rjmp clr_l // очищаем строку
clr_line2: // Очистка line2
rcall lcd_line2 // выбираем начальный адрес очистки строки 2
ldi loop,16 // загружаем количество символов в строке
ldi data,' ' // загружаем пробел 0х20
clr_l: // начало цикла очистки
rcall print_char // выводим на жки
dec loop // счетчик цикла -1
brne clr_l // если не = 0, переходим к началу цикла
ret // выход

print_char: // Вывод данных на ЖКИ
rcall wait_lcd // ждем готовности ЖКИ
sbi LCD,rs // RS -> 1
rjmp send_byte // передаем байт в ЖКИ

send_nibble: // Передача полубайта в ЖКИ
sbi LCD,e // E -> 1
in tmp1,LCD // прочитать содержимое порта
andi tmp1,0x0F // и выделить старшую тетраду
andi data,0xF0 // выделить младшую тетраду в регистре
or data,tmp1 // смешать регистр с данными
out LCD,data // выдать в порт ЖКИ результат
cbi LCD,e // E -> 0
ret // выход

lcd_line1: // Выбор адреса первой строки данных
ldi data,line1 // загружаем данные
rjmp lcd_cmd // передаем команду

lcd_line2: // Выбор адреса второй строки данных
ldi data,line2 // загружаем данные
rjmp lcd_cmd // передаем команду

lcd_cmd: // передача команды в ЖКИ
rcall wait_lcd // ждем готовности ЖКИ
lcd_cmd_i: // передача команды в ЖКИ при ините
cbi LCD,rs // RS -> 0
send_byte: // Передача байта в ЖКИ
push data // сохранить data в STACK
push data // сохранить data в STACK
rcall send_nibble // вызвать передачу полубайта
pop data // извлечь data из STACK
swap data // поменять нибблы местами
rcall send_nibble // вызвать передачу полубайта
pop data // извлечь data из STACK
ret // выход

out_text: // Вывод текста из флеш проца
lpm data,Z+ // загружаем ячейку памяти из флэш с постинкрементом адреса
rcall print_char // выводим данные на ЖКИ
dec loop // отнимаем 1 от счетчика
brne out_text // перейти если не равно
ret // выход

Автор: DiaS Jun 10 2011, 05:54

Цитата(Kir85 @ Apr 4 2010, 16:28) *
Работа с графическим дисплеем MT-12232 на ATmega8.

 mt_12232b.rar ( 118.31 килобайт ) : 632

Кто пробовал запускать ?
Вроде косячок сразу нашел.

bool ReadByte(bool cd, bool l, bool r) {
char b;
if ((l==1)&&(r==1)) return 0; //Читать одновременно из обоих кристаллов недопустимо!
//При необходимости настроить здесь шину данных на ввод
DDRD = 0x00;
//LCD.RW=1; LCD.A0=cd; //Будем читать байт как команду или данные
PORTB_Bit1 = 1; PORTB_Bit6 = cd;
//Delay(>40ns); //Это время предустановки адреса (tAW)
__delay_cycles(1);
//LCD.E1=l; LCD.E2=r; //Выдать нужный строб в индикатор
PORTB_Bit7 = l; PORTB_Bit0 = r;
//Delay(>300ns); //Минимально допустимая длительность сигнала E=1 (время доступа (tACC) попало сюда)
__delay_cycles(1);
//b=LCD.D; //Прочитать данные с шины индикатора (они на ней уже минимум 120нс)
b = PINB; Непонятно что читает?
//LCD.E1=LCD.E2=0; //Сбросить сигналы E1 и E2
PORTB_Bit7 = PORTB_Bit0 = 0;
//Delay(>(2000ns-40ns-300ns)); //Минимально допустимый интервал между сигналами E=1
__delay_cycles(2);
return b; //Вернуть прочитанный байт
}

//Прочитать байт данных из левой половины индикатора
bool ReadDataL(void){
return ReadByte(1,1,0);
}

//Прочитать байт данных из правой половины индикатора
bool ReadDataR(void){
return ReadByte(1,0,1);

Автор: zumanah Jul 1 2011, 06:13

Нормальные уроки по AVR с кодами программ. http://electronix.ru/redirect.php?http://mpcontrol.ru/index.php?option=com_content&view=article&id=53&Itemid=36

Автор: smk Jul 21 2011, 06:59

Поскольку примеры от Atmel занимают много памяти в контроллерах, для которых они предназначены, простора для творчества практически не остается. На основе библиотеки Atmel сделал одну кнопочку на Tiny45. Можно что-то включать/выключать и донавернуть до простейшего интерфейса пользователя, например переходить в режим настройки при длительном удержании. Размер кода 2684 байта.
 QT_t45.rar ( 47.36 килобайт ) : 379

Автор: Леонид Иванович Sep 13 2011, 08:09

Помехоустойчивый декодер RC-5:


 RC5.zip ( 2.43 килобайт ) : 510
 

Автор: sansnotfor Sep 17 2011, 21:20

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

- простая интеграция с готовым проектом
- задействован только 8-ми разрядный таймер т2, при этом остается возможность использовать его для опроса или формирования временных интервалов
- модуль настраивается практически на любую частоту тактового генератора
- высота нот задается в виде символических констант (С0, А2 и т.д) или в Герцах
- длительности задаются в стандартном виде (четверти, восьмые и т.д.) или в миллисекундах
- имеется возможность задавать темп воспроизведения мелодии и количество ее повторений
- в процессе воспроизведения мелодия может быть поставлена на паузу

подробное описание
http://electronix.ru/redirect.php?http://chipenable.ru/index.php/programming-c/89-generacija-zvuka-na-avr.html

Исходники для трех компиляторов - IAR, GCC, CV
 SoundLib.rar ( 11.02 килобайт ) : 362

Автор: Павлик Oct 3 2011, 12:09

Последняя версия для работы с ЖКИ NOKIA 1110i / 1112i
Подключение ЖКИ на картинке ниже


CODE


// pavel-pervomaysk
// Final version Nokia 1110i LCD module
// Time 03.10.2011

// Lcd controller по командам частично совместимый с PCF8814
// SET X adress lcd
// 0x10,0x00 начало строки с 0 го адреса строки
// количество столбцов ЖКИ 96 , штук адрес установки с 0 - 95
// адрес столбца нам нужен 39 , 39 -> HEX = 0x27.
// Установка адреса будет иметь такой вид 0x12,0x07
// 3 старших бита адреса передаются в первой команде
// 4 младших бита адреса передаются во второй команде
// SET Y adress lcd
// Всего 8 полных строк и 9й не полный
// установка адреса Y происходит подачей команд
// 0xB0 первая - 0xB8 девятая строки.
// Дополнительные команды для управления и инициализации ЖКИ
// Сдвиг всей области ЖКИ вверх на 1 0x41
// Сдвиг всей области ЖКИ вверх на 2 0x42
// Сдвиг всей области ЖКИ вверх на 4 0x43
// Сдвиг всей области ЖКИ вверх на 8 0x44
// Сдвиг всей области ЖКИ вверх на 10 0x45
// Сдвиг всей области ЖКИ вверх на 16 0x48
// Сдвиг всей области ЖКИ вниз на 21 0x65
// Контрастность ЖКИ 0x90 ... 0x9F установка по дисплею в проекте
// Очистка картинки (данные соханяются) 0xA2
// Реверсное изображение с низу к верху 0xC8
// Позитивное изображение ЖКИ 0xA6
// Негативное изображение ЖКИ 0xA7
// Заполнение строки с лева на право 0xA1
// |||||||||||||||||||||||||||||||||
// lsb adress ->
// Заполнение строки с права на лево 0xA9
// |||||||||||||||||||||||||||||||||
// <- lsb adress
// Начальное значение курсора строка 0 0xAC
// ЖКИ выключен 0xAE
// ЖКИ включен 0xAF
// RESET lcd 0xE2
// Температурная компенсация включена 0xEB

// DSEG data reserved
.dseg // RAM
.org 0x70 // Set Ram adress begin
line_x: .byte 1 // Lcd line select
cmd_xll: .byte 1 // X address low byte
cmd_xlh: .byte 1 // X address high byte
cmd_yl: .byte 1 // X address low byte next string
cmd_yh: .byte 1 // X address high byte next string
display: .byte 864 // массив для вывода на ЖКИ



.cseg // FLASH

// LCD names pinouts
.equ LCD = PORTC // Порт ЖКИ
.equ dat = PC4 // вывод данных в ЖКИ
.equ clk = PC3 // вывод тактов в ЖКИ
.equ cs = PC5 // выбор чипа

.equ line1 = 0xB0 // 1
.equ line2 = 0xB1 // 2
.equ line3 = 0xB2 // 3
.equ line4 = 0xB3 // 4
.equ line5 = 0xB4 // 5
.equ line6 = 0xB5 // 6
.equ line7 = 0xB6 // 7
.equ line8 = 0xB7 // 8

init_lcd: // Инициализация ЖКИ модуля
ldi tmp,0xE2 // Internal reset
rcall lcd_cmd // выводим команду на ЖКИ
ldi tmp,0xEB // температурная компенсация включена
rcall lcd_cmd // выводим команду на ЖКИ
ldi tmp,0x2F // режим питания
rcall lcd_cmd // выводим команду на ЖКИ
ldi tmp,0xA1 // направление LSB -> MSB
rcall lcd_cmd // выводим команду на ЖКИ
ldi tmp,0x9F // Контрастность ЖКИ 0х90 ... 0х9F
rcall lcd_cmd // выводим команду на ЖКИ
ldi tmp,0xA4 // очистить все пиксели жки
rcall lcd_cmd // выводим команду на ЖКИ
ldi tmp,0xA6 // позитивное изображение
;ldi tmp,0xA7 // негативное изображение
rcall lcd_cmd // выводим команду на ЖКИ
ldi tmp,0xAF // включить дисплей
rcall lcd_cmd // выводим команду на ЖКИ
rcall clr_lcd // Очищаем ЖКИ от случайного мусора
ret // на выход


clr_line: // Очистка линии ЖКИ
ldi xl,low (96) // загружаем количество столбцов
ldi xh,high(96) //
ldi tmp,0 // загружаем данные
rjmp clr_c // очищаем их
clr_lcd: // Очистка ЖКИ
rcall lcd_line1 // выбираем начало ЖКИ
ldi xl,low (864) // количество столбцов ЖКИ = 864
ldi xh,high(864) //
ldi tmp,0 // загружаем данные
clr_c: // цикл очистки ЖКИ
rcall lcd_data // выводим данные на ЖКИ
sbiw xl,1 // счетчик цикла - 1
brne clr_c // если не равно 0 - то переходим к началу
ret // выход


print_data: // выводим 864 байта из RAM в ЖКИ
rcall lcd_line1 // выбираем начало ЖКИ
ldi xl,low (864) // количество байт ЖКИ = 864
ldi xh,high(864) //
ldi yl,low (display) // загружаем адрес L начала блока RAM
ldi yh,high(display) // загружаем адрес H начала блока RAM
print_c: // цикл вывода данных в ЖКИ
ld tmp,Y+ // загружаем данные в регистр из RAM с постинкрементом адреса
rcall lcd_data // выводим данные на ЖКИ
sbiw xl,1 // счетчик цикла - 1
brne print_c // если не равно 0 - то переходим к началу
ret // выход


lcd_cmd: // передача команды на ЖКИ
cbi lcd,cs // CS -> 0
cbi lcd,dat // DAT -> 0
sbi lcd,clk // CLK -> 1
cbi lcd,clk // CLK -> 0
rjmp out_byte // вывести 8 битов
lcd_data: // передача данных на ЖКИ
cbi lcd,cs // выбор чипа
sbi lcd,dat // DAT -> 1
sbi lcd,clk // CLK -> 1
cbi lcd,clk // CLK -> 0
out_byte: // вывод 8 битов из регистра
ldi loop,8 // bit counter
out_c: // цикл
clc // очищаем кари флаг
rol tmp // tmp << 1
brcc d_zer // если флаг очищен , до значит данные DATA -> 0
sbi lcd,dat // если установлен DATA -> 1
rjmp d_one //
d_zer: //
cbi lcd,dat // DATA=0
d_one: //
sbi lcd,clk // CLK -> 1 импульс
cbi lcd,clk // CLK -> 0
dec loop // счетчик цикла - 1
brne out_c //
sbi lcd,cs // CS -> 1
ret // выход


print_char: // Вывод на ЖКИ символа ASCII 5 х 7
push zl // сохранить zl регистр в стеке
push zh // сохранить zh регистр в стеке (последним зашел , первым вышел)
ldi tmp,5 // загрузить значение первого множителя
muls xl,tmp // Multiply signed xh and tmp
movw xl,r0 // Copy result back in xl:xh
ldi tmp,160 // загрузить число 160 DEC в регистр
sub xl,tmp // отнять от пары число 160 0x00 - 0x1F ненужная дата 0x1F * 5 (количество байтов в символе) = 160.
sbc xh,zero // число 160 - это количество сэкономленых и ненужных байт в флэш мк
ldi ZH,high(Code*2) // загрузить старший адрес строки данных
ldi ZL,low (Code*2) // загрузить младший адрес строки данных
add ZL,xl // выбираем нужный символ в строке
adc ZH,xh // путем прибавления данных к адресу строки
ldi tmp1,5 // загружаем счетчик цикла
flash_rc: // Чтение символа ASCII в цикле
lpm tmp,Z+ // загрузить в регистр данные по адресу Z с прибавлением 1 к Z
rcall lcd_data // вывести байт на ЖКИ
dec tmp1 // счетчик - 1
brne flash_rc // если не = 0 то опять по кругу
clr tmp // вывести пробел после символа
rcall lcd_data // вывести байт на ЖКИ
pop zh // извлечь zh из стека
pop zl // извлечь zl из стека
ret // выход

out_text: // Вывод текста из данных флэши
lpm xl,Z+ // загрузить в регистр данные по адресу Z с прибавлением 1 к Z
rcall print_char // вывести символ на ЖКИ
dec loop2 // счетчик символов - 1
brne out_text // если не равно 0 то опять все повторяем
ret // выход


print_char_b: // вывод на ЖКИ символа 9 х 14.
lds tmp,line_x // загружаем данные начальной строки вывода
sts cmd_yl,tmp // сохраняем данные команды адреса верхней строки
inc tmp // данные строки + 1
sts cmd_yh,tmp // сохраняем данные команды адреса нижней строки
lds tmp,cmd_xlh // загружаем старший байт адреса Х
rcall lcd_cmd // выводим команду
lds tmp,cmd_xll // загружаем младший байт адреса Х
rcall lcd_cmd // выводим команду
lds tmp,cmd_yl // загружаем адрес Y
rcall lcd_cmd // выводим команду
ldi tmp,18 // загрузить значение первого множителя
muls xl,tmp // Multiply signed xh and tmp
movw xl,r0 // Copy result back in xl:xh
ldi zh,high(Cod*2) // загрузить старший адрес строки данных
ldi zl,low (Cod*2) // загрузить младший адрес строки данных
add zl,xl // выбираем нужный символ в строке
adc zh,xh // путем прибавления данных к адресу строки
adiw xl,9 // прибавляем к адресу чтения данных 9
ldi tmp1,9 // загружаем счетчик цикла
flash_rc1: // Чтение символа ASCII в цикле
lpm tmp,z+ // загрузить в регистр данные по адресу Z с прибавлением 1 к Z
rcall lcd_data // вывести байт на ЖКИ
dec tmp1 // счетчик - 1
brne flash_rc1 // если не = 0 то опять по кругу
lds tmp,cmd_xlh // загружаем старший байт адреса Х
rcall lcd_cmd // выводим команду
lds tmp,cmd_xll // загружаем младший байт адреса Х
rcall lcd_cmd // выводим команду
lds tmp,cmd_yh // загружаем адрес Y+1
rcall lcd_cmd // выводим команду
ldi zh,high(Cod*2) // загрузить старший адрес строки данных
ldi zl,low (Cod*2) // загрузить младший адрес строки данных
add zl,xl // выбираем нужный символ в строке
adc zh,xh // путем прибавления данных к адресу строки
ldi tmp1,9 // загружаем счетчик цикла
flash_rc2: // Чтение символа ASCII в цикле
lpm tmp,z+ // загрузить в регистр данные по адресу Z с прибавлением 1 к Z
andi tmp,0x3F // чистим 2 ненужных бита
rcall lcd_data // вывести байт на ЖКИ
dec tmp1 // счетчик - 1
brne flash_rc2 // если не = 0 то опять по кругу
ret // выход



lcd_line1: // 1я Линия ЖКИ для вывода информации
rcall lcd_line //
ldi tmp,0xB0 //
rcall lcd_cmd //
ret //
lcd_line2: // 2я Линия ЖКИ для вывода информации
rcall lcd_line //
ldi tmp,0xB1 //
rcall lcd_cmd //
ret //
lcd_line3: // 3я Линия ЖКИ для вывода информации
rcall lcd_line //
ldi tmp,0xB2 //
rcall lcd_cmd //
ret //
lcd_line4: // 4я Линия ЖКИ для вывода информации
rcall lcd_line //
ldi tmp,0xB3 //
rcall lcd_cmd //
ret //
lcd_line5: // 5я Линия ЖКИ для вывода информации
rcall lcd_line //
ldi tmp,0xB4 //
rcall lcd_cmd //
ret //
lcd_line6: // 6я Линия ЖКИ для вывода информации
rcall lcd_line //
ldi tmp,0xB5 //
rcall lcd_cmd //
ret //
lcd_line7: // 7я Линия ЖКИ для вывода информации
rcall lcd_line //
ldi tmp,0xB6 //
rcall lcd_cmd //
ret //
lcd_line8: // 8я Линия ЖКИ для вывода информации
rcall lcd_line //
ldi tmp,0xB7 //
rcall lcd_cmd //
ret //
lcd_line: //
ldi tmp,0x10 //
rcall lcd_cmd //
ldi tmp,0x00 //
rcall lcd_cmd //
ret //



simvol_1: // установка адреса 1 символа 1
ldi tmp,0x10 //
sts cmd_xlh,tmp //
ldi tmp,0x01 //
sts cmd_xll,tmp //
rcall print_char_b // вывести символ 9 х 14 на ЖКИ
ret // выход
simvol_2: // установка адреса 13 символа 2
ldi tmp,0x10 //
sts cmd_xlh,tmp //
ldi tmp,0x0d //
sts cmd_xll,tmp //
rcall print_char_b // вывести символ 9 х 14 на ЖКИ
ret // выход
simvol_3: // установка адреса 25 символа 3
ldi tmp,0x11 //
sts cmd_xlh,tmp //
ldi tmp,0x09 //
sts cmd_xll,tmp //
rcall print_char_b // вывести символ 9 х 14 на ЖКИ
ret // выход
simvol_4: // установка адреса 37 символа 4
ldi tmp,0x12 //
sts cmd_xlh,tmp //
ldi tmp,0x05 //
sts cmd_xll,tmp //
rcall print_char_b // вывести символ 9 х 14 на ЖКИ
ret // выход
simvol_5: // установка адреса 49 символа 5
ldi tmp,0x13 //
sts cmd_xlh,tmp //
ldi tmp,0x01 //
sts cmd_xll,tmp //
rcall print_char_b // вывести символ 9 х 14 на ЖКИ
ret // выход
simvol_6: // установка адреса 61 символа 6
ldi tmp,0x13 //
sts cmd_xlh,tmp //
ldi tmp,0x0d //
sts cmd_xll,tmp //
rcall print_char_b // вывести символ 9 х 14 на ЖКИ
ret // выход
simvol_7: // установка адреса 73 символа 7
ldi tmp,0x14 //
sts cmd_xlh,tmp //
ldi tmp,0x09 //
sts cmd_xll,tmp //
rcall print_char_b // вывести символ 9 х 14 на ЖКИ
ret // выход
simvol_8: // установка адреса 85 символа 8
ldi tmp,0x15 //
sts cmd_xlh,tmp //
ldi tmp,0x05 //
sts cmd_xll,tmp //
rcall print_char_b // вывести символ 9 х 14 на ЖКИ
ret // выход



demonstration: // Вывод текста из FLASH на ЖКИ
rcall lcd_line2 // выбираем строку
ldi zh,high(txt1*2) // загружаем начальный адрес строки текста
ldi zl,low (txt1*2) // умножаем указатель адреса на 2
ldi loop2,16 // загружаем количество символов в строке
rcall out_text // выводим текст на ЖКИ

rcall lcd_line4 // выбираем строку
ldi zh,high(txt2*2) // загружаем начальный адрес строки текста
ldi zl,low (txt2*2) // умножаем указатель адреса на 2
ldi loop2,16 // загружаем количество символов в строке
rcall out_text // выводим текст на ЖКИ

rcall lcd_line6 // выбираем строку
ldi zh,high(txt3*2) // загружаем начальный адрес строки текста
ldi zl,low (txt3*2) // умножаем указатель адреса на 2
ldi loop2,16 // загружаем количество символов в строке
rcall out_text // выводим текст на ЖКИ

rcall lcd_line8 // выбираем строку
ldi zh,high(txt4*2) // загружаем начальный адрес строки текста
ldi zl,low (txt4*2) // умножаем указатель адреса на 2
ldi loop2,16 // загружаем количество символов в строке
rcall out_text // выводим текст на ЖКИ

;rcall wait_075s
rcall wait_075s
rcall clr_lcd // очистка ЖКИ
ret // выход




Txt1: // Текст 1
.db "pavel-pervomaysk"
Txt2: // Текст 2
.db "www.cnc-lab.com "
Txt3: // Текст 3
.db "ATmega8A-PU cpu "
Txt4: // Текст 4
.db "Nokia 1110i LCD "



// ASCII CODE from lcd 5 x 7 pixels. Один символ = 5 байт
Code:.db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5f,0x00,0x00 ; 0x20 ' ' ; 0x21 '!'
.db 0x00,0x07,0x00,0x07,0x00,0x14,0x7f,0x14,0x7f,0x14 ; 0x22 '"' ; 0x23 '#'
.db 0x24,0x2a,0x7f,0x2a,0x12,0x23,0x13,0x08,0x64,0x62 ; 0x24 '$' ; 0x25 '%'
.db 0x36,0x49,0x55,0x22,0x50,0x00,0x05,0x03,0x00,0x00 ; 0x26 '&' ; 0x27 ''
.db 0x00,0x1c,0x22,0x41,0x00,0x00,0x41,0x22,0x1c,0x00 ; 0x28 '(' ; 0x29 ')'
.db 0x14,0x08,0x3e,0x08,0x14,0x08,0x08,0x3e,0x08,0x08 ; 0x2A '*' ; 0x2B '+'
.db 0x00,0x50,0x30,0x00,0x00,0x08,0x08,0x08,0x08,0x08 ; 0x2C ',' ; 0x2D '-'
.db 0x00,0x60,0x60,0x00,0x00,0x20,0x10,0x08,0x04,0x02 ; 0x2E '.' ; 0x2F '/'
.db 0x3e,0x51,0x49,0x45,0x3e,0x00,0x42,0x7f,0x40,0x00 ; 0x30 '0' ; 0x31 '1'
.db 0x42,0x61,0x51,0x49,0x46,0x21,0x41,0x45,0x4b,0x31 ; 0x32 '2' ; 0x33 '3'
.db 0x18,0x14,0x12,0x7f,0x10,0x27,0x45,0x45,0x45,0x39 ; 0x34 '4' ; 0x35 '5'
.db 0x3c,0x4a,0x49,0x49,0x30,0x01,0x71,0x09,0x05,0x03 ; 0x36 '6' ; 0x37 '7'
.db 0x36,0x49,0x49,0x49,0x36,0x06,0x49,0x49,0x29,0x1e ; 0x38 '8' ; 0x39 '9'
.db 0x00,0x36,0x36,0x00,0x00,0x00,0x56,0x36,0x00,0x00 ; 0x3A ':' ; 0x3B ';'
.db 0x08,0x14,0x22,0x41,0x00,0x14,0x14,0x14,0x14,0x14 ; 0x3C '<' ; 0x3D '='
.db 0x00,0x41,0x22,0x14,0x08,0x02,0x01,0x51,0x09,0x06 ; 0x3E '>' ; 0x3F '?'
.db 0x32,0x49,0x79,0x41,0x3e,0x7e,0x11,0x11,0x11,0x7e ; 0x40 '' ; 0x41 'A'
.db 0x7f,0x49,0x49,0x49,0x36,0x3e,0x41,0x41,0x41,0x22 ; 0x42 'B' ; 0x43 'C'
.db 0x7f,0x41,0x41,0x22,0x1c,0x7f,0x49,0x49,0x49,0x41 ; 0x44 'D' ; 0x45 'E'
.db 0x7f,0x09,0x09,0x09,0x01,0x3e,0x41,0x49,0x49,0x7a ; 0x46 'F' ; 0x47 'G'
.db 0x7f,0x08,0x08,0x08,0x7f,0x00,0x41,0x7f,0x41,0x00 ; 0x48 'H' ; 0x49 'I'
.db 0x20,0x40,0x41,0x3f,0x01,0x7f,0x08,0x14,0x22,0x41 ; 0x4A 'J' ; 0x4B 'K'
.db 0x7f,0x40,0x40,0x40,0x40,0x7f,0x02,0x0c,0x02,0x7f ; 0x4C 'L' ; 0x4D 'M'
.db 0x7f,0x04,0x08,0x10,0x7f,0x3e,0x41,0x41,0x41,0x3e ; 0x4E 'N' ; 0x4F 'O'
.db 0x7f,0x09,0x09,0x09,0x06,0x3e,0x41,0x51,0x21,0x5e ; 0x50 'P' ; 0x51 'Q'
.db 0x7f,0x09,0x19,0x29,0x46,0x46,0x49,0x49,0x49,0x31 ; 0x52 'R' ; 0x53 'S'
.db 0x01,0x01,0x7f,0x01,0x01,0x3f,0x40,0x40,0x40,0x3f ; 0x54 'T' ; 0x55 'U'
.db 0x1f,0x20,0x40,0x20,0x1f,0x3f,0x40,0x38,0x40,0x3f ; 0x56 'V' ; 0x57 'W'
.db 0x63,0x14,0x08,0x14,0x63,0x07,0x08,0x70,0x08,0x07 ; 0x58 'X' ; 0x59 'Y'
.db 0x61,0x51,0x49,0x45,0x43,0x00,0x7f,0x41,0x41,0x00 ; 0x5A 'Z' ; 0x5B '['
.db 0x02,0x04,0x08,0x10,0x20,0x00,0x41,0x41,0x7f,0x00 ; 0x5C '' ; 0x5D ']'
.db 0x04,0x02,0x01,0x02,0x04,0x40,0x40,0x40,0x40,0x40 ; 0x5E '^' ; 0x5F '_'
.db 0x00,0x01,0x02,0x04,0x00,0x20,0x54,0x54,0x54,0x78 ; 0x60 '' ; 0x61 'a'
.db 0x7f,0x48,0x44,0x44,0x38,0x38,0x44,0x44,0x44,0x20 ; 0x62 'b' ; 0x63 'c'
.db 0x38,0x44,0x44,0x48,0x7f,0x38,0x54,0x54,0x54,0x18 ; 0x64 'd' ; 0x65 'e'
.db 0x08,0x7e,0x09,0x01,0x02,0x0c,0x52,0x52,0x52,0x3e ; 0x66 'f' ; 0x67 'g'
.db 0x7f,0x08,0x04,0x04,0x78,0x00,0x44,0x7d,0x40,0x00 ; 0x68 'h' ; 0x69 'i'
.db 0x20,0x40,0x44,0x3d,0x00,0x7f,0x10,0x28,0x44,0x00 ; 0x6A 'j' ; 0x6B 'k'
.db 0x00,0x41,0x7f,0x40,0x00,0x7c,0x04,0x18,0x04,0x78 ; 0x6C 'l' ; 0x6D 'm'
.db 0x7c,0x08,0x04,0x04,0x78,0x38,0x44,0x44,0x44,0x38 ; 0x6E 'n' ; 0x6F 'o'
.db 0x7c,0x14,0x14,0x14,0x08,0x08,0x14,0x14,0x18,0x7c ; 0x70 'p' ; 0x71 'q'
.db 0x7c,0x08,0x04,0x04,0x08,0x48,0x54,0x54,0x54,0x20 ; 0x72 'r' ; 0x73 's'
.db 0x04,0x3f,0x44,0x40,0x20,0x3c,0x40,0x40,0x20,0x7c ; 0x74 't' ; 0x75 'u'
.db 0x1c,0x20,0x40,0x20,0x1c,0x3c,0x40,0x30,0x40,0x3c ; 0x76 'v' ; 0x77 'w'
.db 0x44,0x28,0x10,0x28,0x44,0x0c,0x50,0x50,0x50,0x3c ; 0x78 'x' ; 0x79 'y'
.db 0x44,0x64,0x54,0x4c,0x44,0x00,0x08,0x36,0x41,0x00 ; 0x7A 'z' ; 0x7B '{'
.db 0x00,0x00,0x7f,0x00,0x00,0x00,0x41,0x36,0x08,0x00 ; 0x7C '|' ; 0x7D '}'
.db 0x10,0x08,0x08,0x10,0x08,0x06,0x09,0x09,0x06,0x00 ; 0x7E '->'; 0x7F ' ' градус цельсия



// ASCII CODE from lcd 9 x 14 pixels. Один символ = 18 байт
Cod: .db 0xff,0xff,0x03,0x03,0x03,0x03,0x03,0xff,0xff,0x3f,0x3f,0x30,0x30,0x30,0x30,0x30,
0x3f,0x3f ; '0'
.db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x3f,0x3f ; '1'
.db 0xc3,0xc3,0xc3,0xc3,0xc3,0xc3,0xc3,0xff,0xff,0x3f,0x3f,0x30,0x30,0x30,0x30,0x30,
0x30,0x30 ; '2'
.db 0xc3,0xc3,0xc3,0xc3,0xc3,0xc3,0xc3,0xff,0xff,0x30,0x30,0x30,0x30,0x30,0x30,0x30,
0x3f,0x3f ; '3'
.db 0xff,0xff,0xc0,0xc0,0xc0,0xc0,0xc0,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x3f,0x3f ; '4'
.db 0xff,0xff,0xc3,0xc3,0xc3,0xc3,0xc3,0xc3,0xc3,0x30,0x30,0x30,0x30,0x30,0x30,0x30,
0x3f,0x3f ; '5'
.db 0xff,0xff,0xc3,0xc3,0xc3,0xc3,0xc3,0xc3,0xc3,0x3f,0x3f,0x30,0x30,0x30,0x30,0x30,
0x3f,0x3f ; '6'
.db 0x03,0x03,0x03,0x03,0x03,0x03,0x03,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x3f,0x3f ; '7'
.db 0xff,0xff,0xc3,0xc3,0xc3,0xc3,0xc3,0xff,0xff,0x3f,0x3f,0x30,0x30,0x30,0x30,0x30,
0x3f,0x3f ; '8'
.db 0xff,0xff,0xc3,0xc3,0xc3,0xc3,0xc3,0xff,0xff,0x30,0x30,0x30,0x30,0x30,0x30,0x30,
0x3f,0x3f ; '9'
.db 0xfc,0xfe,0xc3,0xc3,0xc3,0xc3,0xc3,0xfe,0xfc,0x3f,0x3f,0x00,0x00,0x00,0x00,0x00,
0x3f,0x3f ; 'A'
.db 0xff,0xff,0xc3,0xc3,0xc3,0xc3,0xc3,0x3c,0x3c,0x3f,0x3f,0x30,0x30,0x30,0x30,0x30,
0x0f,0x0f ; 'B'
.db 0xfc,0xfc,0x03,0x03,0x03,0x03,0x03,0x0c,0x0c,0x0f,0x0f,0x30,0x30,0x30,0x30,0x30,
0x0c,0x0c ; 'C'
.db 0xff,0xff,0x03,0x03,0x03,0x03,0x03,0xfc,0xfc,0x3f,0x3f,0x30,0x30,0x30,0x30,0x30,
0x0f,0x0f ; 'D'
.db 0xff,0xff,0xc3,0xc3,0xc3,0xc3,0xc3,0xc3,0x03,0x3f,0x3f,0x30,0x30,0x30,0x30,0x30,
0x30,0x30 ; 'E'
.db 0xff,0xff,0xc3,0xc3,0xc3,0xc3,0xc3,0xc3,0x03,0x3f,0x3f,0x00,0x00,0x00,0x00,0x00,
0x00,0x00 ; 'F'
.db 0xfc,0xfe,0x03,0x03,0x83,0x83,0x83,0x8e,0x8c,0x0f,0x1f,0x30,0x30,0x31,0x31,0x31,
0x1f,0x0f ; 'G'
.db 0xff,0xff,0xc0,0xc0,0xc0,0xc0,0xc0,0xff,0xff,0x3f,0x3f,0x00,0x00,0x00,0x00,0x00,
0x3f,0x3f ; 'H'
.db 0x00,0x03,0x03,0xff,0xff,0x03,0x03,0x00,0x00,0x00,0x30,0x30,0x3f,0x3f,0x30,0x30,
0x00,0x00 ; 'I'
.db 0x00,0x00,0x00,0x03,0x03,0xff,0xff,0x03,0x03,0x0c,0x1c,0x30,0x30,0x30,0x1f,0x0f,
0x00,0x00 ; 'J'
.db 0xff,0xff,0xc0,0xe0,0x30,0x18,0x0c,0x07,0x03,0x3f,0x3f,0x00,0x01,0x03,0x06,0x0c,
0x38,0x30 ; 'K'
.db 0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3f,0x3f,0x30,0x30,0x30,0x30,0x30,
0x30,0x30 ; 'L'
.db 0xff,0xff,0x06,0x0c,0x18,0x0c,0x06,0xff,0xff,0x3f,0x3f,0x00,0x00,0x00,0x00,0x00,
0x3f,0x3f ; 'M'
.db 0xff,0xff,0x30,0x60,0xc0,0x80,0x00,0xff,0xff,0x3f,0x3f,0x00,0x00,0x00,0x01,0x03,
0x3f,0x3f ; 'N'
.db 0xfc,0xfe,0x03,0x03,0x03,0x03,0x03,0xfe,0xfc,0x0f,0x1f,0x30,0x30,0x30,0x30,0x30,
0x1f,0x0f ; 'O'
.db 0xff,0xff,0xc3,0xc3,0xc3,0xc3,0xc3,0x7e,0x3c,0x3f,0x3f,0x00,0x00,0x00,0x00,0x00,
0x00,0x00 ; 'P'
.db 0xfc,0xfe,0x03,0x03,0x03,0x03,0x03,0xfe,0xfc,0x0f,0x1f,0x30,0x30,0x34,0x2c,0x18,
0x37,0x2f ; 'Q'
.db 0xff,0xff,0xc3,0xc3,0xc3,0xc3,0xc3,0x7e,0x3c,0x3f,0x3f,0x01,0x03,0x06,0x0c,0x18,
0x30,0x20 ; 'R'
.db 0x3c,0x7e,0xc3,0xc3,0xc3,0xc3,0xc3,0x83,0x00,0x00,0x30,0x30,0x30,0x30,0x30,0x30,
0x1f,0x0f ; 'S'
.db 0x03,0x03,0x03,0xff,0xff,0xff,0x03,0x03,0x03,0x00,0x00,0x00,0x3f,0x3f,0x3f,0x00,
0x00,0x00 ; 'T'
.db 0xff,0xff,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x0f,0x1f,0x30,0x30,0x30,0x30,0x30,
0x1f,0x0f ; 'U'
.db 0xff,0xff,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x03,0x07,0x0c,0x18,0x30,0x18,0x0c,
0x07,0x03 ; 'V'
.db 0xff,0xff,0x00,0x00,0xff,0x00,0x00,0xff,0xff,0x0f,0x1f,0x30,0x30,0x1f,0x30,0x30,
0x1f,0x0f ; 'W'
.db 0x07,0x0f,0x18,0xf0,0xe0,0xf0,0x18,0x0f,0x07,0x38,0x3c,0x06,0x03,0x01,0x03,0x06,
0x3c,0x38 ; 'X'
.db 0x3f,0x7f,0xc0,0xc0,0xc0,0xc0,0xc0,0x7f,0x3f,0x00,0x00,0x00,0x3f,0x3f,0x3f,0x00,
0x00,0x00 ; 'Y'
.db 0x03,0x03,0x03,0x83,0xc3,0x63,0x33,0x1f,0x0f,0x3c,0x3e,0x33,0x31,0x30,0x30,0x30,
0x30,0x30 ; 'Z'


.db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00 ; ' '
.db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3c,0x3c,0x3c,0x00,
0x00,0x00 ; '.'
.db 0x00,0x00,0x00,0x3c,0x3c,0x3c,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0x0f,0x0f,0x00,
0x00,0x00 ; ':'
.db 0x00,0x1c,0x3e,0x63,0x63,0x63,0x3e,0x1c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00 ; 'o' градус цельсия
.db 0x00,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00 ; '-' минус
.db 0xc0,0xc0,0xc0,0xf8,0xf8,0xc0,0xc0,0xc0,0x00,0x00,0x00,0x00,0x07,0x07,0x00,0x00,
0x00,0x00 ; '+' плюс
.db 0x80,0x40,0x40,0x40,0x80,0x00,0x00,0x00,0xc0,0x01,0x00,0x00,0x00,0x00,0x01,0x01,
0x01,0x00 ; '~' переменка


; .db 0x,0x,0x,0x,0x,0x,0x,0x,0x, ; здесь добавляем свои символы 9 х 14
; .db 0x,0x,0x,0x,0x,0x,0x,0x,0x ; ' '




 

Автор: s_black Nov 2 2011, 19:50

Исходники на Си для работы МК с симистором, ЖКИ, клавиатурами, энкодером, I2C, UART и многое http://electronix.ru/redirect.php?http://www.embed.com.ua/

Автор: Alexey Belyaev Nov 4 2011, 05:12

Собрал библиотеку avr-libc-1.7.1 с патчем far pointer для WInAVR. Пытался найти готовую на просторах, но не нашёл. Вдруг кому будет интересно.
Источник: http://electronix.ru/redirect.php?http://savannah.nongnu.org/patch/?6352

 avr_libc_1.7.1_fp.rar ( 3.16 мегабайт ) : 497
 

Автор: ESN Jul 31 2012, 07:41

Flash память AT25080,AT25160,AT25320,AT25640
В программе, написанной на ассемблере, данные пишутся и читаются по SPI интерфейсу из AT25080. Было бы полезно, дополнять описания на микросхемы чем-либо подобным.

 Flash_AT25080.zip ( 2.03 килобайт ) : 230
 

Автор: Deka Dec 4 2012, 02:32

Ассемблер! Как много в этом слове... В общем сделал для себя небольшой комплект макросов для работы с сигналами, событиями и флагами. Сигналы - эл.сигналы подключенные к МК. За описанием сигнала скрыт реальный пин порта к которому тот подключен. Вариант небольшого HAL. События и флаги - то, что происходит в программе и её состояние. 8 флагов и 8 событий. Это просто биты в двух выделенных регистрах, но я сделал макросы удобной работы с ними. Теперь сложнее ошибиться и код читабельнее получается. По крайней мере для меня. Ну и ещё сделал немного доп.команд. Что-то сам придумал, а что-то из инета почерпнул. Все макросы объединил в файл MyMacros.inc и подключаю во все свои проекты. Далее для всего сделанного реализовал подсветку синтаксиса для студии 4 (файл AvrStudio_asm.ini). Им надо переписать дефолтный файл и после этого можно будет изменять цвет в IDE. Ну и последнее что сделал - расширил и перекомпилировал хелп файл студии (опять-же Avr Studio 4) для поддержки справкой добавленных макросов и команд. Кому всё ещё интересно матёрое программирование на асме - прошу заценить. Жду Ваши комментарии и пожелания. biggrin.gif

 ExtCmd.7z ( 522.14 килобайт ) : 222
 

Автор: Deka Dec 31 2012, 06:23

Комментариев и пожеланий к моему прошому посту не последовало - выкладываю новую версию. В ней исправлены некоторые ошибки и добавлено описание как это использовать.

 ExtCmd.7z ( 542.43 килобайт ) : 342
 

Автор: uni Apr 21 2013, 10:03

Шаблоны проектов на C++ для AVR [GCC, IAR]

Шаблоны: http://electronix.ru/redirect.php?https://mysvn.ru/avr/templates/
Примеры: http://electronix.ru/redirect.php?https://mysvn.ru/avr/examples/

Экспортировать из репозитория к себе можно при помощи плагина к проводнику: http://electronix.ru/redirect.php?http://tortoisesvn.net/.

Шаблоны для микроконтроллеров: http://electronix.ru/redirect.php?https://mysvn.ru/avr/templates/ATtiny2313/, http://electronix.ru/redirect.php?https://mysvn.ru/avr/templates/ATmega48/, http://electronix.ru/redirect.php?https://mysvn.ru/avr/templates/ATmega16/, http://electronix.ru/redirect.php?https://mysvn.ru/avr/templates/ATmega32/, http://electronix.ru/redirect.php?https://mysvn.ru/avr/templates/ATmega128/.

Особенности шаблонов:
1. Проекты шаблонов собраны таким образом, что компилируются в двух C++ компиляторах: avr-gcc и iar.
2. Каждый шаблон имеет класс CMCU, который является программной моделью микроконтроллера AVR.
3. Обработка событий (прерываний) осуществляется через соответствующие методы класса CMCU, которые имеют соответствующие названия (обработчики "включаются" в файле Configuration.h).
4. Код максимально самодокументирован, вплоть до отдельных настроечных битов конфигурационных регистров.
5. В каждый проект шаблона включён заголовочный файл с классом CVersion. Этот класс создаётся автоматически перед каждой компиляции проекта (и в iar, и в gcc). Его назначение - автоматически отслеживать номер версии прошивки в стиле: Major.Minor.Revision.Build, где первое число изменяется от 0 до 9, второе от 0 до 99, а последние два от 0 до 9999. Также в классе есть метод, возвращающий дату билда в виде строки. Строка находится во флеш.
6. Первоначально проекты шаблонов настроены для работы с WinAVR-20100110 и IAR 6.10.
7. Каждый шаблон имеет возможность однообразного описания декларации переменных и одномерных массивов, которые должны находится во флеш. При использовании специального C++ шаблона умного указателя (SmartPtr.h) можно забыть про функции типа pgm_read_byte() и eeprom_read_byte(). С++ компилятор автоматически вызовет эти функции для чтения данных из флеш или eeprom.
8. Для тех, кто умеет пользоваться VS2008, в каждой папке есть GCC проект для этой IDE, в котором можно работать над проектом. Сборка идёт через Makefile.

Назначение:
1. Переход на C++ с C или ассемблера.
2. Небольшие проекты без сильных требований к быстродействию, т.е. там где не нужны в большом количестве ассемблерные вставки. Их можно подключать и в шаблонах, но только в качестве исключения (обработка прерываний, к примеру).
3. Для тех, кому нравится ООП или хочет писать с использованием ООП на AVR.

Ограничения и недостатки:
1. При использовании двумерных массивов, которые должны находится во флеш, теряется кросс-компиляция (возможно в новых версиях GNU компилятора это можно будет делать также как в IAR, тогда доделаю).
2. Шаблоны пока ещё не готовы на 100%, в них могут быть неточности в плане описания регистров или битов. Нужно быть внимательными.

Дополнительная информация:

1. По ссылке на шаблоны проектов можно найти проекты, которые настроены по дефолту, где практически всё закомментировано (инициализация). Проекты собираются и в IAR, и в WinAVR и имеют самый минимальный размер. Потренироваться можно, к примеру, на ATtiny2313. В AVR Studio 4.xx загрузить плагин Proteus'а и там исследовать прошивку, используя виртуальную внутрисхемную отладку. Либо можно взять модуль Console.cpp из демо-примеров и в том же Proteus'е по виртуальному нуль модему общаться с моделируемым мк. Это чтобы не городить схем, очень удобно всё можно посмотреть в реальном времени, только в последнем случае рекомендую выставлять частоту 4 МГц и скорость 9600, хотя это в зависимости от мощности ПК, я думаю.

2. Поддержка двух компиляторов ведена также и для экспериментальных целей. Почти все исходники по ссылкам компилируются в обоих компиляторах и прошивки должны работать почти идентично. Раньше мне нравилось отлаживать по JTAG'у в IAR, теперь вот в AVR Studio или Proteus это делаю. Получается более широкое поле по исследованию работы различных версий программы мк.

3. В Makefile включены специальные директивы, которые выбрасывают из объектного файла все неиспользуемые функции. Будьте внимательны, если вдруг размер кода будет меньше или наоборот больше, если закомментируете их.

4. Переходник ISRList.cpp для методов, которые обрабатывают прерывания, кушает до полукилобайта кода, если включить все прерывания (т.е. просто включить и больше ничего). Это связано с тем, что методы класса CMCU при этом не могут быть inline. Поэтому в мк, где размер флеша мал, этот модуль отсутствует и его содержимое перенесено в конец модуля MCU.cpp. Это значительно экономит место.

5. Автоматическая работа с версией работает только в Windows-системе, т.е. для генерации файла Version.h используется WSH. Для IAR скрипты запускаются в настройке проекта: пре- и постбилд, для WinAVR это прописано в Makefile. Можно увидеть в исходниках во всех проектах файл Version.h в нём содержится информация о дате последнего билда проекта и собственно номер версии.

6. Все проекты настроены для работы в VS2008. Этому есть причины: Visual Assist, Visual SVN, DevExpress ... и ещё много чего, что есть для этой IDE, которая заточена под разработку C++ проектов. Это удобно, что не мешает использовать что-то своё (IAR, к примеру, его проект находится в папке iar6). Проект VS2008 настроен так, что позволяет перепрыгивать на ошибки из окна вывода (вывод компилятора преобразуется потоковым фильтром).

7. Примеры использования шаблонов в связке с C или ассемблером можно увидеть в демо-примерах. Некоторые из них (uSD) работают в Proteus в реальном времени и можно общаться с контроллером через терминал, что позволяет лучше понять работу программы, можно увидеть и "потрогать" всё прямо почти живьём.

В общем и целом, я хотел какого-то единообразия для всех своих проектов и получил его. Можете пользоваться, если мой подход кому-то будет интересен. Самый интересный более менее демо-проект, который можно попробовать ничего не собирая - это микро файловый менеджер на ATmega16 - проект uSD. Вот как выглядит окно терминала при подключении к моделируемой схеме в Proteus (в железе тоже работает и куда шустрее модели):



По-проще можно посмотреть на проект http://electronix.ru/redirect.php?https://mysvn.ru/avr/examples/PhaseControl/. Это фазовое управление коллекторным двигателем с использованием симистора. Схема моделировалась в Proteus на мк ATtiny2313, потом собирался действующий макет. К сожалению, коллекторного движка пока не нашлось, поэтому управлял асинхронником на 250 Вт. Работать работает, но нужно ещё доделывать программу управления, а точнее регулировку угла и слежение за нулём на каждом периоде синусоиды. Если не считать нестабильной работы движка, то расчётные и реальные осциллограммы практически совпадают, хотя модель та ещё (реальные измерения производились развязанным цифровым осциллографом, и вообще, трансформатора нет, поэтому думайте, прежде чем что-то подключать к реальной такой схеме).

Вот можно посмотреть на модель и графики. Даже на ATtiny2313 я тоже пишу на C++ с использованием шаблона проекта.


Автор: BigallS Apr 28 2013, 15:27

Цитата(uni @ Apr 21 2013, 14:03) *
Шаблоны проектов на C++ для AVR [GCC, IAR]

Шаблоны: http://electronix.ru/redirect.php?https://mysvn.ru/avr/templates/
Примеры: http://electronix.ru/redirect.php?https://mysvn.ru/avr/examples/

Экспортировать из репозитория к себе можно при помощи плагина к проводнику: http://electronix.ru/redirect.php?http://tortoisesvn.net/.

Шаблоны для микроконтроллеров: http://electronix.ru/redirect.php?https://mysvn.ru/avr/templates/ATtiny2313/, http://electronix.ru/redirect.php?https://mysvn.ru/avr/templates/ATmega48/, http://electronix.ru/redirect.php?https://mysvn.ru/avr/templates/ATmega16/, http://electronix.ru/redirect.php?https://mysvn.ru/avr/templates/ATmega32/, http://electronix.ru/redirect.php?https://mysvn.ru/avr/templates/ATmega128/.
.....

Очень интересно, спасибо будем пробовать!

Автор: bob1 Dec 15 2013, 04:47

32-х битная библиотека с плавающей точкой для AVR (ассемблер).

 AVR_BCD.rar ( 3.34 килобайт ) : 183
 

Автор: AI7 Dec 15 2013, 09:40

Цитата(Deka @ Dec 4 2012, 06:32) *
Ассемблер! Как много в этом слове... В общем сделал для себя небольшой комплект макросов для работы с сигналами, событиями и флагами. Кому всё ещё интересно матёрое программирование на асме - прошу заценить. Жду Ваши комментарии и пожелания. biggrin.gif


Deka, для AVR есть графический ассемблер Algorithm Builder (АБ), раз в 5 удобней, чем классический ассемблер.
Поэтому не имеет смысла писать на классическом ассемблере, тем более, что сейчас АБ бесплатный.
Похоже, некоторые Ваши предложения там сделаны на уровне компилятора.
При написании на АБ быстро пришел к тому, что практически не использую имен регистров, бит.
Скажем, у меня команда для включения вентилятора будет выглядеть так:
vkl_FAN, а для выключения, естественно, vykl_FAN.
Если вентилятор подключен к PORTB.0, эти команды представляют собой макросы:
1 -> PORTB.0 и 0 -> PORTB.0.

В АБ масса удобств, например, подпрограммы с параметрами.
При их использовании, например, умножение двух двухбайтных переменных А и В можно записать одной строчкой:
Umnojenie(A,cool.gif

Думаю, при наличии хорошего отладчика писать и отлаживать программы на АБ проще и быстрее, чем на СИ.


Автор: Игoрь Dec 21 2013, 09:04

ага, конечно нет смысла писать на классическом ассемблере sm.gif
Как-то разбирался я со схемой, которая должна была формировать импульсы длительностью 0,8 мкс частотой 200 Гц и измерять время между этими импульсами и ответами от другого устройства. Так вот нагородили там огород из атмеги256 и плисины. На вопрос зачем так сложно последовал ответ- на одном микроконтроллере невозможно точно отсчитать время. А всё почему? Потому что подсели на С и не знают теперь сколько по времени выполняются команды. Реально можно вполне было обойтись атмегой8 без всяких плисин.

Автор: Сергей Борщ Dec 21 2013, 22:32

Цитата(Игoрь @ Dec 21 2013, 11:04) *
Потому что подсели на С и не знают теперь сколько по времени выполняются команды. Реально можно вполне было обойтись атмегой8 без всяких плисин.
Зависит от того, с какой точностью надо было измерять задержку. Если не менее 1/Fcpu, то подумав и задействовав модули захвата и сравнения таймера процессор мог бы делать еще какую-то полезную работу кроме измерения количества потраченных впустую тактов. Даже если программу написать на Си. Легко. А если нужна бОльшая точность, то без внешних элементов не обойтись хоть в машинных кодах пишите.

Автор: Павлик Feb 5 2014, 17:02

NEC IR приемник для AVR

CODE

; DATE: 12.01.2014
; Модуль для работы с NEC IR пультами
; Результат по завершению приема находится в
; четырех регистрах Address L, Address H,Data N, Data Invert !
; Пока держим кнопку, данные сохраняются в регистрах !




; NEC IR receive bytes
;.def bytei = R11 ; Инвертированный байт команды
;.def byten = R12 ; Нормальный байт команды
;.def adrh = R13 ; Адрес старший
;.def adrl = R14 ; Адрес младший


; OSC 10.000 MHz
; NEC IR constants init
; all constants are true ms values !
.equ FCLK = 10000000 ; Тактовая частота в герцах 10 МГц NEC IR DECODER !
.equ IR_pin = PIND ; регистр порта D входы
.equ IR = PD2 ; IR receiver INT0 pin
.equ pre = 8 ; Прескаллер таймера 1
.equ const = (FCLK/10000)/pre ; 125 (1.25 real) 1 тик таймера = 1,25 мкс
.equ starth = (9000*const)/100 ; первая посылка 9,0мс
.equ startl = (4500*const)/100 ; вторая посылка 4,5мс
.equ log1 = (2250*const)/100 ; прием логической 1 (2,250мс)
.equ restart = log1 ; Посылка 4,5ms + 2.250ms = повтор
.equ log0 = (1125*const)/100 ; прием логического 0 (1,125мс)
.equ IRcL = (100*const)/100 ; Константа погрешности 100uS
.equ IRcH = (200*const)/100 ; Константа погрешности 200uS
.equ repeat = 65535-((110000*const/8)/100) ; рестарт посылка после принятых данных через 110 ms


; Это вписываем после инициализации STACK
;************************;
;**** INIT T1 & INT0 ****;

; INT0 falling mode ;
;ldi tmp,(1<<ISC01)|(0<<ISC00) ;
;out MCUCR,tmp ;
;ldi tmp,(1<<INT0) ;
;out GICR,tmp ;
; TIMER_1 ;
; ; 0-STOP, 1-/1, 2-/8, 3-/64, 4-/256, 5-/1024. OVF mode
;ldi tmp,0x01 ; ICNC1, ICES1, –, WGM13, WGM12, CS12, CS11, CS10.
;out TCCR1B,tmp ;
;clr tmp ; clear TIMER1 registers
;out TCCR1A,tmp ;
;out TCNT1H,tmp ;
;out TCNT1L,tmp ;
;out OCR1AH,tmp ;
;out OCR1AL,tmp ;
;out OCR1BH,tmp ;
;out OCR1BL,tmp ;
;out ICR1H,tmp ;
;out ICR1L,tmp ;
;out TIFR,tmp ;
;in tmp,TIMSK ; OCIE2, TOIE2, TICIE1, OCIE1A, OCIE1B, TOIE1, –, TOIE0.
;ori tmp,(1<<TOIE1) ;
;out TIMSK,tmp ; ;out TIMSK,tmp ;



;*******************************************************************************
****
IR_read: ; Регистры cnt,tmp,X,Z !
push tmp ; сохранить tmp в STACK
in tmp,SREG ; прочитать содержимое SREG в tmp
push tmp ; сохранить tmp в STACK
push xl ; сохранить XL в STACK
push xh ; сохранить XH в STACK
push zl ; сохранить ZL в STACK
push zh ; сохранить ZH в STACK
cli ; выключить прерывания
inc cnt ; INT0 counter + 1
cpi cnt,1 ; IF cnt = 1 -> goto IR_9ms
breq IR_9ms ; сброс T1, запуск счета, прерывание по фронту, ловим 9мс !

cpi cnt,2 ; IF cnt = 2 -> goto IR_start
breq IR_start ; принимаем старт 9 мс (+ - 200us) !

cpi cnt,3 ; IF cnt = 3 -> goto IR_repeat_OR_normal start !
breq IR_repeat ; Проверяем повтор команды ! Или передача посылки с данными !

cpi cnt,4 ; IF cnt >= 4 -> goto IR_data
brsh GET_data ; то принимаем данные

rjmp IR_error ; если 0 - выходим из прерывания

Get_data: ; метка перехода
rjmp GET_IR_data ; прием данных 32 бита ! LSB first


IR_9ms: ;
ldi tmp,(1<<ISC01)|(1<<ISC00) ; INT0 - rising
out MCUCR,tmp ;
ldi flags,0x01 ; Flags = 1
rcall read_T1 ; Z = TCNT1
rjmp IR_ok ; выходим из прерывания WAIT Hi level on INT0 !

IR_start: ; 9.136 ms NORMAL ! INT0 - rising cnt=1 !
ldi tmp,(1<<ISC01)|(0<<ISC00) ; INT0 - falling
out MCUCR,tmp ;
rcall read_T1 ; Z = TCNT1
ldi xl,byte1(starth-IRcL) ; load 9.000 ms - 100us
ldi xh,byte2(starth-IRcL) ;
cp zl,xl ; comparing TCNT1 with starth constant !
cpc zh,xh ;
brlo IR_error ; если меньше, чем 8,8 мс то ошибка, не наш протокол !
ldi xl,byte1(starth+IRcH) ; load 9.000 ms + 200us
ldi xh,byte2(starth+IRcH) ;
cp zl,xl ; comparing TCNT1 with starth constant !
cpc zh,xh ;
brsh IR_error ; если больше, чем 9,25 мс то ошибка, не наш протокол !
ldi flags,0x02 ; Flags = 2
rjmp IR_ok ;

IR_repeat: ;
rcall read_T1 ; Z = TCNT1
ldi xl,byte1(restart-IRcL) ; 2.250 ms - 100us
ldi xh,byte2(restart-IRcL) ;
cp zl,xl ; comparing TCNT1 with starth constant !
cpc zh,xh ;
brlo IR_error ; если меньше, чем 8,8 мс то ошибка, не наш протокол !
ldi xl,byte1(restart+IRcL) ; 2.250 ms + 100us
ldi xh,byte2(restart+IRcL) ;
cp zl,xl ; comparing TCNT1 with starth constant !
cpc zh,xh ;
brsh IR_N_start ; если больше, чем 2.375 мс то проверяем нормальный старт
ldi flags,0x03 ; Flags = 3 (REPEAT command)
rcall write_T1 ; T1 = f.osc / 64
rjmp IR_check ;


IR_N_start: ; NEC normal start 9 ms + 4.5 ms ! FLAGS = 3 !
ldi xl,byte1(startl-IRcH) ; load 4.500 ms - 200us
ldi xh,byte2(startl-IRcH) ;
cp zl,xl ; comparing TCNT1 with starth constant !
cpc zh,xh ;
brlo IR_error ; если меньше, чем 4.3 мс то ошибка, не наш протокол !
ldi xl,byte1(startl+IRcH) ; load 4.500 ms + 200us
ldi xh,byte2(startl+IRcH) ;
cp zl,xl ; comparing TCNT1 with starth constant !
cpc zh,xh ;
brsh IR_error ; если больше, чем 4.7 мс то ошибка, не наш протокол !
ldi flags,0x04 ; Flags = 4

IR_ok: ; Успешный прием
cpi cnt,35 ; максимальное количество прерываний посылки пульта = 35 ! далее повторы по 2 прерывания
brsh IR_check ; => 35 - проверяем флаг повтора !

; IR ADDRESS CHECK !
ldi zl,low (IR_adr*2) ; IR address pointer
ldi zh,high(IR_adr*2) ;
lpm xl,z+ ; X = NEC IR ADR
lpm xh,z ; xl <-- ADRL, xh <-- ADRH
cp adrl,xl ;
cpc adrh,xh ;
brne IR_adr_err ; если адрес не совпадает,с указанным в программе, то в команду пишем 255
Exit: ; метка выхда из прерывания
pop zh ; извлечь ZH из STACK
pop zl ; извлечь ZL из STACK
pop xh ; извлечь XH из STACK
pop xl ; извлечь XL из STACK
pop tmp ; извлечь tmp из STACK
out SREG,tmp ; восстановить SREG
pop tmp ; извлечь tmp из STACK
reti ; выход из внешнего прерывания INT0

IR_adr_err: ; Ошибка принятого адреса от пульта IR
ser tmp ;
sts nec,tmp ; сохраняем 255 в команду
rjmp Exit ; на выход из прерывания


IR_error: ; Не наш протокол, ошибка приема !
clr cnt ; счетчик прерываний = 0
ser tmp ;
mov bytei,tmp ; NEC IR Command_INV = FFH
mov byten,tmp ; NEC IR Command_Nor = FFH
mov adrh,tmp ; NEC IR Address High = FFH
mov adrl,tmp ; NEC IR Address Low = FFH
ldi tmp,(1<<ISC01)|(0<<ISC00) ; INT0 - falling
out MCUCR,tmp ; прерывание по спаду !
ldi flags,0b01000000 ; ERROR - 0x40
out TCCR1B,zero ; STOP Timer1
out TCNT1H,zero ;
out TCNT1L,zero ; TCNT1=0
in tmp,TIFR ; tmp = TIFR
andi tmp,0xFD ; TOV1 --> 2 bit (FD)
out TIFR,tmp ; сброс флага переполнения T1
rjmp Exit ; на выход

IR_check: ; Проверка статусов и адреса пульта !!!
sts nec,byten ; сохраняем байт команды !
clr cnt ; ITNT0 counter = 0
cpi flags,0x03 ; если статус = 0x03 то приняты данные
breq IR_ok ; идем на OK!
cpi flags,0x05 ; если статус = 0x05 то приняты данные
breq IR_ok ; идем на OK!
rjmp IR_error ; если флаг установлен, то не стираем данные



GET_IR_data: ; GET data
rcall read_T1 ; Z = TCNT1
IR_data_0: ; Прием бита 0 (1.125ms)
ldi xl,byte1(log0-IRcL) ; load 1.125 ms - 100us
ldi xh,byte2(log0-IRcL) ;
cp zl,xl ; comparing TCNT1 with log0 constant !
cpc zh,xh ;
brlo IR_error ; если меньше, чем 1,025 то не наш протокол, ошибка
ldi xl,byte1(log0+IRcL) ; load 1.125 ms + 100us
ldi xh,byte2(log0+IRcL) ;
cp zl,xl ; comparing TCNT1 with log0 constant !
cpc zh,xh ;
brsh IR_data_1 ; если больше, чем 1,225 то принимаем лог 1
clc ;
lsr bytei ; DATA 32 bits = >> 1 LSB first
ror byten ;
ror adrh ;
ror adrl ;
ldi flags,5 ; принят бит 0 Flags = 5
rjmp IR_ok ; return

IR_data_1: ; Прием бита 1 (2,25ms)
ldi xl,byte1(log1-IRcL) ; load 2.25 ms - 100us
ldi xh,byte2(log1-IRcL) ;
cp zl,xl ; comparing TCNT1 with log0 constant !
cpc zh,xh ;
brlo IR_error ; если меньше чем 2.15ms то не наш протокол, ошибка
ldi xl,byte1(log1+IRcL) ; load 2.25 ms + 100us
ldi xh,byte2(log1+IRcL) ;
cp zl,xl ; comparing TCNT1 with log0 constant !
cpc zh,xh ;
brsh IR_error ; если больше чем 2.35ms то не наш протокол, ошибка
ldi tmp,0b10000000 ; установка бита 7 в регистрах
clc ;
lsr bytei ; DATA 32 bits = >> 1 LSB first !
ror byten ;
ror adrh ;
ror adrl ;
or bytei,tmp ; DATA = | 1
ldi flags,5 ; принят бит 1 Flags = 5
rjmp IR_ok ; return

read_T1: ; Читаем данные счетчика Timer1 и ставим прескаллер 8 !
in zl,TCNT1L ; Z = TCNT1
in zh,TCNT1H ; Low conter must be read FIRST !
out TCCR1B,zero ; STOP Timer1
out TCNT1H,zero ;
out TCNT1L,zero ; TCNT1=0
in tmp,TIFR ; tmp = TIFR
andi tmp,0xFD ; TOV1 --> 2 bit (FD)
out TIFR,tmp ; сброс флага переполнения T1
ldi tmp,0x02 ; f.osc / 8
out TCCR1B,tmp ;
ret ; return

write_T1: ; Timer1 переполнится через 110ms !
out TCCR1B,zero ; STOP Timer1
ldi zl,low (repeat) ;
ldi zh,high(repeat) ; Z = repeat ~(110ms)
out TCNT1H,zh ;
out TCNT1L,zl ; TCNT1=repeat
in tmp,TIFR ; tmp = TIFR
andi tmp,0xFD ; TOV1 --> 2 bit (FD)
out TIFR,tmp ; сброс флага переполнения T1
ldi tmp,0x03 ; f.osc / 64
out TCCR1B,tmp ;
ret ; return


;************************;
; TIMER 1 Overflow ;
T1_ovf:
push tmp ; сохранить tmp в STACK
in tmp,SREG ; прочитать содержимое SREG в tmp
push tmp ; сохранить SREG в STACK
cli ; выключаем прерывания
clr cnt ; CNT = 0
clr flags ; FLAGS = 0
out TCCR1B,zero ; STOP Timer1
out TCNT1H,zero ;
out TCNT1L,zero ; TCNT1=0
in tmp,TIFR ; tmp = TIFR
andi tmp,0xFD ; TOV1 --> 2 bit (FD)
out TIFR,tmp ; сброс флага переполнения T1
ser tmp ;
sts nec,tmp ; RAM NEC IR Command_Nor = FFH
mov bytei,tmp ; NEC IR Command_INV = FFH
mov byten,tmp ; NEC IR Command_Nor = FFH
mov adrh,tmp ; NEC IR Address High = FFH
mov adrl,tmp ; NEC IR Address Low = FFH
pop tmp ; извлечь tmp из STACK
out SREG,tmp ; восстановить SREG
pop tmp ; извлечь tmp из STACK
reti ; выход из прерывания T1_ovf

;************************;
; END of NEC IR_receiver code



;.org 0xFC0
; IR data Команды от пульта
; LG remote control

; NEC IR Address L H ;
IR_adr: .db 0x04,0xFB ; Адрес пульта первый байт, второй байт

; NEC IR Commands N I ;
power: .db 0x08,0xF7 ; команда управления ВКЛ / ВЫКЛ
mute: .db 0x09,0xF6 ; команда управления звук выкл
left: .db 0x02,0xfd ; команда управления громкость + (вправо)
right: .db 0x03,0xfc ; команда управления громкость - (влево)
up: .db 0x00,0xff ; команда управления вверх
down: .db 0x01,0xfe ; команда управления вниз
center: .db 0x44,0xbb ; команда управления OK по центру джойстика.
menu: .db 0x43,0xbc ; команда управления MENU

; Keys 0...9 ;
key0: .db 0x10,0xef ; команда управления 0
key1: .db 0x11,0xee ; команда управления 1
key2: .db 0x12,0xed ; команда управления 2
key3: .db 0x13,0xec ; команда управления 3
key4: .db 0x14,0xeb ; команда управления 4
key5: .db 0x15,0xea ; команда управления 5
key6: .db 0x16,0xe9 ; команда управления 6
key7: .db 0x17,0xe8 ; команда управления 7
key8: .db 0x18,0xe7 ; команда управления 8
key9: .db 0x19,0xe6 ; команда управления 9

; Colour keys ;
keyred: .db 0x72,0x8d ; команда управления красная
keygreen: .db 0x71,0x8e ; команда управления зеленая
keyyello: .db 0x63,0x9c ; команда управления желтая
keyblue: .db 0x61,0x9e ; команда управления синяя






Автор: Метценгерштейн Mar 17 2015, 18:47

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

Идея в том, что в прерывании каждую мс постоянно увеличивается переменная. Идея не нова, но обыграть можно так:

инициализация

Код
uint8_t timer_test = -1;


Код
timer_test  = timer_create (TIMER_REPEAT_START, 1000, timer_test_callback);


а вот сама ф-я
Код
void timer_test_callback (uint8_t index)
{
  cpl (LED);
}


итак, есть ф-я timer_test_callback, которая передается как указатель на ф-ю при инициализации.
инициализируем таймер
Код
timer_create (TIMER_REPEAT_START, 1000, timer_test_callback);

первое- режим- повторяющийся в данном случае, 1000 мс, и ф-я, в которую попадем после установленного времени. Там, например, можно менять на противоположное состояние LED.

в вечном цикле крутим постоянно ф-ю
timer_handle ();

http://electronix.ru/redirect.php?https://cloud.mail.ru/public/c9e359458382/timers.zip

Принимаются комментарии по реализации и работе.

Автор: Xln Dec 16 2015, 01:12

Мой пример формирователя задержек с разрешением в 1 такт для микроконтроллеров AVR на ассемблере.
Всего 12 команд / 24 байта.

CODE

; Процедура формирования программируемых задержек с разрешением 1 такт.
; Формируемая задержка равна (XH:XL + 13) тактов.
; т.е. XL:XH = 0 -> задержка минимальна и равна 13 тактам,
; и XL:XH = 65535 -> задержка максимальна и равна 65548 тактам.

; Формирование дополнительной задержки 8..11 тактов.
; Необходимость дополнительной задержки связана с тем, что
; основной цикл формирования задержки обеспечивает
; дискретность 4 такта.
; Дополнительная задержка имеет разрешение 1 такт.
LSR XH
ROR XL
BRCC APs0_AD_Lab1
RJMP APs0_AD_Lab1
APs0_AD_Lab1:
LSR XH
ROR XL
BRCC APs0_AD_Lab2
NOP
RJMP APs0_AD_Lab2
APs0_AD_Lab2:

; Инкремент для установки минимальной задержки нулём входного значения.
ADIW XH:XL, 1

; Цикл формирования основной задержки.
APs0_AD_Loop:
SBIW XH:XL, 1
BRNE APs0_AD_Loop

Автор: Xln Dec 18 2015, 23:33

В догонку.
Библиотека математических функций для микроконтроллеров Mega (часть функций не используют команд умножения – они применимы и для Tiny) на ассемблере.
Оформлена в виде макросов, переопределения регистров также выполнены в виде макросов.
Краткий перечень содержимого:
Умножение с накоплением для знаковых 24-х битных чисел (результат 48 бит).
Умножение с накоплением для знаковых 32-х битных чисел (результат 64 бита).
Деление беззнаковых 32-х битных чисел.
Преобразования вида: число с фиксированной точкой -> строка, строка -> число с фиксированной точкой.
Код сопровождён пояснениями.
Понятно, что если задача насыщенна 32-х битными вычислениями то проще выбрать 32-х битный микроконтроллер, но если в существующий проект на AVR понадобилось внести такие операции – библиотека есть. Да и 20 МГц AVR в частности вполне достаточно для выполнения несложных фильтров (рекурсивный 2, 4, 6 порядки) на частотах дискретизации 3-5 кГц.


 ATmega_Math.zip ( 13.59 килобайт ) : 97
 

Автор: dm37 Aug 14 2016, 17:33

Демонстрационный пример AVR_Menu2

Описание примера:
Пример, показывает вариант построения многоуровневого меню для текстовых LCD
индикаторов на базе контроллера HD44780, управление с помощью клавиатуры
(8 кнопок), приём 16 дискретных сигналов, передача 16 дискретных сигналов.
В состав проекта входят исходные коды на языке C и проект для Proteus.

Оборудование:
- ATmega32;
- LCD 1604 (HD44780);
- клавиатура (8 кнопок: Up, Down, Left, Right, Enter, Escape, Menu, Reserve);
- 2 регистра ввода (74HC245);
- 2 регистра вывода (74HC573);
- зуммер.

Программное обеспечение:
- среда разработки: IAR Embedded Workbench 6.70.4 (AVR)
- среда эмулирования: Proteus 7.10

-------------------------------------------------------------------------------
Пароль для доступа в меню настроек:
нажать кнопку Menu
и последовательно нажать кнопки Left -> Right -> Up -> Left -> Right


avr_menu1 (LCD4004) - вариант с LCD индикатором 40x4 (2xHD44780)

Дополнительно небольшое видео работы проекта в proteus по ссылке: http://electronix.ru/redirect.php?https://ru.files.fm/u/a2sfccuf#/list/

Автор: dm37 Aug 15 2016, 14:13

В проектах avr_menu исправлена небольшая ошибка (из-за copy/paste), которая не позволяла вывести регистры вывода 74HC573 из третьего состояния.
Также добавил видео демонстрирующее функционал проекта avr_menu http://electronix.ru/redirect.php?https://ru.files.fm/u/a2sfccuf#/list/

 avr_menu.7z ( 551.81 килобайт ) : 108
 

Автор: Gorby Aug 16 2016, 12:24

Цитата(dm37 @ Aug 15 2016, 16:13) *
В проектах avr_menu исправлена небольшая ошибка


Ну, раз началася работа над ошибками, то сделайте, будьте добры так, чтобы меню управлялось пятермыми кнопками: лево-право, верх-низ и Меню.
Имею обоснованное сомнение что Ваши восемь кнопок кому-то понравятся.

"Напишите программу, которой может пользоваться даже идиот, и только идиот захочет ею воспользоваться" 'c'

Автор: dm37 Aug 16 2016, 16:02

Изначально кнопок было 6 (влево-вправо-вверх-вниз-ENTER-ESCAPE). Количество кнопок можно сделать любое от 1 до 8. Функции на кнопки назначаются в каждом меню отдельно, так что всё зависит от вашей фантазии. Если вам нужно именно ваше сочетание кнопок, могу подкорректировать и выслать вам на почту, чтобы не плодить версии.
Во вложении проект с 6-ю кнопками (выжимка из одного проекта) + работа с датчиком DS18B20 + RTC DS1307 (i2c soft).

 ds1820.7z ( 73.08 килобайт ) : 149
 

Автор: fenakit Jul 13 2017, 15:57

dm37, запускаю проект avr_menu1 (ничего не меняя), и вот такая картинка

. Нету кодировки кириллицы. В чем может быть проблема? Уже пробовал разные версии IAR и Proteus. А так заготовка для проектов понравилась, сделано професионально.

Автор: fenakit Jul 16 2017, 18:24

Уже нашел причину - нужна патченая модель LCD для Proteus.

Автор: dm37 Jul 22 2017, 18:44

Мои наработки по использованию языка C++ для микроконтроллеров:
-микроконтроллеры ATtiny2313, ATmega32
-компилятор IAR Embedded Workbench for Atmel AVR 6.80
-симулятор Proteus 7.10

Что получилось можно посмотреть здесь
http://electronix.ru/redirect.php?https://ru.files.fm/u/a2sfccuf#/list/
файл uC_cpp.7z

Внутри:
- пример с динамической индикацией (исходники + proteus)
- пример с LCD на HD44780 (исходники + proteus)
- небольшое описание

Автор: dm37 Aug 20 2017, 16:18

по С++ обновил описание
http://electronix.ru/redirect.php?https://ru.files.fm/u/a2sfccuf#/list/
файл uC_cpp.7z

Автор: technik-1017 Apr 22 2018, 11:46

Добрый день,
предлагаю свой вариант конвертера текста для индикатора на контроллере HD44780 (CP1251 -> HD44780).
Преобразование производится на уровне компиляции и строится на использовании макроса LCD_TEXT_XX (файл lcd_conv.h). Данный макрос может быть использован с любым компилятором языка Си.

Во вложении файл lcd_conv.h и описание.

 lcd_conv.zip ( 270.82 килобайт ) : 31
 

Автор: demiurg1978 Apr 22 2018, 17:52

Цитата(dm37 @ Aug 15 2016, 21:13) *
...

Слишком сложно. Лучше MicroMenu для микроконтроллеров не нашел для себя.

Русская версия Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)