Вопросы по Keil C

May 27, 2005 14 Replies

Юзаю сабжевый компилятор (uVision2 v2.40, версия компилятора - 7.10) Помогите, пожалуйста, решить вопрос.



Как записывать константы в двоичном виде? (запись вида 0b10001011 не катит).


Это же hex, а надо bin, то есть единицы и ноли. ;)

Hello Eugene.

Sat May 28 2005 09:59, Eugene Zhernovoy wrote to Kirill Frolov:

EZ> Kirill Frolov wrote: >> 0xNN ? EZ> Это же hex, а надо bin, то есть единицы и ноли. ;)

Есть один чудный макрос, не помню, где я его взял:

//------------------------------------ // binary constants definition macro #define _bitset(bits)\ ((byte)(\ (bits%010)|\ (bits/010%010)<<1|\ (bits/0100%010)<<2|\ (bits/01000%010)<<3|\ (bits/010000%010)<<4|\ (bits/0100000%010)<<5|\ (bits/01000000%010)<<6|\ (bits/010000000%010)<<7))

#define BINARY(bits) _bitset(0##bits) //------------------------------------

Вызывается, например, так:

// COMB_10 10_WGM // || || TCCR1A = BINARY(11000101); // WGM: 0 = normal, 4 = CTC // || || // others - PWM modes // COMA_10 AB_FOC

Dimmy.

ôÙ ÈÁËÅÒ ÉÌÉ ÇÄÅ?

Hello Kirill.

29 May 05 00:40, you wrote to Eugene Zhernovoy:

Я не хакер:

=== Cut === #ifndef __BITDEF_H__ #define __BITDEF_H__ 1

#define _00000000 0 #define _00000001 1 #define _00000010 2 #define _00000011 3 #define _00000100 4 #define _00000101 5 #define _00000110 6 #define _00000111 7 #define _00001000 8 #define _00001001 9 #define _00001010 10 #define _00001011 11 #define _00001100 12 #define _00001101 13 #define _00001110 14 #define _00001111 15 #define _00010000 16 #define _00010001 17 #define _00010010 18 #define _00010011 19 #define _00010100 20 #define _00010101 21 #define _00010110 22 #define _00010111 23 #define _00011000 24 #define _00011001 25 #define _00011010 26 #define _00011011 27 #define _00011100 28 #define _00011101 29 #define _00011110 30 #define _00011111 31 #define _00100000 32 #define _00100001 33 #define _00100010 34 #define _00100011 35 #define _00100100 36 #define _00100101 37 #define _00100110 38 #define _00100111 39 #define _00101000 40 #define _00101001 41 #define _00101010 42 #define _00101011 43 #define _00101100 44 #define _00101101 45 #define _00101110 46 #define _00101111 47 #define _00110000 48 #define _00110001 49 #define _00110010 50 #define _00110011 51 #define _00110100 52 #define _00110101 53 #define _00110110 54 #define _00110111 55 #define _00111000 56 #define _00111001 57 #define _00111010 58 #define _00111011 59 #define _00111100 60 #define _00111101 61 #define _00111110 62 #define _00111111 63 #define _01000000 64 #define _01000001 65 #define _01000010 66 #define _01000011 67 #define _01000100 68 #define _01000101 69 #define _01000110 70 #define _01000111 71 #define _01001000 72 #define _01001001 73 #define _01001010 74 #define _01001011 75 #define _01001100 76 #define _01001101 77 #define _01001110 78 #define _01001111 79 #define _01010000 80 #define _01010001 81 #define _01010010 82 #define _01010011 83 #define _01010100 84 #define _01010101 85 #define _01010110 86 #define _01010111 87 #define _01011000 88 #define _01011001 89 #define _01011010 90 #define _01011011 91 #define _01011100 92 #define _01011101 93 #define _01011110 94 #define _01011111 95 #define _01100000 96 #define _01100001 97 #define _01100010 98 #define _01100011 99 #define _01100100 100 #define _01100101 101 #define _01100110 102 #define _01100111 103 #define _01101000 104 #define _01101001 105 #define _01101010 106 #define _01101011 107 #define _01101100 108 #define _01101101 109 #define _01101110 110 #define _01101111 111 #define _01110000 112 #define _01110001 113 #define _01110010 114 #define _01110011 115 #define _01110100 116 #define _01110101 117 #define _01110110 118 #define _01110111 119 #define _01111000 120 #define _01111001 121 #define _01111010 122 #define _01111011 123 #define _01111100 124 #define _01111101 125 #define _01111110 126 #define _01111111 127 #define _10000000 128 #define _10000001 129 #define _10000010 130 #define _10000011 131 #define _10000100 132 #define _10000101 133 #define _10000110 134 #define _10000111 135 #define _10001000 136 #define _10001001 137 #define _10001010 138 #define _10001011 139 #define _10001100 140 #define _10001101 141 #define _10001110 142 #define _10001111 143 #define _10010000 144 #define _10010001 145 #define _10010010 146 #define _10010011 147 #define _10010100 148 #define _10010101 149 #define _10010110 150 #define _10010111 151 #define _10011000 152 #define _10011001 153 #define _10011010 154 #define _10011011 155 #define _10011100 156 #define _10011101 157 #define _10011110 158 #define _10011111 159 #define _10100000 160 #define _10100001 161 #define _10100010 162 #define _10100011 163 #define _10100100 164 #define _10100101 165 #define _10100110 166 #define _10100111 167 #define _10101000 168 #define _10101001 169 #define _10101010 170 #define _10101011 171 #define _10101100 172 #define _10101101 173 #define _10101110 174 #define _10101111 175 #define _10110000 176 #define _10110001 177 #define _10110010 178 #define _10110011 179 #define _10110100 180 #define _10110101 181 #define _10110110 182 #define _10110111 183 #define _10111000 184 #define _10111001 185 #define _10111010 186 #define _10111011 187 #define _10111100 188 #define _10111101 189 #define _10111110 190 #define _10111111 191 #define _11000000 192 #define _11000001 193 #define _11000010 194 #define _11000011 195 #define _11000100 196 #define _11000101 197 #define _11000110 198 #define _11000111 199 #define _11001000 200 #define _11001001 201 #define _11001010 202 #define _11001011 203 #define _11001100 204 #define _11001101 205 #define _11001110 206 #define _11001111 207 #define _11010000 208 #define _11010001 209 #define _11010010 210 #define _11010011 211 #define _11010100 212 #define _11010101 213 #define _11010110 214 #define _11010111 215 #define _11011000 216 #define _11011001 217 #define _11011010 218 #define _11011011 219 #define _11011100 220 #define _11011101 221 #define _11011110 222 #define _11011111 223 #define _11100000 224 #define _11100001 225 #define _11100010 226 #define _11100011 227 #define _11100100 228 #define _11100101 229 #define _11100110 230 #define _11100111 231 #define _11101000 232 #define _11101001 233 #define _11101010 234 #define _11101011 235 #define _11101100 236 #define _11101101 237 #define _11101110 238 #define _11101111 239 #define _11110000 240 #define _11110001 241 #define _11110010 242 #define _11110011 243 #define _11110100 244 #define _11110101 245 #define _11110110 246 #define _11110111 247 #define _11111000 248 #define _11111001 249 #define _11111010 250 #define _11111011 251 #define _11111100 252 #define _11111101 253 #define _11111110 254 #define _11111111 255

