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

Обсуждаем контроллеры компании Atmel.
Ответить
Опытный кот
Аватара пользователя
Сообщения: 736
Зарегистрирован: Пн янв 10, 2011 03:06:36
Откуда: Ростов-на-Дону

Сообщение Goldsmith »

sergeys писал(а):Значит warning такой: type of 'sec' defaults to 'int'. Это он предлагает поменять тип переменной sec на int? Зачем?
Компилятор предупреждает, что, поскольку тип формального параметра функции hextobcd явно не указан, по умолчанию он принимается int.

Разберитесь как следует с формальными параметрами и фактическими аргументами функций в языке C.
Любой дурак может писать код. Настоящий профессионал - это тот, кто способен постоянно создавать продукт высокого качества, укладываясь при этом в бюджет.
J. Ganssle
Контактная информация:
Реклама
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 1946
Зарегистрирован: Сб сен 11, 2010 13:45:01
Откуда: Екатеринбург

Сообщение sergeys »

Дописал так:

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

unsigned char hextobcd(unsigned char sec)
работает! Я что-то думал что если переменная уже объявлена глобально, то тут не надо тип указывать.
А теперь еще одна проблема:
вызываю функцию hextobcd так: hextobcd(sec, sec1); т.е. с 2 аргументами, в описании соответсвенно тоже 2. А компилятор мне говорит, что слишком много аргументов для функции: too many arguments to function 'hextobcd'. Что-то я нигде не видел, что больше 1 аргумента нельзя
Ко мне можно на "ты", так даже лучше!
Реклама
Друг Кота
Сообщения: 4583
Зарегистрирован: Вс дек 05, 2010 06:10:34
Откуда: ЮВ

Сообщение HHIMERA »

sergeys писал(а):Я что-то думал что если переменная уже объявлена глобально, то тут не надо тип указывать.
Вы путаете переменную с аргументом функции... а это разные вещи...
Почитайте K&R... прямо сейчас... не откладывая...
"Я не даю готовых решений, я заставляю думать!"(С)
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 1946
Зарегистрирован: Сб сен 11, 2010 13:45:01
Откуда: Екатеринбург

Сообщение sergeys »

А, так и есть, путаю, поэтому писал:
unsigned char hextobcd(unsigned char sec, sec1) и компилятор ругался, что много аргументов, оказывается надо так:
unsigned char hextobcd(unsigned char sec, unsigned char sec1), так все работает!
Goldsmith, HHIMERA, спасибо за помощь!
Ко мне можно на "ты", так даже лучше!
Реклама
Эиком - электронные компоненты и радиодетали
Мучитель микросхем
Аватара пользователя
Сообщения: 424
Зарегистрирован: Сб авг 25, 2007 22:02:05
Откуда: Германия, Viernheim

Сообщение unalex »

sergeys писал(а):оказывается надо так:
unsigned char hextobcd(unsigned char sec, unsigned char sec1), так все работает!
Goldsmith, HHIMERA, спасибо за помощь!

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

int sum(int op1, int op2);	//объявление функции(прототип функции)
	/*
	заголовок функции(без тела)
	причем указаны типы аргументов и тип возвращаемого значения
	имена аргументов можно опустить, т.е написать
	int sum(int, int)
	*/

int main()
{
	int a=2, b=3, c;
	
	c = sum(a, b)	//вызов функции (переменной c присвоится результат выполнения функции)
		/*
		типы аргументов, и тип возвращаемого значения указывать не нужно
		*/
}

int sum(int op1, int op2)	//определение функции
	/*
	в заголовке указываются все типы аргументов и тип возвращаемого значения
	кроме заголовка имеется тело функции
	*/
{
	int result;
	result = op1 + op2;
	return result //return возвращает результат(это может быть число, переменная или выражение)
}
Коктейль "Рекурсивный": 20% спирта, 30% воды, 50% коктейля "Рекурсивный"...
Реклама
Открыл глаза
Сообщения: 59
Зарегистрирован: Ср ноя 17, 2010 01:03:44

Сообщение metcenger »

подскажите аналог ИАРовской начальной инициализации low_level_init в WINavr?
Реклама
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень

