Jump to content
a_sergeevich

Язык Си Для Микроконтроллеров

Recommended Posts

16 минут назад, ARV сказал:

А это ещё нафига?

просто не понимают как работают данные конструкции

Смысл объяснять "обезьяне" как стрелять из автомата, хотя в ютубе и такое увидишь

Не хочу никого обидеть, но прежде чем садиться писать прошивки сложнее моргания лампочки

Сядте, прочитайте основы си и его конструкций. Вопросы снимутся сами собой

В данном случае ткнули носом, а дальше ...........

Edited by hasl

Share this post


Link to post
Share on other sites

Непонятно одно. Что означают сие слова :

8 часов назад, ART_ME сказал:

Назад программа возвращаться не будет никогда

?
Что значит "не будет возвращаться", и самое главное - куда она не будет возвращаться ? Обратно, в точку начала исполнения шага ? Тогда каким образом Вы хотите исполнять остальные шаги ?
Конкретизируйте этот момент.

 

8 часов назад, ART_ME сказал:

Для эксперимента проверил goto,  работает без замечаний.

Ну и оставьте как есть. Главное в написании кода - добиться ожидаемого результата, а не красоты кода. Всё остальное - по желанию.

Share this post


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

просто не понимают как работают данные конструкции

Смысл объяснять "обезьяне" как стрелять из автомата, хотя в ютубе и такое увидишь

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

Для чего? Какая лично Вам радость в оскорблении постороннего Вам человека?  

Вот ей-Богу не понимаю Вашей мотивации. Комплекс неполноценности? 

-------------------------------------------------------------------

3 часа назад, Alex сказал:

Что значит "не будет возвращаться", и самое главное - куда она не будет возвращаться ? Обратно, в точку начала исполнения шага ? Тогда каким образом Вы хотите исполнять остальные шаги ?
Конкретизируйте этот момент.

Это значит, что вполне возможно, что по окончании исполнения всех заданных операций (шагов) новый запуск будет через RESET.  То есть не имеет никакого значения, что будет в конце.

3 часа назад, Alex сказал:

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

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

Та, которую я  привел выше, заточена под goto, отсюда и возникновение у меня этой проблемы,т.к. заменить в данной структуре goto нечем.  В то же время, если выделить операции (шаги) в отдельные независимые блоки, то удобнее оказывается применение например case.

Какая из этих структур окажется для меня предпочтительней, я пока не знаю. Решу по ходу пошаговой отладки. 

Edited by ART_ME

Никогда не спорьте с дураками. Они опустят Вас до своего уровня и победят за счет опыта.

 

 

Share this post


Link to post
Share on other sites

Вебинар «Решения Analog Devices для гальванической изоляции. Обзор технологий и новинок» (27.04.2021)

Компания «Компэл» и Analog Devices приглашают всех желающих 27/04/2021 принять участие в вебинаре, посвященном решениям Analog Devices для гальванической изоляции. В программе вебинара: технологии гальванической изоляции iCoupler, цифровые изоляторы, изолированное питание и технология isoPower, гальванически изолированные интерфейсы (RS-485, CAN, USB, I2C, LVDS) и другое.

Подробнее

8 часов назад, ARV сказал:

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

Попробую не согласится, ведь программа будет выполнять ту строку чему равен tmp? выполнив ее при наличии break; она покинет switch.

Если break; отсутствует то программа перейдет на следующую строчку но выполнять ее не будет, так как  для выполнения следующей строки tmp должен быть равен 4, для этого и нужно будет в предыдущей строке tmp++

Это мое мнение, спецы пусть поправят если это не так

tmp = 3;

switch(tmp)
                        {
                        case 0:    нужное действие; break;
                        case 1:    нужное действие; break;
                        case 2:    нужное действие; break;
                        case 3:    нужное действие; tmp++; break;
                        case 4:    нужное действие; break;
                        case 5:    нужное действие; break;
                        } 

1 час назад, ART_ME сказал:

В то же время, если выделить операции (шаги) в отдельные независимые блоки

Думаю можно и в кейсе все нужное прописать.


Сергей.

Share this post


Link to post
Share on other sites

Пружинные клеммники Degson - высокое качество соединения по оптимальной цене!

Пружинные клеммные блоки Degson для монтажа на печатную плату – это простое и надежное соединение, которое позволяет легко решать задачи для различных приложений за счет обширного ассортимента. Клеммники Degson доступны в двух конструктивных исполнениях (торцевой контакт и зажимная клеть), имеют различные направления ввода проводника (45°, 90°, 180°) и обладают широким диапазоном поперечных сечений (0,2…2,5 мм2).

Подробнее

Так наверное?

