Главная

Популярная публикация

Научная публикация

Случайная публикация

Обратная связь

ТОР 5 статей:

Методические подходы к анализу финансового состояния предприятия

Проблема периодизации русской литературы ХХ века. Краткая характеристика второй половины ХХ века

Ценовые и неценовые факторы

Характеристика шлифовальных кругов и ее маркировка

Служебные части речи. Предлог. Союз. Частицы

КАТЕГОРИИ:






Xdisp LCD(16 2 250K) PA0 PA1 PA2 PA7 PA6 PA5 PA4 nc3 nc2 nc1 nc0




 

Не закрывая VMLAB вернитесь в компилятор CVAVR. После команды #include <mega16.h> добавьте команду

#include <delay.h> // функции организации задержек

После команды lcd_putsf("Hello!"); добавьте команды:

Delay_ms(200);

lcd_clear(); // очистка экрана LCD

Delay_ms(200);

Lcd_gotoxy(5,1);

lcd_putsf("FINISH!");

 

В последнем цикле программы перед комментарием // Place your code here добавьте команду #asm("wdr") и перекомпилируйте проект.

Вернитесь в VMLAB. Сделайте глубокий рестарт и запустите Re-build all... Как теперь выводится информация на табло дисплея? Почему не загорается светофор после запуска непрерывной симуляции?

Ниже приведен пример программы, выводящей на LCD-дисплей строку со значением переменной temp = 43.2 C. К сожалению, демоверсия компилятора CVAVR не позволяет использовать в программе команду ввода/вывода sprintf.

 

#include <mega16.h>

#asm

.equ __lcd_port=0x1B;PORTA

#endasm

#include <lcd.h>

#include <stdio.h>

 

unsigned int temp=432;

char lcd_buffer[33]; // Буфер в ОЗУ для LCD-дисплея

 

void main(void){

lcd_init(16);

// Подготовка строки для LCD-дисплея в массиве ОЗУ

sprintf(lcd_buffer," temp = %u. %u C",temp/10,temp%10);

lcd_gotoxy(1,0);

lcd_puts(lcd_buffer); //Передача строки в LCD-дисплей

while (1);}

 

5. Проведите исследование работы АЦП. В папке z3 с помощью компилятора создайте файлы проекта задачи 3 на базе программы z3.c, текст которой приведен ниже (он подробно прокомментирован в разделе 4 пособия).

//файл z3.c #include <mega16.h> #include <delay.h> interrupt [ADC_INT] void adc_isr(void) { PORTB=(char)~(ADCW>>2); delay_ms(20); ADCSRA|=0x40; } void main(void) { PORTB=0xFF; DDRB=0xFF; ADCSRA=0x8E; #asm("sei") ADMUX=0; ADCSRA|=0x40; while (1); }

Затем с помощью симулятора запишите файл z3_vm.prj.

 

; файл z3_vm.prj .MICRO "ATmega16" .TOOLCHAIN "GENERIC" .TARGET "z3.hex"; эмулируемая прошивка МК .COFF "z3.cof"; файл содержит привязку ; содержимого [.hex] к коду в [__.c] .SOURCE "z3__.c"; исходник на Си, на который сориентирован файл [.cof]. ; это CodeVision добавляет '__' при компиляции .TRACE; выводить отладочную информацию в окне ; SCOPE - розовым (см. HELP эмулятора) .CLOCK 4meg; частота используемого кварца   ; Обозначения точек МК, к которым можно ;"подключить" эмулятор: RESET, AREF, PA0-PA7, PB0-PB7, PC0-PC7, PD0-PD7, ACO, TIM1OVF ; Для использования АЦП МК нужно подать опорное напряжение на вывод AREF - мы подадим 5 вольт питания МК. Но в VMLAB ; нельзя соединить два узла напрямую. Берем резистор на 1 Ом.   R1 VDD AREF 1; резистор R1 подключен к ; узлам VDD и AREF через сопротивление 1 Ом ; опорное напряжение Vref у нас 5 вольт - ; значит при подаче 5 вольт на вход АЦП ; мы получим результат: 1111111111 (АЦП 10-ти разрядный)   ; Вход0 АЦП (это вывод PA0 МК) мы подключим к ; подвижному контакту переменного резистора ; (Slider 1 в окне "Control Panel") - ; чтобы при эмуляции менять напряжение на входе АЦП.   V1 PA0 VSS SLIDER_1(0 5) ; на концах переменного резистора 0 и 5 вольт   ; Эмулятор имеет 8 светодиодов - ; подключаем их к выводам порта B   D1 VDD PB0 D2 VDD PB1 D3 VDD PB2 D4 VDD PB3 D5 VDD PB4 D6 VDD PB5 D7 VDD PB6 D8 VDD PB7   ; Эмулятор допускает прямое подключение светодиодов к ; плюсу питания и выводам МК – в действительности ; необходим токоограничительный резистор 430-910 Ом ; последовательно с каждым светодиодом!   .PLOT V(PA0); на экран осциллографа (окно "SCOPE") ; выведем напряжение на движке ; потенциометра

 

