Спроба інтерфейс Atmega8 на РК-2 за допомогою дроту

M

Mindaugasu

Guest
Я намагаюся інтерфейс AVR за допомогою двох проводів шляхом перенесення даних в регістр зсуву 74HC164.Але я нахиляє отримати код для правильної роботи:
Код:# Включити <inttypes.h>

# Включити <avr/io.h>

# Включити <avr/interrupt.h>

# Включити <avr/signal.h>

# Включити <avr/delay.h>

# Включити <avr/iom8.h>

# Визначити частоту 8000000

# Визначити datapin 0 / / визначити datapin з atmega8 на 74HC164

# Визначити clockpin 1 / / визначити години Сцепляющій з atmega8 по 74HC164

# Визначити регістра R16

/ *

LCD штирями підключений до 74hc164:

Q0 -> LCD_D4

Q1 -> LCD_D5

Q2 -> LCD_D6

Q3 -> LCD_D7

Q4 -> NC

Q5 -> NC

Q6 -> LCD_RS

Q7 -> LCD_E* /atmega8init недійсним (недійсними)

(

DDRC = (1 <<DDC0) | (1 <<DDC1);

)

недійсним sendByteToLCD (uint8_t LCDdata)

(

uint8_t I;PORTC І = ~ (1 <<0); / / встановлює datapin для виводу низького

для (i = 0; I <= 8; I ) / / явний зсув 74HC164 зареєструватися

(

PORTC | = (1 <<1); / / встановлює clockpin для виведення на ВисокомуPORTC І = ~ (1 <<1); / / встановлює clockpin для виводу низького)

для (i = 0; I <= 7; I ) / / запису 8bit LCDdata до 74HC164 зареєструватися

(

якщо (LCDdata І І 0x01)

(PORTC | = (1 <<0); / / встановлює datapin для виведення на ВисокомуPORTC | = (1 <<1); / / встановлює clockpin для виведення на Високому_delay_us (100);

PORTC І = ~ (1 <<1); / / встановлює clockpin для виводу низькогоPORTC І = ~ (1 <<0); / / встановлює datapin для виводу низького)

ще

(

PORTC І = ~ (1 <<0); / / встановлює datapin для виводу низькогоPORTC | = (1 <<1); / / встановлює clockpin для виведення на Високому_delay_us (100);

PORTC І = ~ (1 <<1); / / встановлює clockpin для виводу низького)

LCDdata = LCDdata>> 1;

якщо (I == 7)

(

PORTC І = ~ (1 <<1);

PORTC | = (1 <<0);

PORTC | = (1 <<0);

)))

недійсним sendChar (uint8_t topack) / / форма дані готові до відправки на 74HC164

(

uint8_t упакований;

/ * Перші 4 біти байт містить ЖК-D4-D7 біт

4 та 5 бітів не використовується

Біт 6 призначена для РК-RS

розрядних 7 призначена для ЖК-E

* /

упаковані = (topack І 0xF0) | 0x03;

sendByteToLCD(packed);
_delay_us (100);

упаковані = (topack <<4) | 0x03;

sendByteToLCD (упакований);

_delay_us (100);

)

недійсним sendCommand (uint8_t topack) / / форма дані готові до відправки на 74HC164

(

uint8_t упакований;

/ * Перші 4 біти байт містить ЖК-D4-D7 біт

4 та 5 бітів не використовується

Біт 6 призначена для РК-RS

розрядних 7 призначена для ЖК-E

* /

упаковані = (topack І 0xF0) | 0x01;

sendByteToLCD (упакований);

_delay_us (100);

упаковані = (topack <<4) | 0x01;

sendByteToLCD (упакований);

_delay_us (100);

)

LCDinit недійсним (недійсними)

(

_delay_ms (30); / / чекати poverup

sendByteToLCD (0x31); / / 1

_delay_ms (10);

sendByteToLCD (0x31); / / 2

_delay_ms (10);

sendByteToLCD (0x31); / / 3

_delay_ms (20);

sendByteToLCD(0x21);//sends 00100001 to enable 4 bit mode
_delay_ms (15);

sendByteToLCD (0x21);

_delay_ms (5);

sendByteToLCD (0x01);

_delay_ms (5);

sendByteToLCD (0x11); / / чіткий дисплей

_delay_ms (5);

sendByteToLCD (0x01);

_delay_ms (5);)INT основних (вакууму)