switch(tmp)
                        {
                        case 0:    нужное действие; tmp++;  break;
                        case 1:    нужное действие; tmp++;  break;
                        case 2:    нужное действие; tmp++;  break;
                        case 3:    нужное действие; tmp++;  break;
                        case 4:    нужное действие; tmp++;  break;
                        case 5:    нужное действие; tmp++;  break;
                        } 

Edited by ART_ME

Никогда не спорьте с дураками. Они опустят Вас до своего уровня и победят за счет опыта.

 

 

Share this post


Link to post
Share on other sites

Новое семейство ИП от MEAN WELL мощностью 150, 300, 600 Вт с повышенной перегрузочной способностью

Компания MEAN WELL разработала семейство источников питания номинальной мощностью 150, 300 и 600 Вт с возможностью кратковременной безопасной работы при мощности в 2,5 раза выше номинальной (до 5 секунд). Данное семейство источников питания востребовано в промышленных установках с использованием электродвигателей или с емкостной нагрузкой. Применяя новые источники питания HRP/N можно получить экономический выигрыш.

Подробнее

ну да только если нужно по порядку то break; не нужен, так же и нет необходимости в tmp++ в последней строке


Сергей.

Share this post


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

Попробую не согласится,

Не пробуйте:

14 часов назад, ART_ME сказал:

При запуске программы опрашивается галетник на 10 положений,  и программа стартует с метки, указанным этим галетником.

Программа всегда последовательно проходит все шаги начиная с указанного галетником

Т.е. если выставили 1, то будут последовательно выполнены шаги с 1 по 10, если выставили 5, то будут исполняться шаги с 5 по 10. 


Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

Share this post


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

Не пробуйте:

Да проверил, вы были правы! инкремент тут бесполезен, но зато теперь четко усвоил как функционирует кейс.


Сергей.

Share this post


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

просто не понимают как работают данные конструкции

Смысл объяснять "обезьяне" как стрелять из автомата, хотя в ютубе и такое увидишь

Не хочу никого обидеть, но прежде чем садиться писать прошивки сложнее моргания лампочки

Сядте, прочитайте основы си и его конструкций. Вопросы снимутся сами собой

В данном случае ткнули носом, а дальше ...........

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

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

 

Edited by hasl
ошибка

Share this post


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

у вас сер нет желания учиться

А вас сер я не просил высказывать здесь свое мнение о моем желании или не желании учиться, зафлуживая тему.

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

--------------------------

1 час назад, optima сказал:

ну да только если нужно по порядку то break; не нужен

Так?

switch(tmp)
                        {
                        case 0:    нужное действие; tmp++; 
                        case 1:    нужное действие; tmp++; 
                        case 2:    нужное действие; tmp++; 
                        case 3:    нужное действие; tmp++; 
                        case 4:    нужное действие; tmp++; 
                        case 5:    нужное действие;  break;
                        } 

Edited by ART_ME

Никогда не спорьте с дураками. Они опустят Вас до своего уровня и победят за счет опыта.

 

 

Share this post


Link to post
Share on other sites

нет, так!  Чему будет равен тmp с той строки и будет выполнятся до конца

switch(tmp)
                        {
                        case 0:    нужное действие;
                        case 1:    нужное действие;
                        case 2:    нужное действие;
                        case 3:    нужное действие;
                        case 4:    нужное действие;
                        case 5:    нужное действие;
                        } 


Сергей.

Share this post


Link to post
Share on other sites

Иными словами,  разница с goto только в том, что вместо длинного выборного перечня:

if (tmp == 1) goto 1;

if (tmp == 2) goto 2;

....

if (tmp == 10) goto 10;

Мы пишем всего лишь:

switch(tmp)

Плюс очевиден, спасибо, попробуем. 

Тем более, что это нетрудно, т.к. изначально выбранная структуру под goto не меняется, упрощается лишь задание выбора. 

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

Edited by ART_ME

Никогда не спорьте с дураками. Они опустят Вас до своего уровня и победят за счет опыта.

 

 

Share this post


Link to post
Share on other sites

Здравствуйте. Споткнулся на ровном месте на элементарном вопросе. Большая просьба разъяснить что я делаю не так.

микроконтроллер: atmega8

компилятор: avr-gcc (GCC) 10.2.0

Среда разработки: Eclipse Version: 2020-03 (4.15.0)

OC: Arch linux 5.11.11

 

Но это не важно. Проблема (возможно в моей голове проблема) возникает и с компилятором gcc в моей системе.

Суть.

Обнуление 7 бита порта D

PORTD=~(1<<7); //вроде простая операция. Я понимаю что проще PORTD=0b0111 1111; но цифра 7 это дефайн в начале библиотеке

