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

Лаб_2 Головков И.Е. 12002108

.docx
Скачиваний:
1
Добавлен:
26.06.2024
Размер:
652.4 Кб
Скачать

ФЕДЕРАЛЬНОЕ Государственное АВТОНОМНОЕ образовательное УЧРЕЖДЕНИЕ ВЫСШЕГО образования

«БЕЛГОРОДСКИЙ ГОСУДАРСТВЕННЫЙ НАЦИОНАЛЬНЫЙ

ИССЛЕДОВАТЕЛЬСКИЙ УНИВЕРСИТЕТ»

(НИУ «БелГУ»)

ИНСТИТУТ ИНЖЕНЕРНЫХ И ЦИФРОВЫХ ТЕХНОЛОГИЙ

Кафедра информационных и робототехнических систем

Отчет по лабораторной работе №2 Тема работы «Изучение принципов организации обмена данными по последовательному интерфейсу USB между микроконтроллерам MSP430F1611 и ПЭВМ» по дисциплине «Микроконтроллеры и микроконтроллерные системы»

студента очного отделения

3 курса 12002108 группы

Головкова Игоря Евгеньевича

Проверил:

Шамраев А.А.

Белгород 2024

Цель работы: изучить возможности сопряжения лабораторного стенда на базе микроконтроллера MSP430F1611 и ПЭВМ с помощью последовательного интерфейса USB, принципы программного управления двунаправленным обменом данных по последовательному интерфейсу USB.

Задание Вариант 4: Разработать программу передачи 10 чисел (от 0 до 9) из микроконтроллера MSP430F1611 в ПЭВМ по интерфейсу USB в соответствие с протоколом: модуль USART0, скорость обмена данными 14400 бит/с, режим обмена асинхронный, 7 битов данных без бита четности.

Ход работы:

Рисунок 1 – Результат выполнения работы программы на микроконтроллере MSP430F1611

Листинг программы:

Файл main.c:

#include <msp430.h>

#include "stdio.h"

#include "system_define.h"

#include "system_variable.h"

#include "function_prototype.h"

#include "main.h"

/*

* main.c

*/

void main(void) {

WDTCTL = WDTPW | WDTHOLD;

Init_System_Clock();

Init_System();

UART_init(3,7,1,0,0);

int i;

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

{

UART_sendbyte(i);

}

while(1);

}

Вывод: в ходе лабораторной работы были изучены возможности сопряжения лабораторного стенда на базе микроконтроллера MSP430F1611 и ПЭВМ с помощью последовательного интерфейса USB, а также изучены принципы программного управления двунаправленным обменом данных по последовательному интерфейсу USB.

Приложение А

// инициализация системы тактирования

void Init_System_Clock()

{

volatile byte i;

BCSCTL1 &= ~XT2OFF; // включение осцилятора XT2

// MCLK = XT2, SMCLK = XT2

do // ожидание запуска кварца

{

IFG1 &= ~OFIFG; // Clear OSCFault flag

for (i = 0xFF; i > 0; i--); // Time for flag to set

}

while ((IFG1 & OFIFG)); // OSCFault flag still set?

BCSCTL2 |= SELM_2 | SELS; // установка внешнего модуля тактирования

}

// инициализация портов системы

void Init_System()

{

P1DIR |= (nSS + nWR_nRST + MCU_SEL_0 + MCU_SEL_1); // установка направления портов на вывод

DB_DIR = 0x00; // шина данных настроена на ввод

}

void UART_init(byte speed, byte databits, byte stopbits, byte parity, byte iface)

{

P3SEL |= BIT6 | BIT7; // выбор функции USART1

U1CTL = 0; // инициализация состояния USART

ME2 |= UTXE1 + URXE1; // включить приемник и передатчик USART1

if (databits == 7) U1CTL &= ~CHAR; // 7-разрядная длинна символа

if (databits == 8) U1CTL |= CHAR; // 8-разрядная длинна символа

if (stopbits == 1) U1CTL &= ~SPB; // 1 стоповый бит

if (stopbits == 2) U1CTL |= SPB; // 1 стоповых бита

if (parity == 0) U1CTL &= ~PENA; // контроль четности отключен

if (parity == 1) U1CTL = (U1CTL & ~PEV) | PENA; // контроль четности, нечетный

if (parity == 2) U1CTL |= PENA | PEV; // контроль четности, четный

P5DIR |= BIT0; // переключение мультиплексора на USB/оптику

if (iface == 0)

P5OUT |= BIT0;

if (iface == 1)

P5OUT &= ~BIT0;

U1TCTL |= SSEL1; // BRCLK = SMCLK

U1BR0 = 69; // 8Mhz / 115200 = 69.44 (по-умолчанию)

if (speed == 0) U1BR0 = 208; // 8МГц / 38400 = 208.33

if (speed == 1) U1BR0 = 139; // 8МГц / 57600 = 138,89

if (speed == 3) U1BR0 = 0x2b; // 8МГц / 14400 = 0x2b (43)

U1BR1 = 0x02;

U1MCTL = 0x55; // модуляция

}

