NetNado
  Найти на сайте:

Учащимся

Учителям



«Изучение архитектуры лабораторной платы. Основы программирования микроконтроллеров и плис»



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

по курсу «Микропроцессорные системы»
Тема: «Изучение архитектуры лабораторной платы.

Основы программирования микроконтроллеров и ПЛИС»

Выполнил:

Иванов С.В.

Коваленко Н.В.

Кондратьев М.М.

Пончаков М.Ю.

студ. гр. АК5-61
Принял: Степнев В.А.

2006

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

Занятие проводится с использованием пакетов визуального моделирования цифровых устройств AVR Studio 4 и Quartus II 5.0.

В ходе занятия студенту необходимо ознакомиться с теоретическим материалом, касающимся особенностей функционирования микроконтроллеров AVR, изучить набор команд микроконтроллеров, ознакомится с возможностями пакета AVR Studio 4, собрать (разработать прошивку для ПЛИС Cyclone (EP1C3), используя пакет Quartus II 5.0) на базе лабораторной платы модель описанного ниже устройства, создать программу функционирования контроллера, выполнить ее отладку в пакете AVR Studio 4, провести тестирование устройства.

Задание: изучить принципиальную электрическую схему лабораторной платы; разработать программу для ATMega16L и проект прошивки для EP1C3 с целью получения на базе лабораторной платы устройства световой индикации, которое выполняет инкремент (на единицу) числа, отображаемого на 4-х разрядном индикаторе, с частотой воспринимаемой человеческим глазом. Начальное значение – нуль.

При этом задача микроконтроллера ­– формировать с заданной частотой (условие на частоту см. выше) числовое значение в двоичном коде и передавать его ПЛИС, прошитая логика которой, уже основываясь на полученных данных от микроконтроллера, должна управлять 4-х разрядным индикатором, входящим в состав лабораторной платы.

Отчет

Выполнение лабораторной работы начнем определения способов обеспечения временного режима работы 4-х разрядного индикатора, т.е. с ответа на вопрос: «Каким образом выполнить задержку между изменениями состояний светодиода?».

Требуемая частота ­инкремента значения, отображаемого на индикаторе, должна быть менее 24Гц (условие восприятия человеческим глазом) и более 0.5Гц (для ускорения проверки правильности функционирования устройства).

Определим, сможем ли мы вписаться в этот диапазон, формируя задержку средствами микроконтроллера. Для этого обратимся к документации:

Рабочая частота ATMega16L – 8МГц

Периферия ATMega16L имеет в своем составе два 8-разрядных таймера/счетчика и один 16-разрядный таймер/счетчик с отдельным предварительным делителем. Их программирование позволяет с заданной периодичностью осуществлять прерывание работы программы и передавать управление специальному обработчику.

В качестве базового формирователя задержки выберем, хорошо описанный в теоретических материалах, 8-ми разрядный таймер Т0.

При инициализации таймера-счетчика задаются делитель частоты общей линии синхронизации микроконтроллера и разрешается прерывание от таймера. Для этого необходимо задать значения битов CS00 (№0), CS01 (№1), CS02 (№2) регистра TCCR0, в зависимости от которых частота входного синхросигнала делится на 8, 64, 256 или 1024. Счетчик TCNT0 является восьмиразрядным, в связи с чем входная синхропоследовательность делится еще на 256. Сигналы, используемые для счета в счетчике TCNT0 при разных комбинациях значений в разрядах регистра TCCR0, указаны в таблице 1.

Таблица 1. Параметры частоты сигнала счета TCNT0 в зависимости от битов CS00, CS01, CS02 регистра TCCR0.

CS02

CS01

CS00

Делитель частоты микроконтроллера

0

0

0

нет счета

0

0

1

1

0

1

0

1/8

0

1

1

1/64

1

0

0

1/256

1

0

1

1/1024


При переполнении счетчика TCNT0 устанавливается в единицу разряд TOV0 (№1) регистра TIFR и при единичном состоянии разряда ТОIЕ0 (№1) регистра TIMSK в блок прерываний поступает запрос прерывания Т/С0 OVE, вызывающий обращение к подпрограмме-обработчику. Поэтому, для программирования таймера-счетчика необходимо разрешить прерывание от счетчика установкой бита ТОIЕ0 в регистре TIMSK.

Итого получаем, что прерывания будут генерироваться с минимальной частотой 8МГц/1024/256 ~= 30.2 Гц. Поэтому для обеспечения вхождений в определенный выше диапазон будем использовать дополнительный программный делитель частоты.
;Version 0.1 alpha mod_M

.include "m16def.inc"

.def TEMP_REG=r16

.def COUNTER=r17

.def OUT_VALUE=r18
;interrupt table

rjmp RESET

.org $0012 ;прописываем обработчик прерывания от таймера

rjmp TIMER_OVERFLOW
RESET:

ldi TEMP_REG, high(RAMEND)

out SPH, TEMP_REG

