реклама на сайте
подробности

 
 
> LCD + ATmega8, Нет изображения на ЖКИ
Melandr
сообщение Apr 28 2011, 22:30
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 32
Регистрация: 5-04-10
Пользователь №: 56 435



Доброго дня Всем! Думаю эта тема уже конкретно проработана на форуме, но нужного мне ответа не нашел. Пытаюсь подключить ЖКИ к контроллеру. Сначала пробовал использовать готовые библиотеки. Но ничего не получилось. Везде используется другая частота тактирования процессора, и я подозреваю, что я не попадаю в нужные временные задержки дл работы с ЖКИ. Прогу писал в GCC. Также запускал в Протеусе для проверки. Прога не заводилсь. Потом нашел исходничек маленький в CodeVision. Вот он:
CODE
/*****************************************************
This program was produced by the
CodeWizardAVR V2.05.0 Professional
Automatic Program Generator
© Copyright 1998-2010 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com

Project :
Version :
Date : 28.04.2011
Author : NeVaDa
Company :
Comments:


Chip type : ATmega8
Program type : Application
AVR Core Clock frequency: 14,745600 MHz
Memory model : Small
External RAM size : 0
Data Stack size : 256
*****************************************************/

#include <mega8.h>
//Библиотека для расчета задержки по времени
#include <delay.h>
// Alphanumeric LCD Module functions
#include <alcd.h>

// Declare your global variables here

void main(void)
{
// Declare your local variables here

// Input/Output Ports initialization
// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTB=0x00;
DDRB=0x00;

// Port C initialization
// Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTC=0xFF;
DDRC=0xFF;

// Port D initialization
// Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out
// State7=0 State6=0 State5=0 State4=0 State3=0 State2=0 State1=0 State0=0
PORTD=0x00;
DDRD=0xFF;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
TCCR0=0x00;
TCNT0=0x00;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer1 Stopped
// Mode: Normal top=0xFFFF
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer2 Stopped
// Mode: Normal top=0xFF
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;

// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
MCUCR=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x00;

// USART initialization
// USART disabled
UCSRB=0x00;

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;

// ADC initialization
// ADC disabled
ADCSRA=0x00;

// SPI initialization
// SPI disabled
SPCR=0x00;

// TWI initialization
// TWI disabled
TWCR=0x00;

// Alphanumeric LCD initialization
// Connections specified in the
// Project|Configure|C Compiler|Libraries|Alphanumeric LCD menu:
// RS - PORTD Bit 2
// RD - PORTD Bit 1
// EN - PORTD Bit 3
// D4 - PORTD Bit 4
// D5 - PORTD Bit 5
// D6 - PORTD Bit 6
// D7 - PORTD Bit 7
// Characters/line: 16
delay_us(500);
lcd_init(16);

#asm("sei")
lcd_gotoxy (2,0);
lcd_putsf("HELLO,WORLD!");

while (1)
{
PORTC=0xFE;
delay_ms(1000);//задержка 1 секунда
PORTC=0xFF;
delay_ms(1000);//задержка 1 секунда
}
}

Светодиод поцепил, чтобы было видно что программа работает. В протеусе эта программа запустилась, но в железе изображения на ЖКИ нет. Регулирую контрастность на ЖКИ, все нормально, сначала темнее верхний ряд, потом нижний. Подскажите в чем может быть проблема? Заранее благодарен за ответ.
ЗЫ:Вылаживаю архив с исходником и проектом Протеус
Прикрепленный файл  LCD.rar ( 23.62 килобайт ) Кол-во скачиваний: 112

ЗЫ2:Хотелось бы написать программу в GCC, так в КодеВижене ничего не видно, что и как работает, а интересно разобраться в работе с ЖКИ. Если у кого то есть исходничек для работы с ЖКИ 44780 и ATmega8 с кварцем 14,745600 МГц, большая просьба выложить или дать нормальную ссылочку.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
roman_golovenkov
сообщение May 2 2011, 13:51
Сообщение #2


