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

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
IM1
Грызет канифоль
Сообщения: 268
Зарегистрирован: Вт фев 16, 2010 12:10:38
Откуда: Воронеж, Россия

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

Сообщение IM1 »

Аlex писал(а):Ну если макросы sbi и cbi определены, то почему бы этому не работать ?
Ну, если бы у бабушки был...
С другой стороны согласен, а с третьей: если CHECKBIT(x,y) определили, то и пару строчек о sbi() и cbi() можно было черкнуть.
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

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

Сообщение Аlex »

IM1 писал(а):пару строчек о sbi() и cbi() можно было черкнуть.
Ну, если бабушке всё рассказать и всему научить, то ей и дедушка не понадобиться :)))
А так, согласен, новичка эти слова могут ввести в ступор. Можно было и описать их в примере.
Хотя, с другой стороны, - http://yandex.ru/yandsearch?clid=9582&t ... 8+cbi&lr=5 :) Это я к тому, что людей иногда нужно заставлять шевелить мозгом :)
Аватара пользователя
Kavka
Мудрый кот
Сообщения: 1810
Зарегистрирован: Чт июн 10, 2010 08:55:35
Откуда: Сибирские Афины

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

Сообщение Kavka »

Да что далеко ходить :))) viewtopic.php?p=1576663#p1576663
Там чуть подругому, но тоже в тему.
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Аватара пользователя
uni
Встал на лапы
Сообщения: 137
Зарегистрирован: Пт дек 07, 2007 11:17:40
Откуда: г. Екатеринбург
Контактная информация:

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

Сообщение uni »

Я просто к ним настолько привык, что считаю стандартными в отличие от макроса проверки бита. Уже сам не помню где они определены. Вот мой джентельменский набор: Defines.h.

В WinAVR-20100110 они определены в deprecated.h:

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

/**
   \ingroup deprecated_items
   \def sbi(port, bit)
   \deprecated

   Set \c bit in IO port \c port.
*/
#define sbi(port, bit) (port) |= (1 << (bit))

/**
   \ingroup deprecated_items
   \def cbi(port, bit)
   \deprecated

   Clear \c bit in IO port \c port.
*/
#define cbi(port, bit) (port) &= ~(1 << (bit))

Т.е. пользоваться ими не рекомендуется, но они стандартные, т.к. определены в библиотеке. Вообще, следует просматривать иногда эти заголовочники, чтобы не изобретать велосипедов.
Россия навсегда!
Аватара пользователя
IM1
Грызет канифоль
Сообщения: 268
Зарегистрирован: Вт фев 16, 2010 12:10:38
Откуда: Воронеж, Россия

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

Сообщение IM1 »

uni писал(а):Т.е. пользоваться ими не рекомендуется, но они стандартные, т.к. определены в библиотеке. Вообще, следует просматривать иногда эти заголовочники, чтобы не изобретать велосипедов.
А Atmel Studio посылает очень далеко с такими конструкциями.
Вообще то это дело вкуса, я например, предпочитаю лишний раз написать типа (port) |= (1 << (bit)) или (port) &= ~(1 << (bit)) непосредственно в тексте, просто и понятно.
Аватара пользователя
uni
Встал на лапы
Сообщения: 137
Зарегистрирован: Пт дек 07, 2007 11:17:40
Откуда: г. Екатеринбург
Контактная информация:

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

Сообщение uni »

Может вы просто не умеете её готовить?
\Atmel Toolchain\AVR8 GCC\Native\3.4.2.939\avr8-gnu-toolchain\avr\include\compat\deprecated.h - вот тут они находятся. Нужно лишь правильно подключить заголовочники:

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

#include <compat/deprecated.h>
Россия навсегда!
Аватара пользователя
IM1
Грызет канифоль
Сообщения: 268
Зарегистрирован: Вт фев 16, 2010 12:10:38
Откуда: Воронеж, Россия

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

Сообщение IM1 »

uni писал(а):Может вы просто не умеете её готовить?
Готовить умею, просто не люблю. Посмотрел папку, да уж, круто, аж 2005г. макросы! Ради несчастных sbi - cbi...
Уже писал, что дело вкуса и привычки. В стандарте нет, значит нет, а макрос можно любой склепать.
Аватара пользователя
uni
Встал на лапы
Сообщения: 137
Зарегистрирован: Пт дек 07, 2007 11:17:40
Откуда: г. Екатеринбург
Контактная информация:

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

Сообщение uni »

IM1 писал(а):
uni писал(а):Может вы просто не умеете её готовить?
Готовить умею, просто не люблю. Посмотрел папку, да уж, круто, аж 2005г. макросы! Ради несчастных sbi - cbi...
Уже писал, что дело вкуса и привычки. В стандарте нет, значит нет, а макрос можно любой склепать.

А что за стандарт такой? PROGMEM и работа с флеш там тоже есть, а с EEPROM? Если есть, то и sbi() и cbi() точно совершенно также. Тут вам не ПК. Если когда-нить решитесь озаботиться изучением ассемблера AVR, то обратите внимание на инструкции SBI и CBI и подумайте почему макросы так названы. Люди, которые изучали AVR с низу, не будут иметь проблем с пониманием этих команд и макросов.
Россия навсегда!
TICLIR
Встал на лапы
Сообщения: 134
Зарегистрирован: Вс авг 01, 2010 16:05:25

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