(

atmega8init ();

LCDinit ();

sendChar (0x49);/ * Цикл назавжди, переривання роблять інші * /
для (;;) / * Примітка [6] * /повернути (0);

)

 
Я буду здивований, якщо ви отримали тільки один символ.
Ви AND'ed даних і останній LSB біт даних, але забувати про те, що при натисканні дані для наступного циклу, крім LSB біт буде також йти через цей бітних в результаті mutiple E проблисковими для одного байта.
Це трохи складніше BT зробити 2-х рядковий РК-контролируемом - або ви повинні використовувати автобус expanders хотів I2C або вставити часу для виявлення замикання байт кінця і відстоювати E лінії или что-то еще.

 
74HC595 використовувати для зміни регістру IC
тому що, якщо перехід на нові дані, регістр зсуву, previusly виробництва вартістю Dont змінилася.
після зміни ви використовуєте 3 Сцепляющій контролю (використання 3 провода insted 2 дроту), щоб завантажити регістр зсуву значення для виведення засувки.

 
Я думав про 3 дроту.Може бути, це краще, а дурнем з 2 проводи.Спасибо за ответ.

 
Привіт,
Так, ви можете зробити це з 2 дроти, але він є більш складним.Ви повинні перейти з нулів між nibbles тримати E лінії перемикання.Три дроти, або Davood
про те, буде легше.
Привіт,
Роберт

 
Ви розглянули Серійний LCD, або одного з невеликим Pic або аналогічний,
є багато коду.Може бути, ви не мати запасний послідовний порт, athough ви, можливо, налаштувати будь-який порт для цього.Може бути, не практичним для вас, але тільки одна думка.

 
BeeBop писав:

Привіт,

Так, ви можете зробити це з 2 дроти, але він є більш складним.
Ви повинні перейти з нулів між nibbles тримати E лінії перемикання.
Три дроти, або Davood про те, буде легше.

Привіт,

Роберт
 
Привіт ще раз,
Я роблю те ж саме, але з ПОС і 74HC174.Що вражає мене, що мій код ініціалізації дуже різні.Я відправки nibbles.Тут:
Код:

LCDInit недійсним (недійсними) (/ / Ініціалізація РК I / O PinsRTC Dlay = 20;

а (Dlay! = RTC);LCDNybble (0x003, 0); / / відправити команду ініціалізації

Dlay РТК = 6; / / почекати> 5 мс для

а (Dlay! = RTC); / / LCD прийняти CMDLCDNybble (0x003, 0); / / відправити команду ініціалізації

Dlay РТК = 1; / / почекати> 160 USEC для

а (Dlay! = RTC); / / LCD прийняти CMDLCDNybble (0x003, 0); / / відправити команду ініціалізації

Dlay РТК = 1; / / почекати> 160 USEC для

а (Dlay! = RTC); / / LCD прийняти CMDLCDNybble (0x002, 0); / / відправити команду ініціалізації 0000 0010

Dlay РТК = 6; / / почекати> 5 мс для

а (Dlay! = RTC); / / LCD прийняти CMDLCDByte (0x028, 0) / / крок 6, встановити операційну 0010 1000LCDByte (0x008, 0) / / крок 7, дисплей від 0000 1000LCDByte (0x001, 0) / / крок 8, чіткий дисплей 0000 0001LCDByte (0x006, 0) / / крок 9, зміна 0000 0110LCDByte (0x00E, 0) / / 10 кроку, дисплей на 0000 1110) / / Кінець LCDInit
 
Нарешті я отримав його.Знайдені деякі помилки в моєму коді.Крім того, я спрощеною схемою мого використовуючи діоди і резистори як і елемент.
Опис тут: http://www.scienceprog.com/interfacing-lcd-to-atmega-using-two-wires/
Також додаються схеми та код на цьому посту.
Вибачте, але вам необхідно увійти в акаунт це вкладення

 
Ви також можете перевірити мою звичайним використанням 3 провода:
http://www.scienceprog.com/connect-lcd-to-atmega-using-3-wires/

 
є тільки один немає - час Тас адреса установки (час від РС і RW лінії створення підняти Е) повинно бути не менше 40 nanosec по HDxxx LCD Datasheet і 0 у вашій реалізації.

Але це працює, і Є мої вітання).

 

Welcome to EDABoard.com

Sponsor

Back
Top