Частый гость
**

Группа: Участник
Сообщений: 80
Регистрация: 10-02-09
Пользователь №: 44 637



Попробуйте этот код, ток у меня на 16 меге. Все работает: ив Протеусе, и в железе.
CODE
#include <mega16.h>
#include <delay.h>

// Задание выводимой строки текста.
char flash *static_text = "Hello, world!";

// Задание регистров порта подключения ЖКИ-модуля.
#define LCD_PORT PORTD
#define LCD_DDR DDRD
// Задание номера бита порта для вывода сигнала Е.
#define LCD_E PORTD3
// Задание номера бита порта для вывода сигнала RS.
#define LCD_RS PORTD2

// Команда очистки экрана.
#define CLEAR_COMMAND 0b00000001

// Команда возврата курсора на начальную позицию.
#define HOME_COMMAND 0b00000010

// Команда выбора направления сдвига курсора и экрана:
// инкремент счетчика адреса,
// без сдвига изображения.
#define EMS_COMMAND 0b00000110

// Команда выбора отображения:
// изображение включено,
// курсор в виде подчерка выключен,
// курсор в виде мерцающего знакоместа выключен.
#define DISPLAY_COMMAND 0b00001100

// Команда задания сдвига курсора или экрана.
//#define SHIFT_COMMAND 0b0001xx--

// Команда инициализации и задания режима работы индикатора
// для 8-разрядного режима работы шины данных:
// 4-хразрядная шина данных.
// Здесь тетрады переставлены местами для корректной работы
// подпрограммы записи команды в ЖКИ-модуль.
#define INIT_8_COMMAND 0b00000010

// Команда инициализации и задания режима работы индикатора:
// использование двухстрочного режима отображения информации,
// матрица 5х8 точек,
// 4-хразрядная шина данных.
#define INIT_COMMAND 0b00101000

// Команда задания адреса в CGRAM.
#define CGRAM_COMMAND 0b01000000

// Команда задания адреса в DDRAM.
#define DDRAM_COMMAND 0b10000000

// Смещение первого знакоместа второй строки.
#define SECOND_ROW 0x40

// Количество одновременно отображаемых символов на ЖКИ.
#define TOTAL_CHARS 16

// Длительность программных задержек.
#define INIT_DELAY 50
#define INIT_CONTROL_DELAY 50
#define WAIT_LINE_DELAY 1
#define WRITE_DATA_DELAY 50
#define WRITE_DATA_LONG_DELAY 2000

// Переставляет тетрады в байте.
#pragma warn-
unsigned char swap(unsigned char data)
{
#asm
ld r30, Y
swap r30
#endasm
}
#pragma warn+

// Определение задержки для формирования сигналов на линиях.
#define lcd_wait_line() delay_us(WAIT_LINE_DELAY)

// Записывает данные в ЖКИ-модуль.
void _lcd_write_data(unsigned char data)
{
unsigned char lsn;

// Вывод данных на 4-хразрядную шину.

// Получение и вывод старшей тетрады.
lsn = LCD_PORT & 0x0F;
LCD_PORT = data & 0xF0 | lsn;

// Установка стробирующего сигнала Е.
LCD_PORT.LCD_E = 1;
// Задержка сигнала на линии.
lcd_wait_line();
// Снятие стробирующего сигнала Е.
LCD_PORT.LCD_E = 0;
// Задержка сигнала на линии.
lcd_wait_line();

// Получение и вывод младшей тетрады.
LCD_PORT = swap(data) & 0xF0 | lsn;

// Установка стробирующего сигнала Е.
LCD_PORT.LCD_E = 1;
// Задержка сигнала на линии.
lcd_wait_line();
// Снятие стробирующего сигнала Е.
LCD_PORT.LCD_E = 0;
// Задержка сигнала на линии.
lcd_wait_line();

// Формирование задержки для ожидания выполнения команды ЖКИ-модулем.
if (!LCD_PORT.LCD_RS && (CLEAR_COMMAND == data || HOME_COMMAND == data))
{
delay_us(WRITE_DATA_LONG_DELAY);
}
else
{
delay_us(WRITE_DATA_DELAY);
}
}