Запустив проект на симуляцию, понаблюдайте за светодиодами и осциллографом, изменяя положение движка потенциометра. Какое напряжение соответствует единице младшего разряда АЦП? Раскройте окно Peripherals и понаблюдайте за регистрами АЦП при изменении положения движка потенциометра S1. Сравните показания светодиодов и содержимое регистров ADCH и ADCL.

Просмотрите содержимое памяти программ и текст программы на ассемблере. Сколько ячеек занимает программа? По какому адресу расположен вектор прерывания по завершению процесса аналого-цифрового преобразования?

 

6. Запустите на симуляцию проект, подготовленный в папке C:\CVAVR \ z4 (задача 4). Проект реализован на МК ATmega16.

В окне SCOPE (это виртуальный осциллограф) можно увидеть изменения напряжений на ножках МК, указанных в файле проекта - vmlab.prj. Верхняя осциллограмма – это сигнал на ножке TXD (PD1) последовательного порта USART, по которой МК передает данные на COM-порт ПК через интерфейс RS232 – что передает МК мы видим в виртуальном терминале TTY панели Control Panel. Там выводится значение ШИМ (PWM) сигнала, создаваемого на ножке PD5. Сам сигнал виден в окне SCOPE – посмотрите, как он меняется в соответствии с сообщаемыми числовыми значениями. На ножке PD4 формируются импульсы той же частоты с неизменной длительностью.

В файле проекта vmlab.prj к ножке PD5 подключен простейший фильтр нижних частот (ФНЧ) из резистора и конденсатора – он преобразует ШИМ-сигнал в постоянное напряжение, которое можно увидеть в окне SCOPE (сигнал DAC).

Формат передачи данных в примере – 8N1 (это формат по умолчанию для ПК). В таком формате передача байта начинается со "старт-бита" – это лог. "0" на ножке TXD для USART МК и +5...+15 В для COM-порта ПК. Затем на ножку TXD выводятся все 8 бит передаваемого байта, начиная с нулевого. За время передачи бита приемник должен определить и запомнить этот уровень. Далее идет "стоп-бит" – это лог. "1" на ножке TXD для USART МК и -5...-15 В для COM-порта ПК. Для согласования уровней между МК и ПК включают адаптер MAX232.

Подключение внешнего файла stdio.h с помощью директивы #include <stdio.h> позволяет использовать в программе команды ввода/вывода (такие как printf и sprintf). Ниже показан пример вывода на персональный компьютер показания датчика температуры с помощью команды printf:

char sign='+'; //датчик дал положительное число
int temp=432; //число с датчика температуры

printf ("temp = %c%u. %u С",sign,temp/10,temp%10);


На терминал ПК будет выведено:

temp = +43.2 C

 

7. Протестируйте работу программы, текст которой приведен ниже. При нажатии кнопки 0 эффект «бегущая тень» на светодиодах, подключенных к линиям порта В МК ATmega16, должен сменить направление. Для выполнения работы создайте папку z5, в которую поместите файлы проекта.

 

