Просмотр этой темы:
2 анонимных пользователей
Школьник
Зарегистрирован:
07.11.2012 1:27 Из: Киев
Сообщений:
1
|
дОБРОЕ ВРЕМЯ СУТОК) ребята нужна ваша помощь..
есть програма но сделана не до конца помогите дописать , вот условие . Буду очень благодарна если поможете! Використання інтерфейсу І2С. Мета: Освоїти програмні методи реалізації інтерфейсу І2С та взаємодію контролера з інтегральним датчиком температури та годинником реального часу. Хід роботи. 1. В середовищі AVR Studio скласти та відлагодити підпрограми необхідні для програмної реалізації інтерфейсу І2С: 1.1. генератора синхроімпульсів та запису байту; 1.2. генератора синхроімпульсів та читання байту; 1.3. формування умови «старт» та «рестарт»; 1.4. формування умови прийому та передачі імпульсу підтвердження; 1.5. формування умови «стоп». 2. Скласти програму читання коду температури з цифрового датчика DS1621, апаратний адрес 0х90. Записати програму в пам'ять ЕОМ, та перевірити її роботу на лабораторному макеті. Цифровий код перетворити в 0С та відобразити на екрані, в разі потреби удосконалити програму. 3. Скласти програму котра зчитує поточну дату та час з годинника реального часу DS 1302 та відображає результат на дисплеї. Записати програму в пам'ять ЕОМ та перевірити роботу на макеті. 4. Доповнити програму п.3 можливістю корекції дати та часу; вводу нових значень дати та часу. Для наглядності роботи використати РК – дисплей, текстові пояснення та мигаючий курсор. Короткі теоретичні відомості. Мереж І2С передбачає використання пристроями ліній як на вхід так і на вихід; всі пристрої, що об’єднані в мережу І2С мають вихід відкритий колектор. Вони можуть видавати лише сигнал лог. 0 (підкороти на нульову шину), а сигнал лог. 1 формується за допомогою додаткових резисторів, котрі «підтягують» мережу до шини живлення. Сигнал лог. 1 присутній лише тоді, коли виводи всіх абоненти мережі знаходяться в стані «на вхід», а видача хоча б одним абонентом лог. 0 встановить нуль на шині. Будь трансакція по інтерфейсу І2С починається з умови «Старт»: обидві лінії мережі знаходяться в стані лог. 1, це передумова старту, пристрій Майстер переводить шину SDA з 1 в 0 при одиниці на шині SLC. При програмній реалізації І2С необхідно, як мінімум, два рази перевірити наявність лог. 1 на шині SDA (передумова старту). Всі передачі по шині виконуються 8-ми розрядними байтами, починаючи з старшого біту. Кількість байт в посилці – необмежена, однак кожен байт повинен супроводжуватись бітом підтвердження (ASC). Сигнал свідчить про успішне отримання приймачем байту та про готовність приймати наступний. Якщо приймач не готовий отримувати наступний байт даних він не видає сигналу підтвердження, це може свідчити також про несправність приймача, його відсутність, чи помилку в передачі. Посилка складається з байту адресу відомого пристрою, молодший біт вказує на операцію читання якщо він рівний 1, чи запису молодший біт 0; потім пристрій майстер передає адрес регістру в пристрої слейв з котрим буде запис/читання, далі рестарт для читання чи байт для запису в вибраний регістр. ReStart: ; Перевірка можливості старту SCL_Dwn ;перевести шину SCL в лог.0 nop SDA_Hi ; Шину SDA в 1 nop rcall wait5us ; Цикл затримкики nop SCL_Up ; Наростаючий фронт SCL->1 RS1: sbis PinB,SCL ; Стан очікування відомого пристрою? rjmp RS1 rcall wait5us ; Цикл затримки Start: SDA_Lo ; SDA = 0: умова старту rcall wait4us ; Цикл затримки Підпрограма запису байта в відомий пристрій: WriteByte: sec ; Прапорець переносу C = 1 rol dbyt ; Зсув вліво C->LSB, MSB->C rjmp bit1 ; Особлива обробка для розряду 1 WriteBit: lsl dbyt ; Якщо dbyt пустий, ... bit1: breq GetAck ; ... то передача завершена SCL_Dwn ; Спадаючий фронт SCL brcc WriteLow ; Перехід, якщо прапорець C = 0 nop ; Щоб урівняти час виконання SDA_Hi ; Встановити SDA в 1 rjmp SCL_High WriteLow: SDA_Lo ; Встановити SDA в 0 rjmp SCL_High ; Щоб зрівняти тривалість такту SCL_High: rcall wait4us ; Цикл затримки SCL_Up ; Спадаючий фронт SCL WB1:sbis PinB,SCL ; Стан очікування відомого пристрою? rjmp WB1 rcall wait5us ; Цикл затримки rjmp WriteBit Підпрограма читання біта підтвердження: GetAck: SCL_Dwn ; Спадаючий фронт SCL SDA_Hi ; SDA – високоомний стан rcall wait5us ; Цикл затримки SCL_Up ; Наростаючий фронт SCL GA1:sbis PinB,SCL ; Стан очікування відомого пристрою rjmp GA1 cbr Flg,1< sbr Flg,1< ret Підпрограма читання байту з відомого пристрою: ReadByte: ldi dbyt,1 ; Назначаємо в якості лічильника бітів RB1: SCL_Dwn ; спадаючий фронт SCL rcall wait5us SCL_Up ; Наростаючий фронт SCL RB2: sbis PinB,SCL ; Стан очікування відомого пристрою rjmp RB2 rcall wait5us clc ; Прапорець C = 0 sbic PinB,SDA ; Якщо SDA = 1 sec ;то Carry = 1 rol dbyt ; Зсуваємо прочитаний біт в байті brcc RB1 ; Перехід, якщо читання не завершено SetAck: ; Видача біту підтвердження SCL_Dwn ; Спадаючий фронт SCL sbrs Flg,Ack ;Пропускаємо наступну команду, якщо ;Ack=1 rjmp SA1 ; Перехід, якщо Ack = 0 SDA_Hi ; Встановить SDA в 1 rjmp SA2 SA1: SDA_Lo ; Встановити SDA в 0 SA2: rcall wait5us SCL_Up ; Наростаючий фронт SCL SA3: sbis PinB,SCL ; Стан очікування відомого пристрою rjmp SA3 rcall wait5us ret Видача умови завершення трансакції: Stopp: SCL_Dwn ; спадаючий фронт SCL SDA_Lo ; SDA в 0 rcall wait5us SCL_Up ; SCL в 1 rcall wait5us SDA_Hi ; Наростаючий фронт SCL rcall wait5us ret
Отправлено: 07.11.2012 1:31
|
|