Шпаргалка по AVR

atiny13.c


//SREG
#define SREG_I (1<<7) //Bit 7 – I: Global Interrupt Enable
#define SREG_T (1<<6) //Bit Copy Storage
#define SREG_H (1<<5)// Half Carry Flag
#define SREG_S (1<<4)//
#define SREG_V (1<<3)//
#define SREG_N (1<<2)//
#define SREG_Z (1<<1)//
#define SREG_C (1<<0)//

//EEAR - регистр адреса EEPROM

//EEDR - регистр данных EEPROM

//EECR - регистр управления EEPROM
#define CLEAR_WRITE_EEPROM 0x00 // Стирание и запись в одну операцию (атоматическая операция)
#define CLEAR_EEPROM       0x10//Только стирание
#define WRITE_EEPROM       0x20//Только запись
#define EERIE              (1<<3)//Прерывание от EEPROM по состоянию "готов к записи"
#define EEMPE (1<<2)//Мастер программного разрешения EEPROM
#define EEPE (1<<1)//Программное разрешение в EEPROM
#define EERE (1<<0)//Разрешение чтения EEPROM

/*OSCCAL - калибровочный  ргеистр. 0x00 - самая низкая частота. 0x7F - максимально допустимая частота*/

//CLKPR - выбор предделителя
#define CLKPCE (1<<7)//1 - разрешить деление частоты
#define CLKPR_1	0x0 //Биты для выбора коэффициента деления тактовой частоты
#define CLKPR_2 0x1 //Биты для выбора коэффициента деления тактовой частоты
#define CLKPR_4 0x2 //Биты для выбора коэффициента деления тактовой частоты
#define CLKPR_8 0x3 //Биты для выбора коэффициента деления тактовой частоты
#define CLKPR_16 0x4 //Биты для выбора коэффициента деления тактовой частоты
#define CLKPR_32 0x5 //Биты для выбора коэффициента деления тактовой частоты
#define CLKPR_64 0x6 //Биты для выбора коэффициента деления тактовой частоты
#define CLKPR_128 0x7 //Биты для выбора коэффициента деления тактовой частоты
#define CLKPR_1256 0x8 //Биты для выбора коэффициента деления тактовой частоты

//MCUCR - управления МК
#define PUD (1<<6)//Подтягивающие резисторы запрещены
#define SE (1<<5)// Sleep enable
#define SLMOD_IDLE 0x0//Режим сна idle
#define SLMOD_ADC_NOISE_REDUCTON 0x8//Реим сна для снижения шумов на АЦП
#define SLMOD_POSER_DOWN 0x10//Режим сна power-down
#define LOW_LEVEL_INTx 0x0 // Низкий уровонеь на INTx генерирует прерывание
#define ANY_LEVEL_INTx 0x1//Любое изменение лог.уровня генерирует прерывание
#define FALLING_EDGE_INTx 0x2// Прерывание по спадающему фронут на INTx
#define RISING_EDGE_INTx 0x3// Прерывание по возсходящему фронут на INTx


// MCUSR – регистр статуса
#define WDRF (1<<3)//Флаг сброба WDT (сторж.таймера)
#define BORF (1<<2)//Флаг сброса от BOD-системы
#define EXTRF (1<<1)//Флаг сброса от внешнего источника
#define PORF (1<<0)//Флаг сброса по включению питания

