Обсуждаем контроллеры компании Atmel.
Ответить

Re: Нескольно простых вопросов о программировании AVR на Си.

Пн ноя 21, 2022 21:14:25

ARV, да никакого.
Нет никакой несовместимости. Есть накладные расходы.
И если критична производительность и/или объем кода - то стоит задуматься, а нужен ли тут float ?
Я, наверное, из своих поделий на восьмой или 32й мегах и не припомню, что б вот так прямо нужен был float. Практически везде получалось уйти в целочисленную математику.
Но спорить с вами я не буду :) Хватило тут уже холиваров с авторами ЯВУ. Точку зрения Блондинки™ вы услышали, она может не совпадать с вашей.

Добавлено after 1 minute 30 seconds:
Вспомнила, делался какой то показометр на линейке диодов, там логарифмическое что то просили считать. Пришлось туда втулить.

Re: Нескольно простых вопросов о программировании AVR на Си.

Вт ноя 22, 2022 07:13:34

Проблема разрешилаь очень просто. Применил остаток от деления %. И потом положил в массив. Точку тоже положил в массив куда мне нужно. Ну а
дальше вывел как простую строчку. Получилось прикольно!
Ну признаться посмотрел на форуме там приводился пример подобных действий,я применил его,
я такую разбивку применял только по 7seg indication тоже нормально работает.

Интересно, а что там за магическое число в программе - 0x30? :) :)
Последний раз редактировалось Bill_ Вт ноя 22, 2022 12:02:36, всего редактировалось 1 раз.

Re: Нескольно простых вопросов о программировании AVR на Си.

Вт ноя 22, 2022 07:17:59

Добавка для ANSI-кодировки цифр. В таблице ANSI цифры начинаются с кода 0х30

Re: Нескольно простых вопросов о программировании AVR на Си.

Вт ноя 22, 2022 07:32:39

Добавка для ANSI-кодировки цифр. В таблице ANSI цифры начинаются с кода 0х30

А по-моему проще написать '0'. Или нет? :)
Код:
x = y%10 + '0';

Re: Нескольно простых вопросов о программировании AVR на Си.

Вт ноя 22, 2022 09:04:59

Не то что бы проще, но правильнее.)
Код:
x = y % 10 + '0';

Re: Нескольно простых вопросов о программировании AVR на Си.

Вт ноя 22, 2022 10:35:43

Не то что бы проще, но правильнее.)
Код:
x = y % 10 + '0';

Проще, проще... требуется ввести только 3 символа вместо 4-х.

Re: Нескольно простых вопросов о программировании AVR на Си.

Вт ноя 22, 2022 11:03:08

Проще, проще... требуется ввести только 3 символа вместо 4-х.
Тогда так ещё проще
Код:
x = y % 10 + 48;
всего 2 символа... :))) :))) :))) :twisted: 8)

Re: Нескольно простых вопросов о программировании AVR на Си.

Вт ноя 22, 2022 11:07:19

Bill_, при чем здесь "три символа"? '0' — это и в Африке '0', наглядно и понятно. А что за хрень 0x30 — кто бы знал?
Вот можно и строки заканчивать символом 0x0A, но наглядней таки '\n' писать (я и сам полез сейчас в хексдамп, чтобы глянуть, какой код у '\n', т.к нафиг оно мне в реальной жизни сплющилось это помнить?).
А то еще дойдет до писания букв их кодами. А в какой кодировке тогда?? Вот я работаю в КОИ8-Р, хоть давно на хрюникод все попереходили.

Добавлено after 3 minutes 5 seconds:
Кстати, у меня для печати целых вот что нарисовано:
Код:
static char *_2str(uint32_t  val, uint8_t minus){
    static char strbuf[12];
    char *bufptr = &strbuf[11];
    *bufptr = 0;
    if(!val){
        *(--bufptr) = '0';
    }else{
        while(val){
            *(--bufptr) = val % 10 + '0';
            val /= 10;
        }
    }
    if(minus) *(--bufptr) = '-';
    return bufptr;
}
       
// return string with number `val`
char *u2str(uint32_t val){
    return _2str(val, 0);
}
char *i2str(int32_t i){
    uint8_t minus = 0;
    uint32_t val;
    if(i < 0){
        minus = 1;
        val = -i;
    }else val = i;
    return _2str(val, minus);
}

Когда начал играться с Cortex-M3, пришлось еще и на флоаты расширять...

Re: Нескольно простых вопросов о программировании AVR на Си.

Вт ноя 22, 2022 11:26:24

Проще, проще... требуется ввести только 3 символа вместо 4-х.
Тогда так ещё проще
Код:
x = y % 10 + 48;
всего 2 символа... :))) :))) :))) :twisted: 8)
Да, но тогда придётся в табличку заглядывать, чтобы понять, что сие число означает. А если таблички перед глазами нет?

