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

Обсуждаем контроллеры компании Atmel.
Ответить
Родился
Аватара пользователя
Сообщения: 16
Зарегистрирован: Ср май 26, 2010 13:48:40

Сообщение VasaShmidt »

ARV писал(а):в результате программа теряет основное качество хорошо написанной программы: портируемость.
Аргумент, с которым не поспоришь... Не учла...
Реклама
Опытный кот
Аватара пользователя
Сообщения: 842
Зарегистрирован: Чт дек 31, 2009 19:27:45
Откуда: Бровари, Україна

Сообщение avreal »

Ну я там кое-чего нацарапал на тему секций в GCC.
Если кому непонятен текст, то смотрите исходники в приложении, там всё должно быть понятно :-)
Последний раз редактировалось avreal Вс май 22, 2011 22:55:07, всего редактировалось 1 раз.
Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.
Контактная информация:
Реклама
Нашел транзистор. Понюхал.
Аватара пользователя
Сообщения: 190
Зарегистрирован: Вт янв 26, 2010 21:49:41
Откуда: モスクワ

Сообщение Zwanzig »

Решил пересесть с асма на Си, и вылезла тут непонятная ошибка :) Подключаю я util/delay.h, а компилятор ругается и выдаёт сразу три варнинга:

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

c:/winavr-20100110/lib/gcc/../../avr/include/util/delay.h:113: error: expected expression before '=' token
c:/winavr-20100110/lib/gcc/../../avr/include/util/delay.h:123: error: expected expression before '=' token
c:/winavr-20100110/lib/gcc/../../avr/include/util/delay.h:151: error: expected expression before '=' token
:?
Что такое? В delay.h посмотрел, там всё правильно в плане синтаксиса, да и неужто в заголовочном файле ошибки будут?
Нашел транзистор. Понюхал.
Аватара пользователя
Сообщения: 190
Зарегистрирован: Вт янв 26, 2010 21:49:41
Откуда: モスクワ

Сообщение Zwanzig »

Ахах, вопрос закрыт, я идиот :))) Написал #define F_CPU = 8000000L
Реклама
Эиком - электронные компоненты и радиодетали
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1116
Зарегистрирован: Чт окт 15, 2009 14:16:18
Откуда: Екб

Сообщение AI_Disable »

Подскажите, что за ворны вылезают на функцию strncat(buff,temp_buff,4);

../main.c:254: warning: implicit declaration of function 'strncat'
../main.c:254: warning: incompatible implicit declaration of built-in function 'strncat'

buff и temp_buff объявлены так:
char buff[10],temp_buff[10];

PS: всё работает как надо: к строке buff присоединяются первые 4 символа temp_buff.
Контактная информация:
Реклама
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город

Сообщение Мастер Ломастер »

AI_Disable писал(а):Подскажите, что за ворны вылезают на функцию strncat(buff,temp_buff,4);

../main.c:254: warning: implicit declaration of function 'strncat'
../main.c:254: warning: incompatible implicit declaration of built-in function 'strncat'

buff и temp_buff объявлены так:
char buff[10],temp_buff[10];

PS: всё работает как надо: к строке buff присоединяются первые 4 символа temp_buff.
#include <string.h> присутствует?
битва с дураками проиграна, победители торжествуют. слава победителям!
Контактная информация:
Реклама
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1116
Зарегистрирован: Чт окт 15, 2009 14:16:18
Откуда: Екб

Сообщение AI_Disable »

Мастер Ломастер, вы правы, данный инклюд отсутствовал, благодарю. Как же оно тогда работало... :roll: :)
Контактная информация:
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город

Сообщение Мастер Ломастер »

AI_Disable писал(а):Мастер Ломастер, вы правы, данный инклюд отсутствовал, благодарю. Как же оно тогда работало... :roll: :)
линкер по умолчанию подключает системные библиотеки, поэтому файлы собираются без проблем. а вот компилятору не нравится, что в проекте нет определений функций - вот и варнинг
битва с дураками проиграна, победители торжествуют. слава победителям!
Контактная информация:
Прорезались зубы
Аватара пользователя
Сообщения: 221
Зарегистрирован: Сб апр 25, 2009 14:29:05

Сообщение Savelek »

Здравствуйте! Пишу на GCC, интегрированном в AVR Studio.
Есть функция:

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

