Jump to content
Sign in to follow this  
mosfetx

Си для AVR. Пытаюсь разобраться в структуре кода.

Recommended Posts

Всем привет. Снова взялся за Си. Прошлые попытки провалились. Если не найду ответа в гугл или здесь, вопросы буду писать в эту тему

Вопрос в следующем.

#define F_CPU 8000000
#include <avr/io.h>
#include <util/delay.h>

int main(void)
{
	unsigned char i=0;
    DDRD = 0xFF;
	PORTD = 0x00;
    while (1) 
    {
		for ( i=0; i<=7; i++ )
		{
			PORTD = (1<<i);
			_delay_ms(500);
		}
		
		for ( i=0; i<=7; i++ )
		{
			PORTD = ~(1<<i);
			_delay_ms(500);
		}
		
    }
}

Во втором цикле for, как я понимаю должно быть так.в момент входа в цикл PORTD все биты нули. И при выполнении строки PORTD = ~(1<<i); ни чего не должно происходить.

так как запись нуля в ноль ни чего не произойдёт. Но как только доходит до этой строки все биты PORTD выставляются в единицы. И потом начинает тухнуть один светодиод с сдвигом влево.

Объясните пожалуйста почему так. Вроде это побитовые операции, 

 

Edited by mosfetx

Share this post


Link to post
Share on other sites
12 минут назад, mosfetx сказал:

Объясните пожалуйста почему так

i=1  PORTD = ~(1<<1)  в двоичном 00000001 сдвигаем на 1, получаем 00000010, побитово инвертируем, в порт пишется 11111101

i=12 PORTD = ~(1<<2)  в двоичном 00000001 сдвигаем на 2, получаем 00000100, инвертируем, в порт пишется 11111011

Ну и так далее. Так что все правильно работает, не трожь :) 

Share this post


Link to post
Share on other sites

То есть чтобы не происходило инвертирование всех битов мне надо писать PORTD &= ~(1<<i);?

Share this post


Link to post
Share on other sites

Руководство для разработчика приложений на базе STM32WB55

Представив двухъядерные беспроводные микроконтроллеры STM32WB для IoT-приложений, компания STMicroelectronics предлагает разработчикам экосистему, включающую в себя отладочные платы, примеры кода для микроконтроллера, готовое ПО всех уровней и большой массив документации.

Читать статью

мне кажется что здесь варианты:

1. бегущей тени

{

 PORTD = (1<<i);

_delay_ms(500);

PORTD=0;}

2.бегщий огонь

{

PORTD = ~(1<<i);

_delay_ms(500);

PORTD=0xFF;}

Share this post


Link to post
Share on other sites
                     

Контроль в спящем режиме: повышение КПД батарейного питания с помощью DC/DC MAX17225 nanoPower

В статье описан практический опыт разработчика, применившего повышающий DC/DC-преобразователь MAX17225. В результате ряда практических экспериментов, потребовавших существенного обновления технической базы компании-разработчика, автор убедительно доказывает преимущества выбранного компонента и схемотехнической реализации. Увеличенное на 50% время автономной работы лучше других аргументов говорит об эффективности конвертеров MAX17225, а также о важности предварительной оценки элементной базы.

Подробнее

24 минуты назад, mosfetx сказал:

То есть чтобы не происходило инвертирование всех битов мне надо писать PORTD &= ~(1<<i);?

Конструкция (1<<i) дает байт с 1 в бите с номером i.  Побитовое отрицание ~ дает байт с единицами и нулем в бите i.

Да, сброс одного бита i  PORTD = PORTD & ( ~(1<<i) )  или кратко  PORTD &= ~(1<<i)

Установка одного бита i  PORTD = PORT  |  (1<<i) или кратко PORTD | =  (1<<i)

Но в вашем коде тоже все правильно, сначала бежит 1 от 0 до7 бита, потом так же бежит 0 при остальных битах в единице.

Share this post


Link to post
Share on other sites
10 часов назад, mosfetx сказал:

for ( i=0; i<=7; i++ ) { PORTD = (1<<i); _delay_ms(500); }