#endif === Cut ===

Alexey

Hello Alexey.

31 May 05 17:35, you wrote to Kirill Frolov:

AB> Я не хакер:

AB> #ifndef __BITDEF_H__ AB> #define __BITDEF_H__ 1

AB> #define _00000000 0 AB> #define _00000001 1 AB> #define _00000010 2 AB> #define _00000011 3

[...]

AB> #define _11111110 254 AB> #define _11111111 255

А до 1048576 слабо ? :)

Dmitry

Hello Alexey.

31 May 05 17:35, you wrote to Kirill Frolov:

AB> === Cut === AB> #ifndef __BITDEF_H__ AB> #define __BITDEF_H__ 1

AB> #define _00000000 0 [skip] AB> #define _11111111 255

AB> #endif AB> === Cut === Ууу... А если 32 битные? :) По пpикидкам заголовочник будет поpядка 200 гигов pазмеpом :) По-моему 16-pичные или 8-pичные (кто как пpивык) числа хоpошо pаскладываюся в уме на единички и нолики, к тому же меньше веpоятности допустить опечатку. К тому же лучше использовать мнемонические обозначения бит (и их комбинации по "или", "и" и "не"), если они несут какой-то смысл в конкpетном контексте, легче читать будет и еще меньше веpоятность опечатки. #define BIT_NULL 0x1 #define BIT_ONE 0x2 /* */ = BIT_NULL | BIT_ONE

Sergey

Hello Sergey.

01 Jun 05 11:40, you wrote to me:

AB>> #endif AB>> === Cut === SD> Ууу... А если 32 битные? :) По пpикидкам заголовочник будет поpядка SD> 200 гигов pазмеpом :)

Hу - не получается 32-х битные так. И 16-и битные тоже.

SD> По-моему 16-pичные или 8-pичные (кто как пpивык) SD> числа хоpошо pаскладываюся в уме на единички и нолики,

Да. Hо для записи в битовые регистры периферии эти макросы очень подходят.

SD> к тому же меньше веpоятности допустить опечатку.

Да ну?

SD> К тому же лучше использовать SD> мнемонические обозначения бит (и их комбинации по "или", "и" и "не"), SD> если они несут какой-то смысл в конкpетном контексте, легче читать SD> будет и еще меньше веpоятность опечатки. SD> #define BIT_NULL 0x1 #define SD> BIT_ONE 0x2 /* */ = BIT_NULL | BIT_ONE

В хидерах avr-libc есть макрос: #define BV(bit) (1<<(bit)) Тоже очень помогает. Я уже привык:

TIMSK = BV(TOIE0) | BV(TICIE1);

Alexey

Alexey, ты ещё здесь сидишь?

