WinAvr в вопросах и ответах

Обсуждаем контроллеры компании Atmel.
Ответить
Мучитель микросхем
Сообщения: 455
Зарегистрирован: Сб фев 14, 2009 05:19:48
Откуда: Kiev

Сообщение TuzRostislav »

ps

Прояснилось кое-что. У меня Vista64.
Поставил WinAVR под VMware на XP. Работает без проблем.

Не в курсе, на Vista64 WinAVR реально заставить работать?

ps ps

Проблему решил. DLL надо отсюда скачать.

http://www.madwizard.org/electronics/ar ... inavrvista
Реклама
Открыл глаза
Аватара пользователя
Сообщения: 64
Зарегистрирован: Сб апр 24, 2010 08:48:05
Откуда: Новосибирск

Сообщение Барсук »

Доброго всем
Помогите, пожалуйста, разобраться есть функция, которая должна выводить символ не дисплей по заданным координатам
три массива со шрифтами.
пока все массивы хранились в ОЗУ все работало только ОЗУ заполнялось на 127% (ну некоторые строки приходилось убирать, чтоб было хотя бы 99%)
решил перенести всё в память программ и встал уже 2 недели не могу вывести символ
оставил все по минимуму один массив размер шрифта выводит правильно рисует квадратик а заполняет его всякими кракозябрами причем одинаковыми для любого символа
вот часть кода массив определен в отдельном файле там всё верно первые 3 значения это размеры и количество байт на символ

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

void Lcd_Put_Char(char c,int x,int y,int fcolor,int bcolor)
	{
	
	int i,j;
	unsigned int nCols;
	unsigned int nRows;
	unsigned int nBytes;
	unsigned char PixelRow;
	unsigned char Mask;
	unsigned int Word0;
	unsigned int Word1;
	unsigned char * pFont;
	unsigned char * pChar;
	
	pFont=(unsigned char*) font1;
	
	nCols=pgm_read_byte(pFont);
	nRows=pgm_read_byte(pFont+1);
	nBytes=pgm_read_byte(pFont+2);
	
	pChar=pFont+(nBytes*(c-0x1F))+nBytes-1;
	
	sendCMD(PASET);
	sendData(x);
	sendData(x+nRows-1);

	sendCMD(CASET);
	sendData(y);
	sendData(y+nCols-1);

	sendCMD(RAMWR);
	
	for (i=nRows-1;i>=0;i--)
	{
		PixelRow=pgm_read_byte(*pChar--);
		
		Mask=0x80;
		for(j=0;j<nCols;j+=2)
		{
			if ((PixelRow & Mask)==0) 
				Word0=bcolor;
			else 
				Word0=fcolor;
			Mask=Mask>>1;
			
			if ((PixelRow & Mask)==0) 
				Word1=bcolor;
			else 
				Word1=fcolor;
			Mask=Mask>>1;
			
			sendData((Word0>>4) & 0xFF);
			sendData(((Word0 & 0xF)<<4)|((Word1>>8) & 0xF));
			sendData(Word1 & 0xFF);
			}
		}
		sendCMD(NOP);
	}
код работает правильно вот до этой строчки
pChar=pFont+(nBytes*(c-0x1F))+nBytes-1;
размер символа считывается правильно
Я НЕ суслик, Я БАРСУК
Реклама
Открыл глаза
Аватара пользователя
Сообщения: 64
Зарегистрирован: Сб апр 24, 2010 08:48:05
Откуда: Новосибирск

Сообщение Барсук »

спасибо разобрался сам
Я НЕ суслик, Я БАРСУК
Открыл глаза
Сообщения: 50
Зарегистрирован: Пт ноя 26, 2010 23:12:18

Сообщение Maximka_18 »

Помогите скомпилить код, как не делал makefile, выдает ошибку
Вложения
Desktop.rar
(1.58 КБ) 216 скачиваний
Реклама
Эиком - электронные компоненты и радиодетали
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1262
Зарегистрирован: Пн дек 08, 2008 10:58:48
Откуда: Винница

Сообщение urry »

хидер прерывания не понравился.
Вложения
Desktop.zip
(16.13 КБ) 218 скачиваний
Контактная информация:
Реклама
Грызет канифоль
Сообщения: 294
Зарегистрирован: Пт мар 11, 2011 08:51:55

Сообщение 3DRaven »

Здравствуйте. Есть вопрос по avr-gcc...или WinAvr.
В коде нашел строки

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

