Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Микропроцессоры и микроЭВМ. Учебное пособие

.pdf
Скачиваний:
0
Добавлен:
07.09.2026
Размер:
2 Мб
Скачать
☆
Исходный листинг программы:
#include <avr/interrupt.h> #include <avr/iotn2313.h> #include <inttypes.h> #include <stdio.h> #include <avr/io.h> #include <stdlib.h> #include <util/delay.h> #include <util/delay_basic.h> #include <avr/eeprom.h> #define F_CPU 8000000UL #define OutPORT PORTB // для удобства даётся название порту В #define Level 99 // задаём количество уровней яркости #define KeyPort PORTD #define KeyMode PIND3 // кнопка «Mode» на третьей ножке порта D #define KeyPlus PIND4 // кнопка «+» на четвёртой ножке порта D #define KeyMinus PIND5 // кнопка «–» на пятой ножке порта D #define BeepOut PORTD6 // динамик на шестой ножке порта D #define Tverh 30 //пауза для определения удержания кнопки #define Tavt 28 //Tverh-Tavt скорость обновления нажатия кнопки #define E __attribute__((section(".eeprom"))) // объявление секции памяти static E unsigned char Pwm_ee[8]={1,10,20,30,40,50,60,70}; // определение и ини­циализация статического вспомогательного массива для работы с памятью volatile unsigned short T=0, T1=0; // в качестве таймера volatile unsigned short Pwm_z[8], Pwm_t[8]; //заданное и временное значения ШИМ volatile unsigned short Uderg=0; // счётчик для отработки пауз сканером кнопок volatile unsigned short KeyActiv=0; // номер нажатой кнопки ISR(TIMER1_COMPA_vect) // прерывание по совпадению таймера счётчика1 {
unsigned short i, p_t=0; // локальные переменные T++; // увеличение глобального таймера
if (T>Level) { T=0;
T1++; // увеличение таймера считывания кнопок for(i=0;i<8;i++) Pwm_t[i]=Pwm_z[i]; } // инициализация ШИМ
for(i=0;i<8;i++)
{ p_t=p_t>>1; // сдвиг p_t на один бит вправо if (T<Pwm_t[i]) p_t|=0b10000000; }
OutPORT=p_t; // вывод в выходной порт (В) } // конец прерывания void beep(unsigned int t) // процедура подачи звукового сигнала {
KeyPort|=_BV(BeepOut); // установить вывод в единицу
_delay_ms(t);
KeyPort&=~_BV(BeepOut); // сбросить вывод }
91
void blink(unsigned short n) // мигания выбранным каналом
коррекции в регистр калибровки
{
unsigned short pp; pp=Pwm_z[n]; // сохранение в рр значения яркости n-го диода Pwm_z[n]=0; // выключение n-го диода _delay_ms(100); // задержка 100 мс Pwm_z[n]=Level; // установка максимальной яркости _delay_ms(100); // задержка 100 мс
Pwm_z[n]=pp; // возвращение заданной яркости } unsigned short KeyPressed(void) // сканер кнопок {
unsigned short keyskan, key; // локальные указатели режимов
keyskan=PIND&(_BV(KeyMode)|_BV(KeyPlus)|_BV(KeyMinus));
switch (keyskan) // проверка считанного байта
{
case (1<<KeyMode)|(1<<KeyPlus)|(0<<KeyMinus): // нажата кнопка "-"
if (Uderg==0) // если кнопка была отпущена, то
{ beep(20); // звуковой сигнал
key=1; // запись кода клавиши в key
}
if (Uderg==Tverh) key=11; // если кнопка удерживается
Uderg++; // увеличение текущего значения счётчика удержания
break; // выход из switch
case (1<<KeyMode)|(0<<KeyPlus)|(1<<KeyMinus): //нажата кнопка "+"
if (Uderg==0) { beep(20); key=2; }
if (Uderg==Tverh) key=12;
Uderg++;
break; // выход из switch
case (0<<KeyMode)|(1<<KeyPlus)|(1<<KeyMinus): // нажата кнопка выбора режима
if (Uderg==0) { beep(20); key=3; } if (Uderg==Tverh) key=13; Uderg++; break; // выход из switch default : Uderg=0; key=0; // действие по умолчанию } // конец switch if (Uderg>Tverh) Uderg=Tavt; return key; // возврат кода нажатой клавиши
} // конец KeyPressed int main(void) // основная программа {
unsigned short kan=0; unsigned int jj=0; // таймер длительности редактирования OSCCAL=0x62; // запись байта OutPORT=0; // инициализация порта B DDRB=0xFF; // все выводы порта B – на выход DDRD=0b01000000; // 6 вывод порта D – на выход
92
KeyPort=_BV(KeyMode)|_BV(KeyPlus)|_BV(KeyMinus); // вкл подтяги-
// восстановить таймер редактирования
вающие резисторы на кнопки
OCR1A=400; // запись в регистр совпадения TCCR1B=0b00001001; // режим очистки по совпадению, делитель=1 TIMSK=0b01000000; // разрешить прерывание по совпадению for(kan=0; kan<8; kan++) // чтение из памяти значений яркости Pwm_z[kan]=eeprom_read_byte(&Pwm_ee[kan]); sei(); // разрешить прерывания jj=0; for(;;) // бесконечный цикл { if(T1>3) // если значение счётчика считывания кнопок, то { KeyActiv=KeyPressed(); T1=0; if (jj>0) jj--; switch (KeyActiv) { case 1: case 11: // код кнопки «-» if (jj>0) { jj=700; if (Pwm_z[kan]>0) Pwm_z[kan]--; // уменьшить яркость else beep(20); } // иначе – сигнал достижения значения 0 break; // выход из switch case 2: case 12: // код кнопки «+» if (jj>0) { jj=700; if (Pwm_z[kan]<Level) Pwm_z[kan]++; // увеличить яркость else beep(20); } // иначе – сигнал достижения максимума break; // выход из switch case 3: // код кнопки «Mode» if (jj==0) kan=0; // если jj равно 0, обнулить kan else kan++; // иначе увеличить значение kan if (kan>7) kan=0; blink(kan); // мигание kan-го диода jj=700; // установка таймера редактирования jj break; // выход из switch } if (jj==1) // если значение счётчика jj равно 1
{ cli(); // запретить прерывания for(kan=0; kan<8; kan++) eeprom_write_byte (&Pwm_ee[kan], Pwm_z[kan]); // записать в память заданные значения яркостей для всех диодов
sei(); } // разрешить прерывания
} // конец if
} // конец for
} // конец main()
В результате компиляции файла, был получен файл прошивки объё­мом 1884 байт. По оценке компилятора занято 92% Flash-памяти, 6,3% памяти EEPROM.
93
ЗАКЛЮЧЕНИЕ
Проектирование устройств на микропроцессорах отличается доволь­но высокой сложностью и трудоёмкостью. Здесь залог успеха зависит от знаний проектировщика, как архитектуры микропроцессора, так и языка программирования. Ведь очень многие сложные задачи, стоящие перед микроЭВМ довольно легко решаются умелым сочетанием аппаратных средств и стандартных программных процедур. Также можно отметить значительное отличие архитектуры микропроцессоров и микроконтролле­ров различных производителей. Поэтому даже опытному разработчику микроЭВМ для решения поставленных задач на новом микропроцессоре требуется некоторое время для изучения его особенностей, несмотря на то, что программа будет создаваться на языке высокого уровня.
Тем не менее, несмотря на сложность освоения микропроцессора или микроконтроллера перед разработчиком открываются большие возмож­ности по реализации идей или поиска проектных решений с использова­нием микроЭВМ. Эффективность же обучения студента напрямую связа­на в его стремлении к решению интересующих его задач. Поэтому на на­чальном этапе рекомендуется разрабатывать простые проекты, которые используют минимальное количество деталей и в то же время являются довольно наглядными. К таким проектам, помимо приведённого выше примера, можно отнести большое количество вариантов, связанных с управлением светодиодами, индикаторами, звуковыми излучателями. Важно лишь то, чтобы цель работы имела конкретную практическую зна­чимость, например, вывод информации о температуре на индикатор.
Также необходимо заметить, что в учебном пособии не рассматри­ваются этапы тестирования и отладки, которые, по сути, и являются наи­более сложными и трудоёмкими в жизненном цикле разработки микро­ЭВМ. Здесь предполагается, что разрабатываемые проекты будут доволь­но просты, и работоспособность устройства можно наглядно и легко про­верить. Хотя, как показывает практика, даже в реализации простых при­меров встречаются множество «подводных камней». Именно благодаря таким трудностям происходит приобретение навыков тестирования и от­ладки и совершенствуется понимание процессов внутри микроЭВМ. По­этому не стоит отчаиваться, если проект сразу работает не так как хоте­лось бы, это нормальное явление. Главное испытывать интерес найти от­вет на вопрос «почему он не так работает?».
94
СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ
1. Лукинов, А.П. Проектирование мехатронных и роботехнических устройств [Электронный ресурс] : учеб. пособие / А.П. Лукинов. – СПб. : Лань, 2012. – 608 с. – Загл. с экрана. – Режим доступа: http://e.lanbook.com/
2. Пухальский, Г.И. Проектирование цифровых устройств [Элек­тронный ресурс] : учеб. пособие / Г.И. Пухальский, Т.Я. Новосельцева – СПб.: Изд-во «Лань», 2012. – 896 с. – Загл. с экрана. – Режим доступа:
http://e.lanbook.com/
3. Кириллов, В.В. Архитектура базовой ЭВМ [Электронный ресурс] :
учеб. пособие / В. В. Кириллов. – СПб. : СПбГУ ИТМО, 2010. – 144 с. – Загл. с экрана. – Режим доступа: http://window.edu.ru/window_
catalog/redir?id=72816&file=itmo515.pdf
4. Олссон, Г., Цифровые системы автоматизации и управления / Г. Олссон, Д. Пиани. – СПб. : Невский Диалект, 2001. – 557 с.
5. Шпак, Ю.А. Программирование на языке С для AVR и PIC микро-
контроллеров / Ю.А. Шпак. – Изд. 2-е, перераб. и доп. – К. : «МК-Пресс» ; СПб. : «КОРОНА-ВЕК», 2011. – 544 с.
6. Бродин, В.Б. Микроконтроллеры. Архитектура, программирова­ние, интерфейс / В.Б. Бродин, М.И. Шагурин. – М. : ЭКОМ, 1999. – 546 с.
7. Микро- и миниЭВМ : учеб. пособ. для вузов / Е.П. Балашов и др. – Л. : Энергоатомиздат. Ленингр. отд-ние, 1984. – 376 с.
8. Муромцев, Ю.Л. Микропроцессорные системы контроля : учеб. пособие / Ю.Л. Муромцев, В.Н. Чернышов, З.М. Селиванова; – Тамбов : Изд-во Тамб. гос. техн. ун-та, 2004. – 96 с.
9. Безуглов, Д.А. Цифровые устройства и микропроцессоры : учеб. пособие для вузов / Д. А. Безуглов, И. В. Калиенко. – Ростов н/Д. : Фе­никс, 2006. – 480 с.
10. Баев, Б.П. Микропроцессорные системы бытовой техники : учеб­ник для высшего проф. образования / Б.П. Баев. – 2-е изд., испр. и доп. – М. : Горячая линия – Телеком, 2005. – 480с.
11. www.atmel.ru
12. http://controllersystems.com/static/matchast.html
13. http://avr-libc.narod.ru/modules.html
95
СОДЕРЖАНИЕ
ВВЕДЕНИЕ ……………………………………………………………… 3
1. ПОНЯТИЕ МИКРОПРОЦЕССОРА И МИКРОЭВМ…………... 4
1.1. Возможности и применение микропроцессора
1.2. Состав микропроцессора…………………………………….. 6
1.3. Архитектура микропроцессора……………………………… 9
1.4. МикроЭВМ на основе микроконтроллера Atmel…………... 12
1.4.1. Особенности микросхемы Attiny2313 ………………... 16
1.4.2. Центральное ядро процессора…………………………. 16
1.4.3. АЛУ – арифметико-логическое устройство…………... 19
1.4.4. Адресные регистры…………………………………….. 20
1.4.5. Организация памяти Attiny2313………………………. 21
1.4.6. Порты ввода-вывода……………………………………. 23
1.4.7. Внешние прерывания…………………………………... 26
1.4.8. Восьмиразрядный таймер/счётчик с поддержкой режима ШИМ…………………………………………… 26
1.4.9. Описание системы команды…………………………… 36
1.4.10. Команды регистровых операций …………………….. 41
1.4.11. Команды для работы с ОЗУ…………………………... 43
1.4.12. Команды с обращением к регистрам ввода-вывода… 44
1.4.13. Команда с обращением к FlashROM…………………. 44
1.4.14. Команды операций с битами…………………………. 45
1.4.15. Команды управления ходом программы…………….. 45
1.5. Программирование памяти…………………………………... 47
2. РАЗРАБОТКА ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ МИКРОЭВМ………………………………………………………. 51
2.1. AVR Studio………………………………………….………..... 54
2.2. Общая структура программа на ассемблере………………... 57
2.3. WinAVR……………………………………………………….. 59
2.4. Структура программы на языке Cи………………………..… 64
2.5. Организация прерываний…………………………………….. 79
2.5.1. Организация прерываний на ассемблере…………….. 81
2.5.2. Организация прерываний на языке Си………………. 84
3. ПРИМЕРЫ ПРОЕКТОВ НА МИКРОКОНТРОЛЛЕРАХ AVR... 86
ЗАКЛЮЧЕНИЕ……………………………………………………….… 94
СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ………………….... 95
96
4
Учебное издание
МУРОМЦЕВ Дмитрий Юрьевич,
ЯШИН Евгений Николаевич
МИКРОПРОЦЕССОРЫ И МИКРОЭВМ
Учебное пособие
Редактор З.Г. Ч е р н о в а
Компьютерное макетирование М.А. Филатовой
Подписано в печать 27.02.2013.
Формат 60 × 84/16. 5,58 усл. печ. л. Тираж 100 экз. Заказ № 88
Издательско-полиграфический центр ФГБОУ ВПО «ТГТУ»
392000, г. Тамбов, ул. Советская, д. 106, к. 14
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]