Re: Нескольно простых вопросов о программировании AVR на Си.

Вт ноя 22, 2022 11:49:25

Вы чего? шуток не понимаете? вон сколько морд нарисовал!!!! читаемость кода на первом месте всегда! (глаза и нервы даны одни на всю жизнь, а клавиатуру по мере износа и поменять можно :beer: )
Хотя... бывают случаи, когда читабельность не на первом месте (или даже вредна)... но встречаются довольно редко и данный случай к ним не относится.

Re: Нескольно простых вопросов о программировании AVR на Си.

Вт ноя 22, 2022 12:00:53

Вы чего? шуток не понимаете? вон сколько морд нарисовал!!!! читаемость кода на первом месте всегда! (глаза и нервы даны одни на всю жизнь, а клавиатуру по мере износа и поменять можно :beer: )
Хотя... бывают случаи, когда читабельность не на первом месте (или даже вредна)... но встречаются довольно редко и данный случай к ним не относится.
Да я как-то не привык морды рисовать. Ни кошачьи, ни другие... Ладно, для данного случая так и быть нарисую. :lol: :lol: :)
PS: Вообще-то, я задал вопрос автору поста как-бы в шутку, чтобы обратить его внимание на эту деталь. Но люди восприняли это всерьёз и стали отвечать. Ладно, впредь в таких случаях буду рисовать кошачьи мордочки. :)
Последний раз редактировалось Bill_ Ср ноя 23, 2022 07:21:45, всего редактировалось 1 раз.

Re: Нескольно простых вопросов о программировании AVR на Си.

Ср ноя 23, 2022 06:59:48

"В каждой шутке есть доля шутки.")

Re: Нескольно простых вопросов о программировании AVR на Си.

Пн мар 13, 2023 21:31:02

Мужики, выручайте. )
Есть код. В функцию отправляю переменную с конкретным значением. В функции конструкция switch - case.
Значение переменной, пусть будет 2. Он корректно в отладчике прилетает на этот же CASE. Однако, потом случается чудо и после break он летит через несколько case и выполняет еще один и тот не полностью...

Т.е. перескакивает. В итоге на выходе в регистрах получаются не не значения, которые нужны...

Код:
void Set_Digit(int Digit) // Функция вывода цифры
{
   switch (Digit)
   {
      case 0:
         PORTB |= (1<<Segment_A)|(1<<Segment_E)|(1<<Segment_F);
         PORTD |= (1<<Segment_B)|(1<<Segment_C)|(1<<Segment_D);
         break;
      case 1:
         PORTD |= (1<<Segment_B)|(1<<Segment_C);
         break;
      case 2:
         PORTB |= (1<<Segment_A)|(1<<Segment_E)|(1<<Segment_G);
         PORTD |= (1<<Segment_B)|(1<<Segment_D);
         break;
      case 3:
         PORTB |= (1<<Segment_A)|(1<<Segment_G);
         PORTD |= (1<<Segment_B)|(1<<Segment_C)|(1<<Segment_D);
         break;
      case 4:
         PORTB |= (1<<Segment_B)|(1<<Segment_C);
         PORTD |= (1<<Segment_F)|(1<<Segment_G);
         break;
      case 5:
         PORTB |= (1<<Segment_A)|(1<<Segment_F)|(1<<Segment_G);
         PORTD |= (1<<Segment_C)|(1<<Segment_D);
         break;
      case 6:
         PORTB |= (1<<Segment_A)|(1<<Segment_E)|(1<<Segment_F)|(1<<Segment_G);
         PORTD |= (1<<Segment_C)|(1<<Segment_D);
         break;
      case 7:
         PORTB |= (1<<Segment_A);
         PORTD |= (1<<Segment_B)|(1<<Segment_C);
         break;
      case 8:
         PORTB |= (1<<Segment_A)|(1<<Segment_E)|(1<<Segment_F)|(1<<Segment_G);
         PORTD |= (1<<Segment_B)|(1<<Segment_C)|(1<<Segment_D);
         break;
      case 9:
         PORTB |= (1<<Segment_A)|(1<<Segment_F)|(1<<Segment_G);
         PORTD |= (1<<Segment_B)|(1<<Segment_C)|(1<<Segment_D);
         break;
      default:
         break;
   }
}



Re: Нескольно простых вопросов о программировании AVR на Си.

Пн мар 13, 2023 21:44:40

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

Re: Нескольно простых вопросов о программировании AVR на Си.

Пн мар 13, 2023 21:57:49

Чудес не бывает. Вам сначала нужно выключить все сегменты в портах, а затем уже зажигать.
Starichok51 опередил.)