/*eeprom*/ char eep_my_number[] = {3,1};     //Номер устройства  байты наоборот 0,7 соответсвует номеру 0103
/*eeprom*/ char eep_read_result[] = {'0','7'};   // Тип чтения данных - 2 напряжения 5В
/*eeprom*/ char eep_average = 200; 
/*eeprom*/ char eep_prescaler = freq/16/19200-1;
Вопросы:
1. Закоментированное слово eeprom если раскоментировать, получится, что компилятору будет сообщено, что данные переменные хранятся в eeprom?
2. При обращении к ним будет разница с использованием функций доступа к eeprom из gcc libc? Конечный способ доступа будет тот же самый ведь?

Заранее спасибо за ответ.
Реклама
Открыл глаза
Аватара пользователя
Сообщения: 64
Зарегистрирован: Сб апр 24, 2010 08:48:05
Откуда: Новосибирск

Сообщение Барсук »

3DRaven писал(а):Вопросы:
1. Закоментированное слово eeprom если раскоментировать, получится, что компилятору будет сообщено, что данные переменные хранятся в eeprom?
2. При обращении к ним будет разница с использованием функций доступа к eeprom из gcc libc? Конечный способ доступа будет тот же самый ведь?
смотри в поиск такие вопросы уже были только в другой теме
http://radiokot.ru/forum/viewtopic.php?f=20&t=37981
Я НЕ суслик, Я БАРСУК
Грызет канифоль
Сообщения: 294
Зарегистрирован: Пт мар 11, 2011 08:51:55

Сообщение 3DRaven »

Спасибо. Я действительно уже нашел. Есть вопрос.
Там watchdog timer используется у меня.
При работе с eeprom говорят надо его обнулять пока ждешь готовности памяти,
иначе МК сброситься может.
Так вот при доступе с помощью функций или как в CVAVR с помощью
типа переменной - это делается?
Встал на лапы
Аватара пользователя
Сообщения: 93
Зарегистрирован: Чт апр 26, 2012 14:30:40
Откуда: под Москвой

Сообщение _dark »

Добрый день, уважаемые форумчане!

Прошу помощи по следующим вопросам:
- как в WINAVR подключить (объявить) внешнюю память МК?
- как в WINAVR объявить размещение конкретных данных (массива) во внешней памяти?

(WINAVR + AVR studio 4.18)
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1116
Зарегистрирован: Чт окт 15, 2009 14:16:18
Откуда: Екб

Сообщение AI_Disable »

О какой внешней памяти речь?
Контактная информация:
Встал на лапы
Аватара пользователя
Сообщения: 93
Зарегистрирован: Чт апр 26, 2012 14:30:40
Откуда: под Москвой

Сообщение _dark »

AI_Disable писал(а):О какой внешней памяти речь?
RAM
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1116
Зарегистрирован: Чт окт 15, 2009 14:16:18
Откуда: Екб

Сообщение AI_Disable »

:facepalm: Даю подсказку: Flash, SRAM или EEPROM? Как подключена?
Контактная информация:
Встал на лапы
Аватара пользователя
Сообщения: 93
Зарегистрирован: Чт апр 26, 2012 14:30:40
Откуда: под Москвой

Сообщение _dark »

AI_Disable писал(а)::facepalm: Даю подсказку: Flash, SRAM или EEPROM? Как подключена?
Ув. AI_Disable мне не подсказки нужны, а решение как включить в компиляторе опцию работы с внешней памятью данных (конкретно для Меги128 для RAM свыше 4к) и разместить переменную там же.

К примеру на ICC по первому вопросу (как включить обращение к внешней RAM) нужно было тупо указать в оболочке размер сектора XDATA.
а для размещения конкретной переменной указать директиву xdata перед ней.

Как это сделать в WINAVR?

P.S.
объявление в опциях проекта параметров памяти: Memory Type = Sram, Name = .data, Address = 0x800000
и при объявлении переменных
volatile UCHAR Buf[257] __attribute__ ((section (".data")));

