Заключение
В результате проделанной работы была спроектирована система ввода-вывода аналоговой цифровой информации на базе микроконтроллера 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)
{}//бесконечный цикл, работаем
}