IAR быстрый старт


Electronic Banner Exchange (ElBE)
 
 

IAR-Fast.narod.ru

    IAR - быстрый старт.

Программирование микроконтроллера AVR в IAR


Примеры программ и устройств от производителя
AVR компании ATMEL - АпНоуты - ApNout.narod.ru


 

 
Не дорогой программатор для AVR на USB
  всего за
580 рублей !  в Москве - подключил к USB и программируй AVR.

или + 90 рублей почтой по всей России  - быстро и удобно.
                                   Подробней на  "МК Почтой народ РУ"

Он прекрасно работает с программаторами CodeVisionAVR CVAVR 
AVRStudio
и WinAVR AVRDUDE, легко инсталируется в XP и VISTA.

Программаторы собраны аккуратно и протестированы. 

 

Не дорогой Cупер программатор отладчик для PIC на USB

PICkit   всего за 899 рублей !    в Москве

или + 90 рублей почтой по всей России  - быстро и удобно.
 Фирменный PICkit2 стоит 1700 рублей в среднем.

Узнайте что такое PICkit 2 и как с ним работать и вы поймете что

PICkit2 -
это ЛУЧШИЙ инструмент для работы с PIC10  PIC12 
PIC16  PIC18  PIC24  dsPIC30  dsPIC33
и
PIC32

Подробней о заказе на  "МК Почтой народ РУ"

 

Там же советую заказать

- изготовление электронных устройств по любительской технологии,

- прошивка AVR и PIC на заказ,

- прошитые AVR PIC для сборки программаторов и электронных
  наборов МастерКит и других,

Э
лектронные компоненты из "Тэрраэлектроника",
н
аборы резисторов и конденсаторов, RC модели, материалы, эпоксидную смолу, комплектующие для робототехники и хобби
почтой по всей России.

"МК Почтой народ РУ"

 

 

 

Первые  шаги.

файлы к статье (размер: 160 КБ)

Данные статьи посвящены программированию микроконтроллеров AVR фирмы Atmel на языках С и С++. AVR – это, пожалуй, самое распространенное семейство микроконтроллеров.

Итак, что вообще такое микроконтроллер (далее МК)? Это, условно говоря, маленький компьютер, размещенный в одной интегральной микросхеме. У него есть процессор (арифметическо-логическое устройство, или АЛУ), flash-память, EEPROM-память, множество регистров, порты ввода-вывода, а также дополнительные «навороты», такие как таймеры, счетчики, компараторы, USARTы и т. п. Микроконтроллер после подачи питания загружается и начинает выполнять программу, записанную в его flash-памяти. При этом он может через порты ввода/вывода управлять самыми разнообразными внешними устройствами.

Что же это означает? Это значит, что в МК можно реализовать любую логическую схему, которая будет выполнять определенные функции. Это значит, что МК – микросхема, внутреннее содержимое которой, фактически, мы создаем сами. Что позволяет, купив несколько совершенно одинаковых МК, собрать на них совершенно разные схемы и устройства. Если вам захочется внести какие-либо изменения в работу электронного устройства, то не нужно будет использовать паяльник, достаточно будет лишь перепрограммировать МК. При этом не нужно даже вынимать его из вашего дивайса, если вы используете AVR, т. к. эти МК поддерживают внутрисхемное программирование. Таким образом, микроконтроллеры ликвидируют разрыв между программированием и электроникой.

AVR – это 8-битные микроконтроллеры, т. е. их АЛУ может за один такт выполнять простейшие операции только с 8-ми битными числами. Теперь пора поговорить о том, какой МК мы будем использовать. Я работаю с МК ATMega16. Он очень распространенный и приобрести его можно практически в любом магазине радиодеталей где-то за 100 руб. Если вы его не найдете – тогда можно купить любой другой МК серии MEGA, но в этом случае придется искать к нему документацию, т. к. одни и те же «ножки» разных МК могут выполнять разные функции, и, подключив, казалось бы, правильно все выводы, вы, может быть, получите рабочее устройство, а, может быть, лишь облако вонючего дыма. При покупке ATMega16 проверьте, чтобы он был в большом 40-ножечном DIP-корпусе, а также купите к нему панельку, в которую его можно будет вставить. Для работы с ним потребуются также дополнительные устройства: светодиоды, кнопки, разъемы и т. п..

ATMega16 обладает очень большим количеством самых разнообразных функций. Вот некоторые его характеристики:

  • Максимальная тактовая частота – 16 МГц (8 МГц для ATMega16L)
  • Большинство команд выполняются за один такт
  • 32 8-битных рабочих регистра
  • 4 полноценных 8-битных порта ввода/вывода
  • два 8-битных таймера/счетчика и один 16-битный
  • 10-разрядный аналогово-цифровой преобразователь (АЦП)
  • внутренний тактовый генератор на 1 МГц
  • аналоговый компаратор
  • интерфейсы SPI, I2C, TWI, RS-232, JTAG
  • внутрисхемное программирование и самопрограммирование
  • модуль широтно-импульсной модуляции (ШИМ)
программирование AVR микроконтроллеров AVR на Си

Полные характеристики этого устройства, а также инструкции по их применению можно найти в справочнике (Datasheetе) к этому МК. Правда, он на английском языке. Если вы знаете английский, то обязательно скачайте этот Datasheet, в нем много полезного.

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

программирование AVR микроконтроллеров AVR на Си

Что для этого понадобится?

программирование AVR микроконтроллеров AVR на Си

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

программирование микроконтроллеров на Си

Для соединения элементов схемы очень удобно использовать шлейфы, на концах которых установлены разъемы. Эти разъемы надеваются на «ножки», торчащие рядом с каждым портом МК. Микроконтроллер следует устанавливать в панельку, а не припаивать к плате, иначе его очень трудно будет вынуть в случае, если вы его случайно сожжете. Ниже приведена цоколевка МК ATMEGA16:

программирование atmega на Си

Поясним, какие ножки нас сейчас интересуют.

  • VCC – сюда подается питание (4,5 – 5,5 В) от стабилизированного источника
  • GND – земля
  • RESET – сброс (при низком уровне напряжения)
  • XTAL1, XTAL2 – сюда подключается кварцевый резонатор
  • PA, PB, PC, PD – порты ввода/вывода (A, B, C и D соответственно).

В качестве источника питания можно использовать все, что выдает 7-11 В постоянного тока. Для стабильной работы МК нужно стабилизированное питание. В качестве стабилизатора можно использовать микросхемы серии 7805. Это линейные интегральные стабилизаторы, на вход которых подают 7-11 В постоянного нестабилизированного тока, а на выходе получают 5 В стабилизированного. Перед 7805 и после него нужно поставить фильтрующие конденсаторы (электролитические для фильтрации помех низких частот и керамические для высоких). Если не удается найти стабилизатор, то можно в качестве источника питания использовать батарейку на 4,5 В. От нее МК нужно питать напрямую.

 

PROTEUS скачать свежий стабильный с лекарством и с инструкцией по установке.

 

Ниже приведу схему подключения МК:

AVR atmega С++

Давайте теперь разберемся, что здесь для чего.

BQ1 – это кварцевый резонатор, задающий рабочую частоту МК. Можно поставить любой до 16 МГц, но, поскольку мы планируем работать в будущем и с COM-портом, то рекомендую использовать резонаторы на следующие частоты: 14,7456 МГц, 11,0592 МГц, 7,3725 МГц, 3,6864 МГц или 1,8432 МГц (позже станет ясно, почему). Я использовал 11,0592 МГц. Понятное дело, что чем больше частота, тем выше и скорость работы устройства.

R1 – подтягивающий резистор, который поддерживает напряжение 5 В на входе RESET. Низкий уровень напряжения на этом входе означает сброс. После сброса МК загружается (10 – 15 мс) и начинает выполнять программу заново. Поскольку это высокоомный вход, то нельзя оставлять его «болтающимся в воздухе» - небольшая наводка на нем приведет к непредвиденному сбросу МК. Именно для этого и нужен R1. Для надежности рекомендую также установить конденсатор С6 (не более 20 мкФ).

SB1 – кнопка сброса.

Кварцевый резонатор и фильтрующий конденсатор C3 должны располагаться как можно ближе к МК (не далее 5-7 см), т. к. иначе могут возникать наводки в проводах, приводящие к сбоям в работе МК.

Синим прямоугольником на схеме обведен собственно программатор. Его удобно выполнить в виде провода, один конец которого втыкается в LPT порт, а другой – в некий разъем рядом с МК. Провод не должен быть чрезмерно длинным. Если возникнут проблемы с этим кабелем (обычно не возникают, но всякое бывает) то придется спаять адаптер Altera ByteBlaster. О том, как это сделать, написано в описании к программатору AVReal.

Теперь, когда разобрались с железом, пора перейти к программному обеспечению.

Для программирования AVR есть несколько сред разработки. Во-первых, это AVR Studio – официальная система программирования от Atmel. Она позволяет писать на ассемблере и отлаживать программы, написанные на ассемблере, С и С++. IAR – это коммерческая система программирования на C, С++ и ассемблере. WinAVR – компилятор с открытыми исходниками, причем он поддерживает, судя по всему, фигову тучу самых разных языков. AtmanAVR – система программирования для AVR с интерфейсом, почти «один в один» таким же, как у Visual C++ 6. AtmanAVR также позволяет отлаживать программы и содержит множество вспомогательных функций, облегчающих написание кода. Эта система программирования коммерческая, но, согласно лицензии, ее можно в течение месяца использовать «нахаляву».

Я предлагаю начать работу с IAR как с наиболее «прозрачной» средой разработки. В IAR проект целиком создается «ручками», соответственно, сделав несколько проектов, вы уже будете четко знать, что означает каждая строчка кода и что будет, если ее изменить. При работе же с AtmanAVR придется либо пользоваться предварительно созданным шаблоном, который очень громоздкий и трудный для понимания для человека, не имеющего опыта, либо иметь множество проблем с заголовочными файлами при сборке проекта «с нуля». Разобравшись с IAR, мы впоследствии рассмотрим другие компиляторы.

Итак, для начала раздобудьте IAR. Он очень распространен и его нахождение не должно быть проблемой. Скачав где-либо IAR 3.20, вводим серийники, устанавливаем компилятор, копируем крякалку в папку с установленной программой и запускаем ее. После этого можно начинать работу.

Запустив IAR, выбираем file/new/workspace, выбираем путь к нашему проекту и создаем для него папку и даем имя, например, «Prog1». Теперь создаем проект: Project/Create new project… Назовем его также – «Prog1». Щелкаем правой кнопкой мыши на заголовке проекта в дереве проектов и выбираем «Options»

AVR atmega С++

Здесь будем настраивать компилятор под конкретный МК. Во-первых, нужно выбрать на вкладке Target тип процессора ATMega16, на вкладке Library Configuration установить галочку Enable bit definitions in I/O-include files (чтобы можно было использовать в коде программы имена битов различных регистров МК), там же выбрать тип библиотеки С/ЕС++. В категории ICCAVR нужно на вкладке Language установить галочку Enable multibyte support, а на вкладке Optimization выключить оптимизацию (иначе она испортит нашу первую программу).

AVR программирование atmega С Си С++

Далее выбираем категорию XLINK. Здесь нужно определить формат откомпилированного файла. Поскольку сейчас мы задаем опции для режима отладки (Debug), о чем написано в заголовке, то на выходе нужно получить отладочный файл. Позже мы его откроем в AVR Studio. Для этого нужно выбрать расширение .cof, а тип файла – ubrof 7.

AVR программирование atmega С Си С++

Теперь нажимаем ОК, после чего меняем Debug на Release.

IAR AVR программирование

Снова заходим в Options, где все параметры, кроме XLINK, выставляем те же. В XLINK меняем расширение на .hex, а формат файла на intel-standart.

IAR AVR программирование

Вот и все. Теперь можно приступать к написанию первой программы. Создаем новый Source/text и набираем в нем следующий код:

#include "iom16.h"



short unsigned int i;



void main (void)

{

  DDRB  = 255;

  PORTB = 0;



  while(1)

  {

    if (PORTB == 255)

      PORTB = 0;

    else

      PORTB++;



    for (i=0; i<10000; i++)

    {

    }

  }

}

Файл «iom16.h» находится в папке (C:\Program Files)\IAR Systems\Embedded Workbench 3.2\avr\inc. Если вы используете другой МК, например, ATMega64, то выбирайте файл «iom64.h». В этих заголовочных файлах хранится информация о МК: имена регистров, битов в регистрах, определены имена прерываний. Каждая отдельная «ножка» порта A, B, C или D может работать либо как вход, либо как выход. Это определяется регистрами Data Direction Register (DDR). 1 делает «ножку» выходом, 0 – входом. Таким образом, выставив, например, DDRA = 13, мы делаем выходами «ножки» PB0, PB2, PB3, остальные – входы, т.к. 13 в двоичном коде будет 00001101.

PORTB – это регистр, в котором определяется состояние «ножек» порта. Записав туда 0, мы выставляем на всех выходах напряжение 0 В. Далее идет бесконечный цикл. При программировании МК всегда делают бесконечный цикл, в котором МК выполняет какое-либо действие, пока его не сбросят или пока не произойдет прерывание. В этом цикле пишут как бы «фоновый код», который МК выполняет в самую последнюю очередь. Это может быть, например, вывод информации на дисплей. В нашем же случае увеличивается содержимое регистра PORTB до тех пор, пока он не заполнится. После этого все начинается сначала. Наконец, цикл for на десять тысяч тактов. Он нужен для формирования видимой задержки в переключении состояния порта В.

ВНИМАНИЕ! Если не выключить оптимизацию, то компилятор сочтет этот цикл бесполезной тратой времени и выкинет его из программы!

Теперь сохраняем этот файл в папке с проектом как Prog1.c, копируем в папку с проектом файл iom16.h, выбираем Project/Add Files и добавляем «iom16.h» и «Prog1.c». Выбираем Release, нажимаем F7, программа компилируется и должно появиться сообщение:

Total number of errors: 0
Total number of warnings: 0

Приведу фотографию своего программатора:

схема программатор AVR

Скачиваем программатор AVReal. Копируем его (AVReal32.exe) в папку Release/exe, где должен лежать файл Prog1.hex. Подаем питание на МК, подключаем кабель-программатор. Открываем Far Manager(в нем наиболее удобно прошивать МК), заходим в эту папку, нажимаем Ctrl+O. Поскольку у нас совершенно новый МК, то набиваем

avreal32.exe +MEGA16 -o11.0592MHZ -p1 -fblev=0,jtagen=1,cksel=F,sut=1 –w

Не забудьте правильно указать частоту, если используете не 11059200 Гц! При этом в МК прошиваются т.н. fuses – регистры, управляющие его работой (использование внутреннего генератора, Jtag и т.п.). После этого он готов к приему первой программы. Программатору в качестве параметров передают используемый LPT-порт, частоту, имя файла и другие (все они перечислены в описании к AVReal). Набираем:

Avreal32.exe +Mega16 -o11.0592MHz -p1 -e -w -az -% Prog1.hex

В случае правильного подключения программатор сообщит об успешном программировании. Нет гарантии, что это получится с первого раза (при первом вызове программы). У меня самого бывает программируется со второго раза. Возможно, LPT-порт глючный или возникают наводки в кабеле. При возникновении проблем тщательно проверьте свой кабель. По своему опыту знаю, что 60% неисправностей связаны с отсутствием контакта в нужном месте, 20% - с наличием в ненужном и еще 15% - с ошибочной пайкой не того не к тому. Если ничего не получится, читайте описание к программатору, попробуйте собрать Byte Blaster.

Предположим, у вас все работает. Если теперь подключить к порту В МК восемь светодиодов (делайте это в выключенном состоянии МК, и желательно последовательно со светодиодами включить резисторы в 300-400 Ом) и подать питание, то произойдет маленькое чудо – по ним побежит «волна»!

IAR AVR программирование
 

 

Таймеры, кнопки и прерывания.

Файлы к статье (размер: 62.2 КБ)

В этой статье будет рассмотрено использование таймеров в МК и способ подсоединения кнопок к нему.

Сначала немного теории.

В МК ATMega16 есть три таймера/счетчика – два 8-битных (Timer/Counter0, Timer/Counter2) и один 16-битный (Timer/Counter1). Каждый из них содержит специальные регистры, одним из которых является счетный регистр TCNTn (n – это число 0, 1 или 2). Каждый раз, когда процессор выполняет одну команду, содержимое этого регистра увеличивается на единицу (либо каждые 8, 64, 256 или 1024 тактов). Потому он и называется счетным. Помимо него, есть еще и регистр сравнения OCRn (Output Compare Register), в который мы можем сами записать какое-либо число. У 8-битного счетчика эти регистры 8-битные. По мере выполнения программы содержимое TCNTn растет и в какой-то момент оно совпадет с содержимым OCRn. Тогда (если заданы специальные параметры) в регистре флагов прерываний TIFR (Timer/Counter Interrupt Flag Register) один из битов становится равен единице и процессор, видя запрос на прерывание, сразу же отрывается от выполнения бесконечного цикла и идет обслуживать прерывание таймера. После этого процесс повторяется.

Ниже представлена временная диаграмма режима CTC (Clear Timer on Compare). В этом режиме счетный регистр очищается в момент совпадения содержимого TCNTn и OCRn, соответственно меняется и период вызова прерывания.

программирование AVR микроконтроллеров AVR на Си

Это далеко не единственных режим работы таймера/счетчика. Можно не очищать счетный регистр в момент совпадения, тогда это будет режим генерации широтно-импульсной модуляции, который мы рассмотрим в следующей статье. Можно менять направление счета, т. е. содержимое счетного регистра будет уменьшаться по мере выполнения программы. Также возможно производить счет не по количеству выполненных процессором команд, а по количеству изменений уровня напряжения на «ножке» T0 или T1 (режим счетчика), можно автоматически, без участия процессора, менять состояние ножек OCn в зависимости от состояния таймера. Таймер/Счетчик1 умеет производить сравнение сразу по двум каналам – А или В.

Далее представлена функциональная схема таймера/счетчика0:

таймер счетчик AVR

Для запуска таймера нужно выставить соответствующие биты в регистре управления таймером TCCRn (Timer/Counter Control Register), после чего он сразу же начинает свою работу.

Мы рассмотрим лишь некоторые режимы работы таймера. Если вам потребуется работа в другом режиме, то читайте Datasheet к ATMega16 – там все подробнейше по-английски написано, даны даже примеры программ на С и ассемблере (недаром же он занимает 357 страниц печатного текста!).

Теперь займемся кнопками.

Если мы собираемся использовать небольшое количество кнопок (до 9 штук), то подключать их следует между «землей» и выводами какого-либо порта микроконтроллера. При этом следует сделать эти выводы входами, для чего установить соответствующие биты в регистре DDRx и включить внутренний подтягивающий резистор установкой битов в регистре PORTx. При этом на данных «ножках» окажется напряжение 5 В. При нажатии кнопки вход МК замыкается на GND и напряжение на нем падает до нуля (а может быть и наоборот – вывод МК замкнут на землю в отжатом состоянии). При этом меняется регистр PINx, в котором хранится текущее состояние порта (в отличие от PORTx, в котором установлено состояние порта при отсутствии нагрузки, т. е. до нажатия каких-либо кнопок). Считывая периодически состояние PINx, можно определить, что нажата кнопка.

ВНИМАНИЕ! Если соответствующий бит в регистре DDRx будет установлен в 1 для вашей кнопки, то хорошее нажатие на кнопку может привести к небольшому пиротехническому эффекту – возникновению дыма вокруг МК. Естественно, МК после этого придется отправить в мусорное ведро…

Перейдем к практической части. Создайте в IAR новое рабочее пространство и новый проект с именем, например, TimerButton. Установите опции проекта так, как это описано в предыдущей статье. А теперь наберем следующий небольшой код.

#include "iom16.h"



void init_timer0(void)	//Инициализация таймера/счетчика0

{

  OCR0 = 255;           //Содержимое регистра сравнения



  //Задаем режим работы таймера

  TCCR0 = (1 << WGM01) | (1 << COM00) | (1 << CS02) | (1 << CS00); 

}



void init_timer2(void)  //Инициализация таймера/счетчика2

{

  OCR2 = 255;

  TCCR2 = (1 << WGM21) | (1 << CS22) | (1 << CS21) | (1 << CS20);

  TIMSK |= (1 << OCIE2);  //Устанавливаем для него прерывание совпадения

}



void main (void)

{

  DDRB = 255;

  init_timer0();

  init_timer2();

  while(1)

  {

  }

}



#pragma vector = TIMER2_COMP_vect  //Прерывание по таймеру2

__interrupt void flashing()

{

  if ((PORTB & 3) == 1)

  {

    PORTB &= (0xFF << 2);       // Отключение выводов PB0, PB1

    PORTB |= 2;	                // Включение PB1

  }

  else

  {

    PORTB &= (0xFF << 2);	// Отключение выводов PB0, PB1

    PORTB |= 1; 		// Включение PB0

  }

}



Давайте посмотрим, как это работает. В функциях init_timern задаются биты в регистрах TCCRn, OCRn и TIMSK, причем такой способ может кому-нибудь показаться странным или незнакомым. Придется объяснить сначала, что означает запись «(1 << WGM01)». << - это оператор сдвига битов, который имеет следующий синтаксис:

C = (a << b), вернее a << b

где a – это то число, двоичное представление которого нужно сдвинуть, а b показывает, на сколько битов нужно его сдвинуть. При этом возможна потеря значения, хранящегося в a (т.е. не всегда возможно восстановить из С то, что было в а). Рассмотрим пример:

Что окажется в С после выполнения строки C = (22 << 3);?

2 в двоичном коде будет выглядеть как 00010110, а после сдвига влево на 3 бита получим С = 10110000.

Аналогично существует и сдвиг вправо. Еще пример:

char C;

…

C = ((0xFF << 2) >> 2);

Сначала выполнится действие во внутренних скобках (0xFF – это 255 в шестнадцатеричном коде), из 11111111 получится 11111100, потом произойдет сдвиг вправо и получим С = 00111111. Как видим, здесь две взаимно обратные операции привели к другому числу, т. к. мы потеряли два бита. Этого не произошло бы, если бы переменная С была типа int, т. к. int занимает 16 бит.

Теперь рассмотрим еще два битовых оператора, широко применяющиеся при программировании МК. Это оператор «побитовое и» (&) и «побитовое или» ( | ). Как они действуют, думаю, будет понятно из примеров:

Действие:				Результат (в двоичном коде):



С = 0;					// C = 00000000

C = (1 << 5) | (1 << 2) | (1 << 0);	// C = 00100101

C |= (1 << 3);				// C = 00101101

C &= (0xF0 >> 2);			// C = 00101100

C = (C & 4) | 3;			// C = 00000111

Чуть не забыл! Есть еще «побитовое исключающее или» ( ^ ). Оно сравнивает соответствующие биты в числе, и, если они одинаковые, возвращает 0, иначе единицу.

Вернемся к нашей программе. Там написано «(1 << WGM01)». WGM01 – это число? – спросите вы. Да, если заглянуть в файл iom16.h, то там можно будет найти следующее:

/* Timer/Counter 0 Control Register */

#define    FOC0	7

#define    WGM00	6

#define    COM01	5

#define    COM00	4

#define    WGM01	3

#define    CS02	2

#define    CS01	1

#define    CS00	0

При компиляции программы запись WGM01 просто заменяется на число 3, и в результате получается уже корректная запись. WGM01 называется макросом и он, в отличие от переменной, не занимает места в памяти (разве что в памяти программиста:-).

Если заглянуть теперь в Datasheet, но нетрудно будет увидеть, что WGM01 – это имя третьего бита в регистре TCCR0. То же самое касается и остальных битов этого регистра. Это совпадение не случайно и относится ко всем регистрам МК (или почти ко всем). Т. е., написав «(1 << WGM01)», мы установили этот бит в единицу и включили режим СТС, что видно из таблицы из Datasheetа:

обработка прерываний AVR

Итого, строчка

TCCR0 = (1 << WGM01) | (1 << COM00) | (1 << CS02) | (1 << CS00);

означает, что включен режим СТС, при срабатывании таймера0 меняется состояние «ножки» ОС0 (Она же PB3), содержимое счетчика увеличивается каждые 1024 такта.

Аналогично для таймера2: TCCR2 = (1 << WGM21) | (1 << CS22) | (1 << CS21) | (1 << CS20); Режим СТС, каждые 1024 такта.

В регистре TIMSK (Timer/counter Interrupt MaSK register) задается режим прерываний. Мы написали

TIMSK |= (1 << OCIE2);

что означает прерывание таймера2 по совпадении TCNT2 и OCR2. Самая последняя функция – это собственно функция прерывания совпадения таймера2. Прерывания объявляются следующим образом:

#pragma vector = ВЕКТОР

__interrupt ТИП ИМЯ()

где ВЕКТОР – это макрос вектора прерывания (по смыслу просто число, характеризующее это прерывание); эти макросы в порядке снижения приоритета перечислены в файле iom16.h. ТИП – тип возвращаемого функцией значения, в нашем случае void (ничего). ИМЯ – произвольное имя для этой функции. С прерываниями мы еще успеем наработаться в будущем.

При выполнении нашей функции должны по очереди моргать светодиоды, подключенные к PB0 и PB1. Судя по всему, частота равна 11059200/(256*1024) = 42 Гц. Это быстро, но будет заметно невооруженным глазом. Кстати, применение таймеров дает возможность отсчитывать точные временные интервалы, не зависящие от сложности вашей программы и порядка ее выполнения (но если у Вас не более одного прерывания).

Итак, сохраняем файл как «TimerDebug.c», добавляем его в проект, компилируем, прошиваем МК. Что же мы видим? Светодиод, подключенный к выводу PB3, будет активно моргать, а на PB0 и PB1 нет ни каких изменений. В чем же дело? Неужели что-то неверно?

Чтобы это выяснить, придется отладить нашу программу. Поскольку в IAR нет Debuggerа, придется использовать AVR Studio. Эту среду разработки можно скачать с сайта производителя http://atmel.com. Проблем с ее установкой, думаю, не должно быть. Перед запуском AVR Studio выберите в IAR режим Debug и создайте отладочный cof-файл (все опции проекта должны быть выставлены, как описано в предыдущей статье).

Открыв AVR Studio, мы увидим окно приветствия, в котором выберем «Open». Теперь лезем в папку с проектом, там в Debug\Exe, выбираем там «TimerDebug.cof», создаем проект там, где предложат, выбираем дивайс ATMega16 и режим отладки Simulator. После этого, если все сделали правильно, сразу же идет процесс отладки

отладка AVR AVR Studio

Среда отладки здесь очень удобная, т.к. позволяет просматривать содержимое всех регистров МК, а также вручную устанавливать значения для них щелчками мыши. Например, если установить флаг прерывания в регистре TIFR в бите 7 (под черным квадратом в TIMSK), то следующим шагом программы (нажатие F10 или F11) должна быть обработка прерывания (флаг будет установлен автоматически и при совпадении регистров TCNT2 и OCR2). Но, к нашему удивлению, прерывания не будет!

Возникает вопрос: почему?

Откроем регистр CPU, SREG. Этот регистр определяет работу процессора, а конкретно седьмой его бит (I-бит, Interrupt bit) ответственен за обработку всех прерываний в МК. У нас он не установлен. Стоит его выставить, как сразу же пойдет выполняться прерывание (если одновременно установлен седьмой бит в TIFR).

отладка AVR AVR Studio  

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

Значит, нужно добавить строчку кода для установки этого бита в единичное состояние. Добавим мы его в функцию init_timer2. Получится следующее:

void init_timer2(void)

{

  SREG |= (1 << 7);  //Добавили эту строчку

  OCR2 = 255;

  TCCR2 = (1 << WGM21) | (1 << CS22) | (1 << CS21) | (1 << CS20);

  TIMSK |= (1 << OCIE2);

}

Теперь, выбрав конфигурацию Release и прошив МК нажатием F7 и запуском AVReal32.exe, с радостью увидим, что все работает как надо.

Замечание: при отладке программы следует уменьшать интервалы таймеров, если они слишком длинные, т. к. в процессе отладки в AVR Studio программа выполняется в тысячи раз медленнее, чем внутри МК и вы не дождетесь срабатывания таймера. В целом отладка полностью аналогична таковой в других системах программирования, таких, как Visual C++.

Теперь, научившись отлаживать программы, создадим в IAR новый файл (а старый сохраним и удалим из проекта) и наберем следующий код:

#include "iom16.h"



long unsigned int counter = 0;  //Счетчик для формирования временных интервалов

unsigned char B0Pressed = 0;  //Здесь хранится состояние кнопки0 (0 - не нажата, 1 - нажата)

unsigned char B1Pressed = 0;  //Здесь хранится состояние кнопки1 (0 - не нажата, 1 - нажата)



//Инициализация таймера2

//Нужно каждые 11059 такта (1 мс) увеличивать counter. У нас получается каждые 1,001175 мс

void init_timer2()

{

  OCR2 = 173;

  TCCR2 = (1 << WGM21) | (1 << CS22);

  TIMSK = (1 << 7);

}



//Инициализация портов ввода/вывода

init_io_ports()