не помогает :(
сегмент Data: 2162 bytes (52.8% Full) - не меняется, в смысле не уменьшает % ее использования

P.P.S.
уточняю, вообще-то Address = 0x800000 "убивает" прогу, это я погорячился,
работает Address = 0x10000
Встал на лапы
Аватара пользователя
Сообщения: 93
Зарегистрирован: Чт апр 26, 2012 14:30:40
Откуда: под Москвой

Сообщение _dark »

Да,... похоже одна надежда, что сюда заглянет ARV.
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень

Сообщение vitalik_1984 »

насколько я знаю он больше тут не живет.у него свой сайт.ищите там.в коте последнее сообщение в 2011году.
В поисках истины человек развивается.
Контактная информация:
Встал на лапы
Аватара пользователя
Сообщения: 93
Зарегистрирован: Чт апр 26, 2012 14:30:40
Откуда: под Москвой

Сообщение _dark »

vitalik_1984 писал(а):насколько я знаю он больше тут не живет.у него свой сайт.ищите там.в коте последнее сообщение в 2011году.
Понятно... ну мы и сам с усами, с WINAVR разобрался.

1.Объявляем в опциях проекта сегмент XRAM: Memory Type = Sram, Name = xdata, Address = 0x802000
2.Указываем для переменных (массива):
volatile UCHAR Buf[257] __attribute__ ((section ("хdata")));

...
Открыл глаза
Сообщения: 53
Зарегистрирован: Пт май 13, 2011 21:16:40
Откуда: НИЖЕГОРОДСКАЯ ОБЛ

Сообщение maxpetr1993 »

доброго времени суток)нужна помощь по pgmspace.h,а то скоро разобью голову об стол(((
итак: есть массив в отдельном файле font1.h
const uint8_t sym[256][8] PROGMEM =
{
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
{0x7E,0x81,0xA5,0x81,0xBD,0x99,0x81,0x7E},бла бла бла...
соответственно пытаюсь из него выдергивать значения...
temp4=PGM_READ_BYTE (&sym

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

[temp3]);
соотвнтственно есть инклуде #include "font1.h" что еще ему нужно!!!?)))спасите хелп!!!постоянно говорит 
 undefined reference to `PGM_READ_BYTE'
Встал на лапы
Сообщения: 106
Зарегистрирован: Пн мар 26, 2012 05:25:06

Сообщение Совесть »

pgm_read_byte
Открыл глаза
Сообщения: 53
Зарегистрирован: Пт май 13, 2011 21:16:40
Откуда: НИЖЕГОРОДСКАЯ ОБЛ

Сообщение maxpetr1993 »

чувак ты где живёш? куда тебе ящик пива отпрвить!!!?))
Встал на лапы
Аватара пользователя
Сообщения: 93
Зарегистрирован: Чт апр 26, 2012 14:30:40
Откуда: под Москвой

Сообщение _dark »

Прошу помощи у знатаков WinAVR

Задача:
- разместить в XRAM несколько длинных массивов, оставив все остальное во внутренней RAM Mega128A
(во внутренней памяти программа работает, но массивы укорочены).

Что делаю:
1)
- в оболочке WinAVR указываю доп. сегмент .xdata 0x802000
- переопределяю размещение массивов (размерность сокращена)
volatile UCHAR BufAdc1[281] __attribute__ ((section (".xdata")));
volatile UINT BufAdc2[281] __attribute__ ((section (".xdata")));
volatile UINT BufAdc3[281] __attribute__ ((section (".xdata")));
- разрешаю работу XRAM (тайменги и конфиг. XRAM сути не меняют, но привожу)
MCUCR = (1<<SRE) | (0<<SRW10);
XMCRA = (0<<SRL2) | (0<<SRL1) | (0<<SRL0) | (0<<SRW01) | (0<<SRW00) | (0<<SRW11);
XMCRB = (0<<XMBK) | (0<<XMM2) | (0<<XMM1) | (0<<XMM0);
*.map Размещение:
.xdata 0x00802000 0x57d Variables.o
0x00802000 BufAdc1
0x00802119 BufAdc2
0x0080234b BufAdc3

Это работает!

2)
Увеличиваю размерность одного массива до нужного (в *.h как extern естественно тоже), остальное без изменений.
volatile UCHAR BufAdc1[1281] __attribute__ ((section (".xdata")));
Размещение:
.xdata 0x00802000 0x965 variables.o
0x00802000 BufAdc1
0x00802501 BufAdc2
0x00802733 BufAdc3

Не работает, точнее слетает связь по UART!
Смотрю по map - все остальные переменные находятся на своих местах, т.е. не менялись...
Эти массивы в работе UART при ответах естественно не участвуют.

Портится глобальный флаг готовности буфера приема UART объявленный как
volatile uint8_t fCmdComplite = 0;
прерывание его выставляет = "1", но где то он портится в "0" и в main() он уже "0"...

- свои "сбросы" этого флага убрал...
- его положение сместил в .bss (0x00800248 fCmdComplite)
не помогает... т.е. похоже, что дело не в наезде памяти... (оптимизация Os)

...Похоже это косяки WinAVR, при оптимизации -О2 удалось "довести" массивы до 768 единиц!

Но ряд глюков остался (не читаются отдельные переменные по запросам UART),
т.е. "портятся" другие места, точнее код оптимизируеся неправильно и программа становится нестабильной...

Но так быть не должно! Шаманство какое-то!!!

В чем может быть косяк?
Кто нибудь знает как с ним бороться?
Очень прошу пнуть в нужном направлении, можно сильно!

Mega128A + SRAM, WinAVR + AVR Studio 4.18 (поставил 4.19 + AVRToolchain - таже проблемма)
Ответить

Вернуться в «AVR»