Добавлено after 7 minutes 6 seconds:
А вообще, это делается не так. Обычно в хедере расписывается подключение индикатора и всё. Программа же не меняется. И пофигу, общий анод или катод, один порт, два или три. И кол-во разрядов индикатора.
Последний раз редактировалось OKF Пн мар 13, 2023 21:58:59, всего редактировалось 1 раз.

Re: Нескольно простых вопросов о программировании AVR на Си.

Пн мар 13, 2023 22:07:38

Не не. я так и делаю.
Вот вызов функции
Код:
Set_OFF_All_Razryad;
On_Digit = 0;
Set_Digit(On_Digit);

Set_ON_Razryad1;



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

Добавлено after 1 minute 54 seconds:
И да, я допишу в функцию изначальное гашение всех сегментов. Это СПАСИБО, что посказали и напомнили. )

Добавлено after 1 minute 15 seconds:
У меня почему то , что в отладчике перескакивает при нажатии F11 через несколько кейсов. Что залитая в МК показывает хреноту.

Добавлено after 5 minutes 31 second:
OKF писал(а):А вообще, это делается не так. Обычно в хедере расписывается подключение индикатора и всё


Вот это можно подробнее. ))))

Re: Нескольно простых вопросов о программировании AVR на Си.

Вт мар 14, 2023 07:43:04

А что тут подробнее? На то он хедер, что бы все настройки были в нём.
Код:
#define COMMON_MAX        4
#define BLINK_TIME        500
   
#define COMMON1           C,5,H
#define COMMON2           C,1,H
#define COMMON3           C,2,H
#define COMMON4           D,5,H
   
#define _A                C,4,L
#define _B                C,3,L
#define _C                D,7,L
#define _D                B,1,L
#define _E                B,2,L
#define _F                C,0,L
#define _G                D,6,L
#define _H                B,0,L
   
#define MASK_A            (1<<7)
#define MASK_B            (1<<6)
#define MASK_C            (1<<5)
#define MASK_D            (1<<4)
#define MASK_E            (1<<3)
#define MASK_F            (1<<2)
#define MASK_G            (1<<1)
#define MASK_H            (1<<0)


#define INLINE            static inline __attribute__((__always_inline__))

#define common_out()      (out(COMMON1), out(COMMON2), out(COMMON3), out(COMMON4))
#define segment_out()     (out(_A),out(_B),out(_C),out(_D),out(_E),out(_F),out(_G),out(_H))
#define common_off()      (off(COMMON1), off(COMMON2), off(COMMON3), off(COMMON4))
#define segment_off()     (off(_A),off(_B),off(_C),off(_D),off(_E),off(_F),off(_G),off(_H))

void ledInit();
void display(uint8_t dig1, uint8_t dig2, uint8_t dig3, uint8_t dig4);
void setBlink(uint8_t mask);
void display(int8_t dow, uint8_t day);

Re: Нескольно простых вопросов о программировании AVR на Си.

Ср мар 15, 2023 19:11:02

Очередная задача...
Кстати, с первой был простой косяк: оптимизация компилияции в АВРстудио почему то жутко урезала код, что начлало скакаять по кейсам в свитч не понятно куда. Убрал оптимизацию и все стало так, как нужно.

Теперь я хочу разбивать число неопределенного количества разрядов на цифры. Мне нужен только алгоритмический принцип, а не код. Понимаю, что надо использовать деление на 10 и остаток от деления на 10. Много чего уже посмотрел, но все равно плохо доходит. Думаю, что и сам скоро разберусь, однако не помешает и толчек в нужном направлении.

Суть в том, что я не знаю, сколько разрядов у числа изначально. Может быть три, а может пять. Мне надо его разбить на отдельные цифры и вывести корректно на индикатор.

Опишите суть, или ткните, где это максимально понятно расписано.

Добавлено after 12 minutes 22 seconds:
З.Ы. Число целое. До 5 разрядов.

Re: Нескольно простых вопросов о программировании AVR на Си.

Ср мар 15, 2023 19:24:24

кроме деления часто используют вычитание.
если 5 разрядов, то сначала вычитают 10000, пока есть от чего вычитать.
потом вычитают 1000, потом 100, и наконец 10.
после вычитания десятков остаются единицы числа.

Re: Нескольно простых вопросов о программировании AVR на Си.

Ср мар 15, 2023 20:02:00

с /10 и %10 и получаете разряды (напр. масив цифр), с максимально возможного количества цифр для отображения на дисплее. Затем (при необходимости), удаляете незначащие нули (leading_zeros) (заменяете их пустым символом).

напр.: 123456 в 8-digit 7-сегментный дисплей
123456 -> 0, 0, 1, 2, 3, 4, 5, 6 -> ' ', ' ', 1, 2, 3, 4, 5, 6
а затем последовательно вывести их на дисплей.
Последний раз редактировалось veso74 Ср мар 15, 2023 20:14:50, всего редактировалось 1 раз.
Ответить