Кнопка 0 включена между выводом PD6 и общим выводом. При подключении кнопки к ножке МК надо соответствующий вывод конфигурировать как вход с подтяжкой (записать 1 в бит PORTD.6). Между выводом и плюсом питания будет подключен внутренний резистор, фиксирующий логическую 1 на выводе при разомкнутой кнопке. Кнопки панели Control Panel имеют фиксацию состояния, выбираемого их нажатием.

 

// файл z5.c

/* При нажатии кнопки 0 световой эффект «бегущая тень» на светодиодах порта В меняет направление*/

 

#include <mega16.h>

#include <delay.h>

void main(void){

DDRB=0xFF; // Настройка порта В на вывод

PORTD=0x40; // 6 линия порта D - вход с подтяжкой

m1:

if(PIND.6){

PORTB=1;

while (PORTB!=0){

Delay_ms(10);

PORTB=PORTB<<1;};}

else {

PORTB=128;

while (PORTB!=0){

Delay_ms(10);

PORTB=PORTB>>1;};}

goto m1;}

; файл z5_vm.prj

.MICRO "ATmega16"

.TOOLCHAIN GENERIC"

.TARGET "z5.hex"

.COFF "z5.cof"

.SOURCE "z5__.c"

CLOCK 4meg

.POWER VDD = 5 VSS = 0

K0 PD6 VSS LATCHED; кнопка 0 панелиControl Panel

; Эмулятор имеет 8 светодиодов -

; подключаем их к выводам порта B

 

D1 VDD PB0

D2 VDD PB1

D3 VDD PB2

D4 VDD PB3

D5 VDD PB4

D6 VDD PB5

D7 VDD PB6

D8 VDD PB7

Модифицировать программу в соответствии со своим вариантом индивидуального задания и произвести ее отладку:

 

1. При нажатии кнопки 1 (пятая линия порта А) должна меняться частота мигания светодиодов порта С.

2. В одном положении кнопки 2 (седьмая линия порта А) должен наблюдаться эффект бегущего огонька на светодиодах порта D, в другом положении – светодиоды должны тухнуть.

3. При нажатии кнопки 3 (первая линия порта D) эффект бегущего огонька на светодиодах порта А должен измениться на эффект бегущей тени.

4. В одном положении кнопки 4 (шестая линия порта А) должен наблюдаться эффект бегущего огонька со сменой направления на светодиодах порта В, в другом положении – светодиоды должны тухнуть.

5. При нажатии кнопки 5 (первая линия порта А) эффект бегущего огонька на светодиодах порта C должен измениться на их постоянное горение.

6. При нажатии кнопки 6 (пятая линия порта А) должна меняться частота мигания светодиодов порта D (эффект реализовать за счет смены горящих тетрад порта).

7. Эффект «елочка» (последовательное заполнение огнями линий порта С и их общее погасание) при нажатии кнопки 7 (первая линия порта D) должен измениться на эффект бегущей тени.

8. Эффект «елочка» (последовательное заполнение огнями линий порта D и их общее погасание) при нажатии кнопки 8 (вторая линия порта В) должен измениться на эффект бегущего огонька.

Контрольные вопросы

· Назовите нагрузочную способность линий портов AVR.

· Какими ассемблерными вставками можно разрешать и запрещать глобально прерывания в программе для AVR на языке Си?

· Запишите результат выполнения арифметических операций: 245/37 и 245%37.

· К линиям порта В через дешифраторы подключены два цифровых семисегментных индикатора. Записать команду на языке Си, выводящую на индикаторы число (от 00 до 99), соответствующее значению переменной period.

· Дать комментарий к команде PORTA=~(per++);

· Объявите переменную mnogo, если она может принимать значения от нуля до миллиона.

· Прокомментировать результат выполнения команды ADCSRA|=0x40;

 






Не нашли, что искали? Воспользуйтесь поиском:

vikidalka.ru - 2015-2024 год. Все права принадлежат их авторам! Нарушение авторских прав | Нарушение персональных данных