Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Курсач цуимп филе.docx
Скачиваний:
1
Добавлен:
23.09.2019
Размер:
661.21 Кб
Скачать

Заключение

В результате проделанной работы была спроектирована система ввода-вывода аналоговой цифровой информации на базе микроконтроллера MSP430F149, которая полностью удовлетворяет условиям технического задания.

Были реализованы:

1) Реакция системы на внешнее прерывание;

2) Реакция системы на срабатывание прерываний от таймера;

3) Реакция системы на срабатывание прерываний от АЦП.

Список источников информации

1. Семейство микроконтроллеров MSP430x1xx. Руководство пользователя: Пер. с англ. – М.: «Библиотека Компела», 2004

2. MSP430x1xx Family User's Guide, Texas Instruments, 2002

3. http://emproj.com/MSP430tutorial2

4. http://www.gaw.ru/html.cgi/txt/doc/micros/msp430/arh/9.htm

5. http://www.gaw.ru/html.cgi/txt/ic/Texas_Instruments/micros/msp430/start.htm

6. http://chipenable.ru/index.php/programming-c/5-interrupts-avr-iar.html

Приложение

Код программы обработки внешних прерываний:

#include <msp430x14x.h>

#include <msp430.h>

#include <debtor.h>

//подключаем заголовочные файлы

unsigned int timerCount = 0;

unsigned int j,i,z,jzk,abc=0,jjjj=1,kzj;//вспомогательные переменные

//прерывание для кнопки

#pragma vector=PORT1_VECTOR

__interrupt void P1INT() // Обработчик прерывания

{

abc=~abc;// инвертируем сигнализатор

P1IE &= ~BIT2; // Запрет прерываний

P1OUT ^= BIT0; // P1.0 меняет своё состояние

P1OUT ^= BIT1; // P1.1 меняет своё состояние

for(;;){if(abc==1){P1DIR=0xFF; if(mod(jjjj,2)==0){P1OUT=55;}else{P1OUT=AA;}

/*проверяем остаток от деления jjjj на два (четное число или нет), в зависимости от этого включаем левую или правую сторону светодиодов, задаваемые 01010101 bin для 55 hex, 10101010 bin для AA hex*/

for(volatile unsigned int i = 30000; i != 0; i--); //Задержка

jjjj++;//увеличиваем счетчик обработчика

}}else{P1DIR=0x00;}//выключаем

P1IE |= BIT2; // разрешение прерываний

P1IFG &= ~BIT2; // запрет

}

//прерывание таймер

#pragma vector=TIMERA0_VECTOR

__interrupt void Timer_A0 (void) {

timerCount = (timerCount + 1) % 1; //регулируем

if(jzk>2)jzk=0;// только первые 3 диода

if(timerCount ==0) {

P1OUT &= ~(1 << jzk);//вырубаем предыдущий зажженый

for(double i=0; i < kzj ; i++);//Задержка изменяемая

P1OUT |= 1 << jzk;//следующий диод

}

jzk++;//увеличиваем счетчик

if(!(P3IN & 0x01)) { //проверяем, нажата ли кнока

P1DIR &= ~BIT2;

P1IE |= BIT2; // Разрешение прерываний

P1IES |= BIT2; // прерывание 1\0

P1IFG &= ~BIT2; // Очистка флага прерываний

}

}

//прерывание для ацп

#pragma vector = ADC12_VECTOR

__interrupt void ADC12_ISR (void)

{

if (!(ADC12CTL1 & 0x01)){ ADC12CTL0 |= ADC12SC; }// кручу, верчу, узнать значение хочу

j=ADC12MEM0/500; // подгонка под ацп

if(j>3){ // включаем таймер при значении больше 3

jzk=j*150;//изменяем время задержки таймера

TACCTL0 = CCIE;// Разрешаем прерывание таймера

TACTL = TASSEL_2 | MC_2;// Тактирование от SMCLK

}

}

int main( void )

{ WDTCTL = 0x5A80; // остановка сторожевого таймера

P1DIR |= 0xFF; // настроить P1 на выход - светодиоды

P3DIR =0x00; // настроить P3 на вход - кнопка

P6SEL |= 0x01; // переключение P6.0 на АЦП12 - аналоговый вход

ADC12CTL0 = 0x210; // время выборки - максимальное, включить АЦП12

ADC12CTL1 = 0x200; // источником сигнала SAMPCON является таймер выборки

ADC12IE = 0x01; // разрешить прерывания для битов ADC12IFGx

ADC12CTL0 |= 0x02; // разрешить преобразование

if (!(ADC12CTL1 & 0x01)){ ADC12CTL0 |= ADC12SC; } // запуск преобразования, если АЦП12 свободен, дальше в прерывании читаем

_BIS_SR(GIE); // глобальное разрешение прерываний

while (1)

{}//бесконечный цикл, работаем

}

18