Прерывания. Таблица векторов прерываний ATtiny13
В этом разделе описываются особенности обработки прерываний, выполняемые в ATtiny13A.
Полезная справочная таблица по векторам прерываний Attiny2313:
Расположение векторов прерываний в таблице определяет приоритет их обработки. Чем младше адрес прерывания, тем выше приоритет.
Взято с сайта avrinfo
А вот таблица векторов прерываний для МК Attiny13A:
Vector No. | Program Address | Source | Interrupt Definition |
1 | 0x0000 | RESET | Внешний контакт, сброс при включении питания, cброс при отключении питания, сброс сторожевого таймера |
2 | 0x0001 | INT0 | Внешнее прерывание 0 |
3 | 0x0002 | PCINT0 | Прерывание по изменению состояния выводов |
4 | 0x0003 | TIM0_OVF | Переполнение таймера\счётчика |
5 | 0x0004 | EE_RDY | EEPROM готова |
6 | 0x0005 | ANA_COMP | Аналоговый компаратор |
7 | 0x0006 | TIM0_COMPA | Совпадение А таймера\счётчика T0 |
8 | 0x0007 | TIM0_COMPB | Совпадение B таймера\счётчика T0 |
9 | 0x0008 | WDT | Переполнение сторожевого таймера |
10 | 0x0009 | ADC | Преобразование АЦП завершено |
Если программа никогда не активирует источник прерывания, векторы прерывания не используются, и обычный программный код может быть размещен в этих местах.
Наиболее типичная и общая настройка программы для адресов вектора сброса и прерывания в
ATtiny13A (пример):
Address Labels Code Comments 0x0000 rjmp RESET ; Reset Handler 0x0001 rjmp EXT_INT0 ; IRQ0 Handler 0x0002 rjmp PCINT0 ; PCINT0 Handler 0x0003 rjmp TIM0_OVF ; Timer0 Overflow Handler 0x0004 rjmp EE_RDY ; EEPROM Ready Handler 0x0005 rjmp ANA_COMP ; Analog Comparator Handler 0x0006 rjmp TIM0_COMPA ; Timer0 CompareA Handler 0x0007 rjmp TIM0_COMPB ; Timer0 CompareB Handler 0x0008 rjmp WATCHDOG ; Watchdog Interrupt Handler 0x0009 rjmp ADC ; ADC Conversion Handler ; 0x000A RESET: ldi r16, low(RAMEND) ; Main program start 0x000B out SPL,r16 ; Set Stack Pointer to top of RAM 0x000C sei ; Enable interrupts 0x000D <instr> xxx .Внешние прерывания.. ... ... ...
Внешние прерывания запускаются выводом INT0 или любым выводом PCINT[5:0]. Заметьте, что если они включены, прерывания будут срабатывать, даже если выводы INT0 или PCINT[5:0] сконфигурированы как выходы. Эта функция позволяет применять программное прерывание. Прерывания смены контакта PCI сработает, если какой-либо включенный вывод PCINT[5:0] переключится. Регистр PCMSK определяет, какие контакты способствуют прерываниям по смене пина. Прерывания смены пина на PCINT[5:0] обнаруживаются асинхронно. Это означает, что эти прерывания могут использоваться для пробуждения устройства из спящего (sleep) режима, отличающегося от режима ожидания (idle).
Прерывания INT0 могут быть вызваны падающим или нарастающим фронтом или низким уровнем. Это настраивается, как указано в спецификации для регистра управления MCU – MCUCR. Когда прерывание INT0 включено и настроено как срабатывание по уровню, прерывание будет срабатывать до тех пор, пока контакт удерживается на низком уровне. Обратите внимание, что распознавание прерываний по заднему или переднему фронту на INT0 требует наличия таймера ввода-вывода (I/O clock).
Прерывание по низкому уровню (low level interrupt)Прерывание низкого уровня на INT0 обнаруживается асинхронно. Это означает, что это прерывание может быть использовано для пробуждения детали из спящего режима (sleep), в отличие от режима ожидания (idl). Таймер ввода-вывода (I/O Clock) остановлен в
всех спящих режимах (sleep), кроме режима ожидания (idle).
Обратите внимание, что если прерывание, запускаемое по уровню, используется для пробуждения после выключения питания (power down), то необходимый уровень должен удерживаться достаточно долго, чтобы MCU завершил пробуждение, чтобы вызвать прерывание по уровню. Если
уровень исчезнет до наступления запущенного состояния (Start-up Time), MCU всё равно проснётся, но уже без прерывания. Время запуска определяется фьюзами SUT и CKSEL, как описано в
«Системные таймеры и параметры таймеров».
Если низкий уровень на контакте прерывания изменён до того, как устройство проснулось, тогда исполнение команды по прерыванию не будет переключено на процедуру обслуживания прерывания, а продолжится с инструкции, следующей за командой SLEEP.
Програмирование в AVR Studio 5 с самого начала. Часть 7 » Журнал практической электроники Датагор
Поговорим о прерываниях. Слово прерывание говорит само за себя, происходит остановка какого — то процесса на какое — то время, для того чтобы выполнить дополнительные действия. Прерывания могут быть внешними или внутренними. Приведу простой пример, услышанный из уст моего друга…
Собрался он помыть посуду на кухне, взялся с азартом, засучив рукава…но посуда оказалась жирной и он был вынужден прерваться, чтобы найти на одной из полок кухонного гарнитура средство для мытья жирной посуды, после чего снова продолжил свое занятие. Но в какой-то момент зазвонил телефон, и он опять прервался от своей работы, поднял трубку, звонила теща и сказала, что придет в гости, значит надо сходить в магазин купить продукты к ее приходу. Сходил в магазин и только после этого домыл посуду.
На этом примере видно два вида прерываний, первое – связано с выполнением основной работы — поиск средства для жирной посуды -внутреннее прерывание, второе – телефонный звонок – внешнее прерывание.
В микроконтроллере внешние прерывания возникают за счет сигналов поступающих от других источников, внутренние – за счет устройств встроенных в сам микроконтроллер.
🌼 Полезные и проверенные железяки, можно брать
Опробовано в лаборатории редакции или читателями.
Трансформатор R-core 30Ватт 2 x 6V 9V 12V 15V 18V 24V 30V
Паяльная станция 80W SUGON T26, жала и ручки JBC!
Отличная прочная сумочка для инструмента и мелочей
Хороший кабель Display Port для монитора, DP1.4
Конденсаторы WIMA MKP2 полипропилен
Трансформатор-тор 30 Ватт, 12V 15V 18V 24V 28V 30V 36V
SN-390 Держатель для удобной пайки печатных плат
Панельки для электронных ламп 8 пин, керамика
Чем же так привлекательны прерывания?
Первое — это то, что мы можем остановить основной процесс для выполнения каких либо других функции, с последующим продолжением этого процесса.
Вторым, и наверное во многих случаях основным считается ускорение процесса выполнения всех функций, за счет внутренних дополнительных устройств. Вернемся к нашему примеру. Допустим, мой друг взялся мыть посуду, когда его жена уже пришла домой. Увидев жирную посуду, он просит ее найти средство для мытья посуды, и пока он моет, она уже принесет ему это средство. Но, вот зазвонил телефон, трубку поднимет жена, поговорит с мамой и сходит в магазин. Совместно все дела сделаны очень быстро!
А еще проще зациклится – т.е. основной программы нет.
Мой друг сидит на диване и ничего не делает, домоработница увидев грязную посуду, говорит ему об этом, и получив разрешение, начинает мыть сама. Когда звонит телефон, он говорит жене, чтобы она подняла трубку, жена разговаривает по телефону, и поле разговора идет в магазин за продуктами… Красота! В таком случае в микроконтроллере одновременно работают несколько устройств ввода-вывода (в современных микроконтроллерах их может быть достаточно много) и общая производительность процессора возрастает во много раз, но прерывания от устройств обрабатываются последовательно одно за другим (не одновременно), в зависимости от приоритета (в нашем примере жена имеет больший приоритет, нежели домоработница).
За управление прерываниями отвечают несколько регистров
Устанавливается и сбрасывается флаг I командами:
SEI — разрешить прерывания
CLI — запретить прерывания
Какие из прерываний будут работать, задается с помощью регистров называемых – масками прерываний.
Обозначаются маски прерываний следующим образом:
TIMSK,..,..,.. – управление прерываниями от таймеров и других встроенных устройств
GIMSK (GIKR в семействе Mega) — управление всеми внешними прерываниями.
Маски прерываний в свою очередь зависят от флагов прерываний:
TIFR и GIFR соответственно (не путайте с флагом глобального разрешения прерываний).
Последовательность выполнения прерываний:
При включении микроконтроллера все флаги прерываний сброшены в 0. Для включения прерываний программа должна установить флаг I регистра SREG в 1. После этого прописать регистры маски с установленными локальными прерываниями (прерывания, которые нам нужны).
Вектор прерывания – это фиксированная строка программной области, куда переходит программа в случае возникновения прерывания.
Весь список векторов прерывания – называется таблицей векторов прерывания, который располагается в начале программного кода.
Итак, в момент обращения к вектору прерывания, флаг I регистра SREG и флаг вызвавший прерывание сбрасывается в 0, запрещая другие прерывания.
В качестве примера приведена таблица векторов прерывания для ATtiny2313
Таблица векторов прерывания для Атмега16 выглядит следующим образом:
При сравнении, таблицы совершенно не совпадают.
В семействе ATtiny строка вектора прерывания занимает 16 бит, а в семействе Mega занимают 32 бита (обратите внимание на адреса векторов прерывания, напомню, что адресная строка в программной области представлена 16 битным словом).
Программный код для ATtiny2313 может выглядеть следующим образом:
.cseg .org 0 rjmp Reset rjmp INT_0 rjmp INT_1 rjmp Timer1_capt1 rjmp Timer1_comp1 rjmp Timer1_OVF1 rjmp Timer0_OVF0 rjmp UART_RX rjmp UART_UDRE rjmp UART_TX rjmp ANA_COMP rjmp PCINT rjmp Timer1_compB rjmp Timer0_compA rjmp Timer0_compB rjmp USI_START rjmp USI_OVERFLOW rjmp EE_READY rjmp WDT_ OVERFLOW
Как видно, вектор прерывания создает относительный переход на метки программ прерываний. Ниже в таблице показаны варианты; 1. Когда нет прерываний; 2, 3. с внешним прерыванием по входу INT_1.
Если метки «пустые” (под меткой нет программы), то ничего не происходит, и программа последовательно «пробежавшись” по оставшимся меткам благополучно доходит до команды RETI- Interrupt return — выход из обработчика прерывания как показано в первом столбце таблицы.
Чтобы выполнить программу прерывания, например по входу INT_1, нужно метку INT_1: вынести из списка. Это схематично показано во втором столбце таблицы.
Но, программисту неудобно каждый раз прописывать все прерывания и отдельно метки к ним, особенно в последних моделях, где таблица достаточно большая, проще в строке вектора прерывания сразу написать команду RETI, если прерывание не используется. Тогда программа будет выглядеть, как показано в третьем столбце таблицы.
В AVR-контроллерах в зависимости от модели может быть от 1 до 8 входов внешних прерываний.
Рассмотрим систему управления внешними прерываниями. Для этого предусмотрены следующие комбинации I/O-регистров в зависимости от модели (см. соответствующий DataSheet):
— GIMSK, EIFR, PCMSK, MCUCR;
— GIKR, GIFR, MCUCR;
— EIMSK, EICR, EIFR;
GIMSK, GIKR, EIMSK — маски прерываний,
EIFR, PCMSK, GIFR, EIFR – флаги прерываний
Для разрешения или запрещения внешних прерываний предназначены управляющие регистры: GIMSK-(General Interrupt Mask Register)(Tiny), GICR- (General Interrupt Control Register)(Mega), MCUCR – (MCU Control Register)
Tiny
и соответствующий ему регистр флагов
EIFR- External Interrupt Flag Register: 1- разрешено, 0 – запрещено. Каждый бит (флаг) разрешает соответствующему выводу работать в качестве источника прерываний.
Биты управления регистра GIMSK:
Бит 7 – INT1: External Interrupt Request 1 Enable – бит разрешения прерывания INT1: 1 – разрешено, 0 – запрещено. Прерывание будет формироваться, даже если вывод INT1 настроен как выход. Бит INT1 настраиваются на прерывание в регистре флагов EIFR. Вывод INT1 синхронизирован с тактовым генератором.
Бит 6 – INT0: External Interrupt Request 0 Enable — бит разрешения прерывания INT0: 1 – разрешено, 0 – запрещено. Прерывание будет формироваться, даже если вывод INT0 настроен как выход. Бит INT0 настраиваются на прерывание в регистре флагов EIFR. Вывод INT10 синхронизирован с тактовым генератором.
Бит 5 – PCIE: Pin Change Interrupt Enable – бит разрешения прерывания на выводах PCINT0…7: 1- разрешено, 0 – запрещено. Любое изменение на любом из выводов PCINT0…7 будет формировать прерывание. Выводы PCINT0…7 настраиваются на прерывание индивидуально, битами в регистре флагов PCMSK.
PCMSK — Pin Change Mask Regiser — регистр флагов PCMSK: 1- разрешено, 0 – запрещено. Каждый бит (флаг) разрешает соответствующему выводу работать в качестве источника прерываний. Выводы PCINT0…7 не синхронизированы с тактовым генератором, т.е. прерывание наступает по факту изменения на любом из выводов.
Mega8
и соответствующий ему регистр флагов
GIFR– General Interrupt Flag Register: 1- разрешено, 0 – запрещено. Каждый бит (флаг) разрешает соответствующему выводу работать в качестве источника прерываний.
Биты управления регистра GICR:
Бит 7 – : External Interrupt Request 1 Enable – бит разрешения прерывания INT1: 1 – разрешено, 0 – запрещено. Прерывание будет формироваться, даже если вывод INT1 настроен как выход. Бит INT1 настраиваются на прерывание в регистре флагов GIFR
Бит 6 – INT0: External Interrupt Request 0 Enable — бит разрешения прерывания INT0: 1 – разрешено, 0 – запрещено. Прерывание будет формироваться, даже если вывод INT0 настроен как выход. Бит INT0 настраиваются на прерывание в регистре флагов GIFR
Mega16
GIFR– General Interrupt Flag Register: 1- разрешено, 0 – запрещено. Каждый бит (флаг) разрешает соответствующему выводу работать в качестве источника прерываний.
Биты управления регистра GICR:
Бит 7 – : External Interrupt Request 1 Enable – бит разрешения прерывания INT1: 1 – разрешено, 0 – запрещено. Прерывание будет формироваться, даже если вывод INT1 настроен как выход. Бит INT1 настраиваются на прерывание в регистре флагов GIFR
Бит 6 – INT0: External Interrupt Request 0 Enable — бит разрешения прерывания INT0: 1 – разрешено, 0 – запрещено. Прерывание будет формироваться, даже если вывод INT0 настроен как выход. Бит INT0 настраиваются на прерывание в регистре флагов GIFR
Бит 5 – INT2: External Interrupt Request 2 Enable — бит разрешения прерывания INT2: 1 – разрешено, 0 – запрещено. Прерывание будет формироваться, даже если вывод INT2 настроен как выход. Бит INT2 настраиваются на прерывание в регистре флагов GIFR
Функциями входов INT0 и INT1во всех контроллерах управляют младшие биты регистра MCUCR
MCUCR– MCU Control Register
Биты управления:
Биты 1, 0 – ISC01, ISC00 (Interrupt Sense Control 0 Bit 1 and Bit 0) – состояние данных битов определяет событие на выводе INT0, при котором формируется прерывание INT0:
ISC01=0, ISC00=0 – уровень логического нуля;
ISC01=0, ISC00=1 – любая смена логического состояния;
ISC01=1, ISC00=0 – по спадающему фронту;
ISC01=1, ISC00=1 – по нарастающему фронту.
Биты 3, 2 – ISC11, ISC10 (Interrupt Sense Control 1 Bit 1 and Bit 0) – состояние данных битов определяет уровень сигнала на выводе INT1, по которому формируется прерывание INT1:
ISC11=0, ISC10=0 – уровень логического нуля;
ISC11=0, ISC10=1 – любая смена логического состояния;
ISC11=1, ISC10=0 – по спадающему фронту;
ISC11=1, ISC10=1 – по нарастающему фронту.
Ну вот, вроде как с минимумом о внешних прерываниях поговорили.
Понятно, что для того, чтобы прерывания работали, нужно соответственно их прописывать.
Допишем начатую для tiny, инициализацию прерывания на INT1 по возрастающему фронту сигнала:
ldi r16,0x80 ; запишем в r16 число 0b10000000 ldi r17,0x0C ; запишем в r17 число 0b00001100 out MCUCR,r17 ; прерывание сформируется по нарастающему фронту ISC11=1, ISC10=1 out GIMSK,r16 ; выставим маску INT0 sei
Кстати на tiny2313 можно сформировать прерывание на любых выводах PCINT0…7, на Mega до 48 серии эти возможности отсутствуют…
Есть такие операции, при выполнении которых, возникшие прерывания могут вызвать сбой программы. В таких случаях перед началом выполнения операции пишем CLI, а после SEI. Называются такие операции – атомарными.
Желательно, чтобы программы прерываний были компактными и выполнялись с максимальной скоростью, потому, что целью любых прерываний является фиксация события. Если по разным причинам программа выполняется медленно, то достаточно зафиксировать событие и обработать его чуть позже.
Чтобы не загромождать лишней информацией изложенный материал, рекомендую читателям пользоваться даташитами, а если не все понятно, то чаще задавать вопросы на форумах.
Дальше, подробно рассмотрим внутренние прерывания на основе встроенных таймеров.
векторов прерываний AVR
векторов прерываний AVRВекторы прерываний AVR
Ниже приведены таблицы прерываний, доступных на микроконтроллерах AVR, используемых в классе. Имя вектора — это идентификатор, который следует использовать в начале процедура обслуживания прерывания (ISR). Например, ISR для вывода ATmega328P. Изменить запрос на прерывание 0 будет выглядеть так.
ISR(PCINT0_vect) { // ISR-код }
Примечание. Имена векторов не всегда совпадают для одного и того же прерывания. в разных процессорах. Проверьте таблицу для правильного процессора, прежде чем написание ИСР.
ATmega328P
Vector Number | Interrupt definition | Vector name |
2 | External Interrupt Request 0 | INT0_vect |
3 | External Interrupt Request 1 | INT1_vect |
4 | Запрос прерывания по смене контакта 0 | PCINT0_vect |
5 | Pin Change Interrupt Request 1 | PCINT1_vect |
6 | Pin Change Interrupt Request 2 | PCINT2_vect |
7 | Watchdog Time-out Interrupt | WDT_vect |
8 | Таймер/Счетчик2 Сравнить совпадение A | TIMER2_COMPA_vect |
9 | Таймер/Счетчик2 Сравнить совпадение B | TIMER2_COMPB_vect |
10 | Timer/Counter2 Overflow | TIMER2_OVF_vect |
11 | Timer/Counter1 Capture Event | TIMER1_CAPT_vect |
12 | Timer/Counter1 Compare Match A | TIMER1_COMPA_vect |
13 | Timer/Counter1 Сравнить соответствие B | TIMER1_COMPB_vect |
14 | Timer/Counter1 Overflow | TIMER1_OVF_vect |
15 | Timer/Counter0 Compare Match A | TIMER0_COMPA_vect |
16 | Timer/Counter0 Compare Match B | TIMER0_COMPB_vect |
17 | Таймер/Счетчик0 Переполнение | TIMER0_OVF_vect | 180910019 | SPI Serial Transfer Complete | SPI_STC_vect |
19 | USART Rx Complete | USART_RX_vect |
20 | USART Data Register Empty | USART_UDRE_vect |
21 | USART Tx Complete | USART_TX_vect |
22 | Преобразование ADC завершено | ADC_vect |
23 | EEPROM Ready | EE_READY_vect |
24 | Analog Comparator | ANALOG_COMP_vect |
25 | Two-wire Serial Interface | TWI_vect |
26 | Сохранить чтение памяти программы | SPM_READY_vect |
ATtiny4313
Vector Number | Interrupt definition | Vector name |
2 | External Interrupt Request 0 | INT0_vect |
3 | External Interrupt Request 1 | INT1_vect |
4 | Таймер/Счетчик 1 Событие захвата | TIMER1_CAPT_vect |
5 | Таймер/Счетчик 1 Сравнить совпадение A | TIMER1_COMPA_vect |
6 | Timer/Counter1 Overflow | TIMER1_OVF_vect |
7 | Timer/Counter0 Overflow | TIMER0_OVF_vect |
8 | USART Rx Complete | USART0_RX_vect |
9 | Регистр данных USART пуст | USART0_UDRE_vect |
10 | USART Tx Complete | USART0_TX_vect |
11 | Analog Comparator | ANA_COMP_vect |
12 | Pin Change Interrupt Request 0 | PCINT_B_vect |
13 | Таймер/Счетчик 1 Сравнить совпадение B | TIMER1_COMPB_vect |
14 | Таймер/Счетчик 0 Сравнить совпадение A | TIMER0_COMPA_vect |
15 | Timer/Counter0 Compare Match B | TIMER0_COMPB_vect |
16 | USI Start Condition | USI_START_vect |
17 | USI Overflow | USI_OVERFLOW_vect |
18 | EEPROM готов | EEPROM_READY_vect |
19 | Watchdog Timer Overflow | WDT_OVERFLOW_vect |
20 | Pin Change Interrupt Request 1 | PCINT_A_vect |
21 | Pin Change Interrupt Request 2 | PCINT_D_vect |
ATtiny85
Номер вектора | Определение прерывания | Имя вектора |
1 | External Interrupt Request 0 | INT0_vect |
2 | Pin Change Interrupt Request 0 | PCINT0_vect |
3 | Timer/Counter1 Compare Match A | TIMER1_COMPA_vect |
4 | Переполнение таймера/счетчика 1 | TIMER1_OVF_vect |
5 | Переполнение таймера/счетчика 0 | TIMER0_OVF_vect |
6 | EEPROM Ready | EE_RDY_vect |
7 | Analog Comparator | ANA_COMP_vect |
8 | ADC Conversion Complete | ADC_vect |
9 | Таймер/Счетчик 1 Сравнение соответствия B | TIMER1_COMPB_vect |
10 | Timer/Counter0 Compare Match A | TIMER0_COMPA_vect |
11 | Timer/Counter0 Compare Match B | TIMER0_COMPB_vect |
12 | Watchdog Time-out | WDT_vect |
13 | Состояние запуска USI | USI_START_vect |
14 | Переполнение USI | USI_OVF_vect |
задание_8
задание_8Тема: Встроенное программирование
Прочитайте техпаспорт микроконтроллера.Запрограммируйте свою доску, чтобы сделать что-то, используя как можно больше различных Языки программирования и среды программирования, насколько это возможно.
При желании поэкспериментируйте с другими архитектурами.
Результаты обучения: Определите соответствующую информацию в листе данных микроконтроллера.
Реализовать протоколы программирования.
У вас:
Задокументировано то, что вы узнали из чтения данных микроконтроллера. лист.Какие вопросы у вас есть? О чем бы вы хотели узнать больше?
Запрограммировал вашу плату.
Описал используемые вами процессы программирования.
Включен ваш код.
ATTINY 24/44/84 Технический паспорт
Сначала я прочитал техпаспорт семейства микроконтроллеров ATTINY44. Я читал это несколько раз раньше. Тем не менее, я прочитал это сейчас тщательно. Типичными показаниями являются, например, порядок контактов, привод возможности отдельных выводов и т. д.Также там можно найти много редко необходимой информации, например прерывания и спящие режимы. Производитель публикует короткие и длинные историю листа данных и опубликовать также исправления, если это необходимо.
ATTiny44A имеет флэш-память 4K, 8-битный и 16-битный таймер/счетчик,
10-разрядный АЦП, рабочее напряжение 1,8 — 5,5 В, потребляемая мощность 210 мкА
при 1,8 В и 1 МГц и диапазоне температур от -40 до +85 °С. Скорость
класс 0 — 4 МГц 1,8 — 5,5 В, 0 — 10 МГц 2,7 — 5,5 В и 0 — 20
МГц 4,5 — 5,5В. Порядок выводов следующий:
Программирование ATTINY44A
Я запрограммировал свою плату ранее, когда я сделал это. Я задокументировал это в Задание 6. Это был простой код на основе Arduino, который мигал светодиодом и быстрее, если кнопка нажата. Я использовал программатор FAB TinyISP там. Мне помогла страница http://highlowtech.org/?p=1695.Теперь я хочу использовать Atmel Studio 7 и сделать тот же код мигания светодиода в первый. Я создал новый проект как исполняемый проект GCC.
Затем я выбрал подходящее устройство, ATtiny44A из семейства устройств ATtiny.
Затем, как важно, чтобы Avrdude и FAB TinyISP работали
плавно с Atmel Studio, я добавил команду avrdude -c usbtiny -p t44 -U flash:w:»$(SolutionName).hex» к документации проекта как к событиям сборки и к событию после сборки
командная строка.
Это запускает программирование платы после компиляции этим Avrdude
командой и через программатор FAB tinyISP. Также я нашел готовые старые
кабель от компа думаю. Я использовал его как кабель FTDI, даже если он
8×2 контакта.
Программы мерцания и кнопок
Затем я протестировал две программы. Оба были написаны на языке C, и я написал их с помощью страницы https://tinusaur.org/2014/01/06/tutorial-001-blinking-led/. Я скомпилировал код и запрограммировал свою плату командой Build в IDE Atmel Studio. Этот первый код мигает светодиодом, подключенным к ПОРТ B как контакт PB2.
Второй код мигал светодиодом быстрее, если нажималась кнопка. Кнопка была подключена к PORT A как контакт PA7. Я также получил помощь от страница http://www.elecrom.com/avr-tutorial-2-avr-input-output/.
Программа эха
hello.ftdi.44.echo.c Третья программа могла бы отправить определенный текст на компьютер, если какой-то текст написал первым. Я протестировал пример программы hello.ftdi.44.echo.c со страницы Fab Academy. Он хорошо скомпилирован, когда я добавил правильные часы определение командой #define F_CPU 20000000UL в начале.Однако текст был нечитаем, даже я изменил байтрейты на FTDI кабель USB-to-serial и терминальную программу. Я использовал TeraTerm как терминальная программа. Возможно, причина могла быть в незапрограммированных предохранителях.
Раньше у меня были проблемы с предохранителями, когда я программировал свой FAB Программатор TinyISP с программой Avrdude (версия 5. 11). Раньше я использовал одну готовую установленную Atmel Studio 7 в нашей лаборатории. компьютер (Windows 7) и программатор AtmelICE. И теперь я использовал то же самое и удалось. Ставил предохранители, но все равно привет.ftdi.44.echo.c текст был нечитаем.
Затем я закодировал программу, аналогичную программе Arduino, с помощью страницы http://archive.fabacademy.org/2016/fablabsingapore/students/98/exercise08.html.
Я добавил мигающий светодиод, чтобы быть уверенным в правильной работе. Я установил скорость передачи данных
до 9600 и использовали внутренние часы с частотой 1 МГц.
Затем я загрузил пустой скетч в Arduino и подключил свою приветственную плату.
к Arduino UNO: PA0 (TX) к контакту 1 Arduino (TX) и PA1 (RX) к
Контакт Arduino 0 (RX). Я открыл последовательный монитор Arduino, и я был
в состоянии прочитать некоторый текст, но все еще есть лишние пометки.
Это означает, что проблема с часами и скоростью передачи данных решена. Далее, я
прокомментировал эхо данных и теперь программа отправляет только запрограммированные
данные. И лишние отметки исчезли. Я изменил на 8 МГц внутренний
часы и установите их, прожег Bootloader.
И снова я смог четко прочитать текст. Это означает соединение TX
к моей плате где-то попали помехи. Затем я перешел на внешний
Тактовая частота 20 МГц. Светодиод мигает, но текст теперь не читается. Это значит
проблема с внешними часами 20 МГц. Тем не менее, я смог изменить часы
вернуться к внутренней 1 МГц.
Затем я проверил свою плату. Я очистил дорожки для контактов RX и TX и HEUREKA, также эхо стало работать нормально.
Осталась только проблема с внешними часами. Может быть, я проверяю сигналы осциллограф позже.
Пробуждение Attiny44
В качестве четвертой программы меня интересует
проверить функцию пробуждения микроконтроллера Attiny.
Я сделал несколько попыток и нашел много помощи во многих интернетах. страницы.
Последняя помощь найдена на странице http://www.avrfreaks.net/forum/pcint-attiny44.
Я отредактировал код с учетом своего предыдущего опыта и потребностей и получил
программа для Attiny44, которая мигает светодиодом 10 раз и переходит к
спать. Параметр в режиме не использовался.
Просыпается, при нажатии кнопки моргает 10 раз и
спать снова.
Я использовал режим прерывания PCINT, потому что кнопка была подключена к контакту
PA7/PCINT7. В этом режиме Attiny44 реагирует на изменение контакта.
имеет место.
В качестве спящего режима использовал SLEEP_MODE_PWR_DOWN и значит внутренний
часы и все останавливается, а прерывания только работают. Он падает
энергопотребление до минимума. В паспорте указано 0,1 мкА при 1,8 В.
Я несколько раз проверял свой код и удивлялся помехам. Даже я
не трогал, плата проснулась.
Я снова проверил свой код и нашел ошибку. Порт А необходим для
также инициализировать. Я должен прочитать лист данных снова. И я добавил два
строки моего кода, как показывает красная метка. Тогда это сработало хорошо.
Комментарии и задачи: Avrdude и предохранители
Код Нила Hello получил 2256 байт файла .hex и мой аналогичный Arduino код 6637 байт. Таким образом, он в 3 раза больше.
Мой код пробуждения получил 816 байт.
Могу ли я по-прежнему использовать Avrdude для предохранителей? Я хотел бы протестировать больше
команда:
avrdude -p t44 -P usb -c usbtiny -U lfuse:w:0x5E:m.
Код мигания светодиода: BlinkL_main.