macros.h 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605
  1. ////////////////////////////////////////////////////////////////////////////////////////////////////
  2. // Макроопределения.
  3. //
  4. // (C) Евгений Трифонов, Денис Железняков. 2001 - 2007 г.
  5. // Версия: 2.7.1 от 18.12.2007
  6. ////////////////////////////////////////////////////////////////////////////////////////////////////
  7. // Параметры генератора (частота генератора указывается в Гц.)
  8. #ifndef __MCU_Clock
  9. #warning Тактовая частота процессора (__MCU_Clock) не указана! Используется значение по-умолчанию: 9 216 000 Гц
  10. #define __MCU_Clock 9216000
  11. #endif
  12. //
  13. #ifndef __Macros_Included__
  14. #define __Macros_Included__
  15. //
  16. #ifndef ENABLE_BIT_DEFINITIONS
  17. #define ENABLE_BIT_DEFINITIONS
  18. #endif
  19. //
  20. #include <ioavr.h>
  21. #include <ina90.h>
  22. // Циклы
  23. #define Hz(Value) ((1 / (float)(Value)) * __MCU_Clock)
  24. #define kHz(Value) Hz((Value) * 0x000003E8)
  25. #define MHz(Value) Hz((Value) * 0x000F4240)
  26. #define _ns * ((float)(__MCU_Clock) / 0x3B9ACA00)
  27. #define _us * ((float)(__MCU_Clock) / 0x000F4240)
  28. #define _mks _us
  29. #define _ms * ((float)(__MCU_Clock) / 0x000003E8)
  30. #define _s * ((float)(__MCU_Clock))
  31. #define _cycle
  32. #define _cycles
  33. // Задержка
  34. #define Delay(Value) __delay_cycles(Value)
  35. #define Delay_ns(Value) Delay((Value)_ns)
  36. #define Delay_us(Value) Delay((Value)_us)
  37. #define Delay_mks(Value) Delay((Value)_mks)
  38. #define Delay_ms(Value) Delay((Value)_ms)
  39. #define Delay_s(Value) Delay((Value)_s)
  40. #define Delay_Hz(Value) Delay(Hz(Value))
  41. #define Delay_kHz(Value) Delay(kHz(Value))
  42. #define Delay_MHz(Value) Delay(MHz(Value))
  43. #define Delay_Cycle(Value) Delay(Value)
  44. #define Delay_Cycles(Value) Delay(Value)
  45. // Таймеры
  46. #define TC16_Compare(Div, Value) (unsigned int)((1 / (float)(Div)) * (Value))
  47. #define TC16_Overflow(Div, Value) (unsigned int)(0x10000 - TC16_Compare(Div, Value))
  48. #define TC8_Compare(Div, Value) (unsigned char)TC16_Compare(Div, Value)
  49. #define TC8_Overflow(Div, Value) (unsigned char)(0x00100 - TC8_Compare(Div, Value))
  50. // Битовые операции
  51. #define Bit(Idx) (1 << (Idx))
  52. #define _Bit(Idx) Bit(Idx)
  53. // Изменение состояния обного бита в переменной или регистре
  54. //
  55. // Примеры:
  56. // Set_Bit(TCCR1A, WGM10); - установка бита WGM10 в регистре TCCR1A
  57. // Clear_Bit(TCCR1B, CS10); - сброс бита CS10 в регистре TCCR1B
  58. // Get_Bit(TCCR1A, WGM10); - получение значения бита WGM10 в регистре TCCR1A
  59. // Invert_Bit(TCCR1B, CS10); - инвертирование бита CS10 в регистре TCCR1B
  60. // Is_Bit_Set(TCCR1A, WGM10); - возвращает истину если бит WGM10 в регистре TCCR1A установлен
  61. // Is_Bit_Clear(TCCR1B, CS10); - возвращает истину если бит CS10 в регистре TCCR1B сброшен
  62. //
  63. #define Set_Bit(Var, BitIdx) ((Var) |= _Bit(BitIdx))
  64. #define Clear_Bit(Var, BitIdx) ((Var) &= ~_Bit(BitIdx))
  65. #define Get_Bit(Var, BitIdx) ((Var) & _Bit(BitIdx))
  66. #define Invert_Bit(Var, BitIdx) ((Var) ^= _Bit(BitIdx))
  67. #define Toggle_Bit(Var, BitIdx) Invert_Bit(Var, BitIdx)
  68. #define Is_Bit_Set(Var, BitIdx) (Get_Bit(Var, BitIdx) == _Bit(BitIdx))
  69. #define Is_Bit_Clear(Var, BitIdx) (Get_Bit(Var, BitIdx) == 0x00)
  70. // Изменение состояния переменной или регистра по указанной маске
  71. //
  72. // Примеры:
  73. // Set_Bits(TCCR1A, _Bit(WGM10) | _Bit(COM1A1)); - установка битов WGM10 и COM1A1 в регистре TCCR1A
  74. // Set_Bits(TCCR1A, ~_Bit(WGM10) | _Bit(COM1A1)); - сброс бита WGM10 и установка бита COM1A1 в регистре TCCR1A
  75. // Clear_Bits(TCCR1A, ~_Bit(WGM10) | _Bit(COM1A1)); - установка бита WGM10 и сброс бита COM1A1 в регистре TCCR1A
  76. //
  77. #define Set_Bits(Var, Mask) ((Var) |= (Mask))
  78. #define Clear_Bits(Var, Mask) ((Var) &= ~(Mask))
  79. #define Invert_Bits(Var, Mask) ((Var) ^= (Mask))
  80. #define Toggle_Bits(Var, Mask) Invert_Bits(Var, (Mask))
  81. // Изменение состояния обного бита в переменной или регистре посредством определённых флагов (шаблонов)
  82. //
  83. // Примеры:
  84. // volatile Byte System_Status = 0x00; - объявление переменной, где будут меняться флаги
  85. //
  86. // #define Error_Flag System_Status, 0 - объявление флага в переменной System_Status в бите 0
  87. // #define Ready_Flag System_Status, 1 - объявление флага в переменной System_Status в бите 1
  88. // #define Delay_Flag System_Status, 3 - объявление флага в переменной System_Status в бите 3
  89. // #define RX_Flag System_Status, 6 - объявление флага в переменной System_Status в бите 6
  90. // #define TX_Flag System_Status, 8 - объявление флага в переменной System_Status в бите 8
  91. //
  92. // Set_Flag(Ready_Flag); - установка бита 1 в переменной System_Status
  93. // Set_Flag(RX_Flag); - установка бита 6 в переменной System_Status
  94. // Clear_Flag(TX_Flag); - сброс бита 8 в переменной System_Status
  95. //
  96. #define Set_Flag(FlagDef) Set_Bit(FlagDef)
  97. #define Clear_Flag(FlagDef) Clear_Bit(FlagDef)
  98. #define Get_Flag(FlagDef) Get_Bit(FlagDef)
  99. #define Invert_Flag(FlagDef) Invert_Bit(FlagDef)
  100. #define Toggle_Flag(FlagDef) Toggle_Bit(FlagDef)
  101. #define Is_Flag_Set(FlagDef) Is_Bit_Set(FlagDef)
  102. #define Is_Flag_Clear(FlagDef) Is_Bit_Clear(FlagDef)
  103. //
  104. #define BIN(Value) (((0x##Value##L >> 0x0015) & 0x8000) + ((0x##Value##L >> 0x0012) & 0x4000) +\
  105. ((0x##Value##L >> 0x000F) & 0x2000) + ((0x##Value##L >> 0x000C) & 0x1000) +\
  106. ((0x##Value##L >> 0x0009) & 0x0800) + ((0x##Value##L >> 0x0006) & 0x0400) +\
  107. ((0x##Value##L >> 0x0003) & 0x0200) + ((0x##Value##L & 0x0100)) +\
  108. ((0x##Value##L >> 0x0015) & 0x0080) + ((0x##Value##L >> 0x0012) & 0x0040) +\
  109. ((0x##Value##L >> 0x000F) & 0x0020) + ((0x##Value##L >> 0x000C) & 0x0010) +\
  110. ((0x##Value##L >> 0x0009) & 0x0008) + ((0x##Value##L >> 0x0006) & 0x0004) +\
  111. ((0x##Value##L >> 0x0003) & 0x0002) + ((0x##Value##L & 0x0001)))
  112. // Скорость порта UART
  113. #define Baud_Rate(BaudRate) (unsigned int)((unsigned long)(__MCU_Clock) / (((BaudRate) * 0x10L) - 1))
  114. #define Baud_RateL(BaudRate) (unsigned char)((unsigned long)(__MCU_Clock) / (((BaudRate) * 0x10L) - 1))
  115. #define Baud_RateH(BaudRate) (unsigned char)((unsigned long)(__MCU_Clock) / (((BaudRate) * 0x10L) - 1) >> 8)
  116. // Переименование типов
  117. #ifndef bool
  118. #include <stdbool.h>
  119. #endif
  120. // Булевый тип
  121. typedef bool Boolean;
  122. // Целый тип, 8 бит
  123. typedef unsigned char Byte;
  124. typedef unsigned char u08;
  125. typedef signed char ShortInt;
  126. typedef signed char s08;
  127. typedef signed char SByte;
  128. // Целый тип, 16 бит
  129. typedef unsigned int Word;
  130. typedef unsigned int u16;
  131. typedef unsigned int UInt16;
  132. typedef signed int SmallInt;
  133. typedef signed int s16;
  134. typedef signed int SInt16;
  135. // Целый тип, 32 бита
  136. typedef unsigned long DWord;
  137. typedef unsigned long Cardinal;
  138. typedef unsigned long u32;
  139. typedef unsigned long UInt32;
  140. typedef signed long Integer;
  141. typedef signed long s32;
  142. typedef signed long SInt32;
  143. // Целый тип, 64 бита
  144. typedef unsigned long long DDWord;
  145. typedef unsigned long long u64;
  146. typedef unsigned long long UInt64;
  147. typedef signed long long Int64;
  148. typedef signed long long s64;
  149. typedef signed long long SInt64;
  150. // Вещественный тип, 32 бита
  151. typedef float Float;
  152. //Вещественный тип, 32 бита (если разрешено в настройках, то 64 бита)
  153. typedef double Double;
  154. typedef long double Extended;
  155. //
  156. typedef union
  157. {
  158. unsigned char Byte;
  159. struct
  160. {
  161. unsigned char
  162. Bit0: 1,
  163. Bit1: 1,
  164. Bit2: 1,
  165. Bit3: 1,
  166. Bit4: 1,
  167. Bit5: 1,
  168. Bit6: 1,
  169. Bit7: 1;
  170. };
  171. } Byte_Bit;
  172. //
  173. typedef union
  174. {
  175. unsigned int Word;
  176. struct
  177. {
  178. unsigned char Byte0;
  179. unsigned char Byte1;
  180. };
  181. struct
  182. {
  183. unsigned int
  184. Bit0: 1,
  185. Bit1: 1,
  186. Bit2: 1,
  187. Bit3: 1,
  188. Bit4: 1,
  189. Bit5: 1,
  190. Bit6: 1,
  191. Bit7: 1,
  192. Bit8: 1,
  193. Bit9: 1,
  194. Bit10: 1,
  195. Bit11: 1,
  196. Bit12: 1,
  197. Bit13: 1,
  198. Bit14: 1,
  199. Bit15: 1;
  200. };
  201. } Word_Byte_Bit;
  202. //
  203. typedef union
  204. {
  205. unsigned int Word;
  206. struct
  207. {
  208. unsigned char Byte0;
  209. unsigned char Byte1;
  210. };
  211. } Word_Byte;
  212. //
  213. typedef union
  214. {
  215. unsigned long DWord;
  216. struct
  217. {
  218. unsigned char Byte0;
  219. unsigned char Byte1;
  220. unsigned char Byte2;
  221. unsigned char Byte3;
  222. };
  223. } DWord_Byte;
  224. //
  225. typedef union
  226. {
  227. unsigned long DWord;
  228. struct
  229. {
  230. unsigned char Byte0;
  231. unsigned char Byte1;
  232. unsigned char Byte2;
  233. unsigned char Byte3;
  234. };
  235. struct
  236. {
  237. unsigned long
  238. Bit0: 1,
  239. Bit1: 1,
  240. Bit2: 1,
  241. Bit3: 1,
  242. Bit4: 1,
  243. Bit5: 1,
  244. Bit6: 1,
  245. Bit7: 1,
  246. Bit8: 1,
  247. Bit9: 1,
  248. Bit10: 1,
  249. Bit11: 1,
  250. Bit12: 1,
  251. Bit13: 1,
  252. Bit14: 1,
  253. Bit15: 1,
  254. Bit16: 1,
  255. Bit17: 1,
  256. Bit18: 1,
  257. Bit19: 1,
  258. Bit20: 1,
  259. Bit21: 1,
  260. Bit22: 1,
  261. Bit23: 1,
  262. Bit24: 1,
  263. Bit25: 1,
  264. Bit26: 1,
  265. Bit27: 1,
  266. Bit28: 1,
  267. Bit29: 1,
  268. Bit30: 1,
  269. Bit31: 1;
  270. };
  271. } DWord_Byte_Bit;
  272. //
  273. typedef union
  274. {
  275. unsigned long long DDWord;
  276. struct
  277. {
  278. unsigned int Word0;
  279. unsigned int Word1;
  280. unsigned int Word2;
  281. unsigned int Word3;
  282. };
  283. struct
  284. {
  285. unsigned char Byte0;
  286. unsigned char Byte1;
  287. unsigned char Byte2;
  288. unsigned char Byte3;
  289. unsigned char Byte4;
  290. unsigned char Byte5;
  291. unsigned char Byte6;
  292. unsigned char Byte7;
  293. };
  294. } DDWord_Byte;
  295. //
  296. typedef union
  297. {
  298. unsigned long long DDWord;
  299. struct
  300. {
  301. unsigned int Word0;
  302. unsigned int Word1;
  303. unsigned int Word2;
  304. unsigned int Word3;
  305. };
  306. struct
  307. {
  308. unsigned char Byte0;
  309. unsigned char Byte1;
  310. unsigned char Byte2;
  311. unsigned char Byte3;
  312. unsigned char Byte4;
  313. unsigned char Byte5;
  314. unsigned char Byte6;
  315. unsigned char Byte7;
  316. };
  317. struct
  318. {
  319. unsigned long
  320. Bit0: 1,
  321. Bit1: 1,
  322. Bit2: 1,
  323. Bit3: 1,
  324. Bit4: 1,
  325. Bit5: 1,
  326. Bit6: 1,
  327. Bit7: 1,
  328. Bit8: 1,
  329. Bit9: 1,
  330. Bit10: 1,
  331. Bit11: 1,
  332. Bit12: 1,
  333. Bit13: 1,
  334. Bit14: 1,
  335. Bit15: 1,
  336. Bit16: 1,
  337. Bit17: 1,
  338. Bit18: 1,
  339. Bit19: 1,
  340. Bit20: 1,
  341. Bit21: 1,
  342. Bit22: 1,
  343. Bit23: 1,
  344. Bit24: 1,
  345. Bit25: 1,
  346. Bit26: 1,
  347. Bit27: 1,
  348. Bit28: 1,
  349. Bit29: 1,
  350. Bit30: 1,
  351. Bit31: 1,
  352. Bit32: 1,
  353. Bit33: 1,
  354. Bit34: 1,
  355. Bit35: 1,
  356. Bit36: 1,
  357. Bit37: 1,
  358. Bit38: 1,
  359. Bit39: 1,
  360. Bit40: 1,
  361. Bit41: 1,
  362. Bit42: 1,
  363. Bit43: 1,
  364. Bit44: 1,
  365. Bit45: 1,
  366. Bit46: 1,
  367. Bit47: 1,
  368. Bit48: 1,
  369. Bit49: 1,
  370. Bit50: 1,
  371. Bit51: 1,
  372. Bit52: 1,
  373. Bit53: 1,
  374. Bit54: 1,
  375. Bit55: 1,
  376. Bit56: 1,
  377. Bit57: 1,
  378. Bit58: 1,
  379. Bit59: 1,
  380. Bit60: 1,
  381. Bit61: 1,
  382. Bit62: 1,
  383. Bit63: 1;
  384. };
  385. } DDWord_Byte_Bit;
  386. ////////////////////////////////////////////////////////////////////////////////////////////////////
  387. //
  388. // Операции с портами.
  389. //
  390. // Синтаксис:
  391. // #define <имя> <Letter>, <Idx>, [<Level>], [<PullUp>]
  392. //
  393. // <Letter> - Буква порта (A, B, C, и т. д.).
  394. // <Idx> - Номер вывода порта (0-7).
  395. // <Level> - Активный уровень. (High или Low, если не указан, то High);
  396. // High - логическая единица;
  397. // Low - логический ноль.
  398. // <PullUp> - Внешний подтягивающий резистор. (On или Off, если не указан, то Off);
  399. // On - используется внешний подтягивающий резистор;
  400. // Off - внешнего подтягивающего резастора нет.
  401. //
  402. // Описание макрокоманд:
  403. // Pin_HiZ (Set_Pin_HiZ) - если PullUp = Off, то вывода порта устанавливается в "третье" (Hi-Z) состояние;
  404. // Pin_PullUp_IO (Set_Pin_PullUp_IO) - установка вывода порта для работы с внешним "подтягивающим" резистором;
  405. // Pin_In (Set_Pin_In) - установка вывода порта как вход;
  406. // Pin_Out (Set_Pin_Out) - установка вывода порта как выход;
  407. // Pin_On (Set_Pin_On) - установка активного логического уровня на выводе порта;
  408. // Pin_High (Set_Pin_High) - установка "единичного" логического уровня на выводе порта;
  409. // Pin_Off (Set_Pin_Off) - установка неактивного логического уровня на выводе порта;
  410. // Pin_Low (Set_Pin_Low) - установка "нулевого" логического уровня на выводе порта;
  411. // Pin_Signal (Get_Pin_Signal) - проверка логического уровня на выводе порта;
  412. // Pin_Change (Change_Pin_Signal) - изменение логического уровня на выводе порта на противоположное;
  413. // Pin_Invert (Invert_Pin_Signal) - аналогично Pin_Change;
  414. // Pin_Out_On (Set_Pin_Out_On) - установка вывода порта как выход и установка активного логического уровня;
  415. // Pin_Out_Off (Set_Pin_Out_Off) - установка вывода порта как выход и установка неактивного логического уровня;
  416. // Pin_Out_High (Set_Pin_Out_High) - установка вывода порта как выход и установка единичного логического уровня на выводе порта;
  417. // Pin_Out_Low (Set_Pin_Out_Low) - установка вывода порта как выход и установка нулевого логического уровня на выводе порта.
  418. //
  419. // Примечания:
  420. // 1. Если в определении вывода порта указано, что используется внешний подтягивающий
  421. // резистор (PullUp = On), то макрокоманды Pin_In и Pin_Out выполняют действия,
  422. // аналогичные макрокоманде Pin_PullUp_IO.
  423. // 2. В скобках указаны макрокоманды, выполняющие аналогичные действия, но параметры для
  424. // них передаются не через определение define, а также как в функцию.
  425. // 3. В определении define последние два параметра можно не указывать, но ЗАПЯТЫЕ ОПУСКАТЬ НЕЛЬЗЯ.
  426. //
  427. // Примеры:
  428. // #define Example1 B, 5, Low,
  429. // #define Example2 B, 5,,
  430. // #define Example3 B, 5, Low, On
  431. // #define Example4 B, 5,, Off
  432. //
  433. // Pin_Out(Example1); - установка вывода 5 порта В на выход;
  434. // Pin_On(Example1); - установка указанного активного уровня (Low) на выводе 5 порта B.
  435. //
  436. // Пример к примечанию 2:
  437. // Макрокоманда Set_Pin_On(B, 5, Low, On) выполнит аналогичные действия, что и команда Pin_On(Example3)
  438. //
  439. ////////////////////////////////////////////////////////////////////////////////////////////////////
  440. // Основные операции с портами
  441. #define Set_PORT_Bit(Ltr, Idx) (PORT##Ltr |= _Bit(Idx))
  442. #define Clr_PORT_Bit(Ltr, Idx) (PORT##Ltr &= ~_Bit(Idx))
  443. #define Invert_PORT_Bit(Ltr, Idx) (PORT##Ltr ^= _Bit(Idx))
  444. #define Xor_PORT_Bit(Ltr, Idx) Invert_PORT_Bit(Ltr, Idx)
  445. #define Toggle_PORT_Bit(Ltr, Idx) Invert_PORT_Bit(Ltr, Idx)
  446. #define Set_DDR_Bit(Ltr, Idx) (DDR##Ltr |= _Bit(Idx))
  447. #define Clr_DDR_Bit(Ltr, Idx) (DDR##Ltr &= ~_Bit(Idx))
  448. #define Invert_DDR_Bit(Ltr, Idx) (DDR##Ltr ^= _Bit(Idx))
  449. #define Xor_DDR_Bit(Ltr, Idx) Invert_DDR_Bit(Ltr, Idx)
  450. #define Toggle_DDR_Bit(Ltr, Idx) Invert_DDR_Bit(Ltr, Idx)
  451. #define Get_PIN_State(Ltr, Idx) (PIN##Ltr & _Bit(Idx))
  452. // Установка вывода порта в третье состояние (Hi-Z)
  453. #define Set_Pin_HiZ(Ltr, Idx, Level, PullUp) { Clr_DDR_Bit(Ltr, Idx); Clr_PORT_Bit(Ltr, Idx); }
  454. #define Pin_HiZ(PortDef) Set_Pin_HiZ(PortDef)
  455. // Установка вывода порта для работы с внешним подтягивающим резистором
  456. #define SetPinPullUp(Ltr, Idx)
  457. #define SetPinPullUpOff(Ltr, Idx)
  458. #define SetPinPullUpOn(Ltr, Idx) Clr_PORT_Bit(Ltr, Idx)
  459. #define Set_Pin_PullUp_IO(Ltr, Idx, Level, PullUp) { Clr_DDR_Bit(Ltr, Idx); SetPinPullUp##PullUp(Ltr, Idx); }
  460. #define Pin_PullUp_IO(PortDef) Set_Pin_PullUp_IO(PortDef)
  461. // Установка вывода порта как вход
  462. #define Set_Pin_In(Ltr, Idx, Level, PullUp) Set_Pin_PullUp_IO(Ltr, Idx, Level, PullUp)
  463. #define Pin_In(PortDef) Set_Pin_In(PortDef)
  464. // Установка вывода порта как выход
  465. #define SetPinOut(Ltr, Idx) Set_DDR_Bit(Ltr, Idx)
  466. #define SetPinOutOff(Ltr, Idx) Set_DDR_Bit(Ltr, Idx)
  467. #define SetPinOutOn(Ltr, Idx) Clr_DDR_Bit(Ltr, Idx)
  468. #define Set_Pin_Out(Ltr, Idx, Level, PullUp) { SetPinOut##PullUp(Ltr, Idx); SetPinPullUp##PullUp(Ltr, Idx); }
  469. #define Pin_Out(PortDef) Set_Pin_Out(PortDef)
  470. // Установка активного логического уровня на выводе порта
  471. #define SetPin(Ltr, Idx) Set_PORT_Bit(Ltr, Idx)
  472. #define SetPinHighOn(Ltr, Idx) Clr_DDR_Bit(Ltr, Idx)
  473. #define SetPinHighOff(Ltr, Idx) Set_PORT_Bit(Ltr, Idx)
  474. #define SetPinLowOn(Ltr, Idx) Set_DDR_Bit(Ltr, Idx)
  475. #define SetPinLowOff(Ltr, Idx) Clr_PORT_Bit(Ltr, Idx)
  476. #define SetPinHigh(Ltr, Idx) Set_PORT_Bit(Ltr, Idx)
  477. #define SetPinLow(Ltr, Idx) Clr_PORT_Bit(Ltr, Idx)
  478. #define SetPinOn(Ltr, Idx) Clr_DDR_Bit(Ltr, Idx)
  479. #define SetPinOff(Ltr, Idx) Set_PORT_Bit(Ltr, Idx)
  480. #define Set_Pin_On(Ltr, Idx, Level, PullUp) SetPin##Level##PullUp(Ltr, Idx)
  481. #define Pin_On(PortDef) Set_Pin_On(PortDef)
  482. // Установка вывода порта как выход и установка активного логического уровня
  483. #define Set_Pin_Out_On(Ltr, Idx, Level, PullUp) { Set_Pin_Out(Ltr, Idx, Level, PullUp); Set_Pin_On(Ltr, Idx, Level, PullUp); }
  484. #define Pin_Out_On(PortDef) Set_Pin_Out_On(PortDef)
  485. // Установка единичного логического уровня на выводе порта
  486. #define Set_Pin_High(Ltr, Idx, Level, PullUp) Set_Pin_On(Ltr, Idx, High, PullUp)
  487. #define Pin_High(PortDef) Set_Pin_High(PortDef)
  488. // Установка вывода порта как выход и установка единичного логического уровня на выводе порта
  489. #define Set_Pin_Out_High(Ltr, Idx, Level, PullUp) { Set_Pin_Out(Ltr, Idx, Level, PullUp); Set_Pin_High(Ltr, Idx, Level, PullUp); }
  490. #define Pin_Out_High(PortDef) Set_Pin_Out_High(PortDef)
  491. // Установка неактивного логического уровня на выводе порта
  492. #define ClrPin(Ltr, Idx) Clr_PORT_Bit(Ltr, Idx)
  493. #define ClrPinLow(Ltr, Idx) Set_PORT_Bit(Ltr, Idx)
  494. #define ClrPinHigh(Ltr, Idx) Clr_PORT_Bit(Ltr, Idx)
  495. #define ClrPinOff(Ltr, Idx) Clr_PORT_Bit(Ltr, Idx)
  496. #define ClrPinLowOff(Ltr, Idx) Set_PORT_Bit(Ltr, Idx)
  497. #define ClrPinHighOff(Ltr, Idx) Clr_PORT_Bit(Ltr, Idx)
  498. #define ClrPinOn(Ltr, Idx) Set_DDR_Bit(Ltr, Idx)
  499. #define ClrPinLowOn(Ltr, Idx) Clr_DDR_Bit(Ltr, Idx)
  500. #define ClrPinHighOn(Ltr, Idx) Set_DDR_Bit(Ltr, Idx)
  501. #define Set_Pin_Off(Ltr, Idx, Level, PullUp) ClrPin##Level##PullUp(Ltr, Idx)
  502. #define Pin_Off(PortDef) Set_Pin_Off(PortDef)
  503. // Установка неактивного логического уровня на выводе порта
  504. #define Set_Pin_Out_Off(Ltr, Idx, Level, PullUp) { Set_Pin_Out(Ltr, Idx, Level, PullUp); Set_Pin_Off(Ltr, Idx, Level, PullUp); }
  505. #define Pin_Out_Off(PortDef) Set_Pin_Out_Off(PortDef)
  506. // Установка нулевого логического уровня на выводе порта
  507. #define Set_Pin_Low(Ltr, Idx, Level, PullUp) Set_Pin_Off(Ltr, Idx, High, PullUp)
  508. #define Pin_Low(PortDef) Set_Pin_Low(PortDef)
  509. // Установка вывода порта как выход и установка нулевого логического уровня на выводе порта
  510. #define Set_Pin_Out_Low(Ltr, Idx, Level, PullUp) { Set_Pin_Out(Ltr, Idx, Level, PullUp); Set_Pin_Low(Ltr, Idx, Level, PullUp); }
  511. #define Pin_Out_Low(PortDef) Set_Pin_Out_Low(PortDef)
  512. // Проверка логического уровня на выводе порта
  513. #define GetPinSignal(Ltr, Idx) Get_PIN_State(Ltr, Idx)
  514. #define GetPinSignalLow(Ltr, Idx) (!Get_PIN_State(Ltr, Idx))
  515. #define GetPinSignalHigh(Ltr, Idx) Get_PIN_State(Ltr, Idx)
  516. #define Get_Pin_Signal(Ltr, Idx, Level, PullUp) GetPinSignal##Level(Ltr, Idx)
  517. #define Get_Pin_State(Ltr, Idx, Level, PullUp) GetPinSignal##Level(Ltr, Idx)
  518. #define Pin_Signal(PortDef) Get_Pin_Signal(PortDef)
  519. #define Pin_State(PortDef) Get_Pin_Signal(PortDef)
  520. #define Test_Pin(PortDef) Get_Pin_Signal(PortDef)
  521. // Изменение логического уровня на выводе порта на противоположное
  522. #define Invert(Ltr, Idx) Invert_PORT_Bit(Ltr, Idx)
  523. #define InvertOff(Ltr, Idx) Invert_PORT_Bit(Ltr, Idx)
  524. #define InvertOn(Ltr, Idx) Invert_DDR_Bit(Ltr, Idx)
  525. #define Change_Pin_Signal(Ltr, Idx, Level, PullUp) Invert##PullUp(Ltr, Idx)
  526. #define Invert_Pin_Signal(Ltr, Idx, Level, PullUp) Change_Pin_Signal(Ltr, Idx, Level, PullUp)
  527. #define Toggle_Pin_Signal(Ltr, Idx, Level, PullUp) Change_Pin_Signal(Ltr, Idx, Level, PullUp)
  528. #define Pin_Change(PortDef) Invert_Pin_Signal(PortDef)
  529. #define Pin_Invert(PortDef) Invert_Pin_Signal(PortDef)
  530. #define Pin_Toggle(PortDef) Invert_Pin_Signal(PortDef)
  531. #define Change_Pin(PortDef) Invert_Pin_Signal(PortDef)
  532. #define Invert_Pin(PortDef) Invert_Pin_Signal(PortDef)
  533. #define Toggle_Pin(PortDef) Invert_Pin_Signal(PortDef)
  534. ////////////////////////////////////////////////////////////////////////////////////////////////////
  535. //
  536. #define BYTES(Value) ((Byte *) & (Value))
  537. #define WORDS(Value) ((Word *) & (Value))
  538. // Конфигурационные биты и биты блокировки
  539. #define _DataToZByte(Addr, Value) __AddrToZByteToSPMCR_LPM((void __flash *)(Addr), (Value))
  540. #define _DataToR0Byte(Addr, Value) __DataToR0ByteToSPMCR_SPM((Addr), (Value))
  541. #define Get_Lock_Bits() _DataToZByte(0x0001, 0x09)
  542. #define Set_Lock_Bits(Value) _DataToR0Byte(Value, 0x09)
  543. #define Get_Low_Fuses() _DataToZByte(0x0000, 0x09)
  544. #define Get_High_Fuses() _DataToZByte(0x0003, 0x09)
  545. #define Get_Extended_Fuses() _DataToZByte(0x0002, 0x09)
  546. #define Enable_RWW_Section() _DataToR0Byte(0x00, 0x11)
  547. //
  548. #define INLINE _Pragma("inline=forced")
  549. #define DisableUndefinedBehaviorWarning _Pragma(diag_suppress=Pa082)
  550. #define EnableUndefinedBehaviorWarning _Pragma(diag_default=Pa082)
  551. //
  552. #define Array_Length(Value) (sizeof(Value) / sizeof(Value[0]))
  553. #endif // __Macros_Included__