Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторки.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
1.62 Mб
Скачать

Лабораторна робота №13 Тема: Інформаційний обмін по протоколу OneWire.

Мета роботи: навчитися програмувати мікроконтролер, програмно звертатися до вбудованих модулів, отримати навички по використанню програмної бібліотеки для роботи з апаратним модулем OneWire.

Матеріальне забезпечення роботи: персональний комп’ютер, програмне забезпечення віртуального середовища Proteus ISIS, мова програмування С, відлагоджувальний комплект ICD2.

Завдання для попередньої підготовки.

  1. Вивчити відповідний теоретичний матеріал.

  2. Опрацювати контрольні запитання.

  3. Підготовити звіт.

  4. Намалювати схеми для моделювання та дослідження.

Хід роботи:

  1. В програмному симуляторі зібрати схему згідно завдання лабораторної роботи.

  2. Створити проект програмного коду в програмі mikroC.

  3. Внести заготовлений код програми до програмного середовища.

  4. Компілювати проект.

  5. Внести отриманий двійковий компільований код до програми відлагоджувальника.

  6. Запустити програму відлагоджувальник.

  7. Проаналізувати роботу програми в різних режимах.

Вихідні дані до роботи:

Бібліотека для роботи з|із| інтерфейсом OneWire| надає функції для зв'язку по однопровідній шині, наприклад, з|із| цифровим термометром DS1820|. Це протокол ведущий/ведомый (Master/Slave), що вимагає для зв'язку всього один дріт|провід|. Завдяки використовуваній ним конфігурації пристроїв (єдина підтяжка до живлення|харчування| і драйвери з|із| відкритим|відчиняти| колектором), він дозволяє пристрою|устрою| Slave| крім всього отримувати|одержувати| живлення|харчування| по тому ж дроту|проводу|.

Декілька основних характеристик протоколу:

  • тільки|лише| одне провідний пристрій|устрій| в системі

  • низька вартість

  • невисока швидкість обміну (до 16 кбод|)

  • досить велика дистанція між пристроями|устроями| (до 300 м|м-коду|)

  • невеликі пакети даних.

Кожен пристрій|устрій| OneWire| шини має унікальний 64-бітовий реєстраційний номер (8 битий - тип пристрою|устрою|, 48 битий - серійний номер і 8 битий - CRC|), тому велика кількість ведених|відомих| пристроїв|устроїв| можуть співіснувати на одній шині.

Слід відмітити|помітити|, що для роботи з|із| цифровими термометрами від Dallas|, частота тактового генератора Fosc| має бути не менше 4 Мгц.

Цей приклад|зразок| читає температуру від DS1820|, підключеного до виведення RA5|. Після|потім| скидання|скиду| PIC| отримує|одержує| температуру від датчика і виводить її на LCD|. Слід пам'ятати про правильний вибір Fosc| для цього проекту.

// Встановити TEMP_RESOLUTION| відповідно до дозволу использ|. датчика DS18x20|:

// 18S20|: 9

// 18B20|: 12 (установки за умовчанням можуть бути 9,10,11 або 12)

const| unsigned| short| TEMP_RESOLUTION| = 12;

const| int| RES_FACTOR_1|[4]= {5000, 2500, 1250, 625};

const| unsigned| int| RES_FACTOR_2|[4]= {0x0001, 0x0003, 0x0007, 0x000F|};

const| unsigned| int| RES_FACTOR_3|[4]= {0x8000, 0xC000, 0xE000, 0xF000};

unsigned| temp|;

unsigned| short| j, RES_SHIFT|;

void| Display_Temperature|(unsigned| int| temp|){

const| unsigned| short| RES_SHIFT| = TEMP_RESOLUTION| - 8;

unsigned| int| temp_whole|, temp_fraction|;

unsigned| short| i;

char| text|[8];

// Виділення дробовій частині|частці| і перетворення її в 4-розрядне десяткове ціле

// (для дисплея)

temp_fraction| = temp| & RES_FACTOR_2|[RES_SHIFT| - 1];

temp_fraction| = temp_fraction| * RES_FACTOR_1|[RES_SHIFT| - 1];

//portc| = temp_fraction|;

// Обробка цілої частини|частки| значення температури

temp_whole| = temp|;

// Температура негативна|заперечна|?

if| ((temp_whole| & 0x8000) != 0u|) i = 1; // так|та|, i = 1

else| i = 0; // немає, i = 0

PORTC| = i;

// Видалення|віддалення| дробової частини|частки|

temp_whole| >>=| RES_SHIFT|;

// Корекція знаку, якщо треба

if| (i) temp_whole| |= RES_FACTOR_3|[RES_SHIFT| - 1];

//portd| = temp_whole|;

IntToStr|(temp_whole|, text|); // Перетворення цілого в рядок

Lcd_Out|(2, 6, text|); // Виведення цілої частини|частки| на LCD|

Lcd_Chr_Cp|('.'); // Виведення крапки|точки| для відділення|відокремлення| дробової частини|частки| від цілої

IntToStr|(temp_fraction|, text|); // Перетворення дробової частини|частки| в рядок

// Додавання|добавляти| провідних нулів|нуль-індикаторів| (виводяться 4 цифри дробової частини|частки|)

if| (temp_fraction| < 1000u|) Lcd_Chr_Cp|('0'|);

if| (temp_fraction| < 100u|) Lcd_Chr_Cp|('0'|);

if| (temp_fraction| < 10u|) Lcd_Chr_Cp|('0'|);

Lcd_Out_Cp|(text|); // Виведення дробової частини|частки| на LCD|

Lcd_Chr_Cp|(223); // Виведення символу градуса

Lcd_Chr_Cp|('C'|); // Виведення букви|літери| 'C'| для температури за Цельсієм

}//~

void| main|() {

ADCON1| = 0xFF|; // Конфігурація виведення RA5| як цифрового

PORTE| = 0xFF|;

TRISE| = 0x0F|; // PORTE| - вхід

PORTB| = 0;

TRISB| = 0; // PORTB| - вихід

// Ініціалізація LCD| на PORTB| і підготовці виводу|висновку|

Lcd_Init|(&PORTB|);

Lcd_Cmd|(Lcd_CURSOR_OFF|);

Lcd_Out|(1, 1 " Temperature|: ");

do| { // головний цикл

Ow_Reset|(&PORTE,2|); // Сигнал скидання|скиду| по шині Onewire|

Ow_Write|(&PORTE,2,0xCC|); // Видача команди SKIP_ROM|

Ow_Write|(&PORTE,2,0x44|); // Видача команди CONVERT_T|

Delay_us|(120);

Ow_Reset|(&PORTE,2|);

Ow_Write|(&PORTE,2,0xCC|); // Видача команди SKIP_ROM|

Ow_Write|(&PORTE,2,0xBE|); // Видача команди READ_SCRATCHPAD|

Delay_ms|(400);

j = Ow_Read|(&PORTE,2|); // Получить LSB| температури

temp| = Ow_Read|(&PORTE,2|); // Получить MSB| температури

temp| <<=| 8; temp| += j; // Формування результату

Display_Temperature|(temp|); // Форматування і виведення результатів на LCD|

Delay_ms|(500);

} while| (1);

}//~!

Підключення пристроїв

Приклад|зразок| підключення DS1820| на RA5|