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

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
strengerst
Вымогатель припоя
Сообщения: 516
Зарегистрирован: Пт янв 18, 2013 15:11:02

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

Сообщение strengerst »

Скиньте пожалуйста простенький пример передачи данных для Atmega 8, что в PROTEUSE через терминал было видно. А то у меня не чего не получается. Но скажим буква А.
Реклама
Аватара пользователя
Z_h_e
Собутыльник Кота
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

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

Сообщение Z_h_e »

Есть возможность создания макроса зеркального отображения байта? Спасибо.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Реклама
Аватара пользователя
prinv
Вымогатель припоя
Сообщения: 677
Зарегистрирован: Чт янв 20, 2011 09:07:08
Откуда: Пермь
Контактная информация:

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

Сообщение prinv »

Функции или макроса?
Никакая контра не уйдёт от нас
Аватара пользователя
Z_h_e
Собутыльник Кота
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

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

Сообщение Z_h_e »

Именно так, как я спросил.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
WiseLord
Друг Кота
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск
Контактная информация:

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

Сообщение WiseLord »

Я такое использу. По сути, за счёт inline, мало чем от макроса отличается.

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

inline uint8_t swapBits(uint8_t data) __attribute__((always_inline));
inline uint8_t swapBits(uint8_t data)
{
	data = (data & 0xF0) >> 4 | (data & 0x0F) << 4;
	data = (data & 0xCC) >> 2 | (data & 0x33) << 2;
	data = (data & 0xAA) >> 1 | (data & 0x55) << 1;

	return data;
}
Первую треть (обмен полубайтами) можно и за счёт swap реализовать, но AVR-GCC при оптимизации и сам так делает:
Спойлер

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

inline uint8_t swapBits(uint8_t data) __attribute__((always_inline));
inline uint8_t swapBits(uint8_t data)
{
	data = (data & 0xF0) >> 4 | (data & 0x0F) << 4;
     cc8:	82 95       	swap	r24
	data = (data & 0xCC) >> 2 | (data & 0x33) << 2;
     cca:	68 2f       	mov	r22, r24
     ccc:	63 73       	andi	r22, 0x33	; 51
     cce:	e4 e0       	ldi	r30, 0x04	; 4
     cd0:	6e 9f       	mul	r22, r30
     cd2:	b0 01       	movw	r22, r0
     cd4:	11 24       	eor	r1, r1
     cd6:	8c 7c       	andi	r24, 0xCC	; 204
     cd8:	86 95       	lsr	r24
     cda:	86 95       	lsr	r24
     cdc:	68 2b       	or	r22, r24
	data = (data & 0xAA) >> 1 | (data & 0x55) << 1;
     cde:	86 2f       	mov	r24, r22
     ce0:	85 75       	andi	r24, 0x55	; 85
     ce2:	88 0f       	add	r24, r24
     ce4:	6a 7a       	andi	r22, 0xAA	; 170
     ce6:	66 95       	lsr	r22
     ce8:	86 2b       	or	r24, r22
			}
Реклама
Аватара пользователя
Z_h_e
Собутыльник Кота
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

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

Сообщение Z_h_e »

WiseLord писал(а): inline, мало чем от макроса отличается
Я думаю много чем. Меня именно макрос интересует, если нет возможности обойдусь без него.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Реклама
Аватара пользователя
WiseLord
Друг Кота
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск
Контактная информация:

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

Сообщение WiseLord »

Вряд ли макросом получится лучше сделать. Скорее всего, вычислений будет намного больше, хотя и тут компилятор может при оптимизации постараться.
Аватара пользователя
COKPOWEHEU
Говорящий с текстолитом
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

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

Сообщение COKPOWEHEU »

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

#define ByteMirror(x) (\
  (((unsigned char)(x)>>7)&(1<<0)) | (((unsigned char)(x)<<7)&(1<<7)) |\ //меняем 0 и 7 биты
  (((unsigned char)(x)>>5)&(1<<1)) | (((unsigned char)(x)<<5)&(1<<6)) |\ //меняем 1 и 6 биты
  (((unsigned char)(x)>>3)&(1<<2)) | (((unsigned char)(x)<<3)&(1<<5)) |\ //меняем 2 и 5 биты
  (((unsigned char)(x)>>1)&(1<<3)) | (((unsigned char)(x)<<1)&(1<<4)) \ //меняем 3 и 4 биты
  )
Например, так. Хотя понятия не имею, где такое может пригодиться
Аватара пользователя
WiseLord
Друг Кота
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск
Контактная информация:

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

Сообщение WiseLord »

Принцип похож, но лучше не по 1 биту 4 раза туда-сюда двигать, а переделать по тому же принципу, как я выше описал. Пусть и в виде макроса:

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

     ABCDEFGH
    /        \
ABCD----  ----EFGH   (& 0x0F, & 0xF0)
----ABCD  EFGH----   (>>4, <<4)
    \        /
     EFGHABCD
    /        \
