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

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
Just_Fluffy
Вымогатель припоя
Сообщения: 532
Зарегистрирован: Ср июн 29, 2022 16:25:45

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

Сообщение Just_Fluffy »

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

Добавлено after 1 minute 30 seconds:
Вспомнила, делался какой то показометр на линейке диодов, там логарифмическое что то просили считать. Пришлось туда втулить.
Белая и Пушистая
Реклама
Bill_
Открыл глаза
Сообщения: 60
Зарегистрирован: Вс ноя 13, 2022 14:58:17

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

Сообщение Bill_ »

[uquote="aleksey chilov",url="/forum/viewtopic.php?p=4324009#p4324009"]Проблема разрешилаь очень просто. Применил остаток от деления %. И потом положил в массив. Точку тоже положил в массив куда мне нужно. Ну а
дальше вывел как простую строчку. Получилось прикольно!
Ну признаться посмотрел на форуме там приводился пример подобных действий,я применил его,
я такую разбивку применял только по 7seg indication тоже нормально работает.[/uquote]
Интересно, а что там за магическое число в программе - 0x30? :) :)
Последний раз редактировалось Bill_ Вт ноя 22, 2022 12:02:36, всего редактировалось 1 раз.
Реклама
Аватара пользователя
MLX90640
Опытный кот
Сообщения: 848
Зарегистрирован: Ср авг 03, 2022 05:22:56

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

Сообщение MLX90640 »

Добавка для ANSI-кодировки цифр. В таблице ANSI цифры начинаются с кода 0х30
Bill_
Открыл глаза
Сообщения: 60
Зарегистрирован: Вс ноя 13, 2022 14:58:17

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

Сообщение Bill_ »

[uquote="MLX90640",url="/forum/viewtopic.php?p=4324557#p4324557"]Добавка для ANSI-кодировки цифр. В таблице ANSI цифры начинаются с кода 0х30[/uquote]
А по-моему проще написать '0'. Или нет? :)

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

x = y%10 + '0';
Реклама
Эиком - электронные компоненты и радиодетали
OKF
Это не хвост, это антенна
Сообщения: 1392
Зарегистрирован: Вт июн 07, 2011 08:03:18

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

Сообщение OKF »

Не то что бы проще, но правильнее.)

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

x = y % 10 + '0';
Реклама
Bill_
Открыл глаза
Сообщения: 60
Зарегистрирован: Вс ноя 13, 2022 14:58:17

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

Сообщение Bill_ »

[uquote="OKF",url="/forum/viewtopic.php?p=4324587#p4324587"]Не то что бы проще, но правильнее.)

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

x = y % 10 + '0';
[/uquote]
Проще, проще... требуется ввести только 3 символа вместо 4-х.
Реклама
Аватара пользователя
Ivanoff-iv
Друг Кота
Сообщения: 7077
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Откуда: Сердце Пармы

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

Сообщение Ivanoff-iv »

[uquote="Bill_",url="/forum/viewtopic.php?p=4324626#p4324626"]Проще, проще... требуется ввести только 3 символа вместо 4-х.[/uquote] Тогда так ещё проще

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

x = y % 10 + 48;
всего 2 символа... :))) :))) :))) :twisted: 8)
Для тех, кто не учил магию мир полон физики :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Аватара пользователя
Eddy_Em
Собутыльник Кота
Сообщения: 2516
Зарегистрирован: Пт июл 12, 2019 22:52:01
Контактная информация:

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

Сообщение Eddy_Em »

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, пришлось еще и на флоаты расширять...
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда.
Я на гитхабе, в ЖЖ
Bill_
Открыл глаза
Сообщения: 60
Зарегистрирован: Вс ноя 13, 2022 14:58:17

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

Сообщение Bill_ »

[uquote="Ivanoff-iv",url="/forum/viewtopic.php?p=4324646#p4324646"][uquote="Bill_",url="/forum/viewtopic.php?p=4324626#p4324626"]Проще, проще... требуется ввести только 3 символа вместо 4-х.[/uquote] Тогда так ещё проще

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

x = y % 10 + 48;
всего 2 символа... :))) :))) :))) :twisted: 8)[/uquote]Да, но тогда придётся в табличку заглядывать, чтобы понять, что сие число означает. А если таблички перед глазами нет?
Аватара пользователя
Ivanoff-iv
Друг Кота
Сообщения: 7077
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Откуда: Сердце Пармы

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

Сообщение Ivanoff-iv »

