Модуль AVR ATmega162 для Pinboard II

Собственно почему именно на ATmega162 и чем он отличается от уже имеющегося модуля ATmega16?
  • Некоторые модели ATmega имеют интерфейс внешней памяти (ATmega8515, ATmega162, ATmega640, ATmega641, ATmega128, ATmega256). Интерфейс этот параллельный, т. е. требует 8 линий данных/адреса, до 8 линий дополнительного адреса, 2 линии управления, регистр для разделения данных/адреса. И хотя на стандартный модуль можно установить первые два в DIP-40 корпусе, быстро подключиться к интерфейсу внешней памяти проблематично. Данный модуль имеет возможность подключения внешней памяти SRAM обьемом до 64 Кб установкой в панельку. Интерфейс выведен и на разьем.
  • ATmega162 имеет на борту два полноценных UART.
  • Небольшое лирическое отступление. Довольно давно один товарищ попросил меня подумать о замене контроллера в одном устройстве с AT89C51 на AVR. Тогда я был просто не готов к такому разговору и аргументированно доказал, что овчинка не стоит выделки, слишком сложно. Товарищ успокоился, а мне этот разговор запал в голову. Стал сравнивать даташиты, прикидывать возможность замены, и к своему стыду выяснил что прямая замена не только возможна, она еще и не так сложна. Прямой заменой контроллера AT89C51 среди AVR является ATmega162. Конечно с заменой программы. Единственная доработка печатной платы — сигнал RESET имеет другую полярность. Основные функции на ножках совпадают один в один. Есть и еще небольшое отличие, порт Р0 у AT89C51 имеет нагрузочные резисторы на квазидвунаправленных выходах. Для ATmega162 (порт А) они не нужны, можно не обращать внимания, или же выпаять.


Читать дальше

Формирование импульсов для IR-управления на аппаратном таймере-2 ATmega8

В этой статье приводится описание алгоритма формирования импульсов для IR-управления на аппаратном таймере-2 на примере ATmega8. К статье прилагается программа расчета констант и формирования фрагментов кода для AVR-С.

В процессе разработки поворотного стола для круговой фотосъемки возникла задача дистанционного управления фотокамерой. В поисках информации была найдена статья, автору которой я очень признателен за подробный разбор. Но у него стояла задача выдачи одной лишь команды на один тип камеры (ее выбор осуществляется на этапе компиляции), а мой девайс помимо этого занят другими важными делами, да и не люблю я транжирить память программ списком макросов Pulse/Pause. И к какой конфессии (Canon'истам или Nikon'истам) относится конечный пользователь — неизвестно. В результате было принято решение из статьи взять цифры, а остальное реализовать по-своему. Для этой задачи, как мне кажется, как нельзя лучше подходит аппаратный таймер-2. Потому что у нулевого нет прерывания по совпадению и, тем более, возможности «дрыгать» при этом ногой, а первый, 16-разрядный, тратить на это просто жалко.


Читать далее...
  • +5
  • 30 ноября 2014, 18:53
  • Kerim
  • 1

Программный таймер. Применение HAL

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

А начал я, как следует из заголовка, с самого простого и необходимого модуля — программных таймеров.


Читать дальше

Термометр с питанием от солнечных элементов

На базе популярного датчика температуры DS1820, микроконтроллера AtTiny24A, ЖК-индикатора и деталей, добытых из садовых фонариков я собрал несложный термометр, предназначенный для измерения уличной температуры:



Читать дальше

Отключение защиты от замерзания электро-котла Protherm Скат

Protherm Ray
В достаточно неплохой электро-котел встроена защита от замерзания, срабатывающая при достаточно высокой температуре, и которую невозможно отключить.
И если в систему залит антифриз, и планируется периодическое удаленное включение отопления (заранее перед приездом раз в неделю, по праздникам и т.п.), то эта защита может вылиться в копеечку.
Отключаем защиту с помощью навесной схемки на микроконтроллере AVR с цифровым датчиком температуры DS18B20.


