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

РГРМПТ

.docx
Скачиваний:
16
Добавлен:
12.05.2015
Размер:
212.33 Кб
Скачать

Національний технічний університет України

«Київський політехнічний інститут»

Факультет електроніки

Кафедра промислової електроніки

Розрахунково-графічна робота

з курсу: «Мікропроцесорні пристрої»

Роботу виконав студент 4 курсу

групи ДС- ____

__________________________

Завдання 7

Київ 2015

1. Написати програму, що реалізує математичні операції (для AVR-мікроконтролера):

Z=((200+2)3+1)/X

Де:

Х – знаходиться в SRAM за адресою 0х45(необхідно попередньо провести ініціалізацію);

Y – знаходиться в ROM за адресою 0х240(необхідно попередньо провести ініціалізацію);

Z – виводиться на порт РВ.

Текст програми:

//ICC-AVR application builder : 20.03.2015 11:25:18 // Target : M16 // Crystal: 10.000Mhz #include <iom16v.h> #include <macros.h> #pragma abs_address:0x240 const unsigned char Y=0x09; //ініціалізація Y за заданою адресою в ROM

#pragma end_abs_address unsigned char Z;

unsigned char X; void port_init(void) { PORTA = 0x00; DDRA = 0x00; PORTB = 0x00; DDRB = 0xFF; PORTC = 0x00; //m103 output only DDRC = 0x00; PORTD = 0x00; DDRD = 0x00; } void init_devices(void) { //stop errant interrupts until set up CLI(); //disable all interrupts port_init(); TCCR2=0x08; //за адресою 0х45 в SRAM знаходиться регістр TCCR2 MCUCR = 0x00; GICR = 0x00; TIMSK = 0x00; //timer interrupt sources SEI(); //re-enable interrupts //all peripherals are now initialized } void main(void) { init_devices(); X=TCCR2; Z=(((200+2)^3)+1)/X; PORTB=Z; }

2. Розробити принципову схему контролера з AVR-мікроконтролером (самостійно обрати оптимальний тип мікроконтролера), джерелом живлення, схемою скидання, кварцевим резонатором та АЦП MAX157. З використанням мови Сі розробити драйвер МАХ157.

МАХ157 – 2-канальний 10-розрядний АЦП з SPI-інтерфейсом, для використання якого потрібно 3 лінії зв’язку з мікроконтролером; напруга живлення 2.7 – 5.25 В. Оскільки конкретне призначення пристрою не вказане, подальші вимоги до мікроконтролера гіпотетичні і наближені. Потрібно передбачити можливість виведення інформації з пристрою, наприклад, паралельно по 8 лініям з можливістю вибору приймаючого пристрою, наприклад, виведення послідовно на 3 розряди 7-сегментних індикаторів напруги і 1 індикатор каналу – разом 4 пристрої і 4 лінії керування для сигналів CS кожного пристрою. Отже, мікроконтролер повинен мати SPI-інерфейс і щонайменше 3+8+4=15 ліній введення-виведення. З урахуванням очікуваного розміру програми і її можливого доповнення обираємо мікроконтролер ATTiny40 з 18 лініями введення-виведення(3 порти з розрядністю 8, 6 і 4), 4кБ ROM i 256кБ SRAM, напругою живлення 4.5 – 5.5 В і робочою частотою 0…12МГц.

Напруга, що відповідає молодшому розряду 10-розрядного АЦП:

ULSB=UREF/210= UREF/1024 .

Таким чином, необхідне зовнішнє джерело опорної напруги з нестабільністю менше 1/1024. Оскільки межі вимірюваної напруги не задані, обираємо з допустимого для даного АЦП діапазону 0≤UREF≤UDD опорну напругу UREF=2.5 В, для забезпечення достатньої стабільності якої використовуємо прецизійне джерело опорної напруги – мікросхему ISL21009BFB825Z. Її основні параметри:

Допустима вхідна напруга 3.5 – 16.5В.

Для скидання мікроконтролера по входу = PC3 необхідно встановити фюзес RSTDISBL=1. Скидання відбудеться при імпульсі з напругою UPC3≤URST=(0.2-0.9)UCC і тривалістю t ≥ tRST=400 нс. Для забезпечення необхідної тривалості незалежно від тремтіння контактів використаємо ланцюг R1C3, параметри якого:

(Ом*Ф).

Обираємо резистор R1=56кОм, конденсатор С3=100пФ, RC=5.6*10-6(Ом*Ф). При натисканні і відпусканні S1 конденсатор С3 практично миттєво розряджається і повільно заряджається через R1 протягом часу, більшого за tRST.

SPI-інтерфейс мікроконтролера використовує виводи РС0 = , PC1=SCK iPC2=MISO, які під’єднуються відповіднодо виводів АЦП /SHDN, SCLK i DOUT. АЦП оцифровує 2 канали почергово, кожне перетворення починається по спаду сигналу /SHDN, після чого відповідно до тактових сигналів SCLK послідовно передається 2 байти інформації по каналу DOUT: перші 3 біти рівні 1, другий відповідає номеру каналу, далі 10 бітів значення напруги D9-D0 і 2 додаткові біти S1, S0. С2 має ємність 10мкФ і розташований у безпосередній близькості до вхідних виводів мікросхеми ISL21009. Блок живлення на трансформаторі TV1, діодах VD1-VD4 і конденсаторі C1 розраховується на напругу 5В; пристрій живиться від мережі 220В 50Гц.

Вимірювана напруга підключається до входів U1, U2 і вимірюється відносно загального виводу GND. Всі лінії введення-виведення, крім РС0-РС4, вільні і виведені на зовнішню шину.

Рис.1. Cхема пристрою

Текст програми:

//ICC-AVR application builder : 21.03.2015 9:42:41 // Target : Т40 // Crystal: 8.0000Mhz #include <iot40v.h> #include <macros.h> void port_init(void) { PORTA = 0x00; DDRA = 0xFF; PORTB = 0x0; DDRB = 0xF; PORTC = 0b000001;

DDRC = 0b000011; } //call this routine to initialize all peripherals void SPI_Master_init() { PRR&=~(1<<PRSPI); //SPI on SPCR=0b01010000; //SPI settings DDRC|=(1<<PC0); //SS=output DDRC|=(1<<PC1); //SCK=output DDRC&=~(1<<PC2); //MISO=input PORTC|=(1<<PC0); //SS=1 PORTC&=~(1<<PC1); //SCK=0 } void init_devices(void) { //stop errant interrupts until set up CLI(); //disable all interrupts port_init(); SPI_Master_init(); MCUCR = 0x00; GICR = 0x00; TIMSK = 0x00; //timer interrupt sources SEI(); //re-enable interrupts //all peripherals are now initialized } void DelayMcs(int t_mcs) { while(t_mcs--)//1mcs = 8x 8MHz single-clock operations {asm("nop");asm("nop");asm("nop");asm("nop"); asm("nop");asm("nop");asm("nop");asm("nop");} } unsigned char byte,channel; unsigned int voltage,Uch0,Uch1; void singleADconv() //one channel conversion { PORTB&=~(1<<PB7); //SCK=0; PORTB&=~(1<<PB4); //CS=0; DelayMcs(3); //wait >twake=2.5mcs SPDR=byte;//Start SCK pulses by writing something to SPDR //Wait for end of conversion/transmission: while (!(SPSR&(1<<SPIF))); SPI_int(); //1st byte while (!(SPSR&(1<<SPIF))); SPI_int(); //2nd byte } void SPI_int() //one byte transmitted and SCK stops { unsigned char temp; temp=SPDR; //read transmitted byte if(!byte) //if first byte transmitted { //temp=111CHID D9D8D7D6 channel=temp&0b00010000; //read CHID bit voltage=(temp&0b00001111);//=0000 0000 0000 D9D8D7D6 voltage<<6; // voltage=0000 00D9D8 D7D600 0000 byte=1; //first byte received SPDR=byte; //Start SCK for taking the next byte } else //if second byte transmitted { //temp=D5D4D3D2 D1D0S1S0 voltage=voltage|(temp>>2);//=0000 00D9D8 D7D6D5D4 D3D2D1D0 byte=0; PORTB|=(1<<PB4); //CS=1; end of conversion; if(channel) Uch1=voltage; else Uch0=voltage; } };