// Записывает команду в регистр IR ЖКИ-модуля.
void lcd_control(unsigned char control)
{
// Установка линии RS в низкое состояние - сигнал записи команды.
LCD_PORT.LCD_RS = 0;
// Задержка сигнала на линии.
lcd_wait_line();
_lcd_write_data(control);
}

// Записывает команду в регистр IR ЖКИ-модуля при инициализации.
void lcd_init_control(unsigned char control)
{
lcd_control(control);
// Задержка при инициализации должна быть больше.
delay_ms(INIT_CONTROL_DELAY);
}

// Записывает символ в регистр DR ЖКИ-модуля.
void lcd_putchar(unsigned char c)
{
// Установка линии RS в высокое состояние - сигнал записи данных.
LCD_PORT.LCD_RS = 1;
// Задержка сигнала на линии.
lcd_wait_line();
_lcd_write_data©;
}

// Инициализирует ЖКИ-модуль.
void lcd_init(void)
{
// Порт подключения ЖКИ-модуля работает на вывод.
LCD_DDR |= 0b11111100;

// Предварительная задержка.
delay_ms(INIT_DELAY);
// Отправка команды инициализации для 8-разрядного режима работы шины
// данных, переключение на 4-хразрядную шину.
lcd_init_control(INIT_8_COMMAND);
// Отправка команды инициализации уже для 4-хразрядного режима.
lcd_init_control(INIT_COMMAND);
// Повторная отправка команды инициализации.
lcd_init_control(INIT_COMMAND);
// Задание режима отображения.
lcd_init_control(DISPLAY_COMMAND);
// Очистка экрана.
lcd_init_control(CLEAR_COMMAND);
// Выбор направления сдвига курсора и экрана.
lcd_init_control(EMS_COMMAND);
}

// Записывает строку для отображения из памяти даных в ЖКИ-модуль.
#pragma used+
void lcd_puts(char *str)
{
char c;
#pragma warn-
while (c = *str++)
{
#pragma warn+
lcd_putchar©;
}
}
#pragma used-

// Записывает строку для отображения из памяти программ в ЖКИ-модуль.
#pragma used+
void lcd_putsf(char flash *str)
{
char c;
#pragma warn-
while (c = *str++)
{
#pragma warn+
lcd_putchar©;
}
}
#pragma used-