И вот варнинг:

../LCD.h:23:15: warning: unsigned conversion from 'int' to 'uint8_t' {aka 'volatile unsigned char'} changes value from '-129' to '127' [-Woverflow]

Что за?

Ок. Эксперимент.

 

	unsigned char tmp=0;
	tmp=~0xff;

Причём такую простую операцию я попробовал сделать и скомпилировать не под AVR, а под x86

Варнинг тот же

../LCD.h:24:6: warning: unsigned conversion from 'int' to 'unsigned char' changes value from '-256' to '0' [-Woverflow]

Я так понимаю, что число 0b1111 1111 после побитовой инверсии преобразуется в число 0b0000 0000 и присваивается  переменной tmp. Откуда предупреждение?

Ок, если сделать так:

	unsigned char tmp=0;
	tmp=0xff;
	tmp=~tmp;

Всё ок. Что не так?

Share this post


Link to post
Share on other sites
1 hour ago, DarkDigger said:

Что не так?

В среде avr-gcc минимальный размер целых констант равен размеру int, т.е. 2 байта. То есть все небольшие целые константы расширяются до двух байт.

Получается, что (1<<7) = (0x0001 << 0x0007) = 0x0080. После инверсии имеем ~(0x0080) = 0xff7f, которое равно -129. При записи в однобайтовую переменную старший байт исчезнет, вместо 0xff7f получим другое число 0x7f , о чём компилятор и предупреждает программиста.

То же самое м во втором примере. Число 0xff на самом деле есть 0x00ff. Поэтому после операции иневертирования получаем 0xff00, что в понимании компилятора есть -256. Поэтому он и предупреждает, что записи такой величины в unsigned char старший байт не поместится и величина изменится на 0х00.

Share this post


Link to post
Share on other sites

просто из-за настроек вашего компилятор число было приведено к int

Сделайте приведение типов
PORTD=(uint8_t)(~(1<<7));

и забудьте

это не ошибка, а вас только предупредили

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

И видно будет сразу и ошибки и не словите глобальный глюк при отладке

Share this post


Link to post
Share on other sites
06.04.2021 в 11:42, DarkDigger сказал:

Обнуление 7 бита порта D

PORTD=~(1<<7);

Может у вас просто опечатка, но на всякий случай: обнуление бита это PORTD &= ~(1<<7);

Share this post


Link to post
Share on other sites

Join the conversation