{

  DDRA =(1<< DDA0)|(1<< DDA1)|(1<< DDA2)|(1<< DDA3)|(1<< DDA4)|(1<< DDA5)|(1<< DDA6)|(1<< DDA7);

  DDRB =(1<< DDB0)|(1<< DDB1)|(1<< DDB2)|(1<< DDB3)|(1<< DDB4)|(1<< DDB5)|(1<< DDB6)|(1<< DDB7);

  DDRC =(0<< DDC0)|(0<< DDC1)|(1<< DDC2)|(1<< DDC3)|(1<< DDC4)|(1<< DDC5)|(1<< DDC6)|(1<< DDC7);

  DDRD =(1<< DDD0)|(1<< DDD1)|(1<< DDD2)|(1<< DDD3)|(1<< DDD4)|(1<< DDD5)|(1<< DDD6)|(1<< DDD7);

  

  PORTA =(0<< PA0)|(0<< PA1)|(0<< PA2)|(0<< PA3)|(0<< PA4)|(0<< PA5)|(0<< PA6)|(0<< PA7);

  PORTB =(0<< PB0)|(0<< PB1)|(0<< PB2)|(0<< PB3)|(0<< PB4)|(0<< PB5)|(0<< PB6)|(0<< PB7);

  PORTC =(1<< PC0)|(1<< PC1)|(0<< PC2)|(0<< PC3)|(0<< PC4)|(0<< PC5)|(0<< PC6)|(0<< PC7);

  PORTD =(0<< PD0)|(0<< PD1)|(0<< PD2)|(0<< PD3)|(0<< PD4)|(0<< PD5)|(0<< PD6)|(0<< PD7);

}



//формирование задержки в Pause_ms миллисекунд

void delay(long unsigned int Pause_ms)

{

  counter = 0;

  while (counter < Pause_ms)

  {}

}



void main()

{

  SREG |= (1 << 7); //Разрешаем прерывания

  init_timer2();  //Включаем таймер2 на каждые 64 такта, считать до 173

  init_io_ports();  //Включаем порты ввода/вывода

  while(1)

  {

    //Обработка кнопки 0  

    if (B0Pressed == 1) //Если произошло нажатие на кнопку, 

    {                   // уведичивает PORTB, ждет отпускания

      PORTB++;

      B0Pressed = 0;

      while ((PINC & (1 << PC0)) == 1)

      {}

    }

    else

    {

      if ((PINC & (1 << PC0)) == 1)      //Фиксирует нажатие

      {

        delay(50);        //Устранение "дребезга клавиш"

        if ((PINC & (1 << PC0)) == 1)    //Проверяет нажатие

        {

          B0Pressed = 1;  //Устанавливает флаг "кнопка нажата"

        }

      }    

    }

    //Обработка кнопки 1

    if (B1Pressed == 1)  //Если произошло нажатие на кнопку, 

    {                     // уменьшает PORTB, ждет отпускания

      PORTB--;

      B1Pressed = 0;

      while ((PINC & (1 << PC1)) == 2)

      {}

    }

    else

    {

      if ((PINC & (1 << PC1)) == 2)      //Фиксирует нажатие

      {

        delay(200);        //Устранение "дребезга клавиш"

        if ((PINC & (1 << PC1)) == 2)    //Проверяет нажатие

        {

          B1Pressed = 1;  //Устанавливает флаг "кнопка нажата"

        }

      }    

    }

  }

}



//Прерывание по таймеру 2, прн этом увеличение счетчика counter

#pragma vector = TIMER2_COMP_vect

__interrupt void inc_delay_counter()

{

  counter++;

}



Сначала предлагаю взять уже готовый файл прошивки (файлы к статье, папка Release, файл TimerButton.hex или откомпилировать этот текст) и записать его в МК. После чего вынуть кабель прошивки, подключить к PC0 и PC1 кнопки и попробовать их понажимать. Увидим, что при нажатии на одну из кнопок увеличивается регистр PORTB (загораются светодиоды), а при нажатии на другую – уменьшается. Если не работает – попробуйте понажимать одну кнопку, удерживая другую – будет действовать. Дело в том, что я подключал кнопки следующим образом: при нажатии на кнопку вывод МК «болтается» в воздухе, а при отпускании замыкается на землю. Если вы подключили кнопки по-другому, то придется лишь чуть модернизировать программу.

Давайте разберемся с кодом. Здесь работа с таймером организована несколько иначе. Он срабатывает каждые 11072 такта (то есть каждые 1,001175 мс) и увеличивает содержимое переменной counter. Есть еще функция delay(long unsigned int Pause_ms), которая берет в качестве параметра количество миллисекунд Pause_ms, сбрасывает counter и ждет, когда counter достигнет значения Pause_ms, после чего продолжает работу МК. Таким образом, написав delay(1500), мы сформируем задержку в программе в 1,5 секунды. Это очень удобно для формирования временных интервалов.

С таймером вроде все понятно. Но для чего он используется? Рассмотрим бесконечный цикл while(1) в main(). В этом цикле проверяется состояние кнопок путем анализа содержимого регистра PINB. А зачем там стоит задержка на 50 мс? Это устранение т. н. «дребезга клавиш». Дело в том, что при нажатии на кнопку происходит удар одного контакта о другой, и, поскольку контакты металлические, удар этот упругий. Контакты, пружиня, замыкаются и размыкаются несколько раз, несмотря на то, что палец сделал лишь одно нажатие. Это приводит к тому, что МК фиксирует несколько нажатий. Давайте рассмотрим график зависимости напряжения на выходе PC0 от времени. Он может выглядеть так:

прерывания ATMega

Точка А – момент нажатия кнопки. Он может быть зафиксирован МК. Затем идут несколько замыканий и размыканий (их может и не быть, а может быть и 12 штук – это явление можно считать случайным). В точке B контакт уже надежно зафиксирован. Между A и B в среднем около 10 мс. Наконец, в точке D происходит размыкание. Как же избавиться от этого неприятного явления? Оказывается, очень просто. Нужно зафиксировать момент нажатия кнопки (точка А), через какое-то время, например, 50 мс (точка С) проверить, что кнопка действительно нажата, сделать действие, соответствующее этой кнопке и ждать момент ее отпускания (точка D). То есть нужно сделать паузу от А до С, такую, чтобы весь «дребезг» оказался внутри этой паузы. А попробуйте теперь убрать строчку, формирующую задержку, откомпилировать программу и зашить ее в МК. Путем простых нажиманий на кнопки сможете легко убедиться, что все эти «мучения» не были напрасными.

А что же делать, если к МК нужно подключить, скажем, 40 кнопок? Ведь у него всего лишь 32 вывода. Казалось бы, никак. На самом деле это возможно. В таком случае используют алгоритм, называемый стробированием. Для этого нужно кнопки соединить в виде матрицы, как это показано на рисунке (рисунок взят из книги Мортона «МК AVR, вводный курс», где написано про программирование AVR на ассемблере).

программирование микроконтроллеров ATMega

При подаче на вывод PB0 лог. 1 (+5В), а на выводы PB1 и PB2 лог. 0 разрешается обработка кнопок 1, 4 и 7. После этого состояние каждой из них можно узнать, проверив напряжение на одном из выводов PB3..PB5. Таким образом, подавая последовательно на выводы PB0..PB2 лог. 1, можно определить состояние всех кнопок. Понятное дело, что выводы PB0..PB2 должны быть выходами, а PB0..PB2 входами. Чтобы определить, какое количество выводов потребуется для массива из Х кнопок, нужно найти пару сомножителей Х, сумма которых наименьшая (для нашего случая с 40 кнопками это будут числа 5 и 8). Это означает, что к одному МК можно подключить до 256 кнопок (а с применение дешифраторов и того больше, но о дешифраторах потом). Лучше сделать меньшее число выводов выходами, а большее – входами. В этом случае опрос всех строк матрицы займет меньше времени. Подобный способ подключения (стробирование) свойственен не только для кнопок. Там можно подключать самые разнообразные устройства, начиная от матриц светодиодов и заканчивая микросхемами flash-памяти.

 

 

Использование ШИМ. Подключение полевых транзисторов.

Файлы к статье (размер: 103 КБ)

В этой статье мы рассмотрим вопросы регулировки мощности различных устройств, подключенных через полевой транзистор к МК с помощью широтно-импульсной модуляции (ШИМ)

Сначала немного теории. ШИМ - это широко используемый в электронике способ регулировки мощности самых разнообразных устройств. Где он только не нашел еще применения! Способ заключается в кратковременном включении устройства (на доли миллисекунд), а затем его отключении на некоторый момент времени. Такой цикл включений-выключений непрерывно повторяется. Рассмотрим диаграмму ниже.

программирование AVR микроконтроллеров AVR на Си

На диаграмме показана зависимость напряжения на нагрузке от времени. Закрашенное серым - это область, когда управляемый с помощью ШИМ прибор был включен. Выделяемую энергию можно считать пропорциональной площади этой области. Отношение периода повторения импульсов (T) к их длительности (AC) называется скважностью. Величина, обратная скважности, называется коэффициентом заполнения. Судя по диаграмме, скважность наиболее велика в середине диаграммы. Значит, на этом участке на нагрузке выделялось наименьшее количество энергии в единицу времени. Надеюсь, с этим все понятно. Но возникает вопрос: а чем же так хороша ШИМ? Почему бы не использовать для регулировки мощности устройство, способное менять сопротивление (переменный резистор или транзистор)? Рассмотрим две, казалось бы, эквивалентные схемы.

программирование AVR микроконтроллеров AVR на Си

Если менять сопротивление резистора, как показано на графике в центре, а на ключевой элемент правой схемы подавать ШИМ-последовательность, изображенную на диаграмме, то лампочки будут в любой момент времени светить одинаково (UL - напряжение на лампочке). Но в правой схеме энергия будет выделяться только в лампочке, а в левой - и в лампочке, и в резисторе (или транзисторе, которым можно с успехом его заменить). Резистор будет разогреваться, и, возможно, не хуже лампочки. Поэтому на вопрос, какая схема рациональнее, я думаю, любой ответит, что правая. Она называется импульсной, а левая схема - линейной. Когда работают с мощной сильноточной электроникой, всегда отдают предпочтение именно импульсным элементам и способам. Линейные применяются лишь там, где управляют малыми мощностями и слабыми токами. К тому же, в цифровой электронике, где существуют лишь два состояния - "включено" и "выключено", ШИМ реализовать намного легче. Чем мы и займемся в этой статье.

Для этого нам понадобится совсем немного - полевой транзистор, который и будет работать у нас в качестве ключа (в ключевом режиме). Полевой транзистор предпочтительней потому, что его затвор изолирован от силовой схемы и управление производится электрическим полем, а ток управления достигает микроампер. Это позволяет, используя один-два транзистора, управлять с их помощью нагрузкой огромной мощности (до десятков ампер и десятков-сотен вольт), не нагружая МК. Замечательные мощные и недорогие (10 - 30 руб) транзисторы производит фирма International Rectifier. Они имеют название IRFxxxx, где xxxx - трех или четырехзначный номер. Я использовал в своей макетной плате IRF7311. Подойдут также и другие подобные ему: IRF7341, IRF7103 IRF7301, IRF7343, IRF7401, IRF7403, IRF7413... Эти транзисторы управляются логическим уровнем +5 В, т. е. нашего МК будет достаточно, чтобы полностью их открыть. Они, в свою очередь, могут управлять напряжением от 20 В (все) до 50 В (IRF7103, IRF7341) и через них можно будет открывать и закрывать более мощные транзисторы с достаточно высоким управляющим напряжением, например, IRF530. Таким образом, возможно собрать очень мощный быстродействующий каскад на полевых транзисторах, способный с помощью ШИМ плавно менять мощность на нагрузке, коммутируя токи в десятки ампер. Учитывая также тот факт, что полевые транзисторы можно соединять параллельно (в отличие от биполярных), возможно получить еще более мощный каскад на сотни ампер. Здесь все упирается уже лишь в финансы.

Итак, предположим, Вы решили купить IRF7311. Если открыть его Datasheet (есть в файлах к статье), то выясняется следующее: это махонькая микросхема в корпусе SO-8, внутри которой располагаются два полевых транзистора с индуцированным каналом N-типа и встроенными диодами Шоттки. Это означает, что для открывания транзистора надо подать на затвор G (Gate - "ворота, шлюз") управляющее напряжение +5 В по отношению к истоку S (Source - "источник"). Тогда, если было приложено коммутируемое напряжение "плюсом" к стоку D (Drain - "сток") и "минусом" к истоку, то потечет достаточно сильный ток (до 6 А) от D к S. Наличие диода Шоттки позволяет, не боясь ЭДС самоиндукции, применять эти транзисторы для управления электромоторами. Ниже приведу цоколевку транзистора и его внешний вид (сфотографировать его нереально, поэтому покажу чертеж)

программирование AVR микроконтроллеров AVR на Си

Сверху на корпусе в углу должна быть точка, такая же, как на рисунке. Она стоит рядом с "ножкой" 1. Кстати, у всех микросхем "ножки" нумеруются начиная от подобной метки против часовой стрелки, если смотреть сверху - а то вдруг кто не знает... Если Вы купили полевой транзистор с P-каналом - ничего страшного. Тогда Вам придется подать "минус" на G (относительно S) для включения и поменять полярность нагрузки. То есть для любого полевого транзистора с индуцированным затвором нужно подавать ток против стрелочки, расположенной между затвором и диодом, а нагрузку подключать так, чтобы ток через нее тек в направлении, обратном встроенному диоду. Вот и все.

Прицепим теперь наш транзистор IRF7311 затвором к 21 "ножке" МК (PD7, OC2) и истоком к "земле". К его стоку подключим "плюс" внешнего источника питания (до 20 В), а между его "минусом" и истоком подключим нагрузку, например, лампочку или электромоторчик постоянного тока.

программирование AVR микроконтроллеров AVR на Си

Когда я все собрал, получилось вот так (хоть проводов и не видно, но лампочка подключена):

программирование AVR микроконтроллеров AVR на Си

Осталось только разобраться, как МК реализует ШИМ и написать программу. Как уже говорилось ранее, в нашем МК есть 3 таймера, и все они могут работать в ШИМ-режиме. Таймер1 является самым навороченным и может выводить ШИМ сразу на двух выводах МК. Но мы не будем вдаваться в ненужные нам пока подробности и сложности и рассмотрим работу с ШИМ на примере таймера2.

Существуют два режима работы таймера в качестве ШИМ-модулятора. Это Fast PWM (быстрая ШИМ) и Phase correct PWM (ШИМ с фазовой коррекцией). Рассмотрим оба режима на следующих диаграммах:

программирование AVR микроконтроллеров AVR на Си

Режим работы определяется содержимым битов WGM (Waveform Generation Mode) в регистре TCCR2. В Datasheetе написано, что для ШИМ с фазовой коррекцией нужно установить в единицу WGM20, а для быстрой ШИМ WGM20 и WGM21. Чем же отличаются эти режимы? В быстром режиме меняется состояние "ножки" OC2 в моменты совпадения счетного регистра TCNT2 и регистра сравнения OCR2 (зеленая стрелка), а также в момент сброса таймера (синяя стрелка).При этом серединка импульса (оранжевая) как бы смещается влево, меняется фаза импульса. В режиме фазовой коррекции такого явления не наблюдается. В этом режиме таймер, досчитав до максимума (до 255), начинает счет в другую сторону. В моменты совпадения регистров TCNT2 и OCR2 меняется состояние ножки OC2. При этом серединка импульса никуда не смещается. Этот режим имеет в два раза меньшую частоту, чем быстрый, но изготовитель утверждает, что он лучше подходит для управления электромоторами (скорее всего, шаговыми). Быстрый режим можно использовать в любых других случаях. Все остальные таймеры работают в ШИМ-режиме аналогично, таймер1 позволяет также менять период ШИМ произвольным образом, но, думаю, нам это ни к чему.

