Страница 1 из 1

Atmega8 + lcd

Добавлено: Вт мар 20, 2012 12:35:59
WOLF
Решил попробовать разобраться как сей девайс работает источник тут
код

Код: Выделить всё

/****Тестовая программа для LCD****/
 
#include <io.h>
#include <delay.h>   //используем стандартную процедуру задержки
 
#define RS PC0          //RS подключаем к PC0 микроконтроллера
#define EN PC2          //EN подключаем к PC2 микроконтроллера
 
/***Функция записи команды в LCD***/
 
void lcd_com(unsigned char p) //'p' байт команды
{
PORTC &= ~(1<<RS);   // RS = 0
PORTC |= (1<<EN);    // EN = 1 (начало записи команды в LCD)
PORTD = p;             // вывод команды на шину DB0-7 LCD
delay_us(100);        // длительность сигнала EN
PORTC &= ~(1 << EN);   // EN = 0 (конец записи команды в LCD)
delay_us(100);        // пауза для выполнения команды
}
 
/***Функция записи данных в LCD***/
 
void lcd_dat(unsigned char p)  //'p' байт команды
{
PORTC |= (1 << RS)|(1 << EN);  //RS = 1, EN = 1 (начало записи команды в LCD)
PORTD = p;                     //вывод команды на шину DB0-7 LCD
delay_us(100);                // длительность сигнала EN
PORTC &= ~(1 << EN);           // EN = 0 (конец записи команды в LCD)
delay_us(100);                // пауза для выполнения команды
}
 
/***Функция инициализации LCD***/
 
void lcd_init(void)
{
lcd_com(0x08);          // полное выключение дисплея
lcd_com(0x38);           // 8 бит 2 строки
delay_us(100);
lcd_com(0x38);           // 8 бит 2 строки
delay_us(100);
lcd_com(0x38);           // 8 бит 2 строки
lcd_com(0x38);
lcd_com(0x01);           // очистка дисплея
delay_us(100);
lcd_com(0x06);           // сдвиг курсора вправо
lcd_com(0x0D);           // включение дисплея, мигающий курсор
}
 
/***Основная программа***/
 
int main (void)
{
DDRC |= (1 << PC2)|(1 << PC1)|(1 << PC0); // PC0-3 выходы
PORTC = 0x00;                      // лог. 0 на выходе
DDRD = 0xff;                       // PD0-7 выходы
PORTB = 0x00;
 
lcd_init();      // инициализация дисплея
lcd_dat('H');    // выводим символы на экран
lcd_dat('e');
lcd_dat('l');
lcd_dat('l');
lcd_dat('o');
lcd_dat(' ');
lcd_dat('w');
lcd_dat('o');
lcd_dat('r');
lcd_dat('l');
lcd_dat('d');
lcd_dat('!');
}

при компиляции в CodeVisionAvr ругается
Error: C:\Users\dog\Desktop\test\test_cld.c(13): undefined symbol 'PORTC'
Error: C:\Users\dog\Desktop\test\test_cld.c(14): undefined symbol 'PORTC'
Error: C:\Users\dog\Desktop\test\test_cld.c(15): undefined symbol 'PORTD'
Error: C:\Users\dog\Desktop\test\test_cld.c(17): undefined symbol 'PORTC'
Error: C:\Users\dog\Desktop\test\test_cld.c(25): undefined symbol 'PORTC'
Error: C:\Users\dog\Desktop\test\test_cld.c(26): undefined symbol 'PORTD'
Error: C:\Users\dog\Desktop\test\test_cld.c(28): undefined symbol 'PORTC'
Error: C:\Users\dog\Desktop\test\test_cld.c(51): the 'main' function must return 'void' type
Error: C:\Users\dog\Desktop\test\test_cld.c(54): undefined symbol 'PORTC'
Error: C:\Users\dog\Desktop\test\test_cld.c(55): undefined symbol 'DDRD'

Re: Atmega8 + lcd