Сообщение TICLIR »

Доброго всем времени суток, объясните в чём дело
void slojim_str(char* sdc){
fg=sizeof(sdc);
...................
..................
................}

slojim_str(read_SMS);

При таком построении кода функция sizeof выдаёт неправельный результат,
и как это исправить?
a_skr
Вымогатель припоя
Сообщения: 630
Зарегистрирован: Пн июн 14, 2010 13:07:29
Откуда: Жуковский

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

Сообщение a_skr »

Наверное, нужна длина строки (см. strlen), а не размер указателя.
TICLIR
Встал на лапы
Сообщения: 134
Зарегистрирован: Вс авг 01, 2010 16:05:25

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

Сообщение TICLIR »

a_skr писал(а):Наверное, нужна длина строки (см. strlen), а не размер указателя.

Вот вот. где то вдалеке я это понимаю, вот как бы это по граммотному сделать.
А где смотреть?
Аватара пользователя
IM1
Грызет канифоль
Сообщения: 268
Зарегистрирован: Вт фев 16, 2010 12:10:38
Откуда: Воронеж, Россия

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

Сообщение IM1 »

uni писал(а):А что за стандарт такой?
Вот Вы неугомонный, я же сказал: дело вкуса и делайте, что хотите. Почитайте классику что ли, например K&R.
Сходите по ссылке http://microsin.ru/content/view/629/44/ , там Вам покажут на примерах, что не нужны ненужные макросы, простите за тавтологию.
uni писал(а):Если когда-нить решитесь озаботиться изучением ассемблера AVR, то обратите внимание на инструкции SBI и CBI и подумайте почему макросы так названы.
Здорово Вы меня приложили. У меня тоже была мысль, что в Вас бродит ностальгия по ассемблеру, раз так рьяно используете названия его команд. Но постеснялся написать, чтобы не обидеть.
А по поводу ассемблера, то уже давно озаботился, более того периодически проверяю по дизассемблеру узкие места при оптимизаниции ибо компилятор иногда шибко умничает и выбрасывает куски кода. Ну, можете еще посмотреть в теме "Ассемблер (ASM) для AVR в вопросах и ответах", там я даю фрагменты кода для 1WIRE с разъяснениями.
Ну, вроде бы все обсудили. Успехов :beer:
Аватара пользователя
uni
Встал на лапы
Сообщения: 137
Зарегистрирован: Пт дек 07, 2007 11:17:40
Откуда: г. Екатеринбург
Контактная информация:

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

Сообщение uni »

Послушайте, уважаемый IM1, здесь был конкретный вопрос (прочтите внимательно его, пожалуйста):
kapitaneo писал(а):Помогите разобраться
Как присвоить значение с ноги одного порта на ногу другого?
В Codevisione все просто PORTC.1=PINB.2;
А как в WINAVre
Я уже голову сломал, гуглин нифига.

Спасибо, заранее.

Я дал на него исчерпывающий ответ, а вы ДВА раза не смогли понять как заставить его работать!
IM1 писал(а):
uni писал(а):

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

#define CHECKBIT(x,y) ((x) & (1<<(y)))
CHECKBIT( PINB, 2 ) ? sbi( PORTC, 1 ) : cbi( PORTC, 1 );
И, что, прям ЭТО работает в GCC? :shock:

IM1 писал(а):
uni писал(а):Т.е. пользоваться ими не рекомендуется, но они стандартные, т.к. определены в библиотеке. Вообще, следует просматривать иногда эти заголовочники, чтобы не изобретать велосипедов.
А Atmel Studio посылает очень далеко с такими конструкциями.

Так что кого вы тут учите? Садитесь за букварь и изучайте инструментальные средства, которыми пользуетесь, угомонитель вы наш.
Россия навсегда!
Аватара пользователя
uni
Встал на лапы
Сообщения: 137
Зарегистрирован: Пт дек 07, 2007 11:17:40
Откуда: г. Екатеринбург
Контактная информация:

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

Сообщение uni »

TICLIR писал(а):
a_skr писал(а):Наверное, нужна длина строки (см. strlen), а не размер указателя.

Вот вот. где то вдалеке я это понимаю, вот как бы это по граммотному сделать.
А где смотреть?

sizeof() - это не совсем функция, скорее это оператор типа +, -, * и т.д. только унарный, т.е. с одним операндом. Так вот, этот оператор возвращает размер типа в байтах. Если тип - указатель, то выражение sizeof(указатель) можно считать константой, т.к. компилятору это известно на момент компиляции. Если операнд - массив, то выражение sizeof(массив) - вернёт размер массива в байтах, короче говоря, sizeof() используется, когда нужно указать размер объекта в байтах, и, если это известно на момент компиляции программы.