С теорией вроде бы теперь все понятно. Откроем IAR, создадим новый проект, наберем следующий код:

#include "iom16.h"



unsigned char pwm = 1;

unsigned char inc = 1; // inc = 0 - уменьшать, inc = 1 - увеличивать яркость



void timer2_init()

{

  OCR2 = 1; //ШИМ почти выключена

  // Быстрая ШИМ, переключать OC2 (PD7), увеличение таймера каждые 64 такта

  TCCR2 |= (1 << WGM20) | ( 1 << WGM21) | (1 << COM21) | (1 << CS22);

}



void timer1_init()

{

  OCR1A = 43200; //Прерывание 32 раза в секунду

  TCCR1A = 0;

  // СТС режим, увеличение таймера каждые 8 тактов

  TCCR1B |= (1 << WGM12) | (1 << CS11);

  // Прерывание по совпадению А таймера1

  TIMSK |= (1 << OCIE1A);

  SREG |= (1 << 7); //Разрешить прерывания

}



void io_init() //Инициализация портов ввода-вывода

{

  DDRD = (1 << PD7);

  PORTD = 0;

}



void main ()

{

  timer2_init();

  timer1_init();

  io_init();

  while(1)

  {

  }

}



// Заставляет лампу плавно загораться и гаснуть раз в 8 секунд

#pragma vector = TIMER1_COMPA_vect 

__interrupt void PWM_change()

{

  if (inc == 1) 

  {

    if (pwm < 254)

    {

      pwm++;  // Увеличиваем яркость лампы, пока не достигнем максимума

      OCR2 = pwm;

    }

    else

    {

      inc = 0;

    }

  }

  else

  {

    if (pwm > 1)

    {

      pwm--;  // Уменьшаем яркость лампы, пока не остигнем минимума

      OCR2 = pwm;

    }

    else

    {

      inc = 1;

    }

  }

}

Функция timer2_init() используется нами для включения таймера в ШИМ-режиме. Таймер будет увеличивать счетный регистр каждые 64 такта, работать в режиме Fast PWM, меняя состояние ОС2 неинвертированным образом (биты СОМ20, СОМ21). Да, забыл сказать. Эти биты отвечают за поведение "ножки" ОС2, к которой подключен транзистор. Режим может быть инвертированным и неинвертированным. Чтобы это понять, посмотрите на диаграмму выше. Там приведен график состояния ОС2 (неинвертированный выход) и ОС2 с чертой (инвертированный выход). Если оба бита установлены в 1, то режим будет инвертированным. При работе с ШИМ и использовании транзисторов есть одна ловушка: не все транзисторы могут очень быстро менять свое состояние. Для одних могут потребоваться десятки-сотни наносекунд (как для нашего), для других - микросекунды и десятки микросекунд. Поэтому не советую, не изучив документацию на транзистор, использовать его на высокой частоте - большая нагрузка при высокой частоте ШИМ может его сжечь.

timer1_init() включает таймер2 и заставляет его делать 32 прерывания в секунду. Когда происходит прерывание, меняется OCR2 регистр и, соответственно, яркость лампы. Таким образом, лампа будет плавно загораться и плавно гаснуть раз в 8 секунд. Можно вместо таймера подключить кнопки и менять яркость при их нажатии. Но у нас для наглядности все будет происходить автоматически.

Сохраним этот файл в папке с проектом, добавим его в проект, установим опции проекта так, как это написано в статье 1, но можно оптимизацию теперь не выключать. Дело в том, что в первой статье мы формировали задержку с помощью цикла. Это делать с точки зрения программирования неграмотно и для увеличения скорости программы компилятор такие циклы выкидывает. Сейчас же мы используем встроенное в МК "железо", что не уменьшает производительность и скорость. Поэтому оптимизация ничего плохого не сделает.

Выбираем Release, нажимаем F7, программа компилируется. Запускаем AVReal, прошиваем МК. Кстати, возможно, у Вас возникал вопрос: а бесконечное ли число раз можно перепрошивать МК? Оказывается, нет. Всего лишь 10000 раз (как минимум). Поэтому, думаю, об этом совершенно не стоит беспокоиться. После того, как все это сделали, можно проверять устройство.

ВАЖНО!!! Сначала нужно подать питание на МК, убедиться, что транзистор подсоединен к МК, и лишь затем подавать питание в цепь с лампой (мотором) и полевым транзистором. Иначе можете сжеть транзистор. Дело в том, что в выключенном состоянии "ножки" МК "болтаются в воздухе" - они ни к чему не подключены, и на них возникают наводки. Этих слабеньких наводок достаточно, чтобы частично открыть очень чувствительный полевой транзистор. Тогда его сопротивление между стоком и истоком упадет от нескольких МОм до нескольких Ом или долей Ом и через него потечет большой ток к лампе. Но транзистор не откроется полностью, т. к. для этого нужно подать на затвор не 1-3 В наводки, а стабильные 5 В, и его сопротивление будет намного больше минимального (для IRF7311 это 0,029 Ом). Это приведет к выделению на нем большого количества тепла, и он задымится, а может, и сгорит. Хотя, конечно, все зависит от мощности лампы или мотора.

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

программирование AVR микроконтроллеров AVR на Си
программирование AVR микроконтроллеров AVR на Си

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

 

 

Подключение семисегментных индикаторов.

Файлы к статье (размер: 81.1 КБ)

В этой статье мы рассмотрим подключение семисегментных индикаторов к МК и работу с ними. Что это такое, будет понятно из картинки:

программирование AVR микроконтроллеров на Си

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

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

В качестве примера рассмотрим два индикатора: SA39-11xxx (xxx - три-четыре буквы, кодирующие цвет, в моём случае GWA) и BC56-12xxx (у меня xxx = SRWA).
Приведу ниже список цветов:

  • HWA - ярко-красный на фосфиде галлия GaP, 700 нм
  • EWA - высокопроизводительный красный на фосфиде-арсениде и фосфиде галлия GaAsP/GaP, 625 нм (не знаю, как по-другому можно перевести "HIGH EFFICIENCY RED")
  • GWA - зеленый на фосфиде галлия GaP, 565 нм
  • YWA - желтый на фосфиде-арсениде и фосфиде галлия GaAsP/GaP, 590 нм
  • SRWA - супер ярко-красный на арсениде галлия-алюминия GaAlAs, 660 нм

В названии индикаторов вторая буква обознаяет тип соединения светодиодов: С - общий катод, А - общий анод. Ниже приведена электрическая схема и чертеж SA39 и SC39. Обратите внимание на буквы, которыми обозначили каждый сегмент (a-g) и обозначение точки (DP). Эти названия мы будем использовать в коде программы для объявления макросов. Это позволит как можно сильнее абстагировать программу от электрической схемы, от способа соединения индикатора и МК.

программирование AVR микроконтроллеров на Си

Значит, "ножки" 3 и 8 нужно подключить к шине +5 В (или, в крайнем случае, подать на них +5 В от МК, но так делать не рекомендуется), а остальные - к какому-либо порту МК. При этом не очень-то важно, в каком порядке, т. к. в случае ошибки Вы просто увидите на индикаторе не цифру, а какую-нибудь букву "зю". Тогда придется либо подключить по-другому, либо внести небольшие изменения в программу. В общем, символ, отображемый на индикаторе, зависит от того, какое число отправить в порт. Всего существует 255 комбинаций, и все они возможны независимо от способа подключения. Я использовал порт D для подключения индикатора.

программирование AVR микроконтроллеров на Си

Остается только лишь написать простенькую программу:

#include "iom16.h"

#define a 1   // Эти макросы содержат числа, соответствующие двойке,

#define b 2   // возведенной в степень, равной номеру "ножки" того

#define c 4   // порта, к которому подключен сегмент индикатора с

#define d 128 // одноименным макросу названием. Для того, чтобы вывести

#define e 64  // какую-либо цифру на индикатор, нужно отправить в порт

#define f 32  // число 255 минус сумму соответствующих сегментам макросов.

#define g 16  // Эти числа позволяют сделать программу независимой от подключения.

#define DP 8  // Измените эти числа, если индикатор выводит букву "зю"



short unsigned int i = 1;

unsigned char DigNumber = 0;

unsigned char Dig[10]; // Массив, в котором хранятся числа, которые нужно

// вывести через порт на индикатор, чтобы он показал цифру, равную номеру

// элемента массива. Числа зависят только от макросов.



void io_init()

{

  DDRD = 0xFF;  // К порту D подключен индикатор

  PORTD = 0xFF;

}



void timer0_init()

{

  OCR0 = 15;  // Таймер срабатывает каждые 1024 такта. Прерывание каждые

  // 1024*16 тактов.

  TCCR0 |= (1 << WGM01) | (1 << CS00) | (1 << CS02);

  TIMSK |= (1 << OCIE0);

}



void Dig_init()

{

  Dig[0] = 255 - (a+b+c+d+e+f);   // Если индикатор с общим анодом,

  Dig[1] = 255 - (b+c);           // нужно сумму макросов отнять от

  Dig[2] = 255 - (a+b+g+e+d);     // 255. Если с общим катодом, то

  Dig[3] = 255 - (a+b+g+c+d);     // отнимать не нужно.

  Dig[4] = 255 - (f+g+b+c);       // Имена макросов соответствуют

  Dig[5] = 255 - (a+f+g+c+d);     // именам сегментов индикатора

  Dig[6] = 255 - (a+f+g+c+d+e);

  Dig[7] = 255 - (a+b+c);

  Dig[8] = 255 - (a+b+c+d+e+f+g);

  Dig[9] = 255 - (a+b+c+d+f+g);

}



void main()

{

  io_init();

  timer0_init();

  Dig_init();

  SREG |= (1 << 7);

  PORTD = Dig[0];   //Выводим на индикатор цифру "0"

  while(1)

  {}

}



#pragma vector = TIMER0_COMP_vect

__interrupt void Indic_change()

{

  if (i < 675)  // 675*16*1024 = 11,0592 МГц

  {             // Каждую секунду меняется цифра на индикаторе

    i++;

  }

  else

  {

    i = 1;

    if (DigNumber < 9)

      DigNumber++;

    else

      DigNumber = 0;

    PORTD = Dig[DigNumber];

  }

}

Как это работает, думаю, ясно из комментариев к коду. Макросы после #define позволяют сделать код почти независящим от способа подключения индикатора. Если, например, Вы подключили 5-й вывод индикатора (d-сегмент) к выводу PD3 МК, то для того, чтобы все правильно работало, нужно сопоставить макросу d число 23=8, написав

#define d 8
 

Откомпилировав программу и прошив ее в МК, если все правильно подключено и соответствующе описано в #define, получаем цифровые электронные часы, которые умеют считать до 10. Если у Вас установлен резонатор на 11,0592 МГц, то эти часы будут тикать раз в секунду и с, казалось бы, поразительной точностью: за час они не собьются ни на секунду! Но удивительного тут ничего нет: вся точность упирается в качество резонатора и отсутствие ошибок в программе. Кстати, в электронных часах стоят такие же резонаторы, только меньших размеров и частот (обычно 3 КГц). Но собирать часы на МК несколько нерационально, потому что существуют специализированные микросхемы для этого, умеющие отсчитывать время, дату, месяц, день недели, год и т.д. Связав с такой микросхемой МК, можно научить его "чувствовать" время.

программирование AVR микроконтроллеров на Си

Но мы несколько отвлеклись от темы нашей статьи. Теперь пора рассмотреть работу с трехзначным индикатором, коим является BC56-12xxx. По логике у него должно быть 8*3+1=25 выводов. Но у него их только лишь 12. Давайте посмотрим его документацию.

программирование AVR микроконтроллеров на Си

Оказывается, внутри находятся три семисегментных индикатора, соединенные параллельно, и от каждого из них выходит один общий электрод (катод или анод). Чтобы было понятнее, покажу электрическую схему:

программирование AVR микроконтроллеров на Си

Итак, подавая напряжение на выводы 1, 2, 3, 4, 5, 7, 10, 11, формируют цифру (символ), мы их назовем информационными или шиной данных, а управляя выводами 8, 9, 12, определяют позицию этой цифры. Выводы 8, 9, 12 назовем выводами выбора устройства или шиной адреса. Понятно, что нельзя одновременно зажечь две или три разные цифры. Придется использовать стробирование, т. е. зажигать цифры по очереди с высокой скоростью. Они будут мерцать, но глаз этого не успеет заметить.

Значит, с выводами 1, 2, 3, 4, 5, 7, 10, 11 работа совершенно аналогична. А выводы 8, 9, 12 нужно замыкать на землю по очереди. Казалось бы, чего проще - присоединить их к МК и все. Но, как я уже говорил, не следует цеплять к МК общий электрод - это слишком большая нагрузка для него, и его порт ввода-вывода может сгореть. Следует использовать полевые транзисторы, как это было описано в предыдущей статье.

Мне кажется, настало время рассказать о шифраторах и дешифраторах. Дешифраторами называются комбинационные устройства, преобразующие n-разрядный двоичный код на их входе в логический сигнал, появляющийся на том выходе, десятичный номер которого соответствует двоичному коду. Дешифраторы имеют как правило 3 или 4 входа и 8 или 16 выходов соответственно. Как работает дешифратор? Подадим на вход число в двоичном коде, например, 5, установив лог. 1 на первом и третьем выводах на входе. Тогда появится лог. 1 на пятом выходе. Шифраторы выполняют обратную операцию - если подать лог. 1 на один из входов, на выходе появится двоичный код номера этого входа. Но я не знаю, где их применяют.

Дешифраторы позволяют решить проблему нехватки выходов. Например, у МК есть 3 свободных выхода для выбора устройства, а мы хотим подключить семь устройств. Но ведь у этих трех выходов могут быть 8 различных состояний! Подключив дешифратор, из трех выходов сделаем восемь работающих по очереди и решим т. о. проблему.

В школах и особенно вузах часто на уроках информатики рисуют логическую схему работы памяти, где есть груда логических элементов "И" и/или "ИЛИ" для выборки ячейки памяти, какая-то шина данных, шина адреса, ячейки памяти... Короче, обычно преподаватель сам не может понять, что он нарисовал, как это все работает и не загибается. Оказывается, там стоит дешифратор и все работает очень просто. По шине адреса приходит адрес ячейки памяти в двоичном коде, в которую надо записать информацию (или прочитать) и поступает в дешифратор. Дешифратор подключает требуемую ячейку к цепи питания, ячейка начинает работать и сохраняет тот двоичный код, который установлен на шине данных (или выдает туда свое содержимое). После этого исчезает адрес на шине адреса и дешифратор отключает эту ячейку до следующего использования. При запуске компьютера в программе Setup можно установить напряжение на ЦПУ (там можно выбрать из нескольких значений). А как это происходит? Есть специальная шина, по которой двоичный код поступает в дешифратор. Дешифратор открывает один из нескольких транзисторов и через этот транзистор идет питание требуемого напряжения на ЦПУ.

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

