AVR Раздел по микроконтроллерам компании Atmel - AVR / ATtiny / ATmega / ATMega128 / ATxmega, вопросы по программированию в AVR studio и все, относящееся к AVR... |
09.03.2013, 23:36
|
|
Частый гость
Регистрация: 29.01.2013
Сообщений: 31
Сказал спасибо: 13
Сказали Спасибо 2 раз(а) в 2 сообщении(ях)
|
Re: Библиотеки для Xmega под WinAVR
У меня на отладочной плате отдельно есть источник напряжения в 5В.
Цитата:
|
Поэтому если не подключен и не сконфигурирован вывод LCD R/W ваша схема будет виснуть при инициализации.
|
Очень похоже на правду. Вот только с моим знанием языка, не могу найти где в коде запряталась ошибка.
|
|
|
|
10.03.2013, 00:03
|
|
Частый гость
Регистрация: 01.04.2005
Сообщений: 33
Сказал спасибо: 0
Сказали Спасибо 7 раз(а) в 6 сообщении(ях)
|
Re: Библиотеки для Xmega под WinAVR
В заголовочном файле lcd.h прописаны выводы контроллера. кстати в вашем заголовочном файле есть строка:
#define LCD_CONTROLLER_KS0073 1 /**‹ Use 0 for HD44780 controller, 1 for KS0073 controller */
Где между прочем прописано, что используйте 0 для HD44780 контроллера, 1 для KS0073 контроллера.
У вас стоит 1, т.е. дальше система команд используется как для контроллера KS0073. Надо исправить на 0.
Далее конфигурируются параметры LCD в комментах дается перевод тремя восклицательными знаками !!! выделены параметры которые необходимо указать для своего дисплея
#define LCD_LINES 2 /**‹ число видимых строк на дисплее - 2 !!! */
#define LCD_DISP_LENGTH 16 /**‹ число символов в строке 16 !!! */
#define LCD_LINE_LENGTH 0x40 /**‹ длинна строки !!! - обычно в десятичном формате просто 40 ставится */
#define LCD_START_LINE1 0x00 /**‹ DDRAM адрес первого символа строки 1 !!! в моем дисплее был 0x80*/
#define LCD_START_LINE2 0x40 /**‹ DDRAM адрес первого символа строки 2 !!! в моем дисплее был 0xC0*/
#define LCD_START_LINE3 0x10 /**‹ DDRAM адрес первого символа строки 3 !!! */
#define LCD_START_LINE4 0x50 /**‹ DDRAM адрес первого символа строки 4 !!! */
#define LCD_WRAP_LINES 1 /**‹ 0: no wrap, 1: wrap at end of visibile line !!! Я у себя выставлял в 0*/
Адресацию для конкретного дисплея надо смотреть по полным техническим данным
для подсоединения выводов дисплея использовать определения:
#define LCD_DATA0_PORT PORTC /**‹ port for 4bit data bit 0 */
#define LCD_DATA0_PIN PIN3_bm /**‹ pin for 4bit data bit 0 */
#define LCD_DATA1_PORT PORTC /**‹ port for 4bit data bit 1 */
#define LCD_DATA1_PIN PIN4_bm /**‹ pin for 4bit data bit 1 */
#define LCD_DATA2_PORT PORTC /**‹ port for 4bit data bit 2 */
#define LCD_DATA2_PIN PIN5_bm /**‹ pin for 4bit data bit 2 */
#define LCD_DATA3_PORT PORTC /**‹ port for 4bit data bit 3 */
#define LCD_DATA3_PIN PIN6_bm /**‹ pin for 4bit data bit 3 */
#define LCD_RS_PORT PORTC /**‹ port for RS line */
#define LCD_RS_PIN PIN0_bm /**‹ pin for RS line */
#define LCD_RW_PORT PORTC /**‹ port for RW line */
#define LCD_RW_PIN PIN1_bm /**‹ pin for RW line */
#define LCD_E_PORT PORTC /**‹ port for Enable line */
#define LCD_E_PIN PIN2_bm /**‹ pin for Enable line */
В вашей схеме все необходимые выводы от LCD подключаются на порт C номера выводов порта прописаны в значении. Например PIN1_bm - порт С вывод 1 и т.д.
Когда все установите правильно должно заработать.
Кстати, на всякий случай, часто народ мучается с яркостью символов на дисплее. Вроде все правильно, а на экране ничего нет. Обычно после подачи питания дисплея до сброса яркость резистором выкручивается до состояния, когда одна строка начинает светиться где-то на четверть от максимума. Потом после появления символов яркость устанавливается начистовую.
Последний раз редактировалось shurenock; 10.03.2013 в 00:15.
Причина: Добавление информации
|
|
|
Сказали "Спасибо" shurenock
|
|
|
12.03.2013, 13:30
|
|
Частый гость
Регистрация: 29.01.2013
Сообщений: 31
Сказал спасибо: 13
Сказали Спасибо 2 раз(а) в 2 сообщении(ях)
|
Re: Библиотеки для Xmega под WinAVR
Спасибо большое за Ваши старания помочь!
Я так понимаю Вы использовали эту же библиотеку для работы с LCD?
Цитата:
|
В заголовочном файле lcd.h прописаны выводы контроллера. кстати в вашем заголовочном файле есть строка:
#define LCD_CONTROLLER_KS0073 1 /**‹ Use 0 for HD44780 controller, 1 for KS0073 controller */
Где между прочем прописано, что используйте 0 для HD44780 контроллера, 1 для KS0073 контроллера.
У вас стоит 1, т.е. дальше система команд используется как для контроллера KS0073. Надо исправить на 0.
|
Изменял, результат отрицателен.
Цитата:
|
#define LCD_START_LINE1 0x00 /**‹ DDRAM адрес первого символа строки 1 !!! в моем дисплее был 0x80*/
#define LCD_START_LINE2 0x40 /**‹ DDRAM адрес первого символа строки 2 !!! в моем дисплее был 0xC0*/
|
Соответствует моему LCD.
Подсоединение дисплейя тоже соответственно lcd.h выполненно.
Контраст регулируется потенциометром.
На всякий случай прирепляю проект с исправлениями, а также инструкцию у дисплейю (у меня модель W162B-N3LW). Проект немного упрощен, вместо ожидания нажатия кнопок я установил задержку в 2 сек. (_delay_ms(2000)).
Код:
|
lcd_init(LCD_DISP_ON); /* initialize display, cursor off */
lcd_clrscr();
lcd_puts("01");
_delay_ms(2000);
lcd_clrscr();
lcd_puts("02");
_delay_ms(2000);
lcd_clrscr();
lcd_puts("03");
_delay_ms(2000); |
На дисплейе отображается только "01".
Последний раз редактировалось Fogtech; 12.03.2013 в 13:37.
|
|
|
|
12.03.2013, 15:11
|
|
Частый гость
Регистрация: 01.04.2005
Сообщений: 33
Сказал спасибо: 0
Сказали Спасибо 7 раз(а) в 6 сообщении(ях)
|
Re: Библиотеки для Xmega под WinAVR
Для начала можно немножко пошаманить
Был такой глюк с компилятором
замените
#include ‹util/delay.h›
на
#include ‹avr/delay.h›
У моей студии не нравилось это место почему-то из каталога Util заголовочный файл delay.h подключался а правильно работать не хотел.
Далее
Поменяйте очередность подключения заголовочных файлов:
#include ‹avr/io.h›
#include ‹avr/delay.h›
#include "lcd.h"
Был тоже один глюк. но это не факт что поможет.
Далее делаем простую вещь при инициализации дисплея
lcd_init(LCD_DISP_ON); //Инициализация LCD
lcd_clrscr(); //Очистка экрана
lcd_home(); //установка курсора на начало экрана
Если курсор на начало не устанавливать, то он может выводить в произвольную область данные.
Далее, очистка экрана не устанавливает курсор в начало строки и на 1 строку. Поэтому при каждом выводе данных необходимо делать
lcd_gotoxy(x,y); //x - позиция символа в строке (диапазон 0-15)
//y - позиция строки вывода (диапазон 0-1)
или
lcd_home(); //установка курсора на начало экрана
Далее используем более простую функцию
lcd_putc('1'); //Выводит просто символ
В итогу попробуем без пауз вывести последовательность
lcd_gotoxy(0,0);
lcd_putc('1'); //Выводит 1
lcd_putc('2'); //Выводит 2
lcd_gotoxy(0,1);
lcd_putc('3'); //Выводит 3
lcd_putc('4'); //Выводит 4
Должно получится:
12
34
Ежели получилось попробуем добавить паузу между символами
lcd_gotoxy(0,0);
lcd_putc('1'); //Выводит 1
_delay_ms(1000);
lcd_putc('2'); //Выводит 2
_delay_ms(1000);
lcd_gotoxy(0,1);
lcd_putc('3'); //Выводит 3
_delay_ms(1000);
lcd_putc('4'); //Выводит 4
если не пошло - проблема с паузами
Еще все таки попробовать выставить значения
#define LCD_START_LINE1 0x80 /**‹ DDRAM address of first char of line 1 */
#define LCD_START_LINE2 0xC0 /**‹ DDRAM address of first char of line 2 */
связано с тем, что в библиотеке (моей версии) глюк был: команды контроллера требуют при записи в DDRAM соблюдать формат адреса: семь младших битов собственно адрес ячейки, а старший бит - признак записи в DDRAM.
т.е. 1 A6 A5 A4 A3 A2 A1 A0
Если первый бит 0 - то писаться будет в CGRAM.
В моей версии библиотеки эта 1 не была учтена в функциях записи.
Так что надо пробовать, если не получится будем копать дальше
P.S. Кстати надо именно последнее в первую очередь попробовать, я припоминаю, что у меня тоже в самом начале такой глюк был. Выводит только первые четыре символа правильно и дальше как в пропасть данные уходят.
Последний раз редактировалось shurenock; 12.03.2013 в 15:39.
Причина: Дополнительная информация.
|
|
|
Сказали "Спасибо" shurenock
|
|
|
13.03.2013, 20:10
|
|
Частый гость
Регистрация: 29.01.2013
Сообщений: 31
Сказал спасибо: 13
Сказали Спасибо 2 раз(а) в 2 сообщении(ях)
|
Re: Библиотеки для Xmega под WinAVR
Здравствуйте! Провел все перечисленные выше манипуляции. Видимого результата пока нет.
Цитата:
|
Поменяйте очередность подключения заголовочных файлов:
#include ‹avr/io.h›
#include ‹avr/delay.h›
#include "lcd.h"
Был тоже один глюк. но это не факт что поможет.
|
Изменений в функциональности не наблюдал.
Цитата:
|
Далее делаем простую вещь при инициализации дисплея
lcd_init(LCD_DISP_ON); //Инициализация LCD
lcd_clrscr(); //Очистка экрана
lcd_home(); //установка курсора на начало экрана
Если курсор на начало не устанавливать, то он может выводить в произвольную область данные.
Далее, очистка экрана не устанавливает курсор в начало строки и на 1 строку. Поэтому при каждом выводе данных необходимо делать
lcd_gotoxy(x,y); //x - позиция символа в строке (диапазон 0-15)
//y - позиция строки вывода (диапазон 0-1)
или
lcd_home(); //установка курсора на начало экрана
Далее используем более простую функцию
lcd_putc('1'); //Выводит просто символ
|
Все работает как нужно - "1".
Цитата:
|
lcd_gotoxy(0,0);
lcd_putc('1'); //Выводит 1
lcd_putc('2'); //Выводит 2
lcd_gotoxy(0,1);
lcd_putc('3'); //Выводит 3
lcd_putc('4'); //Выводит 4
Должно получится:
12
34
|
Тоже получилось.
Затем, когда я сменил адреса строк на:
Цитата:
|
#define LCD_START_LINE1 0x80 /**‹ DDRAM address of first char of line 1
#define LCD_START_LINE2 0xC0 /**‹ DDRAM address of first char of line 2
|
у меня прекратила отображаться 2-я строка.
Код:
|
void main()
{
lcd_init(LCD_DISP_ON); /* initialize display, cursor off */
lcd_clrscr(); //Очистка экрана
lcd_home(); //установка курсора на начало экрана
lcd_gotoxy(0,0);
lcd_putc('1'); //Выводит 1
_delay_ms(1000);
lcd_putc('2'); //Выводит 2
_delay_ms(1000);
lcd_gotoxy(0,1);
lcd_putc('3'); //Выводит 3
_delay_ms(1000);
lcd_putc('4'); //Выводит 4
}//main |
В данном примере дисплей снова застывает на "1" (Адреса строк в библиотеки возвращены в первичное значение).
Так же я убрал дублированное значение частоты кварца #define F_CPU 2000000 с главного файла. Попробовал изменять значение #define lcd_e_delay() _delay_us(10). Ничего.
У меня складывается впечатление, что где-то внутри библиотеки во время портирования закралась ошибка. Увы автор порта не указал работает ли у него и с каким дисплейем данная библиотека. И что самое интересное, что это единственная библиотека из заявленных для Xmega, которая хоть что-то отображает ![Улыбка](images/smilies/icon_smile.gif) .
Последний раз редактировалось Fogtech; 13.03.2013 в 20:17.
|
|
|
Сказали "Спасибо" Fogtech
|
|
|
13.03.2013, 23:12
|
|
Гражданин KAZUS.RU
Регистрация: 16.03.2011
Сообщений: 486
Сказал спасибо: 8
Сказали Спасибо 131 раз(а) в 116 сообщении(ях)
|
Re: Библиотеки для Xmega под WinAVR
Сообщение от Fogtech
|
И что самое интересное, что это единственная библиотека из заявленных для Xmega, которая хоть что-то отображает
|
Такую "библиотеку" за день-два написать можно...но нет - будем применять хрен знает что непонятно как работающее...
|
|
|
|
14.03.2013, 10:28
|
|
Частый гость
Регистрация: 01.04.2005
Сообщений: 33
Сказал спасибо: 0
Сказали Спасибо 7 раз(а) в 6 сообщении(ях)
|
Re: Библиотеки для Xmega под WinAVR
Да живая нормальная библиотека. У меня за пол дня пошла. Просто надо иметь определенный опыт в адаптации, настройке и тестировании таких вещей.
Тем более здесь похоже больше проблем не с библиотекой, а с функциями, реализующими паузу.
Просто надо сесть и разобраться, а на расстоянии трудно давать советы. Надо проект иметь на столе.
|
|
|
|
14.03.2013, 18:37
|
|
Почётный гражданин KAZUS.RU
Регистрация: 26.11.2011
Адрес: Анапа
Сообщений: 1,620
Сказал спасибо: 284
Сказали Спасибо 129 раз(а) в 111 сообщении(ях)
|
Re: Библиотеки для Xmega под WinAVR
в xmega + atmelstudio из коропки явно неправильно работают _delay_ , по крайней мере у меня
|
|
|
|
14.03.2013, 23:38
|
|
Гражданин KAZUS.RU
Регистрация: 16.03.2011
Сообщений: 486
Сказал спасибо: 8
Сказали Спасибо 131 раз(а) в 116 сообщении(ях)
|
Re: Библиотеки для Xmega под WinAVR
Сообщение от whoim
|
в xmega + atmelstudio из коропки явно неправильно работают _delay_ , по крайней мере у меня
|
Напишите свою функцию delay, благо таймеров как грязи...
|
|
|
|
15.03.2013, 00:34
|
|
Почётный гражданин KAZUS.RU
Регистрация: 26.11.2011
Адрес: Анапа
Сообщений: 1,620
Сказал спасибо: 284
Сказали Спасибо 129 раз(а) в 111 сообщении(ях)
|
Re: Библиотеки для Xmega под WinAVR
_Артём_, так и делал))
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 14:48.
|
|