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

Лабораторные МПр / Отчет по лабам

.doc
Скачиваний:
16
Добавлен:
05.09.2014
Размер:
43.52 Кб
Скачать

Федеральное агентство по образованию

Прямая соединительная линия 24

Санкт-Петербургский государственный

электротехнический университет «ЛЭТИ»

Прямая соединительная линия 23

Кафедра ВТ

Отчет по лабораторным работам

Микропроцессорные системы

Выполнил:

Группа:

Санкт-Петербург

2014

Лабораторная работа № 1

Добавление движения «бегущий огонь» в обратную сторону и изменение очередности включения светодиодов платы по нажатию джойстика. Возврат в исходное положение по нажатию джойстика.

Ниже приведен листинг программы, выполняющей указанные действия.

#include "LPC17xx.h"

#include "leds.h"

void sleep(int);

int mode = 0;

//------------

int main(void) {

int led = 0; //current led

int dv = 1;

int y=0;

int step = 0;

int last = led;

SystemInit();

LED_init();

while(1) {

LED_Out(0); //all leds off

LED_On(led); //one led on

switch(mode) {

// бегаем в обе стороны

case 0:

if ((dv > 0 && led + dv >= LED_NUM) || (dv < 0 && led == 0))

dv = -dv;

led += dv;

break;

// нажатие джойстика вниз

// мигаем через один светодиод

case 1:

if (step == 0) {

last = led;

led = 0;

} else {

for (y=0; y<8;)

{

LED_On(y);

y=y+2;

}

}

step = 1 - step;

break;

}

sleep(500000);

}

}

void sleep (int ticks) {

int i;

for(i=0; i<ticks; i++) {

if ((LPC_GPIO1->FIOPIN >> 20 & 1) == 0)

mode = 1 - mode;

else if ((LPC_GPIO1->FIOPIN >> 24 & 1) == 0)

mode = 0;

else if ((LPC_GPIO1->FIOPIN >> 25 & 1) == 0)

mode = 1;

}

}

Лабораторная работа № 2

Изучение работы прерываний на МК LCP1768. Изменение очередности включения светодиодов «бегущий огонь» и изменение направления движения по кнопки INT0.

Ниже приведен листинг программы, выполняющей указанные действия.

#include "timer.h"

#include "LPC17xx.h"

#include "leds.h"

int time=0;

char* s;

extern flag, led;

void timer0_init(void) //настройка таймера

{

LPC_TIM0->MCR=0x03;

LPC_TIM0->MR0=7000000;

NVIC_EnableIRQ((IRQn_Type) TIMER0_IRQn);

LPC_TIM0->TCR=1;

}

void TIMER0_IRQHandler (void)

{

LPC_TIM0->IR=1;

if (flag)

{ //движение светодиодов "вперед"

LED_Out(0);

LED_On(led);

//led++;

led = led +2;

if(led >= LED_NUM)

led = 0;

}

else //движение светодиодов "назад"

{

LED_Out(0);

LED_On(led);

if(led == 0)

led = LED_NUM;

led--;

}

}

Лабораторная работа № 3

Изучение сторожевого таймера на МК LCP1768. Изменение продолжительности «бегущего огня» на светодиодах платы до срабатывания сторожевого таймера.

Ниже приведен листинг программы, выполняющей указанные действия.

#include "LPC17xx.h"

#include "leds.h"

void sleep(int);

int spec_mult(int, int);

int main(void) {

int led = 0;

int n;

LPC_WDT -> WDMOD = 0x3;

LPC_WDT -> WDTC = 0xFFFFF;

SystemInit();

LED_init();

LPC_WDT -> WDFEED = 0xAA;

LPC_WDT -> WDFEED = 0x55;

while(1) {

LED_Out(0); //all leds off

LED_On(led); //one led on

led++;

if(led >= LED_NUM)

led = 0;

sleep(2000000); //delay: 1 sec

}

}