// WDTCR – регистр настройки ждущего таймера
#define WDTIF (1<<7)//Флаг прерывания от WDT(сторж.таймера)
#define WDTIE (1<<6)//Разрешения прерывания от WDT(сторж.таймера)
#define WDP3 (1<<5)//Биты выбора предделителя WDT(сторж.таймера)
#define WDCE (1<<4)//Разрешения настройкаи WDT(сторж.таймера)
#define WDE (1<<3)//Разрешить WDT(сторж.таймера) сбрасывать систему.
#define WDP2 (1<<2)//Биты выбора предделителя WDT(сторж.таймера)
#define WDP1 (1<<1)//Биты выбора предделителя WDT(сторж.таймера)
#define WDP0 (1<<0)//Биты выбора предделителя WDT(сторж.таймера)
//Watchdog Timer Prescaler
#define WatchTimPrescale_2k    0x0//Typical Time-out at Vcc = 5.0V 16 ms
#define WatchTimPrescale_4k    0x1//Typical Time-out at Vcc = 5.0V 32 ms
#define WatchTimPrescale_8k    0x2//Typical Time-out at Vcc = 5.0V 64 ms
#define WatchTimPrescale_16k   0x3//Typical Time-out at Vcc = 5.0V 0.125 s
#define WatchTimPrescale_32k   0x4//Typical Time-out at Vcc = 5.0V 0.25 s
#define WatchTimPrescale_64k   0x5//Typical Time-out at Vcc = 5.0V 0.5 s
#define WatchTimPrescale_128k  0x6//Typical Time-out at Vcc = 5.0V 1 s
#define WatchTimPrescale_256k  0x7//Typical Time-out at Vcc = 5.0V 2 s
#define WatchTimPrescale_512k  0x20//Typical Time-out at Vcc = 5.0V 4 s
#define WatchTimPrescale_1024k 0x21//Typical Time-out at Vcc = 5.0V 8 s

// GIMSK – General Interrupt Mask Registe
#define INT0 (1<<6)// Внешний запрос на прерывание INT0 разрешён
#define PCIE (1<<5)// Настройка вывода в качестве источника прерывания разрешена

// GIFR – General Interrupt Flag Registe
#define INTF0 (1<<6)//Флаг прерывания INT0
#define PCIF  (1<<5)//Флаг прерывания на выводах

//PCMSK – Регистр маски прерываний
/*Каждый бит из PCINTx отвечает за свой вывод. Установка какого нибудь битыа из PCINTx разрешает прорывание на соответсвуюшем IO*/


/***********************************************************************
TCCR0A – Регистр настройки таймер/A
--WGM2 = 1 WGM1 =1 WGM0 = 1 Быстрый ШИМ(с большей частотой)
Изменения OCRx при TOP
TOP = OCRA
Установка флага TOV = TOP
--WGM2 = 1 WGM2 =0 WGM0 = 1 ШИМ с фазовой коррекцией(с меньшей частотой)
Изменения OCRx при TOP
TOP = OCRA
Установка флага TOV = BOTTOM
--WGM2 = 0 WGM1 = 1 WGM0 =1 Быстрый ШИМ 
Изменения OCRx при TOP
TOP = 0xFF
Установка флага TOV = MAX
--WGM2 = 0 WGM1 = 1 WGM0 =0 CTC
Изменения OCRx при Немедленно
TOP = OCRA
Установка флага TOV = MAX
--WGM2 = 0 WGM1 = 0 WGM0 =1 ШИМ с фазовой коррекцией(с меньшей частотой)
Изменения OCRx при TOP
TOP = 0xFF
Установка флага TOV = BOTTOM
***********************************************************************/
#define WGM00 (1<<0)
#define WGM01 (1<<1)
#define COM0B0 (1<<4)
#define COM0B1 (1<<5)
#define COM0A0 (1<<6)
#define COM0A1 (1<<7)
#define OC0A_disconnected 0x0
//режим работы таймера 0 без ШИМ:стандартный режим порта (OC0A отключён)
//Быстрый ШИМ:стандартный режим порта (OC0A отключён)
//ШИМ с фазовой коррекцией:стандартный режим порта (OC0A отключён)
//************************************************
#define OC0A_TOGGLE       0x40
//режим работы таймера 0 без ШИМ:переключить(инвертирование) OC0 по каждом совпадении
//Быстрый ШИМ: зарезервированно
//ШИМ с фазовой коррекцией: зарезервированно
//************************************************
#define OC0A_CLEAR        0x80
//режим работы таймера 0 без ШИМ: сброс OC0A при каждом совпадении
//Быстрый ШИМ: Сброс OC0A при совпадении и установка при достижении TOP(0xFF).
//ШИМ с фазовой коррекцией: Сброс OC0 при совпадении во время прямого счета. Установка OC0 при совпадении во время обратного счета
//************************************************
#define OC0A_SET          0xC0
//режим работы таймера 0 без ШИМ: установка OC0A при каждом совпадении
//Быстрый ШИМ:Установка OC0A при совпадении и сброс при достижении TOP(0xFF)
//ШИМ с фазовой коррекцией: Установка OC0 при совпадении во время прямого счета. Сброс OC0 при совпадении во время обратного счета.
//************************************************

