Задачи:
Познакомиться с отладочной платой для микроконтроллера ATtiny104
Научиться программировать микроконтроллер из среды разработки Microchip Studio
На простом примере посмотреть, как выглядит программа для микроконтроллера на языках assembler и C
Работа:
1. Создать проект на языке Assembler, скопировать приведённый ниже код примера, проверить его работоспособность.
2. В коде на Assembler'e изменить основной цикл так, чтобы в нём не содержалось инструкций LDI. Для этого можно использовать инструкции SBI/CBI или SBR/CBR.
3. В коде на Assembler'e изменить подпрограмму задержки так, чтобы для создания секундной задержки было достаточно использования только 2 РОН.
4. Создать проект на языке C, скопировать приведённый ниже код примера, проверить его работоспособность.
5. В коде на С настроить ножку PB1 в режим работы input pull-up. В бесконечном цикле, кроме мигания диодом, опрашивать состояние ножки. При нажатой кнопке светодиод должен всегда гореть, не мигая. Время реакции на нажатие в пределах периода мигания допустимо. Для выполнения задания потребуется использовать регистры PUEB и PINB, а также условный оператор if ().
Код на языке Assembler:
// Инициализация периферии
LDI r16, (1 << DDRA5)
OUT DDRA, R16
// Основной цикл программы
Main:
LDI r16, (1 << PORTA5)
OUT PORTA, r16
RCALL Delay
LDI r16, 0
OUT PORTA, r16
RCALL Delay
RJMP Main
// Подпрограмма задержки
.equ LowByte = 255
.equ MedByte = 255
.equ HighByte = 2
Delay:
LDI R16, LowByte
LDI R17, MedByte
LDI R18, HighByte
loop:
DEC R16
BRNE loop
DEC R17
BRNE loop
DEC R18
BRNE loop
RET
Код на языке C:
#include <avr/io.h>
#include <util/delay.h>
int main(void)
{
DDRA |= (1 << DDRA5);
while (1)
{
PORTA |= (1 << PORTA5);
_delay_ms(500);
PORTA &= ~(1 << PORTA5);
_delay_ms(500);
}
}
Вопросы к защите:
рассказать о структуре микроконтроллера с точки зрения программирования, виды памяти и их назначение
рассказать об устройстве порта ввода/вывода (рис. 4.1 пособия), режимах его работы
рассказать о назначении команд ассемблера, использованных в программе
найти место в прошивке на языке Assembler, где можно было бы использовать указанную преподавателем команду
провести вычисления вида
uint8_t a = 0b00110101;
a &= 0b11001100 | (1 << 4);
a = ?
объяснить принцип создания задержки в программе на языке Assembler
