Atmega8 + lcd

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
WOLF
Открыл глаза
Сообщения: 58
Зарегистрирован: Пн апр 06, 2009 19:36:50
Контактная информация:

Atmega8 + lcd

Сообщение 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'
Аватара пользователя
hybroid
Друг Кота
Сообщения: 8007
Зарегистрирован: Вс ноя 14, 2010 19:24:26
Откуда: Лукалэнд

Re: Atmega8 + lcd

Сообщение hybroid »

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

#include <io.h>

заменить на

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

#include <avr/io.h>

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

UPD: ещё вообще-то лучше void main, а не int main. Или в случае int main в конце самой ф-ии main надо воткнуть return 1; , чтобы не ругался компилятор.
WOLF
Открыл глаза
Сообщения: 58
Зарегистрирован: Пн апр 06, 2009 19:36:50
Контактная информация:

Re: Atmega8 + lcd

Сообщение 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
Аватара пользователя
Сериг
Это не хвост, это антенна
Сообщения: 1451
Зарегистрирован: Пт фев 19, 2010 19:39:28
Откуда: Москва

Re: Atmega8 + lcd

Сообщение Сериг »

я конечно не уверен,но где очистка и инициализация дисплея?
Аватара пользователя
hybroid
Друг Кота
Сообщения: 8007
Зарегистрирован: Вс ноя 14, 2010 19:24:26
Откуда: Лукалэнд

Re: Atmega8 + lcd

Сообщение hybroid »

WOLF писал(а):У меня файлы с расширением xxx.h в одной папке свалены.
Что это значит?! о.О Компилятор какой?

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

Сериг писал(а):я конечно не уверен,но где очистка и инициализация дисплея?
По-моему пока на это плевать.
WOLF
Открыл глаза
Сообщения: 58
Зарегистрирован: Пн апр 06, 2009 19:36:50
Контактная информация:

Re: Atmega8 + lcd

Сообщение 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 то перестает ругаться но ни чего не работает.
WOLF
Открыл глаза
Сообщения: 58
Зарегистрирован: Пн апр 06, 2009 19:36:50
Контактная информация:

Re: Atmega8 + lcd

Сообщение WOLF »

hybroid писал(а):
WOLF писал(а):У меня файлы с расширением xxx.h в одной папке свалены.

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

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


#define <mega8.h>?
Аватара пользователя
hybroid
Друг Кота
Сообщения: 8007
Зарегистрирован: Вс ноя 14, 2010 19:24:26
Откуда: Лукалэнд

Re: Atmega8 + lcd

Сообщение hybroid »

WOLF писал(а):Все файлы лежат в главной директории CVAVR в папочке inc
А проект, судя по PC*, под GCC (или winavr).
WOLF писал(а):#define <mega8.h>?
Эта строка ровным счётом брёд. Если пользуетесь CV - читайте документацию к нему, я этой штукой не пользовался (и слава богам). Подозреваю, что надо в каком-то красивом окошке выбрать из красивого списочка и нажать красивую кнопочку, как и во всех юзерфрендли-фиговинах.
boogyman
Первый раз сказал Мяу!
Сообщения: 33
Зарегистрирован: Ср дек 08, 2010 18:53:34
Откуда: Москва
Контактная информация:

Re: Atmega8 + lcd

Сообщение 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('!');
}
}
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»