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

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

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

Сообщение Goldsmith »

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

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

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

Сообщение sergeys »

Дописал так:

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

unsigned char hextobcd(unsigned char sec)

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

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

Сообщение HHIMERA »

sergeys писал(а):Я что-то думал что если переменная уже объявлена глобально, то тут не надо тип указывать.

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

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

Сообщение sergeys »

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

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

Сообщение 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% коктейля "Рекурсивный"...
metcenger
Открыл глаза
Сообщения: 59
Зарегистрирован: Ср ноя 17, 2010 01:03:44

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

Сообщение metcenger »

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

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

Сообщение vitalik_1984 »

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

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

Сообщение 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
Аватара пользователя
shads
Опытный кот
Сообщения: 882
Зарегистрирован: Ср фев 22, 2012 01:25:21

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

Сообщение shads »

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

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

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

   for (unsigned char i=0; i<8; i++) {.....}

А в некоторых проектах компиль ругается, и приходится писать вот так:

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

   unsigned char i;   
   for(i=0; i<8; i++) {.....}

От чего это зависит???? Мож настроечки какие пошевелить.....
codenamehawk
Вымогатель припоя
Сообщения: 528
Зарегистрирован: Вт фев 09, 2010 17:52:26

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

Сообщение 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
vanyap1
Электрический кот
Сообщения: 1048
Зарегистрирован: Пт июл 30, 2010 11:49:03
Откуда: Украина
Контактная информация:

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

Сообщение vanyap1 »

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

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

Сообщение a_skr »

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

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

Сообщение vanyap1 »

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

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

Сообщение a_skr »

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

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

Сообщение vanyap1 »

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

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

Сообщение 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

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

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

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

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

Сообщение unalex »

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

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

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

Сообщение 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

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

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

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»