Сообщение vitalik_1984 »

Знать бы о чем речь идет, не все же в IARе шарят.
Может скажете точнее тех задание что вам нужно, чтобы мы не гадали о чем речь?
Контактная информация:
Открыл глаза
Сообщения: 59
Зарегистрирован: Ср ноя 17, 2010 01:03:44

Сообщение metcenger »

разобрался:

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

__attribute__ ((naked))     __attribute__ ((section (".init3"))) void __low_level_init (void) {

        TCCR1B= (1<<WGM12) | (0<<CS12) | (0<<CS11) | (1<<CS10); //CTC mode, no prescaling
        TIMSK = (1<<OCIE1A);   //for counter 0 and counter 1 (1<<TICIE1)
        OCR1A= (OSC / 1000);

        PORTB = (0<<7)|(0<<6)|(0<<5)|(0<<4)|(0<<3)|(0<<2)|(0<<1)|(0<<0);      
меня интересовало это- первоначальная инициализация ножек и прочего в GCC
Опытный кот
Аватара пользователя
Сообщения: 882
Зарегистрирован: Ср фев 22, 2012 01:25:21

Сообщение shads »

Драсьте.....

Подскажите, почему в некоторых проектах, вот такое выражение нормально проходит

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

	for (unsigned char i=0; i<8; i++) {.....}
А в некоторых проектах компиль ругается, и приходится писать вот так:

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

	unsigned char i;	
	for(i=0; i<8; i++) {.....}
От чего это зависит???? Мож настроечки какие пошевелить.....
Вымогатель припоя
Сообщения: 541
Зарегистрирован: Вт фев 09, 2010 17:52:26

Сообщение codenamehawk »

Зависит от стандарта языка С

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

# Compiler flag to set the C Standard level.
#     c89   = "ANSI" C
#     gnu89 = c89 plus GCC extensions
#     c99   = ISO C99 standard (not yet fully implemented)
#     gnu99 = c99 plus GCC extensions
CSTANDARD = -std=gnu99
Электрический кот
Сообщения: 1048
Зарегистрирован: Пт июл 30, 2010 11:49:03
Откуда: Украина

Сообщение vanyap1 »

Здравствуйте! С наступающими праздниками и НГ!
Подскажите пожалуйста, в чем секрет прошивки Atmega64 по SPI? Все что ниже этого МК прошивается как следует, а этот как будто бы и не подключен к программатору. Программатор - AVR910.
Питание подключено правильно, линии программирования тоже правильно. Тактовый сигнал подавал как с внешнего генератора, так и с кварцевого резонтора. МК новые, пробовал две штуки прошивать.
Контактная информация:
Вымогатель припоя
Сообщения: 630
Зарегистрирован: Пн июн 14, 2010 13:07:29
Откуда: Жуковский

Сообщение a_skr »

"нестандартное" подключение учли?
MOSI = PDI = PE0
MISO = PDO = PE1
SCK = PB1
Электрический кот
Сообщения: 1048
Зарегистрирован: Пт июл 30, 2010 11:49:03
Откуда: Украина

Сообщение vanyap1 »

Уже попробовал, ничего не выходит. У меги128 та же проблема? или у них стандартное подключение?
Контактная информация:
Вымогатель припоя
Сообщения: 630
Зарегистрирован: Пн июн 14, 2010 13:07:29
Откуда: Жуковский

Сообщение a_skr »

у 128-й аналогично.
откройте datasheet: Memory Programming -> SPI Serial Programming Pin Mapping
и нет там никаких проблем ;)
ps. 64-ю не пробовал, а 128-ю спокойно шил через байтбластер+avreal
Электрический кот
Сообщения: 1048
Зарегистрирован: Пт июл 30, 2010 11:49:03
Откуда: Украина

Сообщение vanyap1 »

Спасибо, удалось. А на первый взгляд все правильно подключено было в соответствии с даташитом.
Контактная информация:
Мучитель микросхем
Аватара пользователя
Сообщения: 424
Зарегистрирован: Сб авг 25, 2007 22:02:05
Откуда: Германия, Viernheim

