
Лабораторные МПр / Отчет по лабам
.docФедеральное агентство по образованию
Санкт-Петербургский государственный
электротехнический университет «ЛЭТИ»
Кафедра ВТ
Отчет по лабораторным работам
Микропроцессорные системы
Выполнил:
Группа:
Санкт-Петербург
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++);
}