Вернемся к нашим баранам. Схема очень проста. Я прицепил к порту А половинку панельки для широких микросхем, так чтобы подключенными оказались выводы 1, 2, 3, 4, 5, 7, 10, 11 вставленного в нее семисегментного индикатора BC56-12xxx. Другие три вывода подключены через уже знакомые нам транзисторы IRF7311 к выводам порта С (вывод 12 к РС5, 9 - к РС6, 8 - к РС7). Один из транзисторов (корпуса два, а их четыре) остался про запас.

программирование AVR микроконтроллеров на C

Код программы приведен ниже. Поскольку в будущем может возникнуть необходимость некоторое трехзначное число, хранящееся в переменной, вывести на индикатор, неплохо было бы написать для этого какую-нибудь специальную функцию. Назовем ее Display(). Казалось бы, реализовать ее очень просто, нужно число поделить на 100, найти целое от деления и остаток и потом также поделить на 10. Но... Но МК не знает функций mod и div. Это во-первых. А во-вторых, у него нет математического сопроцессора для деления, и одна операция деления может занимать сотни и даже тысячи тактов процессора, в отличие от сложения/вычитания (1 такт для char) и умножения на целое(2 такта для char). Поэтому всегда старайтесь заменить деление чем-либо другим, если возможно. Иногда бывает даже рациональнее отправить некоторые данные через COM-порт в компьютер, там произвести вычисления и вернуть обратно результат. Как это реализовать, в следующей статье. А сейчас рассмотрим наглядный пример.

Предположим, Вы решили поставить у себя в ванной электронный регулятор температуры воды на МК, который постоянно измеряет температуру воды в душе специальным датчиком и с помощью мотора крутит кран так, чтобы температура стремилась к заданному значению. И Вы используете некий алгоритм, позволяющий с очень большой точностью управлять этим процессом. Но алгоритм содержит операции деления, извлечения корня, вычисления логарифма, косинуса и, несомненно, интеграла. И когда Вы пойдете мыться, после поворота ручки регулировки температуры, МК "зависнет" и будет на Вас несколько секунд будет лить воду температурой 70-80 °С, а потом, когда он все вычислит, с большой точностью выставит нужные Вам 28,32204°С. :)

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

#include "iom16.h"

#define a 1

#define b 4

#define c 16

#define d 64  //Меняем эти числа для другого индикатора

#define e 128

#define f 2

#define g 8

#define DP 32



short unsigned int i = 1;

short unsigned int Number = 0;

unsigned char      Dig[10];

// В этих переменных хранятся цифры, которые нужно отобразить

char               Disp5, Disp6, Disp7;



// Функция выделяет цифры из трехзначного числа Number

void Display (short unsigned int Number)

{

  unsigned char Num1, Num2, Num3;

  Num1=Num2=0;

  while (Number >= 100)  

  {

    Number -= 100;  

    Num1++;  

  }

  while (Number >= 10) 

  {

    Number -= 10;  

    Num2++; 

  }

  Num3 = Number;

  Disp5 = Dig[Num1];

  Disp6 = Dig[Num2];

  Disp7 = Dig[Num3];

}



void io_init() //Инициализация портов ввода/вывода

{

  DDRA = 0xFF;

  PORTA = 0;

  DDRC |= (1 << PINC5) | (1 << PINC6) |(1 << PINC7);

  PORTC = 0;

}



void timer0_init()

{

  OCR0 = 15;

  TCCR0 |= (1 << WGM01) | (1 << CS00) | (1 << CS02);

  TIMSK |= (1 << OCIE0);

}



void Dig_init()

{

  Dig[0] = (a+b+c+d+e+f);   // Сейчас у нас схема с общим катодом

  Dig[1] = (b+c);

  Dig[2] = (a+b+g+e+d);

  Dig[3] = (a+b+g+c+d);

  Dig[4] = (f+g+b+c);

  Dig[5] = (a+f+g+c+d);

  Dig[6] = (a+f+g+c+d+e);

  Dig[7] = (a+b+c);

  Dig[8] = (a+b+c+d+e+f+g);

  Dig[9] = (a+b+c+d+f+g);

}



void main()

{

  unsigned char j, k = 0;

  Dig_init();

  Display(0);

  io_init();

  timer0_init();

  SREG |= (1 << 7);

  while(1)

  {

    for (j = 0; j <= 50; j++){} // Задержка для отображения цифры

    (k == 3) ? k = 0 : k++;

    PORTC &= 31;  //Очистка PC7, PC6, PC5

    for (j = 0; j<=30; j++){} // Задержка для выключения транзистора

    switch (k)

    {

      case 0: PORTC |= (1 << PINC7); // Единицы

              PORTA = Disp7;

        break;

      case 1: PORTC |= (1 << PINC6); // Десятки

              PORTA = Disp6;

        break;

      case 2: PORTC |= (1 << PINC5); // Сотни

              PORTA = Disp5;

    }

  }

}



#pragma vector = TIMER0_COMP_vect

__interrupt void Indic_change()

{

  if (i < 675)

  {

    i++;

  }

  else

  {

    i = 1;

    if (Number < 999)

      Number++;

    else

      Number = 0;

      PORTB++;

    Display(Number); // Увеличение отображаемого числа.

  }

}

Функция Display(Number) берет число Number и отнимает от него по сотне, пока Number не станет меньше 100. Количество отнятых сотен сохраняется в Num1. Аналогично потом отнимают десятки. Количество десятков - в переменной Num2. Остаток (единицы) сохраняется в Num3. Глобальным переменным Disp5, Disp6, Disp7 присваиваются значения, которые нужно отправить в порт A, чтобы отобразить исходное число Number. Как это выглядит в действии, увидите, когда прошьёте программу в МК.

IAR AVR программирование

 

 

 

USART. Сопряжение МК с компьютером через COM-порт. Теория.

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

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

Итак, слово USART расшифровывается как "универсальный синхронный и асинхронный приемник и передатчик" (УСАПП) ("Universal Synchronous and Asynchronous Receiver and Transmitter"). Так называют устройство, умеющее работать с интерфейсом RS-232 (и его аналогами), на котором и построен СОМ-порт. Помимо этого, существуют еще устройства UART, которые могут работать только в асинхронном режиме. Мы будем использовать только асинхронный, т. к. современные компьютеры имеют 9-контактный СОМ порт без линии автоматических тактовых сигналов.

Напряжениями логического уровня в интерфейсе RS-232C (существуют еще RS-232A и RS-232B, но в компьютере и МК RS-232C) являются +12 В (лог. 0) и -12 В (лог. 1). Состояние 0 В не используется для передачи данных и существует только при отключении питания СОМ-порта. В СОМ порте (на рисунке ниже представлена вилка) 9 проводников.

программирование AVR микроконтроллеров на Си

 
"Ножка" №
Название сигнала
Описание
1
DCD
Обнаружение устройства
2
RXD
Прием данных
3
TXD
Посылка данных
4
DTR
Готовность терминала к передаче данных
5
GND
Земля (общий)
6
DSR
Data Set Ready. Готовность внешнего устройства к передаче данных
7
RTS
Запрос на передачу
8
CTS
Разрешение передачи данных терминалу
9
RI
Ring Indicator (специализированная сигнальная линия управления)


 

Как работать с компьютера с линиями 5 и 7 уже рассказывалось в статьях по СОМ-порту. Нас теперь интересуют линии 2 (RXD) и 3 (TXD). Именно по ним и происходит передача данных. Рассмотрим, как это реализовано.

Оба провода передачи данных работают совершенно одинаково. При этом RXD одного устройства соединяется с TXD другого и наоборот, TXD первого устройсва цепляется к RXD второго устройства. Только не забудьте соединить 5-й провод (землю)! :)

Изначально на линии передачи данных установлена лог. 1 (-12 В). Передача данных осуществляется кадрами по 5-8 бит. Чтобы обозначить начало и конец кадра, используют "старт-бит" и "стоп-бит". Приемник и передатчик заранее должны быть настроены на работу с одинаковыми параметрами для гарантированной передачи данных. Когда нужно передать данные, передатчик меняет состояние линии с лог. 1 на лог. 0 (+12 В). Это стартовый бит. После него начинается передача информационных битов. Этот момент (появление стартового бита) фиксируется приемником и в нем начинают "тикать часы". Биты передаются через одинаковые фиксированные моменты времени с определенной скоростью, называемой битрейтом (baudrate). Например, пусть этот интервал составляет 100 мкс. Передатчик держит стартовый бит (всегда лог. 0) в течение 100 мкс, а затем выставляет на линии первый информационный бит. Еще через 100 мкс он устанавливает второй бит и т.д.. Приемник, в свою очередь, обнаружив стартовый бит, ждет 100 мкс, затем ждет половину этого времени, т.е. 50 мкс (чтобы попасть как раз в середину первого бита), после чего начинает запоминать состояние линии каждые 100 мкс.

программирование AVR микроконтроллеров на Си

За информационными битами следуют бит четности и стоповые биты. Стоповые биты всегда имеют уровень -12 В (лог. 1) и служат одновременно паузой между кадрами данных. Если стоповый бит один, то пауза между кадрами меньше и скорость передачи данных выше. Если их два, то пауза будет дольше. Бит четности (P) служит для контроля правильности передачи данных. Если выставлен параметр четность как Odd (Нечетный), то бит четности будет таким, чтобы сумма всех отправленных информационных битов вместе с ним была обязательно нечетной. Если приемник, приняв кадр, установил, что сумма нечетная, то все верно, если она оказалась четной, значит, была ошибка в одном бите (или в 3-х, 5-ти, 7-ми, 9-ти). Этот способ достаточно примитивен и не обнаружит ошибки в 2-х, 4-х, 6-ти или 8-ми битах. Но наиболее вероятной является ошибка именно в 1 бит, а не в 2 и больше. Если четность установлена как Even (Четная), то сумма всех отправленных битов будет всегда четной.

Как видим, часы, по которым происходит передача и прием данных, синхронизируются по стартовому биту. Если они идут синхронно, то все отлично, если же нет, то момент считывания будет смещаться от середины бита в ту или иную сторону, но, поскольку битов немного (5-9, до 10 с битом четности), небольшая ошибка погоду не испортит и момент считывания не успеет сместиться в соседний бит. К тому же, МК содержит модуль коррекции принятых данных. В качестве часов в МК, используется, естественно, кварцевый резонатор. Вот здесь и нужно будет вспомнить о том, что я говорил в первой статье.

Существуют стандартные битрейты для передачи данных через интерфейс RS-232C.

  • 2400 bps (bps - бит в секунду)
  • 4800 bps
  • 9600 bps
  • 14400 bps
  • 19200 bps
  • 28800 bps
  • 38400 bps
  • 57600 bps
  • 76800 bps
  • 115.2 kbps
  • 230.4 kbps

Заметили связь между скоростями? Так вот, чаще всего используют 9600 бит/с. Для того, чтобы получить эти значения скоростей с высокой точностью, следует использовать резонаторы на те частоты, о которых говорилось в первой статье, например, 11,0592 МГц. Чем выше частота резонатора, тем выше и максимальная скорость. Для нашего МК с резонатором на 16 МГц возможна скорость до 2 Мбит/с. Но не надо забывать, что это скорость между битами в кадре, а в кадрах есть еще стоп-биты и биты четности. Поэтому реально скорость будет на 10-35% ниже. При использовании других резонаторов (4 МГц, 8 МГц и т. п.) будет возникать погрешность для первых 11 скоростей, скорости в 250 кбит/с и кратные будут без погрешностей. Чем больше погрешность, тем ниже устойчивость к помехам и выше вероятность ошибок. Наш МК может также передавать данные с двойной скоростью, что задается спецальным регистром. Ниже приведена схема модуля USART в МК AtMega16.

программирование AVR микроконтроллеров на Си

За работу USARTа отвечают несколько специальных регистров (они обозначены жирным шрифтом на рисунке выше). Во первых, следует выделить регистр UDR (USART Data Register). Он используется для хранения принятых/отправляемых данных. Сделан он особым образом, т.к. на самом деле регистров UDR 3 штуки. При записи значения в UDR происходит запись в тот, который изображен на рисунке верхним (UDR (transmit) или TXB). Это значение незамедлительно отправляется другому устройству через COM-порт и регистр очищается. Когда в МК приходит байт информации, он сохраняется в другом UDR-регистре (UDR (receive) или RXB), причем в верхнем RXB-регистре. Как только байт полностью принят, он автоматически копируется в нижний RXB-регистр, откуда его можно уже прочитать, а в верхний при этом принимается следующий байт (чтобы избежать пауз в работе и потери данных). Итак, при чтении данных из UDR берется принятый байт, а при записи в него данные сразу же отправляются через интерфейс приемнику. Если после приема двух байтов в оба RXB-регистра не произошло считывания из нижнего, то третий байт не будет принят USARTом и USART выставит флаг ошибки Data OverRun (DOR).

Существуют регистры управления и статуса USARTом: UCSRA, UCSRB и UCSRC. Рассмотрим в них подробно те биты, которые чаще всего используются.

UCSRA.

  • Бит 7 - RXC (Receive Comlete). Бит завершения приема. Автоматически устанавливается, если принимаются данные. При чтении принятых данных сбрасывается.

     
  • *Бит 6 - TXC (Transmit Comlete). Бит завершения передачи. Автоматически устанавливается после отправки кадра данных при отсутствии следующих данных для отправки.

     
  • Бит 5 - UDRE (UDR Empty). Бит отсутствия данных для отправки. Если установлен, нет данных для отправки.

     
  • Бит 4 - FE (Frame Error). Бит ошибки кадра. Равен единице, если была ошибка в формате принятого кадра.

     
  • Бит 3 - DOR (Data OverRun). Бит ошибки переполнения буфера. Равен единице, если нет места для приема нового кадра данных.

     
  • Бит 2 - PE (Parity Error). Бит ошибки четности. Равен единице, если была ошибка четности.

     
  • *Бит 1 - U2X (Double speed). Бит двойной скорости USARTа. Если установлен, скорость работы и битрейт удваиваются.

     
  • *Бит 0 - MPCM (Multi-Processor Communication Mode). Бит работы в многопроцессорном режиме. Если равен единице, включен многопроцессорный режим.

     