// передача байта

void UART_sendbyte(char byte)

{

while (!(IFG2 & UTXIFG1)); // проверка готовности буфера передачи USART1

U1TXBUF = byte; // передача байта

}

/******************************************************************************/

#ifndef __SYSTEM_DEFINE_H__

#define __SYSTEM_DEFINE_H__

/******************************************************************************/

#include <msp430.h>

/******************************************************************************/

#ifndef __BYTE_H__

#define __BYTE_H__

typedef unsigned char byte; // 8-bit value

typedef unsigned int word; // 16-bit value

#endif

// output

// Дешифратор DD7 __

#define nSS BIT0 /* P1.0 => сигнал SS - сиглал выборки микросхемы */

// __

#define Set_nSS() P1OUT |= nSS /* сигнал SS = 1 */

// __

#define Reset_nSS() P1OUT &= ~nSS /* сигнал SS = 0 */

// __ ___

#define nWR_nRST BIT2 /* P1.2 => сигнал WR/RST - сигнал записи/сброса */

// __ ___

#define Set_nWR_nRST() P1OUT |= nWR_nRST /* сигнал WR/RST = 1 */

// __ ___

#define Reset_nWR_nRST() P1OUT &= ~nWR_nRST /* сигнал WR/RST = 0 */

//

#define MCU_SEL_0 BIT3 /* P1.3 => сигнал MCU_SEL_0 - младший бит адреса дешифратора */

#define Set_MCU_SEL_0() P1OUT |= MCU_SEL_0 /* сигнал MCU_SEL_0 = 1 */

#define Reset_MCU_SEL_0() P1OUT &= ~MCU_SEL_0 /* сигнал MCU_SEL_0 = 0 */

//

#define MCU_SEL_1 BIT4 /* P1.4 => сигнал MCU_SEL_1 - старший бит адреса дешифратора */

#define Set_MCU_SEL_1() P1OUT |= MCU_SEL_1 /* сигнал MCU_SEL_1 = 1 */

#define Reset_MCU_SEL_1() P1OUT &= ~MCU_SEL_1 /* сигнал MCU_SEL_1 = 0 */

// Адресные линии для модуля ETHERNET xxx7010xx

#define A0 BIT0 /* P2.0 => сигнал A0 - младший бит адреса для модуля ETHERNET */

//

#define A1 BIT1 /* P2.1 => сигнал A1 - старший бит адреса для модуля ETHERNET */

// Шина данных

// direction

#define DB_DIR P4DIR /* Порт P4 <=> двунаправленная шина данных */

// output

#define DB_OUT P4OUT /* Сигналы DB0-DB7 подключены к порту P4 */

// input

#define DB_IN P4IN

// Сигналы управления ЖКИ

// _

#define D_nC_LCD BIT4 /* P3.4 => сигнал D/C_LCD (задает режим обмена между МК и ЖКИ - 1-данные, 0-команда для LCD) */

// _

#define Set_D_nC_LCD() P3OUT |= D_nC_LCD /* сигнал D/C_LCD = 1 */

// _

#define Reset_D_nC_LCD() P3OUT &= ~D_nC_LCD /* сигнал D/C_LCD = 0 */

//

#define EN_LCD BIT5 /* P3.5 => сигнал EN_LCD (разрешение обращений к модулю LCD (а также строб данных)) */

//

#define Set_EN_LCD() P3OUT |= EN_LCD /* сигнал EN_LCD = 1 */

//

#define Reset_EN_LCD() P3OUT &= ~EN_LCD /* сигнал EN_LCD = 0 */

#endif