Вторник Май 31 2005 16:35, Alexey Boyko wrote to Kirill Frolov:

С 16-ти битными битовыми данными что делать собираешься? А с 32-х битными?

Георгий

Hello Sergey.

Wed Jun 01 2005 12:40, Sergey Davydov wrote to Alexey Boyko:

AB>> === Cut === AB>> #ifndef __BITDEF_H__ AB>> #define __BITDEF_H__ 1

AB>> #define _00000000 0 SD> [skip] AB>> #define _11111111 255

AB>> #endif AB>> === Cut === SD> Ууу... А если 32 битные? :) По пpикидкам заголовочник будет поpядка 200 SD> гигов pазмеpом :)

Чего, потерялось моё письмо? Я ж кидал сюда чудную макру на эту тему, сейчас ещё раз кину.

Кстати, в Аде можно использовать числа по любой базе от 16 до 2. :) Пишешь #2#100101, и всё.

//------------------------------------ // binary constants definition macro #define _bitset(bits)\ ((byte)(\ (bits%010)|\ (bits/010%010)<<1|\ (bits/0100%010)<<2|\ (bits/01000%010)<<3|\ (bits/010000%010)<<4|\ (bits/0100000%010)<<5|\ (bits/01000000%010)<<6|\ (bits/010000000%010)<<7))

#define BINARY(bits) _bitset(0##bits) //------------------------------------

Использование:

SFR = BINARY(01101000);

Dimmy.

Tue, 31 May 2005 18:50:42 +0400 Dmitry Lyokhin wrote to Alexey Boyko:

AB>> Я не хакер:

AB>> #ifndef __BITDEF_H__ AB>> #define __BITDEF_H__ 1

AB>> #define _00000000 0 AB>> #define _00000001 1 AB>> #define _00000010 2 AB>> #define _00000011 3

DL> [...]

AB>> #define _11111110 254 AB>> #define _11111111 255

DL> А до 1048576 слабо ? :)

Дык не руками же. :) Тока файла здаровая палучиццо. :))

Hello George.

01 Jun 05 22:45, you wrote to me:

KF>>> Ты хакер или где? AB>> Я не хакер: AB>> === Cut === AB>> #ifndef __BITDEF_H__ AB>> #define __BITDEF_H__ 1 AB>> #define _00000000 0 GS> С 16-ти битными битовыми данными что делать собираешься? А с 32-х GS> битными?

Я же сразу предупредил - я не хакер. Hичего я с ними не собираюсь делать.

Кстати, в одной из сборок WinAvr gcc был пропатчен на предмет 0b10100010

Alexey

Hi Sergey !

Совсем недавно 01 Jun 05 12:40, Sergey Davydov писал к Alexey Boyko:

AB>> #define _00000000 0 SD> [skip] AB>> #define _11111111 255

AB>> #endif AB>> === Cut === SD> Ууу... А если 32 битные? :) Так Тимченко же тут приводил более пристойную форму- по одной строке на каждое бинарное знакоместо. SD> По-моему 16-pичные или 8-pичные (кто как пpивык) SD> числа хоpошо pаскладываюся в уме на единички и нолики, к тому же SD> меньше веpоятности допустить опечатку. Хакер, хакер! :) SD> К тому же лучше использовать мнемонические обозначения бит (и их SD> комбинации по "или", "и" и "не"), SD> если они несут какой-то смысл в конкpетном контексте, легче читать SD> будет и еще меньше веpоятность опечатки. Это да. Учитывая, что во многих эхотажных компиляторах (я так вообще других не помню) эти имена для битов уже прописаны в хедере камня.

WBRgrds Ruslan

Hello Ruslan.

03 Jun 05 08:01, you wrote to me:

AB>>> #define _00000000 0 SD>> [skip] AB>>> #define _11111111 255 AB>>> === Cut === SD>> Ууу... А если 32 битные? :) RM> Так Тимченко же тут пpиводил более пpистойную фоpму- по одной стpоке RM> на каждое бинаpное знакоместо. Видел. Так пpотив такой фоpмы я ничего и не имею. Мне не понpавилась идея пеpечисления всех чисел от 0 до (2^n - 1). SD>> По-моему 16-pичные или 8-pичные (кто как пpивык) SD>> числа хоpошо pаскладываюся в уме на единички и нолики, к тому же SD>> меньше веpоятности допустить опечатку. RM> Хакеp, хакеp! RM> :) Hу уж если 16-pичная запись уже хакеpством считается... :) SD>> К тому же лучше использовать мнемонические обозначения бит (и их SD>> комбинации по "или", "и" и "не"), SD>> если они несут какой-то смысл в конкpетном контексте, легче SD>> читать будет и еще меньше веpоятность опечатки. RM> Это да. Учитывая, что во многих эхотажных компилятоpах (я так вообще RM> дpугих не помню) эти имена для битов уже пpописаны в хедеpе камня. Бывают еще собственные имена битов, напpимеp ножки обозвать более говоpящими именами (в pамках пpоекта), чем, скажем, P1.0

Sergey

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required