|
Как из Байта получить восемь значений 0 и 1, CodeVision AVR |
|
|
|
 |
Ответов
|
Dec 25 2008, 21:03
|

Местный
  
Группа: Свой
Сообщений: 211
Регистрация: 6-08-07
Из: Приднестровье, Тирасполь
Пользователь №: 29 581

|
Цитата(Сергей Борщ @ Dec 25 2008, 23:42)  Я заменил PORTW на PORTD, поскольку у меги8 нет порта... Дык и я заменил Код #define PORTW PORTD Цитата(Сергей Борщ @ Dec 25 2008, 23:42)  Никакой ругани... У Вас объектный код (*.cpp)? Привожу скриншот компиляции Вашего кода (просто вставил его в рабочий проект) в WinAVR 20080610 под AVR Studio 4 А вот так компилится: Код void Test1(uchar byte, uchar bitmask) { PORTD=(byte & bitmask)? PORTD | (1<<BIT): PORTD & ~(1<<BIT); }
Эскизы прикрепленных изображений
--------------------
Любой, заслуживающий внимания, опыт приобретается себе в убыток...
|
|
|
|
|
Dec 25 2008, 21:27
|

Участник

Группа: Свой
Сообщений: 68
Регистрация: 11-12-08
Из: Республика Беларусь, г.Минск
Пользователь №: 42 380