//TCCR0B – Регистр настройки таймер/A
#define WGM02    (1<<3)
#define TIM_STOP 0x0 
#define TIM_0    0x1//выбор предварительного делителя. clk/0
#define TIM_8    0x2//выбор предварительного делителя. clk/8
#define TIM_64   0x3//выбор предварительного делителя. clk/64
#define TIM_256  0x4//выбор предварительного делителя. clk/256
#define FOC0A (1<<7)
/* Бит 7 — FOC0A: Принудительное изменение сигнала на выходе совпадения (канал А).
Бит FOC0A активен только тогда, когда посредством битов WGM выбран один из не-РWМ-режимов.
Для того, чтобы гарантировать совместимость с будущими устройствами, 
этот бит должен быть установлен в ноль каждый раз,
когда производится запись в регистр TCCR0B в любом из PWM-режимов.*/
#define FOC0B (1<<6)
/*Бит 6 — FOC0B: Принудительное изменение сигнала на выходе совпадения (канал В). 
Бит FOC0B активен только тогда, когда 
посредством битов WGM выбран один из не-Р\УМ-режимов. Однако для того,
чтобы гарантировать совместимость с будущими устройствами, 
этот бит должен быть установлен в ноль каждый раз, 
когда производится запись в регистр TCCR0B в любом из PWM-режимов.*/

//TCNT0 - счётный регистр таймера/счётчика 0
/*Счетный регистр позволяет осуществлять прямой доступ для чтения и записи 8 битов текущего значения таймера/счетчика.
 Запись в регистр TCNT0 блокируется на один период тактового сигнала в момент совпадения.
 Изменение содержимого счетного регистра (TCNT0)
 во время работы счетчика может привести к срыву генерации 
сигнала совпадения при равенстве содержимого регистров TCNT0 и OCR0x.*/

//OCR0A - регистр совпадения (канал A)
/*Регистр совпадения канала А содержит восьмибитное значение, 
которое непрерывно сравнивается с текущим значением счетчика (TCNT0). 
Регистр используется для формирования сигнала совпадения
 или для генерации периодических сигналов на выходе ОСОА*/

//OCR0B - регистр совпадения (канал B)

//TIMSK0 - 
#define TOIE0 (1<<1)//разрешения прерывания по переполнению таймера/счётчика
#define OCIE0A (1<<2)//разрешения прерывания по переполнению таймера/счётчика по совпадению на канале А
#define OCIE0B (1<<3)//разрешения прерывания по переполнению таймера/счётчика по совпадению на канале B

//TIFR0 - Регистр флагов таймера/счётчика 0
#define OCF0B (1<<3)//Флаг совпадения на канале B.
/*Бит OCF0B устанавливается в том случае, когда возникает совпадение содержимого счетного регистра 
таймера/счетчика 0 и регистра совпадения OCR0B*/
#define OCF0A (1<<2)/Флаг совпадения на канале A.
/*Бит OCF0A устанавливается в том случае, когда возникает совпадение содержимого счетного регистра 
таймера/счетчика 0 и регистра совпадения OCR0A*/
#define TOV0  (1<<1)//Флаг переполнения таймера/счетчика. 
/*Бит TOV0 устанавливается в единицу в том случае, когда происходит переполнение таймера/счетчика 0.*/