#define IR8_data 1
#define IR8_clk 0
#define IR8_PORT PORTC
#define IR8_DDR DDRC
...
void ir8wword(unsigned char byte0,unsigned char byte1)
{
	ir8_byte0=byte0;
	ir8_byte1=byte1; 
	unsigned char a,b,c;
	b=byte0;
	for(a=2;a>0;a--)
	{
		for(c=8;c>0;c--)
		{
			if((b & (0b10000000))==0) {IR8_PORT&=~(1<<IR8_data);}
			else {IR8_PORT|=1<<IR8_data;}//копирование 0 бита b в PORTC
			IR8_PORT|=1<<IR8_clk;//подача тактового импульса
			asm(
			"nop\n\t"
			"nop\n\t"
			"nop\n\t");
			IR8_PORT&=~(1<<IR8_clk);
			b<<=1;//сдвиг b влево на 1
			}
		b=byte1;
	}
}
Она выводит в два последовательно соединенные сдвиговые регистры ИР8 byte0 и byte1. Таким образом, сначала отсылается byte0, а затем byte1, и в конце выполнения функции в последнем регистре оказывается byte0, а в первом(в том, который и подключен к контроллеру) byte1. Функция работает нормально только если седьмой бит byte1 равен лог.1. Иначе, если седьмой бит byte1 равен лог.0, то в первом регистре ИР8 везде будут нули, независимо от состояния byte0. В общем, как-то так:
  • Левый столбик - то, как вызвана функция, правый столбик - результат на выходе регистров
    ir8wword(0xXX,0b1YYYYYYY); 0b1YYYYYYY 0xXX
    ir8wword(0xXX,0b0YYYYYYY); 0b0YYYYYYY 0x00
Вообще понять не могу, как седьмой бит byte1 может влиять на остальные биты информации, ведь 7-й бит byte1 выгружается самым последним и по логике никак не может повлиять на уже выгруженную информацию byte0. :dont_know:
Пожалуйста, помогите.
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город

Сообщение Мастер Ломастер »

вот тут ARV давал совет про SPI: http://radiokot.ru/forum/viewtopic.php?p=643101#p643101
тоже последовательный вывод 1 байта. а вывод двух байтов делается повторным обращением к функции:

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

void sendword(unsigned int w){
   sendbyte(w & 0xFF); // младший байт
   sendbyte(w >> 8); // старший байт
}
а вы что-то намудрили...
битва с дураками проиграна, победители торжествуют. слава победителям!
Контактная информация:
Прорезались зубы
Аватара пользователя
Сообщения: 221
Зарегистрирован: Сб апр 25, 2009 14:29:05

Сообщение Savelek »

У меня написано тоже самое, только в одну функцию объединен вывод сразу двух байт, и WinAvr, видимо, не поддерживает точный синтаксис обращения к какому-то разряду байта.
Ошибка оказалась самая идиотская: забыл провести дорожку питания в 14-й ноге микросхемы (+ питания). Как она вообще функционировала?... Причем там полигон питания +5Вольт находился ну прям в миллиметре от этой ножки микросхемы, просто я забыл добавить эту дорожку при редактировании печатной платы. :oops: А ведь печатная плата была изготовлена месяц назад и прошла проверку...
Вывод: пора переходить со SprintLayout на что-то посерьезнее.
Открыл глаза
Аватара пользователя
Сообщения: 70
Зарегистрирован: Вт сен 14, 2010 14:40:55
Откуда: Оттуда

Сообщение Bismark »

Всем доброго времени суток!
Возник такой вопрос...
Разбирал я по обучалке Динамический опрос клавиатуры, но вот приспичило мне изучить в данном направлении не ассемблер, а С :)
Собственно, я пробовал приведенный там пример переписать на С, но столкнулся с проблемой - как можно из переменной типа char прочитать конкретный бит???
Есть ли для этого какие-то готовые функции языка? Или как вообще это можно сделать??

З.Ы. нашел в инете такой вариант:
struct BITS
{
bool b1 :1;
bool b2 :1;
bool b3 :1;
bool b4 :1;
bool b5 :1;
bool b6 :1;
bool b7 :1;
bool b8 :1;
};