void ADconv() //serial two channel conversion

{

singleADconv();

singleADconv();

} void main(void) { init_devices(); //insert your functional code here... }

Мікроконтролер працює від внутрішнього каліброваного тактового генератора з частотою 8 МГц. Для запису в глобальні змінні Uch0, Uch1 значень напруги необхідно викликати функцію ADconv(). AЦП почергово перетворює напругу каналів 0 і 1, тому ця функція двічі викликає функцію перетворення і передачі напруги одного каналу singleADconv(), яка керує процесом через SPI- інтерфейс і записує отримані значення напруги у вказані змінні відповідно до отриманого біту CHID. Перетворення керується тактовим сигналом SCK з мікроконтролера, тривалість одного перетворення складає приблизно 8мкс (максимальна допустима тривалість перетворення з гарантованою точністю 140мкс), з урахуванням twake – 11мкс. Мінімальна тривалість високого рівня сигналу на вході АЦП /SHDN складає 60нс, що більш ніж вдвічі менше періоду тактового сигналу мікроконтролера, тому цей сигнал не потребує спеціальної програмної затримки. Частота сигналу SCK встановлена в 4 рази меншою за тактову частоту мікроконтролера і складає 2МГц, що задовольняє вимоги і рекомендації щодо роботи АЦП від зовнішнього тактового сигналу. Функція SPI_Master_init() встановлює всі необхідні біти керування (деякі повторно на випадок попереднього використання портів за іншим призначенням) для роботи SPI.

Висновок:

В даній роботі створено програму для ініціалізації змінних за заданими адресами заданих областей пам’яті, обробки цих змінних і виведення результату на порт; розроблено принципову схему пристрою з мікроконтролером ATTiny40 та АЦП MAX157 і драйвер АЦП для ініціалізації інтерфейсу SPI і передачі виміряних напруг в мікроконтролер, при розробці пристрою вивчені і враховані часові характеристики використаних мікроконтролера і АЦП і логіка їх роботи.

Використані мікросхеми:

Формат вихідних даних мікросхеми МАХ157

Параметри мікросхеми ISL21009BFB825Z