|
Цитата(Goodefine @ Dec 26 2008, 00:03)  Дык и я заменил Код #define PORTW PORTD У Вас объектный код (*.cpp)? Привожу скриншот компиляции Вашего кода (просто вставил его в рабочий проект) в WinAVR 20080610 под AVR Studio 4 А вот так компилится: Код void Test1(uchar byte, uchar bitmask) { PORTD=(byte & bitmask)? PORTD | (1<<BIT): PORTD & ~(1<<BIT); } Попробуйте разделить все три прцедуры на строчки и поймёте где трабл. Да, не нравятся ему аргументы, но в какой позиции строки он не написал. Кстати, посмотрите, byte может у вас определено ранее #defin'ом как unsigned char? Может просто имя переменной поменять? Ксати, глотнул пива, идея пришла: А не прокатит ли такая конструкция: Код for ((Direction)? mask=1<<0:mask=1<<7;mask;(Direction)? mask<<=1:mask>>1) {PORTx=(*byte&mask)? PORTx|(1<<BIT):PORTx&~(1<<BIT);delay_us(x);} Сюда даже вместо 7 (в 'for') можно как-то подставить sizeof(); (хоть в байтах*8-1,хоть в битах-1) ? Тогда прога будет просто супер универсальной! (Я даже себе в библию программиста запишу  ) И если Direction задано через union...struct... как бит, то налицо ещё и прямая экономия места... ?
Сообщение отредактировал DenisIV - Dec 25 2008, 22:08
|
|
|
|
|
Dec 25 2008, 22:46
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(DenisIV @ Dec 25 2008, 23:27)  Сюда даже вместо 7 (в 'for') можно как-то подставить sizeof(); (хоть в байтах*8-1,хоть в битах-1) ? sizeof(mask) * __CHAR_BITS__ Цитата(DenisIV @ Dec 25 2008, 23:27)  И если Direction задано через union...struct... как бит, то налицо ещё и прямая экономия места... ? Скажем так: если это константа, известная на этапе компиляции. В С++ она может быть параметром шаблона. Цитата(DenisIV @ Dec 26 2008, 00:40)  итого мы можем: Код (Direction)? mask=1<<0:mask=1<<7; while(mask) { PORTx=(*byte&mask)? PORTx|(1<<BIT):PORTx&~(1<<BIT); delay_us(x); (Direction)? mask<<=1:mask>>1) } Да. Если мы пойдем еще дальше, и заметим, что при входе в цикл mask никак не может быть равно нулю, т.е. цикл всегда должен выполниться хотя бы один раз - мы можем заменить цикл while() {} на более оптимальный do {} while(): Код mask=1<<(Direction) ? 0 : 7; do { *byte & mask ? PORTx |= (1<<BIT) : PORTx &= ~(1<<BIT); delay_us(x); } while ( Direction ? mask<<=1 : mask>>1 );
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
Сообщений в этой теме
Vny4ek Как из Байта получить восемь значений 0 и 1 Dec 23 2008, 13:27 Палыч Используем цикл
Кодunsigned char Byte, i, Bit... Dec 23 2008, 13:31 SysRq А цель-то какая сего действа? Как "битовый ма... Dec 23 2008, 16:39 Goodefine Цитата(Vny4ek @ Dec 23 2008, 16:27) Есть ... Dec 23 2008, 17:40 Vny4ek цель такая: нужно сделать передачу информации, в в... Dec 24 2008, 06:21 Палыч Цитата(Vny4ek @ Dec 24 2008, 09:21) ...во... Dec 24 2008, 06:51 Goodefine Цитата(Vny4ek @ Dec 24 2008, 10:21) цель ... Dec 24 2008, 07:31 SysRq Цитата(Goodefine @ Dec 24 2008, 10:31) Ко... Dec 24 2008, 10:55 Goodefine Цитата(SysRq @ Dec 24 2008, 14:55) Правил... Dec 24 2008, 11:07 Палыч Цитата(Goodefine @ Dec 24 2008, 14:07) Ну... Dec 24 2008, 11:51 DenisIV Цитата(Goodefine @ Dec 24 2008, 14:07) Ну... Dec 24 2008, 12:19 Goodefine Цитата(Палыч @ Dec 24 2008, 15:51) ...Пер... Dec 24 2008, 12:01 SysRq Цитата(Goodefine @ Dec 24 2008, 15:01) С ... Dec 25 2008, 12:50  DenisIV Цитата(SysRq @ Dec 25 2008, 15:50) Вполне... Dec 25 2008, 13:15 Goodefine Цитата(DenisIV @ Dec 24 2008, 16:19) Обыч... Dec 24 2008, 13:22 xemul Странно, что еще до интегралов не добрались...
Код... Dec 25 2008, 14:13 DenisIV Цитата(xemul @ Dec 25 2008, 17:13) Странн... Dec 25 2008, 17:23  rezident Цитата(DenisIV @ Dec 25 2008, 22:23) иног... Dec 25 2008, 17:36 Goodefine Цитата(xemul @ Dec 25 2008, 17:13) Код...... Dec 25 2008, 18:19 Сергей Борщ Цитата(Goodefine @ Dec 25 2008, 20:19) Ко... Dec 25 2008, 20:13  _Pasha Цитата(Сергей Борщ @ Dec 26 2008, 00:13) ... Dec 26 2008, 12:45 Goodefine Цитата(Сергей Борщ @ Dec 25 2008, 23:13) ... Dec 25 2008, 20:27 Сергей Борщ Цитата(Goodefine @ Dec 25 2008, 22:27) у ... Dec 25 2008, 20:42 Сергей Борщ Цитата(Goodefine @ Dec 25 2008, 23:03) У ... Dec 25 2008, 22:40 DenisIV Ещё глотнул пива...
Ведь оператор for работает так... Dec 25 2008, 22:40 Goodefine Цитата(DenisIV @ Dec 26 2008, 00:27) Попр... Dec 25 2008, 22:56 DenisIV Цитата(Goodefine @ Dec 26 2008, 01:56) Та... Dec 25 2008, 23:42  zltigo Цитата(DenisIV @ Dec 26 2008, 02:42) Похо... Dec 26 2008, 07:48   DenisIV Цитата(zltigo @ Dec 26 2008, 10:48) Реком... Dec 26 2008, 12:25    zltigo Цитата(DenisIV @ Dec 26 2008, 15:25) Я ра... Dec 26 2008, 13:06 Goodefine Цитата(DenisIV @ Dec 26 2008, 03:42) Могу... Dec 26 2008, 06:52 Goodefine Цитата(_Pasha @ Dec 26 2008, 16:45) была ... Dec 26 2008, 13:47 rezident Сообщение модератора.
Уважаемые, участники! За... Dec 26 2008, 14:05
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|