* Звездочку я поставил около тех битов, которые доступны для записи. Остальные биты доступны только для чтения. Некоторая информация, думаю, требует пояснения. Биты 7, 6, 5 могут использоваться для генерации прерываний. Обычно делают прерывание по приему данных. Многопроцессорный режим используется, когда к одному СОМ-порту цепляются сразу несколько МК. Например, Вы подключаете к компьютеру (или другому МК) устройство, в котором есть несколько МК, подключенных к одному интерфейсу RS-232C. Тогда обычно используют 9 битов данных, при этом первый бит сигнализирует о передаче адреса (если установлен) либо данных. МК, принимая остальные биты, если они являются адресом, сравнивает их со своим адресом. В случае совпадения он принимает кадры данных и отвечает на них, а все остальные МК "помалкывают". Если адрес не совпадает, МК реагирут только на первый бит, что уменьшает нагрузку на процессор.

UCSRB.

  • Бит 7 - RXCIE (Receive Comlete Interrupt Enable). Бит генерации прерывания при приеме данных. Если установлен, происходит прерывание для немедленной обработки принятых данных.

     
  • Бит 6 - TXCIE (Transmit Comlete Interrupt Enable). Бит генерации прерывания при завершении передачи. Если установлен, происходит прерывание после отправки данных.

     
  • Бит 5 - UDRIE (UDR Empty Interrupt Enable). Бит генерации прерывания при отсутствии данных для передачи.

     
  • Бит 4 - RXEN (Receiver Enable). Бит наличия приемника данных. Если установлен, МК будет принимать данные через RS-232C.

     
  • Бит 3 - TXEN (Transmitter Enable). Бит наличия передатчика данных. Если установлен, МК будет передавать данные через RS-232C.

     
  • Бит 2 - UCSZ2 (USART Character SiZe 2). Определяет количество бит в кадре. Работает вместе с битами UCSZ1 и UCSZ0 в UCSRC.

     
  • #Бит 1 - RXB8 (Receive Data Bit 8). Девятый бит принятых данных (восьмой при нумерации с 0), использующийся в многопроцессорном режиме.

     
  • Бит 0 - TXB8 (Transmit Data Bit 8). Девятый бит отправляемых данных, использующийся в многопроцессорном режиме.

     

# Решеткой отмечен бит, доступный только для чтения. Все остальные доступны для чтения/записи.
Наконец, самый "страшный" регистр.

UCSRC.

  • Бит 7 - URSEL (USART Register SELect). Бит выбора регистра. 1 - UCSRC, 0 - UBRRH.

     
  • Бит 6 - UMSEL (USART Mode SELect). Бит выбора режима работы. 1 - синхронный, 0 - асинхронный.

     
  • Бит 5 - UPM1 (USART Parity Mode 0). Установка режима четности/нечетности. Оба сброшены - нет контроля.
  • Бит 4 - UPM0 (USART Parity Mode 0). Оба установлены - нечетная сумма. UPM0 = 0 и UPM1 = 1 - четная сумма.

     
  • Бит 3 - USBS (USART Stop Bit Select). Количество стоп-битов. Если сброшен, то 1 стоп-бит, иначе - 2.

     
  • Бит 2 - UCSZ1 (USART Character Size 1). Размер кадра данных (вместе с UCSZ2 из UCSRB).
  • #Бит 1 - UCSZ1 (USART Character Size 1). Таблицу возможных значений см. ниже

     
  • Бит 0 - UCPOL (USART Clock POLarity). Используется в синхронном режиме. Если равен нулю, то тактирование отправляемых данных по переднему фронту импульса, принимаемых - по заднему. Если установлен, то наоборот.

     

Чем же так страшен этот регистр управления USARTом? Он имеет тот же адрес, что и верхний регистр битрейта (0x80). Это означает, что процессор не видит разницы между этими регистрами. Для того, чтобы их можно было отличать, сделан седьмой бит URSEL. Если он равен единице, процессор работает с UCSRC, иначе с UBRRH. Это, возможно, справедливо не для всех МК серии MEGA, так что читайте Datasheet. Ниже обещанная таблица установки размера кадра данных.

IAR AVR программирование

Остались два регистра. Это регистры установки битрейта - UBRRH и UBRRL. В регистре UBRRH доступны биты 0-3 (если в UCSRC URSEL = 0). Регистр UBRRL доступен весь для сохранения восьми младших битов числа. В этих двух регистрах может быть сохранено 12-битное число (От 0 до 4095). Это число вычисляется по следующей формуле:

UBRR = fosc / (X * BAUD) - 1

Здесь X равно 16 при режиме с нормальной скоростью (бит U2X = 0) и 8 в режиме удвоенной скорости (бит U2X = 1), BAUD - нужный битрейт, fosc - частота кварцевого резнонатора. По этой формуле легко вычислить значение регистра самостоятельно, но существуют также специальные таблицы наиболее типичных битрейтов и соответствующих значений UBRR. Такую таблицу из-за её громоздкости приводить не буду. Ее можно найти в Datasheetе к МК. Для AtMega16 таблица находится на стр. 169 его Datasheetа.

В заключение хотелось бы отметить, что COM-порт гарантированно будет работать на больших скоростях (0,5 - 2 Мбит/с) при длине кабеля до 8 метров. При небольших скоростях длину кабеля можно увеличить до 15 метров. При большей длине, возможно, будут ошибки. Хотя... хотя можно в случае надобности придумывать различные ухищрения и особые алгоритмы, позволяющие увеличить длину кабеля, возможно, в ущерб скорости. Тем не менее, помимо RS-232 есть еще и другие подобные интерфейсы, среди которых есть и низковольтные помехоустойчивые с дифференциальными линиями, где можно использовать провода длиной до километра.

 

 

 

USART. Пример практической реализации

файлы к статье (размер: 62.4 КБ)

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

Если Вы читали предыдущую статью (надеюсь на это), то, наверное, заметили, что рабочие напряжения в COM-порту +12 В и -12 В, а МК оперирует напряжениями +5 В и 0 В. Для того, чтобы все работало нормально, нужно установить преобразователь уровней. Рекомендую ставить MAX232. Потребуются, помимо микросхемы, 5 конденсаторов на 1 мкФ.

программирование AVR микроконтроллеров на Си

При работе с COM-портом именно эта микросхема находит наиболее частое применение. Если Вы купили макетную плату с разводкой под СОМ-порт, то там, скорее всего, будет и готовая разводка под установку MAX232 и конденсаторов. Правда, когда я купил свою плату, то сначала припаял МК и цепь питания, потом СОМ-порт. Долго не мог понять, как крепить преобразователь уровня. И тут вдруг выяснилось, что все компоненты я припаял не с той стороны к плате :-). Но не переделывать же все! Поэтому я прицепил СОМ-порт и МАХ232 к "правильной" стороне, а остальное оставил на "неправильной".

У меня в схеме задействованы выводы 11 (T1in) и 12 (R1out). Соответственно, вывод 13 (R1in) подключен к 3-му выводу розетки СОМ-порта (RXD), а 14-й вывод МАХ-232 (T1out) подсоединен ко 2-му выводу розетки СОМ-порта (TXD).

Теперь нужно МАХ232 подсоединить к МК. У ATMEGA16 USART использует 14-й вывод PB0 (RXD) для приема данных и PB1 (TXD) для отправки. Соответственно, PB0 нужно прикрепить к 12-му выводу МАХ232, а PB1 к 11-му. Ну и все. Не забудьте только соединить "земли" МК, МАХ232 и СОМ-порта между собой! :-)
 

Остается лишь написать программу для МК (для ПК тоже можно). В данном примере реализована работа с кварцем 11,0592 МГц, битрейт 115,2 кбит/с, 8 информационных бит, нет бита четности, 1 стоп-бит, скорость удвоенная. С большим, чем 115,2 кбит/с битрейтом мой компьютер работает с глюками.

Ниже приведен код программы для МК.

#include "iom16.h"

#define a 1

#define b 4

#define c 16

#define d 64  // Это для индикатора

#define e 128

#define f 2

#define g 8

#define DP 32



unsigned char      Dig[10];

// В этих переменных хранятся цифры, которые нужно отобразить

char               Disp5, Disp6, Disp7;



// Функция выделяет цифры из трехзначного числа Number

void Display (unsigned char Number)

{

  unsigned char Num1, Num2, Num3;

  Num1=Num2=0;

  while (Number >= 100)  

  {

    Number -= 100;  

    Num1++;  

  }

  while (Number >= 10) 

  {

    Number -= 10;  

    Num2++; 

  }

  Num3 = Number;

  Disp5 = Dig[Num1];

  Disp6 = Dig[Num2];

  Disp7 = Dig[Num3];

}



void USART_init()

{

  UCSRA = (1 << 1); // Установка двойной скорости

  UCSRB |= (1 << 7) | (1 << 4) | (1 << 3); // Прерывание по приему данных, включены приемник и передатчик

  UCSRC |= (1 << 7); // Запись в UCSRC

  UCSRC |= (1 << 1) | (1 << 2); // Размер кадра данных 8 бит

  UCSRC -= 128; // Запись в UBRRH

  UBRRH = 0;

  UBRRL = 11; // Битрейт равет 115200 бит в секунду

}



void Dig_init()

{

  Dig[0] = (a+b+c+d+e+f);

  Dig[1] = (b+c);

  Dig[2] = (a+b+g+e+d);

  Dig[3] = (a+b+g+c+d);

  Dig[4] = (f+g+b+c);

  Dig[5] = (a+f+g+c+d);

  Dig[6] = (a+f+g+c+d+e);

  Dig[7] = (a+b+c);

  Dig[8] = (a+b+c+d+e+f+g);

  Dig[9] = (a+b+c+d+f+g);

}



void io_init() // Инициализация портов ввода/вывода

{

  DDRA = 0xFF;

  PORTA = 0;

  DDRC |= (1 << PINC5) | (1 << PINC6) |(1 << PINC7);

  PORTC = 0;

  DDRB = 1;

}



void main()

{

  unsigned char j, k = 0;

  USART_init();

  Dig_init();

  Display(0);

  SREG |= (1 << 7);

  io_init();

  while(1) // Отображение принятого байта

  {

    for (j = 0; j <= 50; j++){} // Задержка для отображения цифры

    (k == 3) ? k = 0 : k++;

    PORTC &= 31;  //Очистка PC7, PC6, PC5

    for (j = 0; j<=30; j++){} // Задержка для выключения транзистора

    switch (k)

    {

      case 0: PORTC |= (1 << PINC7); // Единицы

              PORTA = Disp7;

        break;

      case 1: PORTC |= (1 << PINC6); // Десятки

              PORTA = Disp6;

        break;

      case 2: PORTC |= (1 << PINC5); // Сотни

              PORTA = Disp5;

    }  

  }

}



#pragma vector = USART_RXC_vect

__interrupt void Recieve()

{

  unsigned char temp = 0;

  unsigned char* str = " Hello! My name is AtMega16! "; // Строка данных

  char t,l;

  temp = UDR; // Чтение принятых данных

  Display (temp); // Отображение числа на индикаторе

  PORTB = 1 - PORTB; // Зажигаем/гасим светодиод на PB0

  if (temp == 5) // Отправка строки, если принятый байт равен 5

  {

    for (t=0; t < 28; t++)

    {

      UDR = str[t]; // Отправка строки

      for (l=0; l < 200; l++) // Задержка (чтобы успел отправить число)

      { }

    }

  }

  else

  UDR = temp; // Отправка обратно принятого числа

}
 
 
Не дорогой программатор для AVR на USB
  всего за
580 рублей !  в Москве - подключил к USB и программируй AVR.

или + 90 рублей почтой по всей России  - быстро и удобно.
                                   Подробней на  "МК Почтой народ РУ"

Он прекрасно работает с программаторами CodeVisionAVR CVAVR 
AVRStudio
и WinAVR AVRDUDE, легко инсталируется в XP и VISTA.

Программаторы собраны аккуратно и протестированы. 

 

Не дорогой Cупер программатор отладчик для PIC на USB

PICkit   всего за 899 рублей !    в Москве

или + 90 рублей почтой по всей России  - быстро и удобно.
 Фирменный PICkit2 стоит 1700 рублей в среднем.

Узнайте что такое PICkit 2 и как с ним работать и вы поймете что

PICkit2 -
это ЛУЧШИЙ инструмент для работы с PIC10  PIC12 
PIC16  PIC18  PIC24  dsPIC30  dsPIC33
и
PIC32

Подробней о заказе на  "МК Почтой народ РУ"

 

Там же советую заказать

- изготовление электронных устройств по любительской технологии,

- прошивка AVR и PIC на заказ,

- прошитые AVR PIC для сборки программаторов и электронных
  наборов МастерКит и других,

Э
лектронные компоненты из "Тэрраэлектроника",
н
аборы резисторов и конденсаторов, RC модели, материалы, эпоксидную смолу, комплектующие для робототехники и хобби
почтой по всей России.

"МК Почтой народ РУ"

 
 
 
 

							

Теперь нужно позаботиться о программе в компьютере, которая будет управлять СОМ-портом и работать с МК. Можно просто взять готовую программу из статей о СОМ-порте компьютера, основанную на библиотеке SerialGate.dll. Сделаю здесь ссылку на архив с этой программой (там лежит еще Terminal.exe, о нем чуть позже) Давайте посмотрим, что получится...

скачать SerialGateTest & Terminal (размер: 383 КБ)

Запускаем программу, подключаем наше устройство к СОМ-порту, подаем питание на него, в программе выбираем СОМ-порт и устанавливаем битрейт 115200 бит/с. Давайте отправим какой-нибудь символ, например, "&". МК отправит его обратно и отобразит на индикаторе его номер - 38. Отправив строку, получаем ее обратно. Заметьте, что при нечетном количестве символов меняется состояние светодиода, подключенного к PB0. При каждом прерывании он загорается либо гаснет.

программирование AVR микроконтроллеров на Си

 

Теперь давайте рассмотрим другую программу из этого архива - Terminal.exe. Не знаю, кто ее автор, но ему СПАСИБО!

Это очень мощная и удобная программа, позволяющая делать с СОМ-портом практически все, что угодно. Запустив программу, выберите номер порта, битрейт 115200, 8 битов данных, четность "none", 1 стоп бит. Нажимаем Connect и можем теперь отправлять данные МК. Символы передаются так же, как и в предыдущей программе, в виде их ASCII - значений, но если набрать "#xxx", где ххх-трехзначное число до 255, то можно передать любой символ, в т.ч. и непечатный. Если МК получает символ с номером 5, то он вместо него обратно отсылает строку " Hello! My name is AtMega16! ". 13-й символ - это переход на след. строчку. Кстати, ASCII таблица в программе тоже есть.

программирование AVR микроконтроллеров на Си

 


 

 

 



 
Программирование LPT порта

Программирование LPT порта

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

1. С чего начать? Или получение первых результатов от LPT.

2. Работа с LPT под Win 2000, XP: библиотека inpout32.dll

3. Работа с LPT под Win 2000, XP: драйвер GiveIO.sys

4. Работа с LPT под Win 2000, XP: самодельный драйвер Port.sys

5. Запись/чтение данных в LPT порт. (Часть 1) Основы.

6. Запись/чтение данных в LPT порт. (Часть 2) Делаем LPT устройство.

7. Запись/чтение данных в LPT порт. (Часть 3) Пишем программу.