Добавлено: Вт мар 20, 2012 13:14:35
hybroid

Код: Выделить всё

#include <io.h>

заменить на

Код: Выделить всё

#include <avr/io.h>

Должно помочь.

UPD: ещё вообще-то лучше void main, а не int main. Или в случае int main в конце самой ф-ии main надо воткнуть return 1; , чтобы не ругался компилятор.

Re: Atmega8 + lcd

Добавлено: Вт мар 20, 2012 13:40:47
WOLF
Код просто уже под свою систему настроил. У меня файлы с расширением xxx.h в одной папке свалены.

Error: C:\Users\dog\Desktop\test\test_cld.c(13): undefined symbol 'PC0'
Error: C:\Users\dog\Desktop\test\test_cld.c(14): undefined symbol 'PC2'
Error: C:\Users\dog\Desktop\test\test_cld.c(17): undefined symbol 'PC2'
Error: C:\Users\dog\Desktop\test\test_cld.c(25): undefined symbol 'PC0'
Error: C:\Users\dog\Desktop\test\test_cld.c(28): undefined symbol 'PC2'
Error: C:\Users\dog\Desktop\test\test_cld.c(53): undefined symbol 'PC2'

Компилятор CodeVisionAvr

Re: Atmega8 + lcd

Добавлено: Вт мар 20, 2012 13:49:06
Сериг
я конечно не уверен,но где очистка и инициализация дисплея?

Re: Atmega8 + lcd

Добавлено: Вт мар 20, 2012 13:52:11
hybroid
WOLF писал(а):У меня файлы с расширением xxx.h в одной папке свалены.
Что это значит?! о.О Компилятор какой?

Ещё минздрав рекомендует продефайнить модель МК и его частоту. Кто-то делает это в Makefile, кто-то в исходнике..

Сериг писал(а):я конечно не уверен,но где очистка и инициализация дисплея?
По-моему пока на это плевать.

Re: Atmega8 + lcd

Добавлено: Вт мар 20, 2012 13:57:45
WOLF
Ругается на строчки в этих фрагментах, выделил тегами

Код: Выделить всё

void lcd_com(unsigned char p) //'p' байт команды
{
[u]PORTC &= ~(1<<RS);   // RS = 0[/u]
[u]PORTC |= (1<<EN);    // EN = 1 (начало записи команды в LCD)[/u]
PORTD = p;             // вывод команды на шину DB0-7 LCD
delay_us(100);        // длительность сигнала EN
[u]PORTC &= ~(1 << EN);   // EN = 0 (конец записи команды в LCD)[/u]
delay_us(100);        // пауза для выполнения команды
}

и тут

Код: Выделить всё

void lcd_dat(unsigned char p)  //'p' байт команды
{
[u]PORTC |= (1 << RS)|(1 << EN);  //RS = 1, EN = 1 (начало записи команды в LCD)[/u]
PORTD = p;                     //вывод команды на шину DB0-7 LCD
delay_us(100);                // длительность сигнала EN
[u]PORTC &= ~(1 << EN);           // EN = 0 (конец записи команды в LCD)[/u]
delay_us(100);                // пауза для выполнения команды
}


и тут

Код: Выделить всё

void main (void)
{
[u]DDRC |= (1 << PC2)|(1 << PC1)|(1 << PC0); // PC0-3 выходы[/u]
PORTC = 0x00;                      // лог. 0 на выходе
DDRD = 0xff;                       // PD0-7 выходы
PORTB = 0x00;

lcd_init();      // инициализация дисплея
lcd_dat('H');    // выводим символы на экран
lcd_dat('e');
lcd_dat('l');
lcd_dat('l');
lcd_dat('o');
lcd_dat(' ');
lcd_dat('w');
lcd_dat('o');
lcd_dat('r');
lcd_dat('l');
lcd_dat('d');
lcd_dat('!');
}


если тупо ставить занчени в эти строки в виде 0 и 1 то перестает ругаться но ни чего не работает.