//GTCCR - главный регистр управления таймерам 
#define TSM (1<<7)// Режим синхронизации таймера-счетчика
/*TSM: Установка бита TSM активизирует режим синхронизации таймеров-счетчиков. В данном режиме после 
установки бита PSR0 или PSR321 соответствующий предделитель будет постоянно
 находиться в сброшенном состоянии. В этом состоянии гарантируется,
 что все соответствующие таймеры-счетчики будут остановлены и могут быть одинаково
 настроены без риска изменения состояния одного из них 
во время конфигурации. Если после этого сбросить бит TSM,
 то биты PSR0 и PSR321 сбрасываются аппаратно, а таймеры-счетчики начинают счет одновременно.*/
#define PSR10 (1<<0)//Сброс предварительного делителя таймера/счетчика. 
/*PSR10: Если данный бит равен лог. 1, то предделитель таймера-счетчика 0 сбрасывается.
 Данный бит обычно сбрасывается аппаратно сразу после установки. Если данный бит устанавливается, 
когда таймер-счетчик 0 работает в асинхронном режиме, то он остается равным 1 пока 
не сбросится предделитель таймера-счетчика 0. Данный бит не сбрасывается аппаратно, если бит TSM=1.*/


/*ADCSRB - выбор источника запуска преобразования АЦП*/
/*http://www.mirmk.net/content/view/116/29/ */
#define ACME (1<<6)//
#define ADTS2 (1<<2)
#define ADTS1 (1<<1)
#define ADTS0 (1<<0)
#define ADC_FREE_RUN 0X0//Свободный запуск
#define ADC_ANALOG_COMP 0x1//аналоговый компаратор
#define ADC_EXTERNAL_INTERRUPT 0x2//внешнее прерывание, канал 0
#define ADC_COMP_TIMA 0x3//таймер, совпадение в канале А
#define ADC_OVERFLOW_TIM 0x4//переполнение таймера
#define ADC_COMP_TIMB 0x4//таймер, совпадение в канале B
#define ADC_PIN_CHANGE 0x6//изменения на любом выводе

//ACSR - Регистр состояния и управления аналогового компаратора
#define ACD (1<<7)//Отключение аналогового компаратора
#define ACBG (1<<6)// Подключение источника опорного напряжения к аналоговому компаратору
#define ACO (1<<5)//Выход аналогового компаратора
#define ACI (1<<4)//Флаг прерывания аналогового компаратора
/*Данный разряд устанавливается аппаратно, при возникновении события в соответствии 
с установками бит ACIS1 и ACIS0.*/
#define ACIE (1<<3)// Разрешение прерывания аналогового компаратора
#define ACIS1 (1<<1)//Выбор события прерывания аналогового компаратора
#define ACIS0 (1<<0)//Выбор события прерывания аналогового компаратора
#define COMP_TOOGLE 0x0//Прерывание по любому изменению на выходе компаратора
#define COMP_FALLING 0x2//Прерывание по падающему фронту на выходе компаратора
#define COMP_RISING 0x3//Прерывание по нарастающему фронту на выходе компаратора

/*ADMUX - Регистр управления мультиплексором АЦП*/
#define REFS0 (1<<6)// 1 - внешний И.О.Н. 0 - Vcc используется как источник И.О.Н.
#define ADLAR (1<<5)//Бит управления представлением результата преобразования
/*Бит ADLAR влияет на представление результата преобразования в паре регистров результата преобразования АЦП.
 Если ADLAR = 1, то результат преобразования будет иметь левосторонний формат, 
 в противном случае - правосторонний. 
 Действие бита ADLAR вступает в силу сразу после изменения, независимо от выполняющегося параллельно преобразования.
 Полное описание действия данного бита представлено в “Регистры данных АЦП – ADCL и ADC*/
#define ADC0_PB5 0x0//выбор одного из входов АЦП
#define ADC1_PB2 0x1//выбор одного из входов АЦП
#define ADC2_PB4 0x2//выбор одного из входов АЦП
#define ADC3_PB3 0x3//выбор одного из входов АЦП