void sleep (int ticks) {

int i;

for(i=0; i<ticks; i++);

}

int spec_mult(int _from, int _to) {

int i;

int n = 1;

for(i=_from; i<_to; i++) {

n *= i;

}

return n;

}

Лабораторная работа № 4

Программирование двойного перепада на выходах PWM 1.3 и 1.5. Изменение интервалов включения LED индикаторов и их активности.

Ниже приведен листинг программы, выполняющей указанные действия.

#include <lpc17xx.h>

int main (void)

{

LPC_SC->PCONP |= 1<<6;

LPC_SC->PCLKSEL0 |= 00<<12;

LPC_PINCON->PINSEL4 |= 0x01<<4 //Connect PWM1.3 to pin 2.2

| 0x01<<8; //Connect PWM1.5 to pin 2.4

LPC_PWM1->PCR |= 0x01<<11 //Enable PWM 3 output

| 0x01<<13; //Enable PWM 5 output

LPC_PWM1->PCR |= 0x01<<3 // упр. двойным перепадом для PWM3

| 0x01<<5; // упр. двойным перепадом для PWM5

LPC_PWM1->MCR = 0x00000002; //сброс при совпадении для канала 0

LPC_PWM1->PR = 0x00000000; //Load prescaler

LPC_PWM1->MR0 = 6000000/4; //set cycle rate to one second //регистры совпаденя

LPC_PWM1->MR1 = 6000000/8; //set duty cycle to 50%

LPC_PWM1->MR2 = 3000000/8; //set duty cycle to 50%

LPC_PWM1->MR3 = 6000000/8; //set duty cycle to 50%

LPC_PWM1->MR4 = 1000000/8; //set duty cycle to 50%

LPC_PWM1->MR5 = 3000000/8; //set duty cycle to 50%

LPC_PWM1->MR6 = 6000000/8; //set duty cycle to 50%

LPC_PWM1->LER = 0x00000079; //enable shadow latch for match 0,3-6

LPC_PWM1->TCR = 0x00000002; //Reset counter and prescaler

LPC_PWM1->TCR = 0x00000009; //enable PWM - 01<<8(режим таймера), release counter

while(1)

{ }

}

Лабораторная работа № 5

Управление каналами 3 и 5 по двойному перепаду. Нажатие кнопки прерывания INT0 принудительно останавливаем выполнение программы МК.

Ниже приведен листинг программы, выполняющей указанные действия.

#include "LPC17xx.h"

#include "leds.h"

#include "timer.h"

#include "GLCD.h"

#include "adc.h"

#define EINT0 0x00000001

#define EINT0_EDGE 0x00000001

void sleep(int);

int led = 0;

char flag=1; // флаг прерывания

unsigned long int EINTInit( void ) //инициализация прерывания

{

LPC_PINCON->PINSEL4=0x00100000;

LPC_GPIOINT->IO2IntEnR= 0x00000400;

LPC_SC->EXTMODE = EINT0_EDGE;

LPC_SC->EXTPOLAR = 0;

NVIC_EnableIRQ(EINT0_IRQn);

return(1);

}

int main(void) {

SystemInit();

LED_init();

timer0_init();

GLCD_Init ();

adc_init ();

EINTInit(); //инициализация внешних прерываний

//настр. таймера

LPC_TIM0->MCR=0x03;

LPC_TIM0->MR0=7000000;

NVIC_EnableIRQ((IRQn_Type) TIMER0_IRQn);

LPC_TIM0->TCR=1;

//при нажатии кнопки прерывания INT0 происходит

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

LPC_TIM0->IR=1;

if (flag)

{

while(1) {

LED_Out(0);

LED_On(led);

led++;

if(led >= LED_NUM)

led = 0;

sleep(25000000);

LPC_ADC->ADCR |=(1<<24);

sleep(250000);

}

}

}

void sleep (int ticks)

{

int i;

for(i=0; i<ticks; i++);

}