ldi TEMP_REG, low(RAMEND)

out SPL, TEMP_REG
;configure ports!!!!

ldi TEMP_REG, $FF

out DDRD, TEMP_REG

ldi TEMP_REG, $FF

out DDRB, TEMP_REG
;configure T0

ldi TEMP_REG, 0b00000101 ;частота переполнения 30,5 Гц

out TCCR0, TEMP_REG

ldi TEMP_REG, 0b00000001 ;разрешить прерывания T0

out TIMSK, TEMP_REG
sei

LOOPING:

rjmp LOOPING

TIMER_OVERFLOW:

inc COUNTER ;увеличиваем программный делитель частоты

cpi COUNTER, 30 ;если он уже равен 30-ти

breq INC_VALUE ;то переходим на увеличение и вывод нового значения

reti ;иначе выходим из прерывания

INC_VALUE:

inc OUT_VALUE ;увеличиваем выводимое значение

out PORTD, OUT_VALUE ;выводим в порт

ldi COUNTER, 0 ;обнуляем программный делитель

reti
Ниже представлен исходный текст прошивки ПЛИС на языке проектирования аппаратных средств Verilog

Модуль main ­– как следует из названия, главный модуль, получает через порт D микроконтроллера числовое значение в двоичном коде и посредством модулей Conv2To7 и MultiplexIndicators формирует управляющие сигналы для 4-х разрядного индикатора таким образом, чтобы принятое 8 битовое значение отображалось на соответственно двух разрядах (8 разрядов в двоичной системе ­– это максимум три разряда в десятичной системе, а в шестнадцатеричной системе (в ней отображаются числа на индикаторах) ­– два) индикатора. По нулевому уровню тактового сигнала отображаем значение на первом разряде 4-х разрядного индикатора, по единичному – на втором разряде. Для этого и используется модуль MultiplexIndicators, а для преобразования четырех младших и четырех старших разрядов двоичного числа, получаемого от микроконтроллера, в управляющие сигналы для первого и второго индикатора соответственно – модуль Conv2To7.

module main

(

Input_Clk,

Input_Number,

Output_SevSegmCode,

Output_IndNumber

);
input Input_Clk;

input [7:0] Input_Number;

output [6:0] Output_SevSegmCode;

output [3:0] Output_IndNumber;
reg [6:0] SevSegmCode1;

reg [6:0] SevSegmCode2;

reg [6:0] Tmp_SevSegmCode;

reg [3:0] Tmp_IndNumber;

//Div_frq ( InputClk, InternalClk );

Conv2To7 ( Input_Number[3:0], SevSegmCode1 );

Conv2To7 ( Input_Number[7:4], SevSegmCode2 );

MultiplexIndicators ( SevSegmCode1, SevSegmCode2, Input_Clk, Tmp_SevSegmCode, Tmp_IndNumber );

assign Output_SevSegmCode = Tmp_SevSegmCode;

assign Output_IndNumber = Tmp_IndNumber;
endmodule
module Conv2To7

(

BinCode,

SevSegmCode

);
input [3:0] BinCode;

output [6:0] SevSegmCode;

reg [6:0] value;

always @(BinCode)

begin

case (BinCode)

0: value = 7'b0111111;

1: value = 7'b0000110;

2: value = 7'b1011011;

3: value = 7'b1001111;

4: value = 7'b1100110;

5: value = 7'b1101101;

6: value = 7'b1111101;

7: value = 7'b0000111;

8: value = 7'b1111111;

9: value = 7'b1101111;

10: value = 7'b1110111;

11: value = 7'b1111100;

12: value = 7'b0111001;

13: value = 7'b1011110;

14: value = 7'b1111001;

15: value = 7'b1110001;

endcase

end

assign SevSegmCode = value;

endmodule
module MultiplexIndicators

(

Low_SevSegmCode,

High_SevSegmCode,

Value_Number,

Out_SevSegmCode,

Out_ActiveIndicatorCode

);
input [6:0] Low_SevSegmCode;

input [6:0] High_SevSegmCode;

input Value_Number;

output [6:0] Out_SevSegmCode;

output [3:0] Out_ActiveIndicatorCode;
reg [6:0] Tmp_SevSegmCode;

reg [3:0] Tmp_ActiveIndicatorCode;
always @(Value_Number or Low_SevSegmCode or High_SevSegmCode)

begin

case (Value_Number)

0 :

begin

Tmp_SevSegmCode = Low_SevSegmCode;

Tmp_ActiveIndicatorCode = 4'b1000;

end

1 :

begin

Tmp_SevSegmCode = High_SevSegmCode;

Tmp_ActiveIndicatorCode = 4'b0100;

end
endcase

end

assign Out_SevSegmCode = Tmp_SevSegmCode;

assign Out_ActiveIndicatorCode = Tmp_ActiveIndicatorCode;
endmodule


страница 1


скачать

Другие похожие работы:


Документы

архив: 1 стр.





Документы

архив: 1 стр.