/*DIDR0 - отключение функции цифрового входа для аналогового канала*/
/*(для снижения потребляемой мощьности)*/
#define ADC0D (1<<5)// отключение цифровых входов ADC0
#define ADC2D (1<<4)// отключение цифровых входов ADC2
#define ADC3D (1<<3)// отключение цифровых входов ADC3
#define ADC1D (1<<2)// отключение цифровых входов ADC1
#define AIN1D (1<<1)// отключение цифровых входов AIN1
#define AIN0D (1<<0)// отключение цифровых входов AIN0


Сижу вот думаю, чтобы такого сделать на атини. RGB контроллер светодида с управленим по уарт? Значит надо софт уарт и софт шим. Тогда можно каждому контроллеру задавать адрес и при совпадение адреса светодиод может менять цвет. Атини стоит 28 руб, + транзисторы…
А хватит ли 1к памяти?
Файлы в топике: avr_head.zip

Комментарии (39)

RSS свернуть / развернуть
Возьми stm8s103f3 по 21руб здесь www.terraelectronica.ru/catalog.php?ID=769&Search=1&Text=stm8s103f3p6&Gde=2&PageS=1 там есть нормальный УАРТ, ШИМ и много еще чего полезного. Памяти 8К. И не парься с АтИмелом. :)
+1
Плюсадин!
0
И я поддержу, хоть так и не добрались пока мои шаловливые ручки до stm, но цены вдохновляют!
0
Тем более, что за 30 р. уже можно и STM32F100C4T6B взять! Лишь бы только научиться эту мелочь запаивать. Но у меня как раз несколько мелких таких заказано — буду учиться паять эту мелочь :)
0
Я вот кстати все думаю: при том, что у ST цены на 8 и 32 битки практически уже где-то рядом. Какой же все-таки лучше выбрать класс?..
Нет ну понятно, что с одной стороны там много общего между ними и все такое. И как бы для каждой задачи свой класс. Но все же, наверное, лучше было бы остановиться на чем-то одном? Особенно если я так, для себя для хобби, а не в производство. И в общем-то желания перелопачивать кучу информации у меня нет…
Вот и размышляю: стоит ли изучать их 8-ми битки, или сразу на 32 пересаживаться — прикупить себе j-link и вперед и с песнями?
Кто что думает?

PS: хотя это же оффтоп… Прошу у автора прощения за это, надеюсь, он не будет сердиться.
0
ж-линк в любом случае стоит заиметь.
а 8/32 бита — от задачи. причем 8 бит только авры и пики. как мелкие периферийные ногодрыги. стм8 на эту роль не годятся. а как числодробилку стм32 и прочие армы — самое то… вот тут жлинк и пригодится…
0
Спасибо!
Я правда подумал, что зря тут оффтоплю — и создал опрос. Жаль, комментарий уже не удалить было. (Мой косяк. Каюсь.)

Так что по вопросу выбора семейства если кто еще хочет высказаться, пишите лучше там!
0
напишу тут. ;)
тини45 12.5грн
мега8 11.5грн
мега48 8.45грн

STM32F100C4T6B 11грн
о несопоставимости ресурсов, имхо, говорить не нужно. и выбор однозначно очевиден.
(приведенные цифры — розница космоса)
0
Мега48 любопытный вариант. Дешевле.
0
  • avatar
  • Vga
  • 28 сентября 2012, 16:59
мега48 любопытнее чем представленная альтернатива стм32ф100??! О_О
она не любопытнее. тут просто паритет цена-фарш.
0
Она дешевле и для очень многих задач ее достаточно (правда, с отладкой облом) — зачем переплачивать за фарш, когда он не нужен?.. Плюс на ней можно получить жесткие тайминги и запустить V-USB или сделать генератор PAL или SVGA.
0
  • avatar
  • Vga
  • 28 сентября 2012, 22:19
C отладкой не облом — плати 50 $ за Dragon и отлаживай по dWire.
0
Во первых дороже, во вторых это на скольки же STM32F100C4 нужно сэкономить, чтобы окупить отладку для авр? И вообще жаба давит.
0
  • avatar
  • Vga
  • 29 сентября 2012, 00:51