Довольно неоптимальная конструкция, скорее всего компилятор для (1<<i) тоже организует цикл. Вот так гораздо лучше:

for(uint8_t i=1; i; i<<1){
  PORTD = i;
  _delay_ms(500);
}

 Соответственно, во втором варианте надо лишь инвертировать i перед вывoдом в порт: PORTD = ~i;

Share this post


Link to post
Share on other sites

Учу по урокам с этого сайта http://narodstream.ru/avr-urok-7-knopka/.

Встретил там такие предложения.

Цитата

Можно пойти на хитрость и применить вот такую конструкцию PINB&0b00000001.

Данная конструкция нам и проверит нулевой бит. То есть если в регистре PINB также будет 1 в нулевом его бите,

то независимо от состояния остальных битов в данном регистре мы получим ненулевой результат, что также является истиной.

Наверное он имел ввиду if(!(PINB&0b00000001)?

и ещё я вообще не понял что он тут имеет ввиду

Цитата

То есть если ни с чем не сравнивать в условии результат, то условие эквивалентно сравниванием с нулём, только наоборот

. Для истинности результат должен быть ненулевым — (результат!=0).

Возможно глупые вопросы но я должен все понимать чтоб двигаться дальше.

Share this post


Link to post
Share on other sites

Не знаю, что там за уроки, но правильно так: всё, что не ноль, эквивалентно истине. Поэтому (a) и (a != 0) абсолютно эквивалентны в качестве условия в if и других местах, где требуется.

Главное, не думать, что истина всегда эквивалентна 1.

То есть (PINB & 1) и (PINB & 2) совсем не то же самое, что (PINB & 1) == 1 и (PINB & 2) == 1

Share this post


Link to post
Share on other sites

Глупые вопросы продолжаются

#define F_CPU 8000000, #define F_CPU 8000000L, #define F_CPU 8000000UL

Зачем здесь эти буквы после 8000000.

Share this post


Link to post
Share on other sites

Во-первых, этой строчки не должно быть в тексте ваших исходников. Определение тактовой частоты должно задаваться в makefile или в свойствах проекта вцелом, а не в индивидуальных исходниках. В самом дико крайнем случае - в единственном заголовочном файле, подключаемым ко всем исходникам проекта, но и этот случай я бы не одобрил.

Во-вторых, суффикс UL означает, что число следует рассматривать, как unsigned long, а суффикс L - как просто long. Это необходимо потому, что в Си по умолчанию (т.е. без суффиксов) все числа имеют размерность int, а значит, бОльшее число туда может влезть не полностью, что приведет к загадочным результатам вычислений. В последних версиях (стандартов Си или компиляторов?) это вроде как уже немного скорректировано, но я бы на это не стал надеяться, и рекомендовл бы продолжать использовать суффиксы явно.

Edited by ARV

Share this post


Link to post
Share on other sites
05.12.2019 в 22:14, mosfetx сказал:

Вопрос в следующем.

Лучше всего вам создать консольный проект на компьютере и запустить эту вашу функцию в дебаге, закоментировав апаратнозависимые хидера и переопределив апаратнозависимые функции и переменные-регистры.Например так:

unsigned char PORTD ;

_delay_ms(short val)

{

printf("delay for %d ms, PORTD=0x%x;\n",val, PORTD);

}

На все вопросы вам ответит компилятор, все остальное от лукавого!

05.12.2019 в 22:14, mosfetx сказал:

Объясните пожалуйста почему так. Вроде это побитовые операции, 

unsigned char PORTD ;
void _delay_ms(short val) 
{ 
	printf("delay for %d ms, PORTD=0x%x;\n",val, PORTD); 
  static int debugCnt = 0;
  if(debugCnt++ > 20) exit(0);
}

во так без дебага можно посмотреть что с портом Д происходит на С-ях.

Share this post


Link to post
Share on other sites
2 часа назад, ARV сказал:

. Определение тактовой частоты должно задаваться в makefile или в свойствах проекта вцелом, а не в индивидуальных исходниках.

А зачем вообще в коде задавать значение тактовой ? что оно нам даст ? тактовая же определяется во фьюзах и задается при прошивке отдельно.

Share this post


Link to post
Share on other sites
27 минут назад, E_C_C сказал:

А зачем вообще в коде задавать значение тактовой ? что оно нам даст ?

значения констант для задержек, вы думаете, на основании чего считаются? Вообще все что связано с временем требует значение тактовой частоты.

Share this post


Link to post
Share on other sites
2 минуты назад, ruhi сказал:

вы думаете, на основании чего считаются?

Это понятно.Так же если нужно сделать одинаковые временные интервалы при переносе проекта на разные чипы , с разными тактовыми. Но вот в плане вопроса ТС , он ничего не портирует , код пишется под атмегу 8 с 8мгц тактовой , зачем нужен дефайн ? Не проще один раз посчитать значение делителя и значение таймера и записать их.

Share this post


Link to post
Share on other sites
59 минут назад, E_C_C сказал:

Не проще один раз посчитать значение делителя и значение таймера и записать их.

Проще или не проще - вопрос лично для меня не стоит. Правильнее или не правильнее - так я ставлю вопрос. И ответ на него дал. Писать код неправильно учиться не надо, усилий требует вырабатывание привычки писать код правильно.

В программировании любая простота обязательно оборачиавется проблемами: либо до какого-то события, либо после него: мы или мучаемся над изучением/осваиванием чего-либо, либо мучаемся потом, отлавливая ошибки. Какие проблемы решать лучше - каждый сам выбирает для себя.

Share this post


Link to post
Share on other sites
45 минут назад, ARV сказал:

усилий требует вырабатывание привычки писать код правильно.

И сразу возникает вопрос - каков критерий "правильного"  кода?

Оптимальность ,т.е .скорость выполнения и нетребовательность к ресурсам железа ? Удобство в понимании другими ? удобство в написании для себя ?, а может изящество , или изощренность в решении задачи ?

К примеру - операцию деления  на любую степень двойки можно заменить сдвигом , это будет быстрее , но не так очевидно. И каждый автор учебника или курса предлагает своё видение , говоря что именно так и правильно. 

в уроках "народ стрим" , на которые ссылается топикстартер, проект разбит на  библиотеки и содержит много дефайнов , да это удобно, для программиста . А для начинающего создает сложности,  т.к .  нет наглядности , разумеется это моё ИМХО и я ни разу не претендую на авторитетное мнение.  

Edited by E_C_C

Share this post


Link to post
Share on other sites

Даже ребенка в игре с кубиками учат, что при строительстве пирамидки снизу должны быть кубики побольше, а выше - поменьше. То есть объясняют порядок, которого следует придерживаться. Так и в программировании: если придерживаться порядка, то будет легче.

Разумеется, если руки не дрожат и есть опыт, можно построить пирамиду и наоборот6 снизу маленький и тонкий, а на нем огромная куча больших и толстых. Но все это развалится от малешего толчка. Так и в программировании: если делать как-нибудь, оно вполне может работать, и даже будет скорее всего работать, но буквально до первой попытки что-то изменить.

При программировании на Си вопрос оптимальности - надуманный вопрос. В огромном количестве случаев любая "оптимизация вручную" (пример с делением) наверняка в конечном итоге проиграет оптимизации, которую устроит компилятор. Но даже если это и не так - необходимости в столь тонкой оптимизации почти никогда не встречается в любительских проектах: производительность современных микроконтроллеров настолько высока, что экономить на делении, заменяя его сдвигами, нет никакого смысла.

А все непонятки и сложности от незнакомости. Любому начинающему приучиться делать свои проекты многофайловыми совсем не сложно, а пользы от этого в будущем будет много.

Есть большая и толстая книга:

71AE90J735L%5B1%5D.gif

или в переводе на русский

Alen_Golub__Verevka_dostatochnoj_dliny_c

Прочесть которую необходимо каждому, кто вознамерился заниматься программирвоанием хотя бы раз в неделю. Хорошо прочищает голову, освобождая от всяких вопросов типа "а нужно ли?".

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
Sign in to follow this  

  • Сообщения

    • Может быть сбой передачи из-за плохого кабеля, особенно если воткнуто в разъём на "морде" компьютера. Попробуйте найти кабель получше, точно экранированый (если в непрозрачной изоляции - он более толстый и на изгиб более жёсткий) и воткнуть его в разъём, который прямо на материнской плате.
    • В раздел "Работа". Лениво помогать ленивым на шару.
    • НЕ ДОПУСТИМ ПРИЗНАНИЯ ОПГ РФ ВВ отправил правительство ОПГ РФ в отставку, но рано радоваться он призывает провести референдум и изменить "конституцию 1993" года которая не существует, слушайте и думайте своей головой граждане СССР к чему вас сейчас начнут призывать. Никаких референдумов не существующей ООО управляющей компании РФ которая закрыта, проведен аудит 15 сентября 2019 года, по этому и ушло правительство в отставку так как закрыта компания РФ где Медведев/Мендель был ген.директором. Но открыта новая УК РФ где учредитель Рокфелер который приезжал в Россию перед новым годом. По этому новое правительство будет уже сформировано под новую УК РФ для которой нужно провести референдум что бы ее типа узаконить в лице народа. По этому нельзя допустить, никаких волнений и не ведитесь на призывы ехать в Москву или выходить на митинги в своих городах. Это провокации!!! Объясняйте всем знакомым и не только, что нельзя признавать референдумы ОПГ РФ - это нужно существующей власти и теми кто из-за рубежа управляет через них, для того что-бы узаконить не существующую РФ и отменить статью 15.4 в несуществующей Конституции 1993 года после чего международные законы не будут действовать в нашей стране и мы станем бесправными на 100%. Декларация Человека и др законы защищающие права Человека не дают сегодня оккупационному правительству уничтожить нас окончательно, но признавая референдум мы сами себе подпишем смертный приговор, так как в РФ нет прав у Человека как и нет самого Человека. Нас сделали Физ.лицами для того что-бы можно было с нами взаимодействовать юридическим компаниям которых создала ОПГ РФ, юр.лицо не может вступать в отношения правовые с Человеком, только с юр.лицом или физ.лицом. Это в государстве СССР где есть государственный организации возможно только взаимодействие с Человеком и гражданином! По этому создали бумажные и цифровые физ.лица иначе ни одна компания в РФ не может с нами взаимодействовать и обирать нас налогами, поборами, штрафами, НДС, судами и пр. Расскажите каждому, перешли всем знакомым и да будет с нами сила наших предков и всего РОДа Сионисты ведут ликвидацию единственного юридически законного собственника 90-95% Мировых активов - Советский Народ! Через изменения в проект конституции РФ-93 собираются отменить границы СССР, чтобы на фирму "рэфэ" ("именно "решением" народа рэфэ"), "перестали" довлеть именно международные договоры СССР, которые без "решения народа" никто не может изменить, отменить и игнорировать! Необходимо создавать Народные Советы на местах! Наши предки оставили ­­­­нам правовую платф­о­р­м­у Советского Со­юз­а! Все, чем занимаются ­­­­сионисты особенно ­п­о­с­ледние 30лет (р­ел­иг­ия­ми, партиями­, и­ пр­оче­й хернёй)­, эт­о ув­одят­ нас и­менно­ от п­равой­ платформ­ы СССР­, чтоб­­ы мы за­были, з­а что­ о­тдали­ свои жи­зни­ наши­ пр­едшествен­н­ики! Что­ ­в ООН все ­­документы ­­СССР дей­ст­вующие, и­ г­раниц­ы СС­СР никто­ не ­мо­жет из­менить,­ потом­­у как, ­есть М­еждун­аро­дные Д­огово­ры! В России добивают Со­­­­­ветский народ, ка­к­ ­е­д­инственного ю­ри­ди­че­ск­и законно­го ­соб­ств­енн­ика о­бщен­арод­ного­ иму­щ­ества­! ССС­Р никому­, ­и н­ичего ­докуме­­нтальн­­о не пе­редав­ал­! Нет­ н­и одн­ого­ акта­ пр­иёма ­- п­е­редачи и­м­ущества. В случае уничтожения­­­­­ Советского народа,­ ­з­а­к­роется красив­ая­ ж­из­нь­ по всему­ ми­ру,­ та­к же­ как ­и по­явил­ась,­ как­ ­альте­рнати­ва СС­СР!­ Т­.н.­ капит­ализм с­ "чел­­овеческ­им лиц­о­м", т­.н­. сре­дний­ кла­сс,­ т.н.­ "с­оц­иальная­ ­ответств­е­­нность биз­­неса", 8ч. раб. день! Си­о­­нисты с ­30­-х год­ов ­её искуственно­ подд­ержи­ваю­т, и ­они ­да­вно "ус­­тали"! В­се т.н­­. стр­ан­ы "разв­итого­ ка­­питали­зма" и­меют­ с­тран­ доно­ров!­ Ни­к­то из си­онис­тов­ Т­­НК не собира­етс­я ­"­­кормить" пенсио­не­р­­­ов и прочую челядь­­!­­­((( Если Советский народ­­­ на@бн­ут,  начнё­т­ся реализ­­ац­ия прог­р­аммы "зол­от­­ой ми­ллиа­рд" , х­отя ­пиш­ут уже ­о сум­ме в­­ ­500млн. Сионисты специально ­­­­­для нас, разыгрыв­а­ю­т­ ­очередные спе­кт­ак­ли­ "­противост­оян­ия"­ с ­Зап­адом,­ или­ игр­ы в ­"зло­й­ и до­брый следователь",­ чтобы­ лохи ­­ресурс­­ной пед­ераци­и ­верил­и!­!! Благодаря Сталину пл­­­­­­аны сионистов от­о­д­в­и­н­улись на ст­о ­ле­т. Надо помн­ить про 19­­­­­17 год, про ц­арс­к­у­ю­ ­Внешнюю разве­д­­ку­, ­про Генерало­в В­не­­шне­й ­развед­ки и­ пат­ри­о­тов­ Р­оссии­, кот­орые ­­пе­р­евел­и арми­ю на с­­торо­ну­ больше­виков­, ­испол­ьзуя тро­цки­стов (и ­­находящегося ср­­­­еди ни­­х Сталина ­н­а­ ­тот мом­е­нт), ­ка­к ­ме­ньшее из­ з­­ол! Ресурсная педерация ­­­­­­это источник пра­в­о­в­о­г­о нигилизма­! ­И ­ес­ли­ п­ри "оп­рос­е" ­сио­нисту­  з­адаё­­шь ­вопр­ос­ о ­закон­нос­т­и или­ не­законн­ости о­­рган­­­ов упра­вления ­эр­эф­ии­,­ а ­*****­ы н­е­ ви­дят­­ в этом ­п­ресту­пн­о­го з­ахват­­а власти­ ­­и т.д. ­­, ­значит во­т­­ он в­раг!­­ А если­ нед­­о­понима­ет ­и н­е хоче­­т­ разо­братьс­­я, з­нач­ит­ не­доумо­к! Этих критериев доста­­­­­­точно для опреде­л­е­н­и­я­ свой - чуж­ой­! Сегодня, как никогда­­­­­­ важно наличие Р­а­з­у­м­а­, это наше ­ор­уж­ие­ п­ро­тив си­они­сто­в! Сионисты исполь­­­­­­зуют зомби ­-­ ­п­отр­ебителей д­ля­ с­ам­о­у­ничтожени­я, ­в т­о­м ­чис­ле и наше­го у­­ничт­ожен­и­я! Юр­ид­иче­ская ­пла­тф­орм­­а СССР­ нам н­­еобход­­­има, у­ нас о­громн­ый ­с­­оветск­ий­ жиз­ненны­й о­пыт! Есть т.н.  Сталинска­­­­­­я экономика (эко­н­о­м­и­с­т Шарапов) ­вн­ед­рё­нн­ая­ Стали­ным­ в ­30-­е г­оды­ ­с Ге­нера­л - ­лейт­е­нан­т­ом ещ­ё "ца­рск­ой­ ар­ми­и" ­Нечвол­­одовым­­! Ни о­­дин т­.н­. эко­но­мист ­ре­­сурсн­ой ­педер­аци­и­ (Гл­азь­е­вы и т.д­.­­) даже не­­­ заикает­ся­­ об этом­ о­п­ыте­!  Троцкист Хрущёв свер­­­­­­нул эту экономик­у­ ­в­ ­1­954 году, а­ с­ 1­95­5 ­го­да её ­исп­оль­зую­т я­пон­ц­ы, и­ "вых­лоп" ­при ­­капи­т­ализм­е у н­и­х в ­два­ р­аза­ хуже­,­ чем у­­ нас б­­ыло­ при­ соци­ал­изме! СССР с троцкистами, ­­­­­­которых внедряли­ ­в­ ­о­р­ганы управл­ен­ия­ С­СС­Р ­с 50-х­ го­дов­ пр­ошл­ого­ ­века­, на­м на­ хер­ ­не ­н­ужен!­ Эти ­вра­ги­ се­го­дня­ и кон­­тролир­­уют пс­­евдоо­рг­аны  ­уп­равле­ни­­я нез­ако­нной ­эрэ­ф­ии! Тем, кто "верит" в­­­­­­ нелегальную эрэф­­и­ю­,­ ­я предлагаю о­­тм­ен­ит­ь ­Междунар­о­дны­е д­ого­вор­ы п­од­писа­нные­ Ста­лин­ы­м­ от и­мени ­Совет­­ско­го­ На­рода в­ Я­лте ­­1945г.,­ или Хе­­льсин­ки­ 1975­г. о ­нер­уши­мости­ гр­ани­ц, убр­а­ть из ОО­­­Н­ Советски­­й Союз, ка­­­к­ "не с­ущ­ествующ­ее­" ­го­су­дарс­тво!­ И з­адумать­ся, чт­­­о же­ ­может ­отменит­ь­ ­те М­еждун­ародны­е до­г­ово­ры ­­СССР ­определ­яю­щ­ие ­гра­­ницы СССР?­! И­­ ­они­ начинают пон­им­а­ть­, что ж­улики си­о­­н­­исты смогу­т "отме­­­­нить­" границы­ Сове­­т­­ского ­Союза, т­о­л­ьк­о­ через (­форсм­аж­­ор­ -­ война) но­­вый­ до­­гов­ор, т.е.­ нов­­ая М­и­ро­вая В­ойна!­  Не могут п­­­­риспешники сионист­о­в­­­ ­в ООН, поменя­ть­ з­ак­­онное образ­ова­ние­ СС­С­Р ­на О­ПГ"Р­­Ф" без­ докум­­енто­в!­ А ­вдр­уг Ру­сс­кие -­­ Совет­­ски­й Нар­од ­опя­ть по­б­едят в в­о­йне! Тогда­­ сионистов­,­ п­од их ж­­е ­­­суды в Гаа­гу, и­ ­т.­п! Закрыть СССР­ ­б­е­з­ законных до­ку­ме­нт­­ов­, с юриди­чес­ки ­­зак­онным­и г­ражд­а­нам­и Со­ветско­­го С­­оюза ­- нев­озм­ожно­­,­ это у­голов­ка - ­СЕ­­ПАРАТ­ИЗМ! "Гражданами" РФ нас­ ­н­а­з­н­ачили для поэта­пно­го ­уни­что­жен­и­я! Предатели Советско­­­­­­го Народа должны­ ­б­ы­т­ь­ осуждены Народными С­удами ­по УК Союзных Республик в т.ч. по ­У­К Р­СФ­СР ­ст.64 ­­- Изме­­на Род­­ине!
    • Waso огромное спасибо за развернутый ответ, начинаю делать макет.
    • сервисный универсальный осциллограф ОСУ-10 частота 10мгц входное напряжение400в(DC+ACпик), генератор синус, меандр ,пила, TTL импульс частота сигнала 10мгц
×
×
  • Create New...