Re: Atmega8 + lcd

Добавлено: Вт мар 20, 2012 14:07:25
WOLF
hybroid писал(а):
WOLF писал(а):У меня файлы с расширением xxx.h в одной папке свалены.

Что это значит?! о.О Компилятор какой?

Все файлы лежат в главной директории CVAVR в папочке inc
hybroid писал(а):Ещё минздрав рекомендует продефайнить модель МК и его частоту. Кто-то делает это в Makefile, кто-то в исходнике..


#define <mega8.h>?

Re: Atmega8 + lcd

Добавлено: Вт мар 20, 2012 14:25:45
hybroid
WOLF писал(а):Все файлы лежат в главной директории CVAVR в папочке inc
А проект, судя по PC*, под GCC (или winavr).
WOLF писал(а):#define <mega8.h>?
Эта строка ровным счётом брёд. Если пользуетесь CV - читайте документацию к нему, я этой штукой не пользовался (и слава богам). Подозреваю, что надо в каком-то красивом окошке выбрать из красивого списочка и нажать красивую кнопочку, как и во всех юзерфрендли-фиговинах.

Re: Atmega8 + lcd

Добавлено: Сб апр 14, 2012 23:59:20
boogyman
Вот так работает, проверял в Протеусе, но опять выскакивает ошибка дисплея

Код: Выделить всё

/****Тестовая программа для LCD****/
 
#include <mega8.h>
#include <delay.h>   //используем стандартную процедуру задержки

/***Функция записи команды в LCD***/
 
void lcd_com(unsigned char p) //'p' байт команды
{
PORTC.0 = 0;   // RS = 0
PORTC.2 = 1;    // EN = 1 (начало записи команды в LCD)
PORTD = p;             // вывод команды на шину DB0-7 LCD
delay_us(100);        // длительность сигнала EN
PORTC.2 = 0;   // EN = 0 (конец записи команды в LCD)
delay_us(100);        // пауза для выполнения команды
}
 
/***Функция записи данных в LCD***/
 
void lcd_dat(unsigned char p)  //'p' байт команды
{
PORTC.0 = 1;  //RS = 1, EN = 1 (начало записи команды в LCD)
PORTC.2 = 1;  //RS = 1, EN = 1 (начало записи команды в LCD)
PORTD = p;                     //вывод команды на шину DB0-7 LCD
delay_us(100);                // длительность сигнала EN
PORTC.2 = 0;           // EN = 0 (конец записи команды в LCD)
delay_us(100);                // пауза для выполнения команды
}
 
/***Функция инициализации LCD***/
 
void lcd_init(void)
{
lcd_com(0x08);          // полное выключение дисплея
lcd_com(0x38);           // 8 бит 2 строки
delay_us(100);
lcd_com(0x38);           // 8 бит 2 строки
delay_us(100);
lcd_com(0x38);           // 8 бит 2 строки
lcd_com(0x38);
lcd_com(0x01);           // очистка дисплея
delay_us(100);
lcd_com(0x06);           // сдвиг курсора вправо
lcd_com(0x0D);           // включение дисплея, мигающий курсор
}
 
/***Основная программа***/
 
void main (void)
{
DDRC = 0x07;     // PC0-3 выходы
PORTC = 0x00;    // лог. 0 на выходе
DDRD = 0xff;     // PD0-7 выходы
PORTD = 0x00;
 
lcd_init();      // инициализация дисплея
delay_us(100);
while(1){
lcd_com(0x0C);   // выключаем курсор
lcd_com(0x02);
delay_us(100);   // вывод в верхнюю левую позицию
lcd_dat('H');    // выводим символы на экран
lcd_dat('e');
lcd_dat('l');
lcd_dat('l');
lcd_dat('o');
lcd_dat(' ');
lcd_dat('w');
lcd_dat('o');
lcd_dat('r');
lcd_dat('l');
lcd_dat('d');
lcd_dat('!');
}
}