8. Программа управления LPT портом под Windows на MFC.

9. Применение таймеров для работы с портами.

10. Программа управления LPT портом под Windows на Delphi.

11. Разрушаем легенды: переходник USB-LPT



 
Программирование АЦП ЦАП, простая схема АЦП

Применение АЦП и ЦАП

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

1. Двуполярный источник питания для АЦП

2. 8-ми разрядный АЦП на микросхеме КР572ПВ3



 
Программирование COM порта

Программирование COM порта

COM порт - порт, работающий по последовательному протоколу передачи данных. Хоть его уже почти не встретишь на ноутбуках (там только USB), огромное колличество устройств имеет последовательный порт, так что без программирования COM портов разработчику устройств сопряжения ну никак не обойтись.

1. С чего начать? Или получение первых результатов от COM порта.

2. Управление COM портом внешним устройством.

3. Обработка событий COM-порта.

4. SerialGate.dll :: Чтение/запись данных в COM порт. (Часть 1).

5. SerialGate.dll :: Чтение/запись данных в COM порт. (Часть 2). Программа под Windows.

6. SerialGate.dll :: Определение доступных COM портов.



 
Программирование микроконтроллеров PIC

Программирование PIC микроконтроллеров

Данный цикл статей посвящен вопросам применения и программирования микроконтроллеров PIC фирмы Microchip на языке Си и ассемблере.

1. Установка среды программирования MPLAB 7.40.

2. Установка интегрированного компилятора языка Си HI-TECH.

3. Пишем первую программу на Си для МК PIC16F877.

4. Изготовление платы программатора.

5. Установка и настройка программы программатора PonyProg.

6. Запись программы в МК. Сборка схемы на PIC16F877.

7. 10-ти разрядный АЦП на основе PIC16F877.

8. Спряжение PIC16F877 с ПК через COM порт (Часть 1).

9. Спряжение PIC16F877 с ПК через COM порт (Часть 2).


 

В рамках общего раздела по программированию PIC контроллеров в этом подразделе будут размещаться статьи по программированию PIC на ассемблере.

1. Первая программа на ассемблере для PIC16F877.

2. Первая программа на ассемблере для PIC16F877 (Часть 2).

3. Первая программа на ассемблере для PIC16F877 (Часть 3).



 
Программирование AVR микроконтроллеров AVR

Программирование AVR микроконтроллеров

Статьи этого раздела посвящены программированию микроконтроллеров AVR фирмы Atmel на языке С. AVR – это, пожалуй, самое распространенное семейство микроконтроллеров, поэтому мы не могли не удилить им внимания на данном сайте.

1. Программирование микроконтроллера AVR. Первые шаги.

2. Таймеры, кнопки и прерывания.

3. Использование ШИМ. Подключение полевых транзисторов.

4. Подключение семисегментных индикаторов.

5. USART. Сопряжение МК с компьютером через COM-порт. Теория.

6. USART. Пример практической реализации.



 
Программирование USB

Программирование USB

USB - это реально! Данный раздел позволит Вам создавать собственные USB устройства, подключать внешние устройства через шину USB. Особенно хотелось отметить, что в статьях будет рассмотрена практическая реализация передачие HighSpeed на скоростях до 220 МБит/c!

Программирование модуля Ke-USB24A

USB модуль Ke-USB24A

Еще одним интересным USB компонентом от Kernelchip является модуль Ke-USB24A. Он предназначен для для управления внешними нагрузками через шину USB. Посмотрим, что интересного можно сделать с этим модулем.


 

1. Управление внешними нагрузками через USB с помощью Ke-USB24A.

2. Настройка направлений линий ввода/вывода. (New! 22 марта 2008)

3. Считывание информации с внешних ключей, кнопок. (New! 22 марта 2008)

4. Простой USB вольтметр на основе Ke-USB24A (New! 23 марта 2008)

5. Сохранение данных в EEPROM модуля (New! 23 марта 2008)

6. Изменение строкового дескриптора модуля (New! 23 марта 2008)

7. Зарезервировано: USB осциллограф с изменяемой частотой дискретизации 1-400 Гц.

8. Зарезервировано: Переходник USB-LPT на основе Ke-USB24A.

9. Зарезервировано: Управление модулем из Excel.



 
Программирование модуля WoodmanUSB

В данном цикле статей будет рассказываться о практическом применении модуля WoodmanUSB. С его помощью мы будем создавать различные устройства с поддержкой USB интерфейса начиная с простого устройства управления светодиодами по USB и заканчивая компьютерным осциллографом с частотой дискритезации 48 МГц.


 

1. Изготовление простого USB устройства на основе модуля WoodmanUSB. (Часть 1)

2. Изготовление простого USB устройства на основе модуля WoodmanUSB. (Часть 2)

3. Изготовление простого USB устройства на основе модуля WoodmanUSB. (Часть 3)

4. Дополнение 3-ей части: пишем программу в Borland Delphi 7.0

5. Дополнение 3-ей части: пишем программу в Borland Builder 6.0 C++

6. Дополнение 3-ей части: пишем программу на C#

7. Зарезервировано: Дополнение 3-ей части: пишем программу на Visual Basic

8. Зарезервировано: Дополнение 3-ей части: пишем программу на Java

9. Зарезервировано: Управление внешними нагрузками через порт PORTA

10. Достоиства и "недостатки" порта PORTA

11. Передача данных через порт PORTB. Теория записи данных.

12. Передача данных через порт PORTB. Практика. (Часть 1)

13. Передача данных через порт PORTB. Практика. (Часть 2)

14. Дополнение к части 2: программа на Delphi и С++ WinAPI

15. Передача данных через порт PORTB. Теория чтения данных.

16. Передача данных через порт PORTB. Практика. (Часть 3)

17. Передача данных через порт PORTB. Практика по PKTEND. (Часть 4)

18. Зарезервировано: Дополнение к части 4: программа на Delphi и С++ WinAPI

19. Скоростные возможности порта PORTB в асинхронном режиме

20. Синхронный режим работы порта PORTB

21. Компьютерный USB осциллограф на 48 МГц. (Часть 1)

22. Компьютерный USB осциллограф на 48 МГц. (Часть 2) (New! 15 февраля 2008)

продолжение следует...



 
Программирование видео, программирование Web-камеры web камера

Программирование Видео

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

1. Беспроводная видеосистема

 


 

 

Исходники программ и библиотек

для микроконтроллеров AVR

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

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

Автор: haker_fox Dec 20 2005, 04: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кб ) Кол-во скачиваний: 1678
Присоединённый файл  MT_10T7.zip ( 1.91кб ) Кол-во скачиваний: 1677
Присоединённый файл  rtc.zip ( 1.64кб ) Кол-во скачиваний: 1662
 

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

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


Присоединённые файлы
Присоединённый файл  8515.zip ( 80.97кб ) Кол-во скачиваний: 30991
 

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

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


Присоединённые файлы
Присоединённый файл  STK500_Dataflash_Routines.zip ( 27.05кб ) Кол-во скачиваний: 2054
 

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

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

Удачи.

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

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

http://www.circuitcellar.com/avr2004/wentries/A3694.zip

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


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

http://www.superkranz.de/christian/S65_Display/DisplaySoftware.html

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

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


Присоединённые файлы
Присоединённый файл  25lc640.rar ( 1.65кб ) Кол-во скачиваний: 1070
 

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

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

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

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

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

Автор: Alechin Jan 11 2006, 18: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кб ) Кол-во скачиваний: 1405
Присоединённый файл  AsyncTmr.zip ( 2.61кб ) Кол-во скачиваний: 1406
Присоединённый файл  Timer.zip ( 2.58кб ) Кол-во скачиваний: 1618
Присоединённый файл  MT12864_drv.zip ( 27.4кб ) Кол-во скачиваний: 2009
Присоединённый файл  PE12864_drv.zip ( 27.5кб ) Кол-во скачиваний: 4055
 

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

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

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

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

http://nav2.livejournal.com/130205.html cool.gif



Присоединённые файлы
Присоединённый файл  24c256.rar ( 1.46кб ) Кол-во скачиваний: 1630
 

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

(Balaganov @ Jan 19 2006, 18:01) *

Хидер задержек для IAR. Использует __delay_cycles для формирования задержек от наносекунд до секунд. В параметре CPU_CLK_Hz указать тактовую частоту в герцах.[attachmentid=3956]


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

 

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

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

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


Присоединённые файлы
Присоединённый файл  BoudRateCalkulator.txt ( 17.21кб ) Кол-во скачиваний: 974
 

Автор: afe Jan 26 2006, 01:48

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

http://hubbard.engr.scu.edu/avr/avrlib/
 


[b]Procyon AVRlib Overview[/b]
 
General AVR Built-In Peripheral Drivers
  • Byte Buffering (circular)
  • Bit Buffering (linear)
  • Printf and other formatted print functions
  • VT100 Terminal Output
  • Command Line Interface
  • FAT16/32 File System (support is read-only for now)
  • STX/ETX Packet Protocol
  • Fixed-Point Math Library (basic operations only)
  • Timers (with PWM, interrupt management)
  • UART (interrupt driven)
  • A/D Converter
  • I2C Master/Slave (interrupt and non-intr)
  • SPI Interface
  • External Interrupts
External Hardware Device Drivers AVR Software-Emulated Devices
  • Character LCD Modules (HD44780-based)
  • I2C EEPROM Memories
  • SPI EEPROM Memories
  • MMC/SD Card Interface (SPI mode)
  • LIS3L02 ST Accelerometer
  • IDE/ATA Interface (for hard disks and CF cards)
  • Quadrature Encoders
  • RC-Servos (up to 8 channels)
  • STA013 MP3 Decoder Chip
  • GPS Receivers (via serial port)
    • NMEA-0813 Protocol
    • Trimble TSIP Protocol
  • Graphic LCD Modules
    • KS0108/HD61202 Controller
    • T6963 Controller
    • LCD Fonts and Symbols
  • I2c Master (Bit-Bang)
  • UART (software-based, timer interrupt driven)
  • Pulse Output (timer-based, variable frequency)
  • Intel-type Memory Bus (Address & Data Buses + nRD,nWR)
Network Support
  • Device Drivers
    • RTL8019 Ethernet
    • AX88796 Ethernet
    • CS8900 Ethernet
    • Prism2 Wireless LAN
  • Network Protocols
    • ARP
    • ICMP
    • IP
    • UDP
    • DHCP
  • Network Stack infrastructure


 

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

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

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

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

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



Присоединённые файлы
Присоединённый файл  ds18b20.zip ( 2.01кб ) Кол-во скачиваний: 2380
Присоединённый файл  ds1307.zip ( 1.39кб ) Кол-во скачиваний: 1844
Присоединённый файл  i2c_soft_and_hardware.zip ( 2.57кб ) Кол-во скачиваний: 2321
 

Автор: ЛЕСЯ Feb 6 2006, 14: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, 20:41

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

 

Автор: haker_fox Feb 7 2006, 03: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://www.spetspribor.com/support/software/wake/wake.html.
В крайнем случае, если что, можно в PM спросить.


Присоединённые файлы
Присоединённый файл  wake.zip ( 7.03кб ) Кол-во скачиваний: 838
 

 

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

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

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


Присоединённые файлы
Присоединённый файл  buff16x2.txt ( 4.88кб ) Кол-во скачиваний: 1631
 

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

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


Присоединённые файлы
Присоединённый файл  crc16.zip ( 2.31кб ) Кол-во скачиваний: 1346
 

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

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


Присоединённые файлы
Присоединённый файл  Div24.zip ( 1.56кб ) Кол-во скачиваний: 1916
 

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

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



Присоединённые файлы
Присоединённый файл  ________________.doc ( 74кб ) Кол-во скачиваний: 2273
 

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

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

Автор: SasaVitebsk Apr 4 2006, 00: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кб ) Кол-во скачиваний: 1677
Присоединённый файл  pult.rar ( 172.19кб ) Кол-во скачиваний: 1961
 

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

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

Автор: SasaVitebsk Apr 6 2006, 23: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кб ) Кол-во скачиваний: 2093
 

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

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

http://hubbard.engr.scu.edu/embedded/avr/avrlib/

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

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

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

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

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



Присоединённые файлы
Присоединённый файл  bibl.rar ( 10.35кб ) Кол-во скачиваний: 1048
 

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

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


Присоединённые файлы
Присоединённый файл  USART.Driver.rar ( 4.7кб ) Кол-во скачиваний: 1698
 

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

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


Присоединённые изображения
Присоединённое изображение

Присоединённые файлы
Присоединённый файл  Software_uart.zip ( 6.24кб ) Кол-во скачиваний: 6071
 

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

Привет всем!



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




Присоединённые файлы
Присоединённый файл  HD44780src.ZIP ( 4.68кб ) Кол-во скачиваний: 2111
 

Автор: aleksey_g May 30 2006, 18: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, 18: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, 14:32

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

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

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

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

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

Присоединённый файл  beg_stroka.rar ( 2.6кб ) Кол-во скачиваний: 1777

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

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


Присоединённые эскизы
Присоединённое изображение

Присоединённые файлы
Присоединённый файл  3_wire_lcd.rar ( 48.94кб ) Кол-во скачиваний: 2254
 

Автор: Wladimir_TS Aug 26 2006, 10:58

Не уверен уместно-ли здесь просить какие - либо исходники, но я попробую:

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

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

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

(Wladimir_TS @ Aug 26 2006, 10:58) *

Не уверен уместно-ли здесь просить какие - либо исходники, но я попробую:

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

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


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


Присоединённые файлы
Присоединённый файл  MATHLIB.rar ( 10.28кб ) Кол-во скачиваний: 803
 

 

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

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


Автор: Георгий Sep 27 2006, 08:51

To SasaVitebsk:
А нельзя ли получить исходники тестовой программы со стороны РС. Меня больше эта часть интересует.

Автор: SasaVitebsk Sep 27 2006, 18:01

(Георгий @ Sep 27 2006, 08:51) *

To SasaVitebsk:
А нельзя ли получить исходники тестовой программы со стороны РС. Меня больше эта часть интересует.


Это по пульту? Писалась давно лет 5 назад. Потом я свои знания в DELFI оцениваю как нулевые и использую их только для написания тестовых программ. Оформительским способностями не обладаю и мне стыдно их выкладывать. Если честно. Так как они явно не могут являтся примером. Если сильно надо то перешлю.
А вот есть у меня другая програмка. (с теми же вышеперечисленными недостатками). Я ей часто пользуюсь. Называю - осциллограф. Она позволяет просматривать файлы в виде цифровой информации от 1 до 8 лучей. Это когда модем писал. Сбрасывал на PC информацию и потом медленно просматривал. Поиск работает и всё такое. Могу выложить.

 

Автор: vesago Sep 27 2006, 22:39

Выложите, будьте так любезны.

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

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

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

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


Присоединённые файлы
Присоединённый файл  Osc.zip ( 255.4кб ) Кол-во скачиваний: 1143
 

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

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

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