void main(void)
{
// Инициализация ЖКИ-модуля.
lcd_init();

// Вывод заданного текста в первой строке с первого знакоместа.
lcd_putsf(static_text);

// Переключение на четвёртое знакоместо второй строки.
lcd_control(DDRAM_COMMAND + SECOND_ROW + 3);

// Вывод заданного текста во второй строке с четвёртого знакоместа.
lcd_putsf(static_text);

for (;;)
{
}


Сообщение отредактировал roman_golovenkov - May 2 2011, 13:56
Эскизы прикрепленных изображений
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
Melandr
сообщение May 2 2011, 22:53
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 32
Регистрация: 5-04-10
Пользователь №: 56 435



Цитата(roman_golovenkov @ May 2 2011, 16:51) *
Попробуйте этот код, ток у меня на 16 меге. Все работает: ив Протеусе, и в железе.

У Вас компилятор IAR, а то я пытаюсь скомпилить в AVRStudio, а он ругается?

Цитата(Genadi Zawidowski @ May 3 2011, 00:41) *
Вот работающий проект - разберётесь. WinAWR или атмеловский тулчейн. Интересующая Вас часть (работа с проверкой готовности) находится в файле hd44780.c

Спасибо буду разбираться с Вашим исходником.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Melandr   LCD + ATmega8   Apr 28 2011, 22:30
- - bav   видел где-то здесь еще здесь   Apr 29 2011, 07:12
- - Сергей Борщ   QUOTE (Melandr @ Apr 29 2011, 01:30) ЗЫ2:...   Apr 29 2011, 10:40
|- - Melandr   Цитата(Сергей Борщ @ Apr 29 2011, 13:40) ...   Apr 29 2011, 12:48
|- - Сергей Борщ   QUOTE (Melandr @ Apr 29 2011, 15:48) Заде...   Apr 29 2011, 13:47
|- - Melandr   Цитата(Сергей Борщ @ Apr 29 2011, 16:47) ...   Apr 29 2011, 15:58
|- - defunct   Цитата(Melandr @ Apr 29 2011, 18:58) По п...   Apr 29 2011, 17:02
- - Melandr   Почитал http://electronix.ru/forum/index.php?s=...   Apr 29 2011, 18:12
|- - =GM=   Начальную установку дисплея вы делаете неправильно...   Apr 29 2011, 20:22
|- - Genadi Zawidowski   Цитата(Melandr @ Apr 29 2011, 21:12) Почи...   May 2 2011, 21:41
- - Melandr   Вопрос по поводу питания. Если у меня напряжение п...   Apr 29 2011, 23:37
- - Melandr   Как проверить флаг занятости, какая должна быть по...   May 1 2011, 12:37
- - Melandr   переписал немного программу, изменил процедуру ини...   May 1 2011, 20:38
- - Melandr   Изменил код, получается линия RW при записи байта ...   May 1 2011, 21:50
|- - Сергей Борщ   На вашей схеме Vee подключен к +питания. Так работ...   May 2 2011, 07:23
- - Melandr   Частоту кварца указал правильно. Сейчас подкоректи...   May 2 2011, 07:55
||- - roman_golovenkov   ЦитатаУ Вас компилятор IAR, а то я пытаюсь скомпил...   May 3 2011, 00:26
|- - Melandr   Цитата(roman_golovenkov @ May 2 2011, 16...   May 4 2011, 21:02
- - XVR   Вот это - Кодtemp=(lcd|(1<<RS...   May 3 2011, 10:18
|- - Сергей Борщ   QUOTE (XVR @ May 3 2011, 13:18) иначе она...   May 3 2011, 10:50
|- - XVR   Цитата(Сергей Борщ @ May 3 2011, 14:50) Т...   May 3 2011, 13:41
|- - Сергей Борщ   QUOTE (XVR @ May 3 2011, 16:41) Не маскир...   May 3 2011, 15:18
- - XVR   Да, действительно. Не заметил Все равно это не ко...   May 3 2011, 17:08
- - Melandr   Я так понимаю, что хоть программа написана не силь...   May 3 2011, 21:22
- - Melandr   Переделал код CodeVision под WinAVR. Вот код: COD...   May 7 2011, 11:21
|- - =GM=   Компилятор ожидает логическое выражение в оператор...   May 7 2011, 11:44
||- - Melandr   Цитата(=GM= @ May 7 2011, 14:44) Не знаю ...   May 7 2011, 13:46
|- - Genadi Zawidowski   Цитата(Melandr @ May 7 2011, 14:21) Перед...   May 7 2011, 17:42
|- - Melandr   Цитата(Genadi Zawidowski @ May 7 2011, 20...   May 7 2011, 20:54
- - SysRq   Из памяти программ читать удобно чем-либо из WinAV...   May 7 2011, 14:08
- - Melandr   Не могу понять где ошибка в коде, вроде изменил вс...   May 8 2011, 00:31
- - Melandr   Что-то все умерли? Все молчат, программу запустил ...   May 9 2011, 08:35
|- - Сергей Борщ   Так праздник у цивилизованных людей. QUOTE (Melan...   May 9 2011, 09:04
- - Melandr   Наконец, добил я код для WinAVR. Вылаживаю его мож...   May 9 2011, 10:17


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 19:44
Рейтинг@Mail.ru


Страница сгенерированна за 0.01502 секунд с 7
ELECTRONIX ©2004-2016