You are posting as a guest. 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...

  • Сообщения

  • Similar Content

    • By Артемон
      Всем привет. Просьба посодействовать в исправлении кода для термометра. Так как сам я в этом новичек, то код собирал из трех чужих проектов. Реализация такова, подключение термопары через микруху Max6675 к Atmega и вывод данных на LCD экран. В архиве прилагаю проект Atme Studio 7 и принт скрин из Протеуса. Ошибка заключается в неправильных показаниях температуры

      Test1.rar
      Вот код, чтоб не скачивать проект.

      #define F_CPU 1000000UL #include <util/delay.h> #include <avr/io.h> #include "max6675.h" #include "LCD.h" uint16_t gettemp(void); //Funktionsdeklarationen void initavr(void); //gettemp () returns absolute Temperature in Temp * 4 °C - in 1/4°-steps // uint16_t gettemp(void){ //Temperatur holen. uint8_t bit = 0, bitnr = 12; //Variablen uint8_t foo1 = 0; uint16_t Rohdata = 0; CS_Port &= ~(1 << CS); //Chip select anlegen for(foo1 = 0 ; foo1 < 16 ; foo1++){ //16 Bits einlesen bit = 15 - foo1; //Die Aktuelle Bitnr berechnen. SCK_Port |= (1 << SCK); //SCK hi if((bit <= 14) && (bit >= 3)){ //Einfach mal die 12 relevanten von den 16 Bits ausfiltern if((SO_Pin & (1 << SO))){ //WENN SO 1 ist, dann... bitnr--; //zдhlen wir runter... Rohdata |= (1 << bitnr); // und schieben eine 1 an bit x }else{ //WENN dem NICHT so ist, dann... bitnr--; //zдhlen wir runter... Rohdata &= ~(1 << bitnr); //und schieben eine 0 an bit x } }else{ //weis au nimmer, was das soll. bitnr = 12; } SCK_Port &= ~(1 << SCK); //SCK LO } CS_Port |= (1 << CS); //CS HI //Alles auf Standardkonfig. return Rohdata; //Das ist doch mal was ;D } // getTC() returns 0 if Thermocouple is not connected, 255 if thermocuple is connected // (to enable this feature T- must be connected to GND) uint8_t getTC(void){ //Temperatur holen. //Variablen uint8_t TC = 0; uint8_t foo1 = 0; CS_Port &= ~(1 << CS); //Chip select anlegen for(foo1 = 0 ; foo1 < 16 ; foo1++){ //16 Bits einlesen //Die Aktuelle Bitnr berechnen. SCK_Port |= (1 << SCK); //SCK hi if(foo1 == 2){ //das 3. bit ist fьr uns relevant. if((SO_Pin & (1 << SO))){ //WENN SO 1 ist, dann... TC = 0; }else{ //WENN dem NICHT so ist, dann... TC = 255; } } SCK_Port &= ~(1 << SCK); //SCK LO } CS_Port |= (1 << CS); //CS HI //Alles auf Standardkonfig. return TC; //Das ist doch mal was ;D } //Initiates the MAX6675 and IO-pins void init_6675(void){ //AVR initialisieren SO_DDR &= ~(1 << SO); CS_DDR |= (1 << CS); SCK_DDR |= (1 << SCK); //IOs setzen SO_Port |= (1<<SO); //Pullups an. (Wichtig fьr MAX6675, der kann nicht anders, hab ich festgestellt... CS_Port |= (1 << CS); //CS HI //Alles auf Standardkonfig. SCK_Port &= ~(1 << SCK); //SCK LO } int main(void) { init_port();// инициализируем порт ЖКИ lcd_init();// инициализируем ЖКИ init_6675(); while (1) { char buffer[8]; int temp; temp = gettemp(); temp /=4; lcd_gotoxy(0,0);//перемещаем курсор в верхний левый угол sprintf(buffer, "t=%i\xdf\C ", temp); // так как тут не плавающая запятая то числа с запятой записываются так %i.%i, код градуса записывается так \xdf lcd_putstring(buffer); } }
      вставляете код пользуйтесь тегами [CОDE][/CОDE] редактора сообщений, кнопка <>
    • By igoryan
      нужно ли обрабатывать RESET просто компилятор не видит RESET_vect?
    • By P32L
      Натолкните на мысль пожалуйста.Смысл в следующем.Нужно изменять задержку(Delay) из EEPROM. Контроллер PIC , язык СИ.
      Как реализовать чтение числа из ипрома ? Если не затруднит, то кусочек кода был бы очень кстати.
    • By Zver2011
      Здравствуйте! Недавно начал изучать МК AVR. Читаю книги Белова. Пользуюсь программами CVAVR и Proteus. По урокам, собирал все в железе. По готовым примерам кода конечно же мне легко учиться и все в принципе понятно из описания, хоть и в программировании не силен, но как только начинаешь создавать что то свое - начинаются проблемки.
      В общем я создаю что то вроде музыкального светильника, который должен включаться от звука (голоса). Датчик звука пытаюсь реализовать на компараторе, плавное включение света - ШИМ, а генерация мелодии (пищалки) благодаря таймеру Т1 и его прерыванию. Куски кода брал из разных чужих самоделок, вот только объединить не удается.
      В железе работает как будто цветомузыка какая-то. Мелодия не играет, Я думаю это из-за неправильной конфигурации компаратора, а также схемы. Вот это основной вопрос у меня. Ну и собственно основной цикл программы, там я думаю тоже накосячил.
      Помогите мне разобраться до конца, понять ошибки в коде, мне самому интересно вот только С - язык тяжеловатый на мой взгляд и без помощи знающих не обойтись))

      КОД.txt
    • By sensey88
      Продам счетчики бета-гамма излучения новые заводская упаковка
      Си1Г (79г) 62 шт. 5000р
      Си21БГ (79г) 49 шт. 350р
      Си22БГ (79г) 70 шт. 700р
      Си3БГ (84г) 20 шт. 300р
      Си3БГ (78г) 46 шт. 250р
      Си3БГ (77г) 10 шт. 250р
      Си3БГ (79г) 18 шт. 250р
      Си3БГ (75г) 10 шт. 200р
      Си37Г (80г) 40 шт. 400р
      Си37Г (76г) 24 шт. 350р
      Си37Г (79г) 16 шт. 350р
      Си33Г (78г) 28 шт. 450р
      Си33Г (77г) 15 шт. 450р
      СБТ13 (78г) 2 шт. 3000р
      СБТ13 (76г) 3 шт. 2700р
      СБТ13 (69г) 3 шт 2500р.
      Си8Б (79г) 1 шт. 2500р
      Си8Б (78г) 1 шт. 2500р
      СБТ10 (79г) 3 шт. 4500р
      8 (910) 7051241 Евгений
      bishop-x@yandex.ru
×
×
  • Create New...