Читать дальше
  • +1
  • 11 ноября 2014, 19:07
  • vad7
  • 1

Еще один освежитель воздуха Airwick

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


Читать дальше
  • +3
  • 07 ноября 2014, 18:57
  • vad7
  • 1

Инициализация PWM конструктором класса ( C++ )

Долгое время писал код под МК на С. Друг пишет под МК на С++, посоветовал мне, вот я решил попробовать. Микроконтроллер у меня ATmega88А, IDE Atmel Studio 6.2. Буду использовать 6 апаратных PWM для управления сервоприводами, так как нужно писать 6 одинаковых кусков кода, решил сделать класс Servo:

class Servo
{
private:
        int* pulse_width;  

public:
        Servo(int* PWM_Channel);
        void write(int data);
}; //Servo

через конструктор передаем куда будем писать наше значение, тоесть регистр таймера для управления PWM:

// default constructor
Servo::Servo(int* PWM_Channel)
{
        pulse_width = PWM_Channel;
} //Servo


void Servo:: write(int data)
{
        *pulse_width = data;
}

Используем:

int main(void)
{ 
    Servo servo1(&OCR0A);
    Servo servo2(&OCR0B);
        
    servo1.write(10);
    servo2.write(50);
    
    while(1)
    {
    }
}


Вроде код получился читабельней.

Но вот как быть с инициализацией. Писать просто функцию где будут инициализироваться 3 апаратных таймера как то не по ООП. Добавить в конструктор весь код, будет инициализировать всё 6 раз, тоесть делать то же самое. Как можно сделать чтобы получить независимую инициализацию для каждого обьекта (канала) PWM — если регистры конфигурации разные для каждого таймера?
  • -1
  • 29 октября 2014, 12:18
  • Nemo

ATTINY13A с завода - обычный ISP вам не поможет

Закупил летом кучу чипов ATTINY 13A на ebay, часть в SU (200 mil) исполнении, часть в SSU (150 mil). С SU (в трее) проблем не возникло, а вот SSU (в ленте) отказались распознаваться обычным китайским USBASP программатором. Перепробовав всевозможные настройки, решил опробовать высоковольтное программирование чтобы попробовать сбросить fuses.
Как обычно это бывает — программировать в таком режиме было нечем.
Полистав полчаса гугл, остановился на самом простейшем для меня варианте (нужна ардуино-совместимая плата).

Что менял под себя:
1) транзистор заменил на 2N2222 (так как были в наличии)
2) 12В подал с лабораторного блока
3) чипы лепил на soic-dip переходник

Перешил на пробу 3 чипа. Все оказались с заводскими fuses: FF FC вместо FF FF
Все ATTINY13A в SSU исполнение, купленные до этого внутри страны, были с обычными fuses (FFFF).

На будущее заказал пару OTS socket для программирования SOIC8/16 т.к. прижимать или припаивать каждый чип нереально.
Что любопытно — на ebay такие socket'ы отдельно стоят всегда дороже (в разы), чем уже припаянные на платки (видимо налепили для каких-то программаторов, которые уже никому не нужны).

Коротенький диспетчер

Понадобился мне небольшой диспетчер. Вот, собственно, результат. Тут, конечно, фиг чего нового придумаешь, но все таки пусть лежит. Нуждается в легком допиливании, ибо добавление задачи сверх положенного сорвет контроллеру крышу, ну и стек в прерывании некисло прогружается. Под катом здоровая простыня кода, можно сразу копировать и запускать. Есть фрагменты кода DI HALT`a, они со мной давно ))


Читать дальше

Простая макетная плата ATmega16 ATmega32 DIP

AVR
Развёл простенькую макетку. Тупо все ноги МК вывел на пятачки, кондёры по питанию повесил, кварц, и разъём для программирования. Остальное цепляется к пятакам по вкусу. Так как у меня в разных проектах всё по разному, вешать кнопки/светодиоды на жёстко заданные выводы нет смысла.


Читать дальше