Вы чего? шуток не понимаете? вон сколько морд нарисовал!!!! читаемость кода на первом месте всегда! (глаза и нервы даны одни на всю жизнь, а клавиатуру по мере износа и поменять можно :beer: )
Хотя... бывают случаи, когда читабельность не на первом месте (или даже вредна)... но встречаются довольно редко и данный случай к ним не относится.
Для тех, кто не учил магию мир полон физики :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Bill_
Открыл глаза
Сообщения: 60
Зарегистрирован: Вс ноя 13, 2022 14:58:17

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

Сообщение Bill_ »

[uquote="Ivanoff-iv",url="/forum/viewtopic.php?p=4324680#p4324680"]Вы чего? шуток не понимаете? вон сколько морд нарисовал!!!! читаемость кода на первом месте всегда! (глаза и нервы даны одни на всю жизнь, а клавиатуру по мере износа и поменять можно :beer: )
Хотя... бывают случаи, когда читабельность не на первом месте (или даже вредна)... но встречаются довольно редко и данный случай к ним не относится.[/uquote]Да я как-то не привык морды рисовать. Ни кошачьи, ни другие... Ладно, для данного случая так и быть нарисую. :lol: :lol: :)
PS: Вообще-то, я задал вопрос автору поста как-бы в шутку, чтобы обратить его внимание на эту деталь. Но люди восприняли это всерьёз и стали отвечать. Ладно, впредь в таких случаях буду рисовать кошачьи мордочки. :)
Последний раз редактировалось Bill_ Ср ноя 23, 2022 07:21:45, всего редактировалось 1 раз.
OKF
Это не хвост, это антенна
Сообщения: 1392
Зарегистрирован: Вт июн 07, 2011 08:03:18

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

Сообщение OKF »

"В каждой шутке есть доля шутки.")
Аватара пользователя
СКАЗОЧНИК
Идёт направо - песнь заводит, Налево - сказку говорит.
Сообщения: 5000
Зарегистрирован: Чт апр 21, 2011 17:55:50
Откуда: Иркутск

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

Сообщение СКАЗОЧНИК »

Мужики, выручайте. )
Есть код. В функцию отправляю переменную с конкретным значением. В функции конструкция 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;
	}
}



Станислав
Аватара пользователя
Starichok51
Модератор
Сообщения: 19053
Зарегистрирован: Сб авг 14, 2010 15:05:51
Откуда: г. Озерск, Челябинская обл.

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

Сообщение Starichok51 »

чудо заключается в том, что ты только добавляешь по "или" нужные сегменты, а не нужные не выключаешь, и они продолжают светиться.
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
OKF
Это не хвост, это антенна
Сообщения: 1392
Зарегистрирован: Вт июн 07, 2011 08:03:18

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

Сообщение OKF »

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

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

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

Сообщение СКАЗОЧНИК »

Не не. я так и делаю.
Вот вызов функции

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

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 писал(а):А вообще, это делается не так. Обычно в хедере расписывается подключение индикатора и всё
Вот это можно подробнее. ))))
Станислав
OKF
Это не хвост, это антенна
Сообщения: 1392
Зарегистрирован: Вт июн 07, 2011 08:03:18

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

Сообщение OKF »

А что тут подробнее? На то он хедер, что бы все настройки были в нём.

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

#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);
Аватара пользователя
СКАЗОЧНИК
Идёт направо - песнь заводит, Налево - сказку говорит.
Сообщения: 5000
Зарегистрирован: Чт апр 21, 2011 17:55:50
Откуда: Иркутск

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

Сообщение СКАЗОЧНИК »

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

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

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

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

Добавлено after 12 minutes 22 seconds:
З.Ы. Число целое. До 5 разрядов.
Станислав
Аватара пользователя
Starichok51
Модератор
Сообщения: 19053
Зарегистрирован: Сб авг 14, 2010 15:05:51
Откуда: г. Озерск, Челябинская обл.

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

Сообщение Starichok51 »

кроме деления часто используют вычитание.
если 5 разрядов, то сначала вычитают 10000, пока есть от чего вычитать.
потом вычитают 1000, потом 100, и наконец 10.
после вычитания десятков остаются единицы числа.
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
veso74
Поставщик валерьянки для Кота
Сообщения: 1907
Зарегистрирован: Сб май 05, 2012 20:24:52
Откуда: KN34PC, Болгария
Контактная информация:

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

Сообщение veso74 »

с /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 раз.
Ответить

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