1 лаба микроконтроллеры
.docxУфимский Государственный Технический Университет
Кафедра АСУ
Лабораторная Работа №1
По дисциплине «Микропроцессорные системы управления»
Тема: «Изучение микроконтроллера MSP430. Цифровой ввод-вывод»
Выполнили ст.гр.ИВТ402:
Харисов Д.Ф.
Сакаев Р.А
Сенников А.С.
Ахметова А.М.
Проверил:
Старцев Ю.В.
Уфа 2015
Цель работы: Изучение основных характеристик и архитектуры микроконтроллера MSP430. Изучение интерфейса отладочного модуля MSP430 LaunchPad. Изучение основных приемов программирования микроконтроллера MSP430.
Краткие теоретические сведения:
MSP430 - семейство микроконтроллеров фирмы «Texas Instruments» с низким энергопотреблением [1 - 3]. Первый контроллер с аббревиатурой MSP430 появился в 1999 году. Отличительными характеристиками микроконтроллеров семейства MSP430 являются следующие.
Архитектура со сверхнизким потреблением, позволяющая увеличить время работы при питании от батарей:
-
ток сохранения содержимого ОЗУ — не более 0.1 мкА;
-
ток потребления в режиме часов реального времени — не более 0.8 мкА;
-
ток потребления в активном режиме — 250 мкА/MIPS.
Высокоэффективная аналоговая подсистема, позволяющая выполнять точные измерения:
-
таймеры, управляемые компаратором;
-
многоканальный АЦП.
16-битное RISC ЦПУ:
-
большой регистровый файл устраняет ограничения рабочего регистра;
-
произведённое по меньшему техпроцессу ядро позволяет снизить потребление и уменьшает стоимость кристалла;
-
оптимизировано для современных языков программирования высокого уровня;
-
набор команд состоит всего из 27 инструкций; поддерживается 7 режимов адресации;
-
векторная система прерываний с расширенными возможностями.
Флэш-память с возможностью внутрисхемного программирования позволяет гибко изменять программный код (в том числе, во время эксплуатации), а также производить сохранение данных.
16-разрядный RISC-контроллер MSP430 имеет ортогональную систему команд. Ортогональность системы команд означает, что в качестве операндов в любой команде можно использовать не только регистры общего назначения, но и ячейки основного ОЗУ и константы.
MSP430 имеет фоннеймановскую архитектуру, с единым адресным пространством для команд и данных.
Задание
-
Подключить отладочный модуль MSP430 LaunchPad с установленным в DIP-гнездо микроконтроллером MSP430G2452 при помощи кабеля к разъему порта USB компьютера. Запустить среду разработки Energia. Произвести настройку связи среды разработки Energia с отладочным модулем LaunchPad.
-
Загрузить примеры программ Blink, Button, Debonce, StateChangeDetection в среде разработки Energia. Изучить программные коды и произвести прошивку микроконтроллера для всех этих программ. Проверить экспериментально правильность работы программ на отладочном модуле LaunchPad.
/*
Blink
The basic Energia example.
Turns on an LED on for one second, then off for one second, repeatedly.
Change the LED define to blink other LEDs.
Hardware Required:
* LaunchPad with an LED
This example code is in the public domain.
*/
// most launchpads have a red LED
//#define LED RED_LED
//see pins_energia.h for more LED definitions
#define LED GREEN_LED
// the setup routine runs once when you press reset:
void setup() {
// initialize the digital pin as an output.
pinMode(LED, OUTPUT);
}
// the loop routine runs over and over again forever:
void loop() {
digitalWrite(LED, HIGH); // turn the LED on (HIGH is the voltage level)
delay(5000); // wait for a second
digitalWrite(LED, LOW); // turn the LED off by making the voltage LOW
delay(5000); // wait for a second
}
// constants won't change. They're used here to
// set pin numbers:
const int buttonPin = PUSH2; // the number of the pushbutton pin
const int ledPin = GREEN_LED; // the number of the LED pin
// variables will change:
int buttonState = 0; // variable for reading the pushbutton status
void setup() {
// initialize the LED pin as an output:
pinMode(ledPin, OUTPUT);
// initialize the pushbutton pin as an input:
pinMode(buttonPin, INPUT_PULLUP);
}
void loop(){
// read the state of the pushbutton value:
buttonState = digitalRead(buttonPin);
// check if the pushbutton is pressed.
// if it is, the buttonState is HIGH:
if (buttonState == HIGH)
{
// turn LED on:
digitalWrite(ledPin, LOW);
}
else {
// turn LED off:
digitalWrite(ledPin, HIGH);
}
}
// constants won't change. They're used here to
// set pin numbers:
const int buttonPin = PUSH2; // the number of the pushbutton pin
const int ledPin = GREEN_LED; // the number of the LED pin
// Variables will change:
int ledState = HIGH; // the current state of the output pin
int buttonState; // the current reading from the input pin
int lastButtonState = LOW; // the previous reading from the input pin
// the following variables are long's because the time, measured in miliseconds,
// will quickly become a bigger number than can be stored in an int.
long lastDebounceTime = 0; // the last time the output pin was toggled
long debounceDelay = 50; // the debounce time; increase if the output flickers
void setup() {
pinMode(buttonPin, INPUT_PULLUP);
pinMode(ledPin, OUTPUT);
}
void loop() {
// read the state of the switch into a local variable:
int reading = digitalRead(buttonPin);
// check to see if you just pressed the button
// (i.e. the input went from LOW to HIGH), and you've waited
// long enough since the last press to ignore any noise:
// If the switch changed, due to noise or pressing:
if (reading != lastButtonState) {
// reset the debouncing timer
lastDebounceTime = millis();
}
if ((millis() - lastDebounceTime) > debounceDelay) {
// whatever the reading is at, it's been there for longer
// than the debounce delay, so take it as the actual current state:
buttonState = reading;
}
// set the LED using the state of the button:
digitalWrite(ledPin, buttonState);
// save the reading. Next time through the loop,
// it'll be the lastButtonState:
lastButtonState = reading;
}
// this constant won't change:
const int buttonPin = PUSH2; // the pin that the pushbutton is attached to
const int ledPin = RED_LED; // the pin that the LED is attached to
// Variables will change:
int buttonPushCounter = 0; // counter for the number of button presses
int buttonState = 0; // current state of the button
int lastButtonState = 0; // previous state of the button
void setup() {
// initialize the button pin as a input:
pinMode(buttonPin, INPUT_PULLUP);
// initialize the LED as an output:
pinMode(ledPin, OUTPUT);
// initialize serial communication:
Serial.begin(9600);
}
void loop() {
// read the pushbutton input pin:
buttonState = digitalRead(buttonPin);
// compare the buttonState to its previous state
if (buttonState != lastButtonState) {
// if the state has changed, increment the counter
if (buttonState == HIGH) {
// if the current state is HIGH then the button
// wend from off to on:
buttonPushCounter++;
Serial.println("on");
Serial.print("number of button pushes: ");
Serial.println(buttonPushCounter);
}
else {
// if the current state is LOW then the button
// wend from on to off:
Serial.println("off");
}
}
// save the current state as the last state,
//for next time through the loop
lastButtonState = buttonState;
// turns on the LED every four button pushes by
// checking the modulo of the button push counter.
// the modulo function gives you the remainder of
// the division of two numbers:
if (buttonPushCounter % 4 == 0) {
digitalWrite(ledPin, HIGH);
} else {
digitalWrite(ledPin, LOW);
}
}
3.Подключить пьезокерамический излучатель между выводами 20 (GND) и 15 (цифровой выход P1.7) микроконтроллера. Написать и отладить программу генерации последовательности звуковых сигналов (не менее трех), сопровождающихся миганием светодиодов. Произвести прошивку программы в микроконтроллер и проверить ее работу.
const int buttonPin = PUSH2; // номер вывода для кнопки
int buttonState = 0; // переменная для чтения статуса кнопки
int numberSound = 0; //номер звука
int previousButtonState=0; // прошлое значение клавиши
void setup()
{
// put your setup code here, to run once:
pinMode(15,OUTPUT); //иницаиализация 15 пина
pinMode(buttonPin, INPUT_PULLUP); //иницаиализация кнопки
pinMode(RED_LED,OUTPUT); //иницаиализация светодиода
}
void loop()
{
buttonState = digitalRead(buttonPin); // чтение статуса кнопки в переменную
if (buttonState !=previousButtonState) //если изменено состояние клавиши
{
numberSound++; //увеличение номера звука
}
tone(15,((numberSound%10)+1)*500,10); //вывод звука на 15 порт
digitalWrite(RED_LED,(millis()/(((numberSound%10)+1)*50)%2)); //управление миганием светодиода от функции millis
previousButtonState=buttonState; //присваивание последнего значения кнопки
}
4.Написать и отладить программу имитации работы счетчика нажатий кнопки.
-
коэффициент счета счетчика должен быть равен номеру рабочего места плюс 2;
const int buttonPin = PUSH2; // the number of the pushbutton pin
const int ledPin = GREEN_LED; // the number of the LED pin
int ledState = HIGH; // the current state of the output pin
int buttonState; // the current reading from the input pin
int lastButtonState = LOW; // the previous reading from the input pin
int count=0; //счетчик
void setup() {
pinMode(buttonPin, INPUT_PULLUP); //инициализация кнопки
pinMode(RED_LED, OUTPUT);//инициализация красного светодиода
pinMode(GREEN_LED, OUTPUT); //инициализация зеленого светодиода
}
void loop() {
int reading = digitalRead(buttonPin); //считываем клавишу
if (reading==LOW && lastButtonState==HIGH) //если клавиша нажата и предыдущее состояние клавиши была отпущено
{
if(count==8) //если счетчик переполнен
count=0; //сброс счетчика
else
count++; //увеличение счетчика
}
switch(count%3) // управление младшим тритом
{
case 0: //если младший трит равен 0
{
digitalWrite(GREEN_LED,LOW); //зеленый светодиод не горит
break;
}
case 1: //если младший трит равен 1
{
digitalWrite(GREEN_LED,(millis()/500%2)); //зеленый светодиод мигает
break;
}
case 2: //если младший трит равен 2
{
digitalWrite(GREEN_LED,HIGH); //зеленый светодиод горит
break;
}
}
switch(count/3) // управление старшим тритом
{
case 0: //если старший трит равен 0
{
digitalWrite(RED_LED,LOW); //красный светодиод не горит
break;
}
case 1: //если старший трит равен 1
{
digitalWrite(RED_LED,(millis()/500%2)); //красный светодиод мигает
break;
}
case 2: //если старший трит равен 2
{
digitalWrite(RED_LED,HIGH); //красный светодиод горит
break;
}
}
lastButtonState = reading; //присваивание последнего значения кнопки
}
Вывод: В ходе данной лабораторной работы изучили основные характеристики и архитектуры микроконтроллера MSP430, интерфейс отладочного модуля MSP430 LaunchPad, выполнили основные приемы программирования микроконтроллера MSP430. Создали простые программы управления цифровыми линиями порта ввода-вывода для отладочного модуля MSP430 LaunchPad с помощью среды программирования Energia.