Если нам нужен размер строки, которая передаётся не через буфер с известным размером, а через указатель на область памяти, то нужно использовать функции работы со строками. Именно функции, т.к. они работают уже во время выполнения программы, когда размер строки не известен, и высчитывают этот размер по указателю на неё в памяти. Т.е. функция strlen() будет перебирать символы с начала строки до встречи с символом завершения '\0' - нулевым байтом, поэтому такие строки называются ASCIIZ, где ASCII - это кодовая таблица (стандарт), а Z - это Zero (ноль) на конце такой строки.

Смотреть можно в заголовочнике string.h, выбирая оттуда имена функций и вставляя их в строку поиска Google.
Россия навсегда!
Аватара пользователя
IM1
Грызет канифоль
Сообщения: 268
Зарегистрирован: Вт фев 16, 2010 12:10:38
Откуда: Воронеж, Россия

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

Сообщение IM1 »

uni писал(а):Так что кого вы тут учите? Садитесь за букварь и изучайте инструментальные средства, которыми пользуетесь, угомонитель вы наш.
Все обидеть норовите?
Тема была закрыта сразу мной с Alexом в связи с взаимным согласием, что макросы надо было описать, если используете таковые, а не пугать начинающих.
Аlex писал(а):А так, согласен, новичка эти слова могут ввести в ступор. Можно было и описать их в примере.
Не надо нести чушь на пустом месте, - есть правила, есть стандарты. Например, Вы же не ездите по левой стороне и не ходите голым по улице?
Про асм Вы уже не? Что еще мне изучить? Если можно, то со ссылками. А я могу посоветовать http://avr-libc.narod.ru/group__avr__sfr.html Цитата оттуда: "В новых версиях компилятора инструкции манипуляций с битами - sbi/cbi больше не поддерживаются". Может мне станцевать для доходчивости?
Аватара пользователя
uni
Встал на лапы
Сообщения: 137
Зарегистрирован: Пт дек 07, 2007 11:17:40
Откуда: г. Екатеринбург
Контактная информация:

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

Сообщение uni »

IM1, я вам про стандарты уже написал, вы мимо ушей пропустили. Где в ваших стандартах "стандартная" работа с Flash и Eeprom? Может ещё цитату из K&R приведёте? Не может быть гнутый компилятор полностью "стандартным", т.к. архитектура AVR этого не позволяет. Поэтому есть два компилятора: iar cc и gnu cc. Они только частично совместимы, хотя оба пользуются вашими т.н. "стандартами". Что могут от них, то используют, а что не могут - тут уж извините... спускайтесь с небес на Землю.

Инструментарий манипуляции с битами на мк не может не поддерживаться в компиляторе для мк. Это нонсенс, ибо кто будет изменять состояние порта (!), если нужно поменять состояние его бита? Здравый смысл у вас есть? В каком-то ином виде, но пройти мимо инструкций мк манипулирующих битами не получится, ибо вредить самим себе никто не будет. Ещё раз повторяю, если вы пользуетесь PROGMEM'ом или другим его аналогом для указания адреса во Flash или то же с Eeprom, то не говорите мне про какие-то там стандарты. Это нехорошо. Есть компилятор, есть заголовчники к нему. Хотите, чтобы ваши исходники компилировались от одной версии к другой? Тогда используйте только те конструкции, которые определены в этих самых библиотечных заголовочниках, либо пишите конструкции, производные от них. Это и есть и правила, и стандарты для практиков, а не теоретиков чистого Си на гарвардской архитектуре.
Россия навсегда!
TICLIR
Встал на лапы
Сообщения: 134
Зарегистрирован: Вс авг 01, 2010 16:05:25

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

Сообщение TICLIR »

CПасибо uni за подробное объяснение.
Помогите вот с этим:
while(!(PINA&0x10));
Компилятор игнорирует этот код,сразу скажу что внеш прерывания все
в дальнейшем будут использоваться. Стоит мне добавить:
volatile unsigned char tt;
-
-
while(!(PINA&0x10)){
tt++;
}
безполезное "tt++" как всё работает. И что мне сделать, оставить tt++, или как то по другому можно решить вопрос?
a_skr
Вымогатель припоя
Сообщения: 630
Зарегистрирован: Пн июн 14, 2010 13:07:29
Откуда: Жуковский

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

Сообщение a_skr »

Не игнорирует:

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

00000034 <main>:
#include <avr/io.h>

int main(void)
{
  while(!(PINA&0x10));
  34:   cc 9b          sbis   0x19, 4   ; 25
  36:   fe cf          rjmp   .-4         ; 0x34 <main>
}
  38:   80 e0          ldi   r24, 0x00   ; 0
  3a:   90 e0          ldi   r25, 0x00   ; 0
  3c:   08 95          ret
TICLIR
Встал на лапы
Сообщения: 134
Зарегистрирован: Вс авг 01, 2010 16:05:25

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

Сообщение TICLIR »

a_skr писал(а):Не игнорирует:

Спасибо, а если вот так
while(strcmp(sms_ka,">"));
как быть в таком случае, оч надо.
a_skr
Вымогатель припоя
Сообщения: 630
Зарегистрирован: Пн июн 14, 2010 13:07:29
Откуда: Жуковский

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

Сообщение a_skr »

Что не работает-то???
Ответить

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