void myfunction()
{
char cByteRead;
BITS b;

cByteRead = 'a';

cout << "The full byte has a meaning of...: " << cByteRead << endl;
cout << "...which is in int:" << (int)cByteRead << endl;

b = *(BITS*)(&cByteRead);
cout << b.b1 << endl;
cout << b.b2 << endl;
cout << b.b3 << endl;
cout << b.b4 << endl;
cout << b.b5 << endl;
cout << b.b6 << endl;
cout << b.b7 << endl;
cout << b.b8 << endl;
}
Хоть и для С++, но это не столь важно. Другая проблема в том, что как по мне, то для МК этот код как-то слишком уж обьемный... А попроще можно ли это реализовать?
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город

Сообщение Мастер Ломастер »

круто... битовые поля, С++ - это вы знаете, а простейшие битовые операции операции - не знаете...

проверка 3-го бита (начиная с 0-го!) в байте if(byte & (1 << 3)){...} об этом писалось уже мульён раз
битва с дураками проиграна, победители торжествуют. слава победителям!
Контактная информация:
Открыл глаза
Аватара пользователя
Сообщения: 70
Зарегистрирован: Вт сен 14, 2010 14:40:55
Откуда: Оттуда

Сообщение Bismark »

Мастер Ломастер писал(а):круто... битовые поля, С++ - это вы знаете, а простейшие битовые операции операции - не знаете...

проверка 3-го бита (начиная с 0-го!) в байте if(byte & (1 << 3)){...} об этом писалось уже мульён раз
Обалдеть... Ну да, протупил :oops: :)))
Просто подобная конструкция описана для проверки битов непосредственно в регистре порта, но я не подумал что таким же образом можно проверить и просто байт...

Спасибо за помощь!
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город

Сообщение Мастер Ломастер »

Bismark писал(а):Просто подобная конструкция описана для проверки битов непосредственно в регистре порта, но я не подумал что таким же образом можно проверить и просто байт...
а в чем разница-то? порт или байт: это все равно для Си - просто переменные...
битва с дураками проиграна, победители торжествуют. слава победителям!
Контактная информация:
Открыл глаза
Аватара пользователя
Сообщения: 70
Зарегистрирован: Вт сен 14, 2010 14:40:55
Откуда: Оттуда

Сообщение Bismark »

Мастер Ломастер писал(а):а в чем разница-то? порт или байт: это все равно для Си - просто переменные...
Ну вот этого как раз я и не учел...
Думал что регистр для WinAVR - это что-то особенное, а не просто однобайтовая переменная :)

Еще раз спасибо!
Родился
Сообщения: 3
Зарегистрирован: Пт июн 03, 2011 17:14:24

Сообщение maxmihan »

День добрый, я здесь новый.
Есть вопрос по программированию в WinAVR, gcc-avr (?) компилятор.

Есть например функция
uint8_t UART0_PrintString( uint8_t * string)

Однако при компиляции строки UART0_PrintString("Preved") выдается warning
pointer targets in passing argument 1 of 'UART0_PrintString' differ in signedness

Если объявить как
uint8_t UART0_PrintString( const char * string)
то ругаться начинает на UART0_PrintString( var_preved ), константная строка понятно проходит

Что мне теперь 2 дублирующие функции объявлять что-ли?

Параметры компилятора
vr-gcc -c -mmcu=atmega64 -I. -gdwarf-2 -DF_CPU=8000000UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=./fat32.lst -std=gnu99 -MMD -MP -MF .dep/fat32.o.d fat32.c -o fat32.o fat32.c
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18678
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

формально char это не uint8_t вот и все. мне кажется, объявив с параметром char* вы избавитесь от варнинга. и следует уточнить. как у вас определена переменная var_preved - возможно, проблема именно в ней.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Родился
Сообщения: 3
Зарегистрирован: Пт июн 03, 2011 17:14:24

Сообщение maxmihan »

объявил.
константная строка проходит без ошибки, вариант с переменной выдает предупреждение
переменная объявлена допустим как uint8_t aux_name[10]
при объявлении ее как char aux_name[10] компиляция проходит без предупреждений, однако придется поковырять пару функций, где она еще используется.
Короче, похоже можно все сделать без ошибок, но все как то переусложнено.
Речь ведь идет просто про byte. Надеюсь программа после этого не перестанет работать.
Прорезались зубы
Сообщения: 221
Зарегистрирован: Вс янв 23, 2011 21:51:12

Сообщение Ar-Gen-Tum »

maxmihan писал(а): ...
Речь ведь идет просто про byte. Надеюсь программа после этого не перестанет работать.
Смотрите: сюды
Нетути в С типа byte. (Можно лишь определить #typedef unsigned char byte)
Ответить

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