AVR Раздел по микроконтроллерам компании Atmel - AVR / ATtiny / ATmega / ATMega128 / ATxmega, вопросы по программированию в AVR studio и все, относящееся к AVR... |
02.04.2010, 14:07
|
|
Прописка
Регистрация: 28.09.2006
Сообщений: 144
Сказал спасибо: 11
Сказали Спасибо 95 раз(а) в 51 сообщении(ях)
|
Библиотеки для Xmega под WinAVR
Предлагаю выкладывать библиотеки под Xmega...кому не жалко
Библиотека для работы с символьными дисплеями на базе контроллеров HD44780 и KS0073, за основу была взята библиотека для atmega от Peter Fleury. Реализована поддержка контроллеров Xmega в 4-х битном режиме, добавлен символ уровня заряда батареи (lcd_putc(batn) n=0-5) и массив для автоматической перекодировки символов кириллицы.
Пример работы с библиотекой:
#include ‹avr/io.h›
#include ‹util/delay.h›
#include "clksys_driver.h"
#include "lcd.h"
int main(void)
{
CLKSYS_PLL_Config( OSC_PLLSRC_RC2M_gc, 16 );
CLKSYS_Enable( OSC_PLLEN_bm );
do {} while ( CLKSYS_IsReady( OSC_PLLRDY_bm ) == 0 ); /* Wait for PLL to be ready */
CLKSYS_Main_ClockSource_Select( CLK_SCLKSEL_PLL_gc ); /* Switch main clock PLL */
CLKSYS_AutoCalibration_Disable( DFLLRC2M );
lcd_init(LCD_DISP_ON);
lcd_clrscr();
lcd_puts("Привет мир");
lcd_putc(bat0);
lcd_putc(bat1);
lcd_putc(bat2);
lcd_putc(bat3);
lcd_putc(bat4);
lcd_putc(bat5);
PORTD.DIRSET=PIN2_bm;
while (1)
{
PORTD.OUTTGL=PIN2_bm;
_delay_ms(100);
}
}
Последний раз редактировалось harchenko_pavel; 02.04.2010 в 14:12.
|
|
|
Эти 2 пользователя(ей) сказали Спасибо harchenko_pavel за это сообщение:
|
|
|
02.04.2010, 18:30
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.05.2006
Адрес: Москва
Сообщений: 3,559
Сказал спасибо: 76
Сказали Спасибо 326 раз(а) в 230 сообщении(ях)
|
Re: Библиотеки для Xmega под WinAVR
Отличное начало, пора осваивать их.
__________________
Обучалка AVR PIC ARM начинающим программирование курс самоучитель шаг за шагом с нуля, CVAVR, PROTEUS, MPLAB, WinAVR, IAR, KEIL электроника - http://proavr.narod.ru
|
|
|
|
02.04.2010, 19:58
|
|
Прописка
Регистрация: 28.09.2006
Сообщений: 144
Сказал спасибо: 11
Сказали Спасибо 95 раз(а) в 51 сообщении(ях)
|
Re: Библиотеки для Xmega под WinAVR
Обнаружил ошибку в функцие static inline void lcd_newline(uint8_t pos) из за которой каретка переходила в неправильную позицию по \n
прошу поменять функцию на:
static inline void lcd_newline(uint8_t pos)
{
register uint8_t addressCounter;
#if LCD_LINES==1
addressCounter = 0;
#endif
#if LCD_LINES==2
if ( pos ‹ (LCD_START_LINE2) )
addressCounter = LCD_START_LINE2;
else
addressCounter = LCD_START_LINE1;
#endif
#if LCD_LINES==4
if ( pos ‹ LCD_START_LINE2 )
addressCounter = LCD_START_LINE2;
else if ( (pos ›= LCD_START_LINE2) && (pos ‹ LCD_START_LINE3) )
addressCounter = LCD_START_LINE3;
else if ( (pos ›= LCD_START_LINE3) && (pos ‹ LCD_START_LINE4) )
addressCounter = LCD_START_LINE4;
else
addressCounter = LCD_START_LINE1;
#endif
lcd_command((1‹‹LCD_DDRAM)+addressCounter);
}/* lcd_newline */
|
|
|
|
04.03.2013, 22:50
|
|
Частый гость
Регистрация: 29.01.2013
Сообщений: 31
Сказал спасибо: 13
Сказали Спасибо 2 раз(а) в 2 сообщении(ях)
|
Re: Библиотеки для Xmega под WinAVR
С помощью выше указанной библиотеки хочу заставить LCD переодически изменять сообщения. Но комманда _delay_ms() почему-то вместо задержки оставналивает весь процесс. Если же _delay_ms() убрать, то все последующие сообщения быстро отображаются до последнего, после чего все останаливается. Хотя все процедуры находяться в бесконечном цикле.
Вот основной код, использующий библиотеку lcd.h:
Код:
|
#include ‹stdlib.h›
#include ‹avr/io.h›
#include ‹avr/pgmspace.h›
#include "lcd.h"
#include ‹util/delay.h›
#define F_CPU 20000000 // AVR clock frequency in Hz, used by util/delay.h
int main(void)
{
char buffer[7];
int num=134;
unsigned char i;
/* initialize display, cursor off */
lcd_init(LCD_DISP_ON);
for (;;) { /* loop forever */
lcd_clrscr();
lcd_puts("LCD Test Line 1\n");
lcd_puts("Line 2");
lcd_gotoxy(7,1);
lcd_putc(':');
_delay_ms(2000);
lcd_clrscr();
lcd_command(LCD_DISP_ON_CURSOR);
lcd_puts("CurOn");
_delay_ms(2000);
lcd_clrscr(); /* clear display home cursor */
/* put string from program memory to display */
lcd_puts_P( "Line 1 longer than 14 characters\n" );
lcd_puts_P( "Line 2 longer than 14 characters" );
lcd_command(LCD_MOVE_DISP_LEFT);
_delay_ms(2000);
lcd_clrscr();
/* turn off cursor */
lcd_command(LCD_DISP_ON);
_delay_ms(2000);
lcd_clrscr(); /* clear display home cursor */
/* convert interger into string */
itoa( num , buffer, 10);
/* put converted string to display */
lcd_puts(buffer);
_delay_ms(2000);
}
} |
Вопрос: каким образом можно выставить временные задержки в отображении новой информации на дисплейе и как зациклить процесс. Спасибо.
|
|
|
|
07.03.2013, 22:05
|
|
Частый гость
Регистрация: 29.01.2013
Сообщений: 31
Сказал спасибо: 13
Сказали Спасибо 2 раз(а) в 2 сообщении(ях)
|
Re: Библиотеки для Xmega под WinAVR
В процессе поиска решения проблемы, пришел к мысли, что проблема может крыться где-то в районе Busy Flag. Если программа без остановчно только отправляет сообщения, то все работает. Если же есть задержка или ожидание нажатия кнопки, то отправка сообщений на LCD останавливается.
В прикрепленном архиве - проект с прораммой. При включении платы отображается сразу "0". При нажатии кнопок LCD больше никак не реагирует.
Прошу натолкнуть на свежие мысли... Как-то долго уже мучаюсь все с тем же. Спасибо.
|
|
|
|
08.03.2013, 02:50
|
|
Почётный гражданин KAZUS.RU
Регистрация: 26.11.2011
Адрес: Анапа
Сообщений: 1,620
Сказал спасибо: 284
Сказали Спасибо 129 раз(а) в 111 сообщении(ях)
|
Re: Библиотеки для Xmega под WinAVR
Fogtech,
Цитата:
|
PORTD.DIR = (0 ‹‹ 0); // D0 as KEY SW0, input.
PORTD.DIR = (0 ‹‹ 1); // D1 as KEY SW1, input.
PORTD.DIR = (0 ‹‹ 2); // D2 as KEY SW2, input.
PORTD.DIR = (0 ‹‹ 3); // D3 as KEY SW3, input.
|
нет ли тут ошибки?
|
|
|
|
08.03.2013, 10:37
|
|
Частый гость
Регистрация: 29.01.2013
Сообщений: 31
Сказал спасибо: 13
Сказали Спасибо 2 раз(а) в 2 сообщении(ях)
|
Re: Библиотеки для Xmega под WinAVR
Сообщение от whoim
|
нет ли тут ошибки?
|
Нет, кнопки работают, о чем свидетельствуют светящиеся диоды, которые зажигаются соответственно нажатым копкам. И даже если выбросить копки, а поставить временную задержку, проблема остается.
У автора оригинальной библиотеки для атмеги, Петера Флойри, есть пример с функцией void wait_until_key_pressed(void) Пытался адптировать (закоментированная часть кода в main.c) - также напрасно.
Последний раз редактировалось Fogtech; 08.03.2013 в 13:53.
|
|
|
|
09.03.2013, 13:00
|
|
Частый гость
Регистрация: 01.04.2005
Сообщений: 33
Сказал спасибо: 0
Сказали Спасибо 7 раз(а) в 6 сообщении(ях)
|
Re: Библиотеки для Xmega под WinAVR
Для Xmegа необходимо сконфигурировать программно источник тактовой частоты процессора и периферии. Т.е. схему PLL и собственно источник частоты (внешний кварц, внутренняя RC цепочка и пр.)
Если брать выставленные значения производителем по умолчанию, то там вроде как не 20 Мгц будет, а меньше.
Соответственно, директива #define F_CPU 20000000, которая определяет тактовую частоту для всех временных процессов, указана не верно. Как следствие, _delay_ms(2000); будет отрабатывать тоже не правильно, т.к. эта функция повязана и рассчитывается исходя из F_CPU.
Если мы используем одну библиотеку для LCD, то там тоже есть блоки, которые определяют временные параметры процессов при формировании сигналов для LCD.
И вот там если неправильно выставлен F_CPU, программа может подвисать, т.к. в этой библиотеке используется кусок, где осуществляется чтение из LCD.
Это просто мысли, из опыта, с которым столкнулся сам, когда с Xmega возился.
А вообще ели нет отладчика, чтобы посмотреть состояние контроллера в точке останова, хороший способ вычислить, на какой точке программы контроллер виснет - это просто сконфигурировать одну ногу на выход и навесить на нее светодиод. В итоге: светодиод не горит, когда прошла программа точку - зажечь светодиод. Вот и все. Ищем точку в программе, после которой светодиод перестает загораться. Значит там ошибка.
|
|
|
Сказали "Спасибо" shurenock
|
|
|
09.03.2013, 17:06
|
|
Частый гость
Регистрация: 29.01.2013
Сообщений: 31
Сказал спасибо: 13
Сказали Спасибо 2 раз(а) в 2 сообщении(ях)
|
Re: Библиотеки для Xmega под WinAVR
@shurenock
F_CPU 20000000, это верно. После публикации тоже заметил, тем не менее с F_CPU 2000000 (2МГц) работает точно также... К тому же если инициализация и первое сообщение проходит успешно, могу сделать вывод что со временем на этом этапе все работает нормально (?)
На счет программы, то используя выше прикрепленный пример, программа работает по циклу. То есть светодиоды всегда зажигаются соответственно нажатым кнопкам. А вот HD44780 виснит сразу после первой же остановки отправки на него комманд.
Спасибо за ответ!
З.Ы. Работая с Xmega, Вы не сталкивались члучайно с LCD HD44780? Если да, то хотелось бы перенять Ваш драгоценный опыт.
Последний раз редактировалось Fogtech; 09.03.2013 в 17:10.
|
|
|
|
09.03.2013, 18:01
|
|
Частый гость
Регистрация: 01.04.2005
Сообщений: 33
Сказал спасибо: 0
Сказали Спасибо 7 раз(а) в 6 сообщении(ях)
|
Re: Библиотеки для Xmega под WinAVR
HD44780 - это не LCD, это контроллер с системой управляющих команд на основе которого строятся море LCD.
Кстати одна из возможных проблем может быть связана с питанием LCD. Контроллер HD44780 имеет 5 вольтовое питание, а интерфейс может поддерживаться 3-х вольтовый.
XMega же имеет 3.3 вольта питание. Поэтому LCD надо запитывать от отдельного 5-ти вольтового источника. У меня такие проблемы были.
Кроме того XMega требовательна к многим мелким вещам. Например после конфигурации источника тактовой частоты необходимо выставить паузу на время переходных процессов.
Далее С библиотека LCD в отличие от прочих языков (например Бейсика) не знаю почему, но содержит команды как записи данных, так и для чтения. Причем при инициализации LCD как раз и используется сначала запись команд, а потом чтение для проверки конфигурации LCD.
Поэтому если не подключен и не сконфигурирован вывод LCD R/W ваша схема будет виснуть при инициализации.
Да там еще много мелких мелочей может быть.
|
|
|
Сказали "Спасибо" shurenock
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 02:08.
|
|