EF--AB--  --GH--CD   (& 0x33, & 0xCC)
--EF--AB  GH--CD--   (>>2, <<2)
    \        /
     GHEFCDAB
    /        \
G-E-C-A-  -H-F-D-B   (& 0x55, & 0xAA)
-G-E-C-A  H-F-D-B-   (>>1, <<1)
     HGFEDCBA
Аватара пользователя
Z_h_e
Собутыльник Кота
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

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

Сообщение Z_h_e »

Ок. Завтра попробую. Чего-то сам не догадался так. Массив надо ин циализировать большой, зеркальные числа в данном случае нагляднее.

Помоему без разницы какой алгоритм будет в макросе, коли его в коде исполняемом не будет.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Аватара пользователя
WiseLord
Друг Кота
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск
Контактная информация:

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

Сообщение WiseLord »

Что значит - не будет в коде? А куда оно и каким волшебным образом денется?
Будет, и, вероятно, длиннее получится, чем в случае inline функций.
Последний раз редактировалось WiseLord Сб дек 03, 2016 20:47:42, всего редактировалось 1 раз.
Аватара пользователя
COKPOWEHEU
Говорящий с текстолитом
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

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

Сообщение COKPOWEHEU »

Константам безразлично (все равно этим препроцессор заниматься будет), а переменные все равно лучше через ассемблерную вставку делать.
У меня получилось в 15 команд по алгоритму WiseLord'а:

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

asm volatile(
    "swap %0 \n\t"
    "mov r23, %0 \n\t"
    "lsl %0 \n\t"
    "lsl %0 \n\t"
    "andi %0, 0x33 \n\t"
    "lsr r23 \n\t"
    "lsr r23 \n\t"
    "andi r23, 0xCC \n\t"
    "or %0, r23 \n\t"
    "mov r23, %0 \n\t"
    
    "lsl %0 \n\t"
    "andi %0, 0x55\n\t"
    "lsr r23 \n\t"
    "andi r23, 0xAA \n\t"
    "or %0, r23"
    :"+a"(x) // х - переменная, одновременно входная и выходная
    :
    :"r23" //указание компилятору что вставка портит регистр r23, пусть учтет
  );
Аватара пользователя
Z_h_e
Собутыльник Кота
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

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

Сообщение Z_h_e »

"Что значит - не будет в коде? А куда оно и каким волшебным образом денется"

Препроцессор одно число, заменит на другое.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
serg9301
Родился
Сообщения: 18
Зарегистрирован: Пн ноя 28, 2016 20:33:17

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

Сообщение serg9301 »

Вопрос знатокам, имеем на руках рабочий девайс атмега 8 часы, термометр, таймер, чем вскрыть прошивку для редактирования, контроллер считывается но как хексфайл, чем привести его в читабельный вид ассемблера для редактирования?
Аватара пользователя
Z_h_e
Собутыльник Кота
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

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

Сообщение Z_h_e »

Сначало поглядите код в цифрах. Если идут попорядку, то камень залочен.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Аватара пользователя
WiseLord
Друг Кота
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск
Контактная информация:

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

Сообщение WiseLord »

Z_h_e писал(а):Препроцессор одно число, заменит на другое
Неверно. Он одно число заменит на целую кучу сдвигов и логических умножений. И я думаю, большую кучу, чем при использовании ассемблерной вставки или inline функции.
serg9301
Родился
Сообщения: 18
Зарегистрирован: Пн ноя 28, 2016 20:33:17

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

Сообщение serg9301 »

Z_h_e писал(а):Сначало поглядите код в цифрах. Если идут попорядку, то камень залочен.
нет камень не залочен, прошивку считывал и записывал на другую мегу, работает без нареканий
Аватара пользователя
COKPOWEHEU
Говорящий с текстолитом
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

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

Сообщение COKPOWEHEU »

WiseLord писал(а):
Z_h_e писал(а):Препроцессор одно число, заменит на другое
Неверно. Он одно число заменит на целую кучу сдвигов и логических умножений. И я думаю, большую кучу, чем при использовании ассемблерной вставки или inline функции.
Но всю эту кучу он сам вычислит и вставит в код только результирующее число:

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

#define ANY_CONST 0xA2
PORTB = ByteMirror( ANY_CONST );
...
ldi r16, 0x45
out PORTB, r16
Разумеется, работает только для констант, известных на этапе компиляции.
Аватара пользователя
WiseLord
Друг Кота
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск
Контактная информация:

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

Сообщение WiseLord »

Вот именно, только если это число - константа. А в этом случае и макрос не нужен, по большому счёту. По крайней мере, я не могу особо придумать, для чего такое действительно может понадобится - именно инверсия константы.
Аватара пользователя
Z_h_e
Собутыльник Кота
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

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

Сообщение Z_h_e »

С телефона неудобно писать.

WiseLord, Вы путаете с макросами ассемблера.Для чего мне надо я уже писал.

Добавлено after 2 minutes 55 seconds:
А макросы как раз нужны, в том числе, для замены магических чисел. И для удобства.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Ответить

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