жму руку, наливаю коньяка.
0
Ну, какой-то инструмент для программирования АВР всё равно нужен и к его цене драгон не сильно добавляет. Разница в цене между AvrIsp и AvrDragon 15 Euro — не так уж и дорого.
0
Чисто программаторов на эти 15 евро можно три штуки собрать. А китайских — все пять купить.
Это если нету LPT или COM, тех все полсотни собрать можно.
0
  • avatar
  • Vga
  • 30 сентября 2012, 00:39
Собирать как-то нет желания.
Сколько будет доставка китайского стоить?
0
Собирать как-то нет желания.
Фи
Сколько будет доставка китайского стоить?
Бесплатная
0
  • avatar
  • Vga
  • 30 сентября 2012, 20:35
да, с отладкой грабли. но мы ведь не о ней?
0
В остальном у меги48 минусов нет, при условии ее адекватности задаче.
0
  • avatar
  • Vga
  • 29 сентября 2012, 01:44
ну дык, я о том и говорю, что мега48 примерно паритетна той стм32. учитывая всё.
0
Э, нет. В задачах, где меги48 недостаточно паритета уже не будет.
0
  • avatar
  • Vga
  • 29 сентября 2012, 09:03
Кстати, для меги48 цена норм, а вот STM32F100C4 дороговат. Я брал в полтора раза дешевле.
0
  • avatar
  • Vga
  • 28 сентября 2012, 22:20
Еще любопытный вариант attiny45. Всего в одной задаче (8-ногий USB), но конкурентов не имеет (25/85 не в счет — это то же самое).
0
  • avatar
  • Vga
  • 28 сентября 2012, 22:22
Хотя, у нее еще ШИМ на 250кГц. Тоже довольно редкая фишка. STM32F103@72MHz конечно и немного больше выдаст, но жрет и стоит куда больше.
0
  • avatar
  • Vga
  • 28 сентября 2012, 22:23
да, восьминожек порой сильно не достает…
0
stm8 по 10-15р есть.
0
Во, в соседнем блоге предложили stm8s003f3 по 9р.45коп.
www.terraelectronica.ru/catalog.php?ID=1115&Search=1&Text=stm8s003f&Gde=2&PageS=1

Для обычного юзера — практически то-же самое что и stm8s103f3. Места занимает ровно столько, сколько Тини13.
0
да, у нас они тоже чуточку дороже обычной логики.
0
Лучше взять Mega48/88/8. Tiny нужны если надо съэкономить на цене или месте на плате.
P.S. R чему этот листннг? То же самое есть в IAR или GCC. только лучше. И почему atiny13.c, а не atiny13.h? И где #ifdef AT_TYNY13_INCLUDED?
0
Тини у меня 2 шт валяются да и место мало занимают. Для стм ещё не всё разжёванно, а вот авр перетёрли полностью. Среда разработки для авр бесплатная и более удобная. Да и авр стабильнее как с точки зрения хобби так и с производственной, цена на них более устоявшиеся.
Где-то тут прочитал что у ст проблемы с деньгами, так что вполне может быть что цены поднимутся.
У стм 32 меня отпугнула сложность и еррата.
0
А кто вам мешает заказать с запасом, на случай роста цены? при копеечной стоимости вполне приемлимое решение.
0
поддерживаю. я обычно их пачками тарю. на случай ядерной войны. или вон того косяка, как у атмела случился. чтобы хоть для поделок на полке в запасе лежали…
0
Ну если валяются, тогда — да
>>Среда разработки для авр бесплатная и более удобная.
Это AVRStudio 4 более удобная? Какую среду для STM пробовали? (Спрашиваю чтобы знать что лучше не использовать).
0
STVD
0
И почему atiny13.c, а не atiny13.h? И где #ifdef AT_TYNY13_INCLUDED?
Так черновое всё, сюда выложил чтобы можно было взять и переделать. Потихоньку дополняю и редактирую пост.
0
под ту задачу, которую Вы изложили, памяти у тиньки вполне хватит.
0
А чем Атмеловские инклюды не устраивают?
0
В инете нарыл софтину, для генерации асм файла, добавил к топику.
0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.