Страница 1 из 1

Вопрос новичка по функции #define

Добавлено: Пт июн 27, 2008 12:18:25
megasvintus
Приведен кусок файла *.h :
define u8 unsigned char // 0 to 255
#define s8 signed char // -128 to 127

#define u16 unsigned int // 0 to 65535
#define s16 signed int // -32768 to 32767

#define u32 unsigned long int // 0 to 4294967295
#define s32 signed long int // -2147483648 to 2147483647

#define f32 float // ±1.175e-38 to ±3.402e38
#define d32 double // ±1.175e-38 to ±3.402e38

/*
Type Size (Bits) Range from CodeVisionAVR help
bit 1 0 , 1
char 8 -128 to 127
unsigned char 8 0 to 255
signed char 8 -128 to 127
int 16 -32768 to 32767
short int 16 -32768 to 32767
unsigned int 16 0 to 65535
signed int 16 -32768 to 32767
long int 32 -2147483648 to 2147483647
unsigned long int 32 0 to 4294967295
signed long int 32 -2147483648 to 2147483647
float 32 ±1.175e-38 to ±3.402e38
double 32 ±1.175e-38 to ±3.402e38
*/

///////////////////////////////////////////////

#ifdef _MEGA8_INCLUDED_


/* 2 wire serial interface */

#define TWPS1 1
#define TWPS0 0

#define TWINT 7
#define TWEA 6
#define TWSTA 5
#define TWSTO 4
#define TWWC 3
#define TWEN 2
#define TWIE 0
#define TWGCE 0


Вопрос вот в чем: к примеру взять строчку #define TWEA 6

По даташиту понятно что написав в исходнике на С слово TWEA компиллятор найдет его в файле *.h и установит бит 6 в регистре TWCR в единицу, ПОЧЕМУ ВМЕСТО указания что в шестой бит надо установить единицу стоит просто цифра 6 ?????

Добавлено: Пт июн 27, 2008 12:24:25
L29Ah
Ээээ... Это вопрос про директиву "#define" или про неведомый даташит и непонятную прогу?

Добавлено: Пт июн 27, 2008 12:30:39
megasvintus
Это вопрос про директиву, и это не кусок исходника, а кусок хидера.

Мне просто не совсем понятно как эта функция в данном случае делает подстановку определений пользователя.

Каким образом функция осуществляет все вышесказанное просто по цифре 6. Где это в хидере прописано???

Даташит очень даже ведомый по меге 8 скачанный с сайта Atmel.com

Добавлено: Пт июн 27, 2008 12:38:55
L29Ah
Он того, что ты сказал, не делает.

Директива препроцессора "#define ляляля люлюлю ухуху" всего-лишь сообщает препроцессору, что в исходник перед компиляцией вместо "ляляля" нужно подставить "люлюлю ухуху". Всё.

Re: Вопрос новичка по функции #define

Добавлено: Пт июн 27, 2008 12:39:18
tych
megasvintus писал(а):По даташиту понятно что написав в исходнике на С слово TWEA компиллятор найдет его в файле *.h и установит бит 6 в регистре TWCR в единицу, ПОЧЕМУ ВМЕСТО указания что в шестой бит надо установить единицу стоит просто цифра 6 ?????
ни какой бит не установится. просто в тексте программы препроцессор компиятра заменит TWCR на цифру 6.

смотри стр. 5 "Си для МК" под кнопкой Изображение ниже.

Добавлено: Пт июн 27, 2008 20:35:52
Mozart
я внесу свою лепту ибо он не установит 6ой бит а просто запишет число 6 в регистр а вот чтобы установить именно 6ой бит надо...

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

#include <...>
#define SIX_BIT    6
#define MASK_SIX_BIT   (1 << SIX_BIT)

int main()
{
     int a = 0;
     a |=  (1 << SIX_BIT);  //set six bit
     a &= ~(1 << SIX_BIT); // clear six bit
//or...
     a |= MASK_SIX_BIT;
     a &= ~MASK_SIX_BIT; 

     return 0;
}
з.ы. вот и всё... читайте книги по Си они иногда помогают

Добавлено: Пт июн 27, 2008 23:16:43
tych
Mozart писал(а): он не установит 6-ой бит а просто запишет число 6 в регистр
Чепуха ! Выше уже ДВА раза написано как ПРАВИЛЬНО !
Mozart писал(а):читайте книги по Си они иногда помогают
Читайте книги !

Добавлено: Пт июн 27, 2008 23:22:21
Mozart
если число 6 или 0x06 или 0x6 представить в бинарном виде то получим 0b00000110 и вот это вото он запишет в регистр))) :)) и где тут позвольте у вас узнать бит номер 6???

Добавлено: Сб июн 28, 2008 10:50:20
tych
Mozart писал(а):ржунимагу...
Действительно ЖЖЖЕШЬ не подетски ! Есть над чем поржать.