Сообщение unalex »

просветите чайника, будет ли работать мой экспериментальный код?
компилируется без ошибок, но я сомневаюсь что такая штука будет работать правильно
переменная ведь меняется в процессе выполнения программы, а макрос заменит код при компиляции

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

#include<avr/io.h>
#include<util/delay.h>

#define LED(x) x
#define LEDSTATE(bit, val) (val==0)?(PORTA&=~(1<<(bit))):(PORTA|=(1<<(bit)))

int main(void)
{
	DDRA = 0xff;
	unsigned char count = 0;
	while(1)
	{
		LEDSTATE(LED(count), 1);
		count++;
		LEDSTATE(LED(count-1), 0);
		if(count == 8) count = 0;
		_delay_ms(100);
	}
	return 0;
}
Коктейль "Рекурсивный": 20% спирта, 30% воды, 50% коктейля "Рекурсивный"...
Вымогатель припоя
Сообщения: 680
Зарегистрирован: Ср фев 24, 2010 19:16:07

Сообщение ВитГо »

а что вас в этом коде пугает ? будет работать, никуда не денется...
правда какой то странный алгоритм реализуете. точно не нужен еще один delay ? в текущем варианте визуально будет казаться что светодиод всегда потушен.. так как гореть он будет очень и очень короткий промежуток времени.. глазу совершенно не заметный...
Мучитель микросхем
Аватара пользователя
Сообщения: 424
Зарегистрирован: Сб авг 25, 2007 22:02:05
Откуда: Германия, Viernheim

Сообщение unalex »

да дело не в delay, это просто пример

смущает только то что #define выполняет замену текста перед компиляцией, а переменная count меняется во время работы программы
Коктейль "Рекурсивный": 20% спирта, 30% воды, 50% коктейля "Рекурсивный"...
Мучитель микросхем
Аватара пользователя
Сообщения: 424
Зарегистрирован: Сб авг 25, 2007 22:02:05
Откуда: Германия, Viernheim

Сообщение unalex »

ну а чтоб горело как надо, задержку просто перемещу выше

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

#include<avr/io.h>
#include<util/delay.h>

#define LED(x) x
#define LEDSTATE(bit, val) (val==0)?(PORTA&=~(1<<(bit))):(PORTA|=(1<<(bit)))

int main(void)
{
   DDRA = 0xff;
   unsigned char count = 0;
   while(1)
   {
      LEDSTATE(LED(count), 1);
      count++;
      _delay_ms(500);
      LEDSTATE(LED(count-1), 0);
      if(count == 8) count = 0;
      
   }
   return 0;
}
Коктейль "Рекурсивный": 20% спирта, 30% воды, 50% коктейля "Рекурсивный"...
Вымогатель припоя
Сообщения: 680
Зарегистрирован: Ср фев 24, 2010 19:16:07

Сообщение ВитГо »

unalex писал(а):да дело не в delay, это просто пример

смущает только то что #define выполняет замену текста перед компиляцией, а переменная count меняется во время работы программы
и что?

у вас вместо LEDSTATE(LED(count), 1) после препроцессора будет (1==0)?(PORTA&=~(1<<(LED(count)))):(PORTA|=(1<<(LED(count))))

и вместо LEDSTATE(LED(count), 0) будет после препроцессора будет (0==0)?(PORTA&=~(1<<(LED(count)))):(PORTA|=(1<<(LED(count))))

из-за того что результат сравнения можно предсказать заранее то:
-первая строка с оптимизируется в (PORTA|=(1<<(LED(count))))
-вторая строка с оптимизируется в (PORTA&=~(1<<(LED(count))))

#define - это не константа в программе, это строка в тексте программы для компиляции !

при старте компиляции - препроцессором просто происходит замена строк, и потом код программы компилируется..

если в define константа - то компилятор будет использовать это значение как константу, если это код программы (как в вашем случае) - компилятор вставит в нужную часть программы этот код и потом откомпилирует весь листинг программы как программу (прямо масло масленное :-)
Последний раз редактировалось ВитГо Пн янв 21, 2013 06:36:56, всего редактировалось 3 раза.
Ответить

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