close

Вход

Забыли?

вход по аккаунту

?

PMkS 1 otchyot

код для вставкиСкачать
МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ УКРАИНЫ
ХАРЬКОВСКИЙ НАЦИОНАЛЬНЫЙ УНИВЕРСИТЕТ РАДИОЭЛЕКТРОНИКИ
Кафедра ТАПР
Отчёт
По лабораторной работы №1
По дисциплине "ПМкС"
Выполнил Проверила
Ст. гр. АКИТ-10-3 Фирсов А.Г
2013
1 ИССЛЕДОВАНИЕ ПОРТОВ ВВОДА ВЫВОДА МИКРОКОНТРОЛЛЕРОВ AVR
1.1 Цель работы: Изучить функциональные возможности, внутреннюю структуру и систему команд микроконтроллеров AVR. Получить первичные навыки программирования микроконтроллеров AVR.
1.2 Выполнение работы:
Необходимо на входы микроконтроллера подключить три кнопки (К0,К1,К2), а на выход три светодиода(D1,D2,D3) и запрограммировать микроконтроллер так, что бы при нажатии на кнопку диода загорался, при повторном нажатии выключался.
Для того чтобы светодиод начал излучать свет, необходимо создать разность потенциалов между анодом и катодом. Катод подключен к отрицательному выводу источника питания (GND). При сравнении с предыдущей схемой становится ясно, что когда разряд сбрасывается в "0" - светодиод не будет излучать свет, а когда разряд = 1 будет.
Так как мы не можем подключить напрямую светодиоды к микроконтроллеру, мы подключаем перед каждым по резистору, что бы избежать перенапряжения на светодиодах.
Рисунок 1.1 - Схема которую необходимо реализовать
Далее мы переходим к файлу проекта, где мы настраиваем нашу схему и микроконтроллер. Сперва необходимо на входы с напряжением 0В(VSS) подключить кнопки (К0,К1,К2):
K0 VSS PC0
K1 VSS PC1
K2 VSS PC2
Затем мы сделали входы для светодиодов (W1,W2,W3), так как в проекте на выходы мы подключаем подтягивающие резисторы (R1,R2,R3) и подключаем к этим входам светодиоды с напряжением 5В(VDD):
D1 VDD W1
D2 VDD W2
D3 VDD W3
Осталось теперь подключить резисторы к выводам микроконтроллера и нашим входам (W1,W2,W3):
R1 W1 PB0 100
R2 W2 PB1 100
R3 W3 PB2 100
Так будет выглядеть наш файл проекта:
; ************************************************************
; Micro + software running
; ------------------------------------------------------------
.MICRO "ATmega8"
.TOOLCHAIN "GCC"
.GCCPATH "C:\WinAVR"
.GCCMAKE AUTO
.TARGET "my_idea2.hex"
.SOURCE "my_idea2.c"
.TRACE ; Activate micro trace
; Following lines are optional; if not included
; exactly these values are taken by default
; ------------------------------------------------------------
.POWER VDD=5 VSS=0 ; Power nodes
.CLOCK 1meg ; Micro clock
.STORE 250m ; Trace (micro+signals) storage time
; Micro nodes: RESET, AREF, PB0-PB7, PC0-PC6, PD0-PD7, ACO, TIM1OVF, ADC6, ADC7
; Define here the hardware around the micro
; ------------------------------------------------------------
K0 VSS PC0
K1 VSS PC1
K2 VSS PC2
D1 VDD W1
D2 VDD W2
D3 VDD W3
R1 W1 PB0 100
R2 W2 PB1 100
R3 W3 PB2 100
Следующим этапом будет создание кода, для этого переходим на файл кода и начинаем с того что у нас должен быть такой код:
#include <avr\io.h> #include <avr\interrupt.h> #include <avr\signal.h> #include <util\delay.h>
int main(void) {
while(1) { // Бесконечный цикл
}
}
Далее мы создаём три переменные целочисленного типа, которые будут принимать значения 0 и 1 и отвечать и показывать коду горит светодиод или нет (int i1=0;int i2=0;int i3=0;), теперь необходимо настроить ножки микроконтроллера, какая отвечает за вход, какая за выход и выключить кнопки со светодиодом.
DDRC &=~((1<<PC0)|(1<<PC1)|(1<<PC2));
PORTC |=(1<<PC0)|(1<<PC1)|(1<<PC2);
DDRB |=(1<<PB0)|(1<<PB1)|(1<<PB2);
PORTB |=(1<<PB0)|(1<<PB1)|(1<<PB2);
DDRx - регистр направления передачи данных. Этот регистр определяет, является тот или иной вывод порта входом или выходом. Если некоторый разряд регистра DDRx содержит логическую единицу, то соответствующий вывод порта сконфигурирован как выход, в противном случае - как вход. Буква x в данном случае должна обозначать имя порта, с которым вы работаете. Таким образом, для порта A это будет регистр DDRA, для порта B - регистр DDRB и т. д.
В данном случае что бы настроить порты микроконтроллера PC0,PC1,PC2 на вход нам необходима запись.
DDRC &=~((1<<PC0)|(1<<PC1)|(1<<PC2));
Для того что б порт был входом нам необходимо в биты записать 0, при данной записи еденица перемещается на две позиции и мы получаем такую побитовую маску 00000111, но у нас стоит "~" с помощью которой происходит инвертирование, тем самым мы получаем 11111000 далее происходит операция логического умножение.
Выходы настраиваем аналогично но уже без инверсии и с помощью логического сложения что бы настроить нужный порт на 1.
DDRB |=(1<<PB0)|(1<<PB1)|(1<<PB2);
В данном случае мы получим 00000111.
Теперь настроем значение, которое будет храниться в регистре порта, за это отвечает команда PORTx, они изначально должны быть равны единице(кнопки и светодиоды выключены).
PORTC |=(1<<PC0)|(1<<PC1)|(1<<PC2);
PORTB |=(1<<PB0)|(1<<PB1)|(1<<PB2);
После выполнения изначальных данных мы переходим в цикл где будем отслеживать нажатие кнопок, нам понадобиться конструкция такого вида для каждой кнопки:
if(((PINC&(1<<PC0))==0)&&(i1==0)){PORTB &=~(1<<PB0); }else
{
if((PINB&(1<<PB0))==0){i1=1;}
}
if (((PINC&(1<<PC0))==0)&&(i1==1)){PORTB |=(1<<PB0); }else
{
if((PINB&(1<<PB0))!=0){i1=0;}
}
PINx - позволяет считывать входные данные порта на внутреннюю шину микроконтроллера. В данном случае при условии PINC&(1<<PC0))==0, мы проверяем есть ли напряжение на порту PC0(нажата ли кнопка), если условие выполняется мы записываем 0 в порт с соответствующим светодиодом, когда светодиод горит мы присваиваем целочисленной переменной 1 и при повторном действии будет срабатывать уже следующий if где светодиод мы отключаем и присваиваем целочисленной переменной 0.
Файл кода:
#include <avr\io.h> // Most basic include files
#include <avr\interrupt.h> // Add the necessary ones
#include <avr\signal.h> // here
#include <util\delay.h>
int main(void) {
int i1=0;
int i2=0;
int i3=0;
DDRC &=~((1<<PC0)|(1<<PC1)|(1<<PC2));
PORTC |=(1<<PC0)|(1<<PC1)|(1<<PC2);
DDRB |=(1<<PB0)|(1<<PB1)|(1<<PB2);
PORTB |=(1<<PB0)|(1<<PB1)|(1<<PB2);
while(1) { // Infinite loop; define here the
if(((PINC&(1<<PC0))==0)&&(i1==0)){PORTB &=~(1<<PB0); }else
{
if((PINB&(1<<PB0))==0){i1=1;}
}
if (((PINC&(1<<PC0))==0)&&(i1==1)){PORTB |=(1<<PB0); }else
{
if((PINB&(1<<PB0))!=0){i1=0;}
}
//--------------------------------
if(((PINC&(1<<PC1))==0)&&(i2==0)){PORTB &=~(1<<PB1); }else
{
if((PINB&(1<<PB1))==0){i2=1;}
}
if(((PINC&(1<<PC2))==0)&&(i3==0)){PORTB &=~(1<<PB2); }else
{
if((PINB&(1<<PB2))==0){i3=1;}
}
if (((PINC&(1<<PC1))==0)&&(i2==1)){PORTB |=(1<<PB1); }else
{
if((PINB&(1<<PB1))!=0){i2=0;}
}
if (((PINC&(1<<PC2))==0)&&(i3==1)){PORTB |=(1<<PB2); }else
{
if((PINB&(1<<PB2))!=0){i3=0;}
}
_delay_ms(10);
}
}
Выводы
__________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Документ
Категория
Рефераты
Просмотров
33
Размер файла
56 Кб
Теги
otchyot, pmks
1/--страниц
Пожаловаться на содержимое документа