Автор: vesago Sep 28 2006, 12:11

To SasaVitebsk:
Я так понял ваша программа пишет данные по битам 0 - 7 LPT порта. А драйвер какой надо для XP?

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

(vesago @ Sep 28 2006, 12:11) *

To SasaVitebsk:
Я так понял ваша программа пишет данные по битам 0 - 7 LPT порта. А драйвер какой надо для XP?


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


Присоединённые файлы
Присоединённый файл  St01.rar ( 177.84кб ) Кол-во скачиваний: 800
 

 

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

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

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


Присоединённые файлы
Присоединённый файл  codevisionavr_vmlab.rar ( 6.13кб ) Кол-во скачиваний: 548
 

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

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


Присоединённые файлы
Присоединённый файл  RemoconCtrl.rar ( 1.83кб ) Кол-во скачиваний: 742
 

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

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

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

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

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


Присоединённые файлы
Присоединённый файл  ds1820.zip ( 4.51кб ) Кол-во скачиваний: 1133
Присоединённый файл  HD44780.zip ( 5.85кб ) Кол-во скачиваний: 1099
 

Автор: Screw Nov 30 2006, 01:08

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

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

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

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


Присоединённые файлы
Присоединённый файл  TextLCD_2.zip ( 9.05кб ) Кол-во скачиваний: 597
 

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

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


Присоединённые файлы
Присоединённый файл  farblcd.rar ( 23.83кб ) Кол-во скачиваний: 741
 

Автор: kuber Jan 9 2007, 02: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кб ) Кол-во скачиваний: 351
 

Автор: Шалапут:-) Jan 11 2007, 07: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кб ) Кол-во скачиваний: 476
 

Автор: Stankov Roman Jan 12 2007, 04:03

простенькая библиотека, заставляет контроллер делать задержку, в мксекундах, мили секундах и снкундах. в зависимости от частоты тактового генератора.
"delay.h"
может кому надо smile.gif

 

#include <intrinsics.h> //функции циклов

#define f_cpu (1000000) //Частота задающего генератора




#define delay_us(temp) (__delay_cycles((temp * f_cpu) / 1000000));
/* макрос задержки на "temp" микросекунд. чочная задержка при целом значении
задающей частоты генератора в МГц (1, 2, 3, 4, ..., 10, 11, ...) */// 571 + 2, 387 + 2

#define delay_ms(temp) (__delay_cycles((temp * f_cpu) / 1000));
/* макрос задержки на "temp" миллисекунд. чочная задержка при целом значении
задающей частоты генератора в кГц (1, 2, 3, 4, ..., 10, 11, ...) */

#define delay_s(temp) (__delay_cycles(temp * f_cpu));
/* макрос задержки на "temp" секунд. чочная задержка при целом значении
задающей частоты генератора в Гц (1, 2, 3, 4, ..., 10, 11, ...) */

 

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

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


Присоединённые файлы
Присоединённый файл  Bin32BCD8.rar ( 400байт ) Кол-во скачиваний: 547
 

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

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

Автор: andybeg Jan 18 2007, 15:19

Stankov Roman
библиотека #include <intrinsics.h> тоже твоя или к какому компилятору прилагается?

Автор: SasaVitebsk Jan 18 2007, 19:05

(andybeg @ Jan 18 2007, 13:19) *

Stankov Roman
библиотека #include <intrinsics.h> тоже твоя или к какому компилятору прилагается?

IAR

 

Автор: Сергей Борщ Jan 21 2007, 04: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кб ) Кол-во скачиваний: 617
 

 

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

(Сергей Борщ @ Jan 21 2007, 00:19) *

очень удобные (как мне кажется) макросы.

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

 

Автор: Sergei Frolov Jan 30 2007, 19: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.

 

Автор: Stankov Roman Feb 4 2007, 21:29

да, эта библиотека входит в состав компилятора IAR.

но в IAR 4.12 при больших значенях f_cpu 7..10 Mz возникаю тпроблемы: компилятор делает слишком много циклов, в несколько раз больше чем надо. в других версиях компилятора от IAR не пробовал.

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

Сергей Борщ

 

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

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

 

Автор: Сергей Борщ Feb 5 2007, 02: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://gcc.gnu.org/onlinedocs/cpp/Initial-processing.html#Initial-processing комментарии заменяются пробелами до обработки #define

 

Автор: yarunt Feb 6 2007, 17:14

(yarunt @ Jan 4 2007, 13:14) *

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

Наступил на грабли .Есть два типа дисплея нокия3510и
на одном;
4850277
10168p01317bp
0304280004
этот не удалось запустить никакую(посмертно)!
другой
u609b102aa s4 05 25 br с этим все ок.
Отличаются они по расположению кондеров.
фотка с правильным расположением кондеров!


Присоединённые файлы
Присоединённый файл  conekter.rar ( 173.53кб ) Кол-во скачиваний: 316
 

 

Автор: yarunt Feb 8 2007, 14:49

(yarunt @ Feb 6 2007, 15:14) *

(yarunt @ Jan 4 2007, 13:14) *

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

Наступил на грабли .Есть два типа дисплея нокия3510и
на одном;
4850277
10168p01317bp
0304280004
этот не удалось запустить никакую(посмертно)!
другой
u609b102aa s4 05 25 br с этим все ок.
Отличаются они по расположению кондеров.
фотка с правильным расположением кондеров!

Я сам офигел blink.gif оказывается дисплеи нокиа3510и инокиа3530 дисплеи абсолютно идентичны,но команды немного отличаются!
для 3530
команда 2с идет как оманда
бит даты и команды в противофазе фазе!
пины подключения абсолютно одинаковы
на фотке слева3510 с права3530


Присоединённые эскизы
Присоединённое изображение

 

Автор: GL_basik Feb 16 2007, 21:51

Попробую здесь спросить.
Кто-нибудь видел в сети web сервер для avr БЕЗ TCP стека? Нужен чистый web сервер. Я просто устал раковыривать чужие проги и писать свои варианты получая граблями по лбу. Я бы может воспользовался чужим творчеством. Но почему-то все что я видел было намертво имплантировано в TCP стек, да еще и обвязано перекрестными ссылками. А TCP стек у меня уже есть аппартный...

Автор: svlad Feb 17 2007, 22:53

(afe @ Jan 25 2006, 22:48) *

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

http://hubbard.engr.scu.edu/avr/avrlib/
 

[b]Procyon AVRlib Overview[/b]
 
General AVR Built-In Peripheral Drivers
  • Byte Buffering (circular)
  • Bit Buffering (linear)
  • Printf and other formatted print functions
    ..............

Скачал AVRlib, а где мне взять interrupt.h и io.h которые они используют?

 

Автор: Kuzmi4 Feb 20 2007, 17:21

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

Автор: andybeg Feb 20 2007, 18:41

выложи конечно - интересно smile.gif

Автор: svlad Feb 21 2007, 00:09

(Kuzmi4 @ Feb 20 2007, 14:21) *

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

не уж то ни у кого нет WinAVR? smile.gif

 

Автор: Сергей Борщ Feb 21 2007, 13: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, 13:57

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


Присоединённые файлы
Присоединённый файл  Shnyaga.txt ( 7.38кб ) Кол-во скачиваний: 339
 

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

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


Присоединённые файлы
Присоединённый файл  nokia.rar ( 2.63кб ) Кол-во скачиваний: 210
 

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

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

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

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



Присоединённые файлы
Присоединённый файл  md_.txt ( 497байт ) Кол-во скачиваний: 267
 

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

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

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

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

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



Присоединённые файлы
Присоединённый файл  Traktor_dw.zip ( 237.09кб ) Кол-во скачиваний: 1032
 

Автор: Kuzmi4 Feb 27 2007, 18: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кб ) Кол-во скачиваний: 316
Присоединённый файл  _________.pdf ( 147.51кб ) Кол-во скачиваний: 2026
 

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

(Waso @ Dec 19 2005, 17:29) *

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

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


Присоединённые файлы
Присоединённый файл  test_ls020.zip ( 10.81кб ) Кол-во скачиваний: 186
 

 

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

(yarunt @ Mar 20 2007, 10:22) *

Вот хочу выложить проэктик на алгоритмбилдере 4.8

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

 

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

(Qwertty @ Mar 20 2007, 12:26) *

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

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

 

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

(yarunt @ Mar 20 2007, 12:19) *

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

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

 

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

(Qwertty @ Mar 20 2007, 13:40) *

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

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


Присоединённые эскизы
Присоединённое изображение

 

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

(haker_fox @ Dec 20 2005, 02:03) *

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

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



 

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

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


Присоединённые файлы
Присоединённый файл  fnt0.zip ( 1.86кб ) Кол-во скачиваний: 353
 

Автор: acex2 Mar 30 2007, 01:44

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


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

 

Автор: SasaVitebsk Mar 30 2007, 02:16

(acex2 @ Mar 29 2007, 22:44) *

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


Ну простите опи`сался. Это моноширинные. Для других использую "разноширинные". То что это моноширинные легко видно с помощью элементарной математики. Если бы были разноширинные, то я бы дал более развёрнутую информацию по файлам. В связи с тем, что непонятно было бы как их использовать.

 

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

Додрый день

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

автор архива gevv - http://hyperelektronik.com/

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

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

(Kolia @ Mar 30 2007, 13:11) *

Додрый день
Есть архивчик программ - весит 82 Мега.
http://rapidshare.com/files/7450315/AVR.rar.html пароль::gevv
автор архива gevv - http://hyperelektronik.com/
http://www.edaboard.com/viewtopic.php?t=213262&highlight=archive


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


 

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

(DeXteR @ Mar 30 2007, 13:51) *

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

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

.Done smile.gif

 

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

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


Присоединённые файлы
Присоединённый файл  CC2500_modem.zip ( 83.55кб ) Кол-во скачиваний: 437
 

Автор: prottoss Apr 10 2007, 18: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, 19:32

 

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

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

Присоединённый файл  AvrStudio_asm.rar ( 1.85кб ) Кол-во скачиваний: 186

 

Автор: VAHOO Apr 11 2007, 11:48

(prottoss @ Apr 10 2007, 16:37) *

В файле stdafx.h подключен хедер io8515.h. Его лучше всего заменить на ioavr.h вот так

 
#include <ioavr.h>


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

Enjoy!:-)



а "systime.h" откудо найти ???

если нетрудно отправ примерчик скажем бегушая строка,
и если написал дока для етих библиотек, тоже отправ,

я LCD подключил на PORTC , 4 бит, спасибо!

 

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

(VAHOO @ Apr 11 2007, 13:48) *

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

 

Автор: by-pass Apr 14 2007, 02:01

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


Присоединённые файлы
Присоединённый файл  CAN_controller_for_AT90CAN128_.rar ( 9.85кб ) Кол-во скачиваний: 261
 

Автор: backa Apr 14 2007, 15: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, 06:22

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

Автор: Serg_greS Jun 9 2007, 07: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, 14: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, 21:18

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

Автор: Serg_greS Jul 31 2007, 12: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/

 

Автор: Kuzmi4 Aug 3 2007, 14:09

2 Serg_greS - оно конечно огромное спасибо, но как добраться к тем хэдерам ? а то я там только одни дефайны наблюдаю....

Автор: Serg_greS Aug 3 2007, 14: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, 14:55

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




Присоединённые файлы
Присоединённый файл  test_float_good_last.rar ( 46.41кб ) Кол-во скачиваний: 222
 

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

QUOTE(dimka76 @ Aug 16 2007, 20:55) *

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

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

 

Автор: WHALE Aug 17 2007, 07:39

Да вот CV тока недавно научили.Лень товарисчу было писать 2 библиотеки math-под тини и под мегу,
была много лет одна общая без использования умножителя.Десяток операций с плавучкой-и флеш
уже весь сьеден.

Автор: АЛЕК@СЕЙ Sep 14 2007, 17:02

Здраствуйте!Не бейте сильно если чего не так сморожу! smile.gif
Подскажите пожалусто где можно почитать на русском принцип работы и передачи данных с контролера на монитор.А так-же обучающая информация,как использовать библиотеки и в общем програмно работать с мониторами ,мониторчик 162В. Делаю первые шаги...так сказать в IAR, С.

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

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

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

Автор: sKWO Oct 3 2007, 21:27

В общем книга всем известная по Си, в ПДФ.
Керниган и Ричи он же K&R. Не совсем по теме , но полезно.


Присоединённые файлы
Присоединённый файл  Kernigan_B_V_Richi_D_M_Yazyk_C_www.itlibitum.ru.pdf ( 1.4мб ) Кол-во скачиваний: 1636
 

Автор: Сергей Борщ Oct 4 2007, 00:09

(sKWO @ Oct 3 2007, 21:27) *
В общем книга всем известная по Си, в ПДФ.
Увы, первое издание, к тому же из текста куда-то напрочь пропали фигурные скобки. С современным С описанное в первом издании имеет много общего, но отличий достаточно, чтобы не рекомендовать первое издание. А вот второго в pdf не попадалось. Есть только в html sad.gif

 

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

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


Присоединённые файлы
Присоединённый файл  rc5.rar ( 6.98кб ) Кол-во скачиваний: 106
 

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

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

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


Присоединённые файлы
Присоединённый файл  lwIP4IAR.ZIP ( 784.67кб ) Кол-во скачиваний: 121
 

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

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

Автор: umup Nov 6 2007, 14:21

 
Здесь есть библиотеки для MODBUS


что-то получается слишком большой размер кода. у меня RTU поместился в 500 байт Flash и 30 ОЗУ

 

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

(umup @ Nov 6 2007, 15:21) *

что-то получается слишком большой размер кода. у меня RTU поместился в 500 байт Flash и 30 ОЗУ

Дело еще в том, на сколько код "откатан" в железе. Немного поизучали эту тему, но в последствии выяснилось, что в реализации всего протокола нет необходимости, а возможные коллизии обошли таймаутами. В сети попадлись вопросы в этой связИ, вот еще ветка:
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, 22:31

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

Автор: Сергей Борщ Nov 7 2007, 01: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, 09: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, 13: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, 05: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, 14: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кб ) Кол-во скачиваний: 166
Присоединённый файл  lcd44780.zip ( 5.18кб ) Кол-во скачиваний: 146
Присоединённый файл  timerhw.zip ( 1.52кб ) Кол-во скачиваний: 133
 

 

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

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

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

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

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

Автор: Kybik Feb 5 2008, 00: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кб ) Кол-во скачиваний: 78

Автор: Genadi Zawidowski Feb 13 2008, 02:14

AvrStudio + WINAVR, чистый C

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

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

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

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

A3553.ZIP


Присоединённые файлы
Присоединённый файл  TC1_Feb_04_2008_src.zip ( 240.28кб ) Кол-во скачиваний: 77
Присоединённый файл  avr_d12_cdc.zip ( 99.24кб ) Кол-во скачиваний: 70
Присоединённый файл  A3553.ZIP ( 947.59кб ) Кол-во скачиваний: 56
 

 

 

Hosted by uCoz