ΠΊΠ°ΠΊΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°Π·Π½Π°Ρ‡ΠΈΡ‚ΡŒ Π²Ρ‹Π²ΠΎΠ΄Ρƒ ΠΏΠΎΡ€Ρ‚ Π²Π²ΠΎΠ΄Π°

ΠŸΠΎΡ€Ρ‚Ρ‹ Π²Π²ΠΎΠ΄Π°-Π²Ρ‹Π²ΠΎΠ΄Π° ΠΎΠ±Ρ‰Π΅Π³ΠΎ назначСния ΠΌΠΎΠ³ΡƒΡ‚:

ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ просто ΠΊΠ°ΠΊ ΠΏΠΎΡ€Ρ‚Ρ‹ Π½Π° Π²Ρ‹Ρ…ΠΎΠ΄ ΠΈ Π²Ρ…ΠΎΠ΄, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, логичСских «0» ΠΈ «1»;

ΠΈΠΌΠ΅Ρ‚ΡŒ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π°Π½Π°Π»ΠΎΠ³ΠΎΠ²Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с АЦП;

ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π°ΠΏΠΏΠ°Ρ€Π°Ρ‚Π½ΠΎ для Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… интСрфСйсов взаимодСйствия, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ UART, SPI ΠΈ Ρ‚.Π΄.

ΠšΠΎΠ»ΠΈΡ‡Π΅ΡΡ‚Π²ΠΎ ΠΏΠΎΡ€Ρ‚ΠΎΠ² Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΌ процСссорС Ρ€Π°Π·Π½ΠΎΠ΅, ΠΊΠ°ΠΊ ΠΈ распрСдСлСниС ΠΏΠΎ Π½ΠΈΠΌ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ. Π˜Π½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΏΠΎ Π΄Π°Π½Π½ΠΎΠΌΡƒ вопросу Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Π² спСцификации Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ «ΠŸΠΎΡ€Ρ‚Ρ‹ Π²Π²ΠΎΠ΄Π° Π²Ρ‹Π²ΠΎΠ΄Π° MDP_PORTx»

Π Π°Π±ΠΎΡ‚Π° ΠΏΠΎΡ€Ρ‚Π° рассмотрСна Π² ΡΡ‚Π°Ρ‚ΡŒΠ΅ Π‘Ρ…Π΅ΠΌΠΎΡ‚Π΅Ρ…Π½ΠΈΠΊΠ° ΠΏΠΎΡ€Ρ‚ΠΎΠ² GPIO.

Π£ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΏΠΎΡ€Ρ‚Π°ΠΌΠΈ Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ SPL

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ SPL Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‚ настройку ΠΈ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΏΠΎΡ€Ρ‚Π°ΠΌΠΈ Ρ‡Π΅Ρ€Π΅Π· ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹Π΅ поля, структуры ΠΈ значСния. ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ настройки ΠΈΠΌΠ΅Π΅Ρ‚ своС ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠ΅ ΠΏΠΎΠ»Π΅ Π² структурС, Π² Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π΅ своСм ΠΈΠΌΠ΅Π΅Ρ‚ пСрСчислимый Ρ‚ΠΈΠΏ значСния этого поля ΠΈ ΠΊΡ€Π°Ρ‚ΠΊΠΎΠ΅ описаниС Π² коммСнтариях. Π­Ρ‚ΠΎ ΠΎΡ‡Π΅Π½ΡŒ ΡƒΠ΄ΠΎΠ±Π½ΠΎ ΠΈ позволяСт ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ ошибок ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅. ΠšΡ€ΠΎΠΌΠ΅ этого, ΠΎΠ΄Π½Π° ΠΈ Ρ‚Π° ΠΆΠ΅ функция SPL Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎΠ΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ для всСх ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅ΠΌΡ‹Ρ… SPL процСссоров. Π’ΠΎ Π΅ΡΡ‚ΡŒ поля Π² рСгистрах ΠΈΠ»ΠΈ сами рСгистры, ΠΈΡ… адрСса ΠΌΠΎΠ³ΡƒΡ‚ ΠΎΡ‚Π»ΠΈΡ‡Π°Ρ‚ΡŒΡΡ ΠΎΡ‚ процСссора ΠΊ процСссору, Π½ΠΎ функция, вызванная с ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹ΠΌ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠΌ, Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎΠ΅ дСйствиС. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ рСализуСтся стандартноС ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΏΡ€ΠΈ Ρ€Π°Π·Π»ΠΈΡ‡ΠΈΠΈ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π² ΠΆΠ΅Π»Π΅Π·Π΅.

ΠœΠΈΠ½ΡƒΡΠΎΠΌ использования SPL являСтся большой Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ (ΠΏΡ€ΠΎΡˆΠΈΠ²ΠΊΠΈ) ΠΈ сниТСнноС быстродСйствиС. ΠŸΡ€ΠΈ этом сводится ΠΊ ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌΡƒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΡΠΎΠ²Π΅Ρ€ΡˆΠΈΡ‚ΡŒ ΠΎΡˆΠΈΠ±ΠΊΡƒ. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ для освоСния программирования рСкомСндуСтся Π½Π°Ρ‡ΠΈΠ½Π°Ρ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρƒ с функциями SPL, Π΄ΠΎΠ±ΠΈΠ²Π°Ρ‚ΡŒΡΡ работоспособности ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°, Π° Π·Π°Ρ‚Π΅ΠΌ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ критичСскиС куски ΠΊΠΎΠ΄Π° ΠΊ рСгистровому исполнСнию.

Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ ΠΏΠΎΡ€Ρ‚Π°

// Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅ΠΌ структуру ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ Π²Ρ‹Π²ΠΎΠ΄Π°(-ΠΎΠ²) ΠΏΠΎΡ€Ρ‚Π° значСниями ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ
PORT_StructInit(&GPIOInitStruct);

Ѐункция PORT_StructInit заполняСт структуру ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ΠΏΠΎΡ€Ρ‚Π° значСниями ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ:

void PORT_StructInit(PORT_InitTypeDef* PORT_InitStruct)
<
/* Reset PORT initialization structure parameters values */
PORT_InitStruct->PORT_Pin = PORT_Pin_All;
PORT_InitStruct->PORT_OE = PORT_OE_IN;
PORT_InitStruct->PORT_PULL_UP = PORT_PULL_UP_OFF;
PORT_InitStruct->PORT_PULL_DOWN = PORT_PULL_DOWN_OFF;
PORT_InitStruct->PORT_PD_SHM = PORT_PD_SHM_OFF;
PORT_InitStruct->PORT_PD = PORT_PD_DRIVER;
PORT_InitStruct->PORT_GFEN = PORT_GFEN_OFF;
PORT_InitStruct->PORT_FUNC = PORT_FUNC_PORT;
PORT_InitStruct->PORT_SPEED = PORT_OUTPUT_OFF;
PORT_InitStruct->PORT_MODE = PORT_MODE_ANALOG;
>

PORT_Pin

PORT_OE

PORT_PULL_UP ΠΈ PORT_PULL_DOWN

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ PORT_PULL_UP ΠΈ PORT_PULL_DOWN Π·Π°Π΄Π°ΡŽΡ‚ подтяТку Π²Ρ‹Π²ΠΎΠ΄Π° ΠΊ Π»ΠΈΠ½ΠΈΠΈ питания ΠΈΠ»ΠΈ Π·Π΅ΠΌΠ»ΠΈ. ΠžΠ±Ρ‹Ρ‡Π½ΠΎ это ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ, ΠΊΠΎΠ³Π΄Π° Π²Ρ‹Π²ΠΎΠ΄ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΊΠ°ΠΊ Π²Ρ…ΠΎΠ΄. Π‘ΠΎΠΏΡ€ΠΎΡ‚ΠΈΠ²Π»Π΅Π½ΠΈΠ΅ рСзистора подтяТки составляСт порядка

50КОм, Ρ‚ΠΎΡ‡Π½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡƒΡ‚ΠΎΡ‡Π½ΡΡ‚ΡŒ Π² спСцификации Π½Π° ΠΌΠΈΠΊΡ€ΠΎΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€.

ΠžΡ‡Π΅Π½ΡŒ часто значСния ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΌΠΈ Π±ΠΈΡ‚ΠΎΠ²Ρ‹ΠΌΠΈ масками, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π² ΠΈΡ‚ΠΎΠ³Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Ρ€Π°ΡΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚ΡŒΡΡ ΠΏΠΎ Π½ΡƒΠΆΠ½ΠΎΠΌΡƒ ΡΠΌΠ΅Ρ‰Π΅Π½ΠΈΡŽ Π² рСгистрС. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ PORT_PULL_UP_OFF Π½Π΅ Ρ€Π°Π²Π½ΠΎ PORT_PULL_DOWN_OFF, ΠΈ Π²Π°ΠΆΠ½ΠΎ ΠΈΡ… Π½Π΅ ΠΏΡƒΡ‚Π°Ρ‚ΡŒ.

PORT_PD_SHM

Π­Ρ‚ΠΎ ΠΏΠΎΠ»Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ значСния, ΠΏΡ€ΠΈ PORT_PD_SHM_OFF dU = 200 ΠΌΠ’, Π° ΠΏΡ€ΠΈ PORT_PD_SHM_On = 400 ΠΌΠ’.

PORT_PD

Π’ Ρ€Π΅ΠΆΠΈΠΌΠ΅ PORT_PD_OPEN Π²Ρ‹Π²ΠΎΠ΄ ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ ΠΎΡ‚ транзистора ΠΊΠΎΠΌΠΌΡƒΡ‚ΠΈΡ€ΡƒΡŽΡ‰Π΅Π³ΠΎ Π΅Π³ΠΎ с Ρ†Π΅ΠΏΡŒΡŽ питания, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡ€ΠΎΡΠ°ΠΆΠΈΠ²Π°Ρ‚ΡŒ внСшнюю линию Π½Π° 0, Π° ΠΏΡ€ΠΈ записи 1 это «ΠΏΡ€ΠΎΡΠ°ΠΆΠΈΠ²Π°Π½ΠΈΠ΅» ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ. Π’ Ρ‚Π°ΠΊΠΎΠΌ Ρ€Π΅ΠΆΠΈΠΌΠ΅ подразумСваСтся, Ρ‡Ρ‚ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ внСшняя подтяТка ΠΊ ΠΏΠΈΡ‚Π°Π½ΠΈΡŽ, ΠΊΠ°ΠΊ это происходит Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π½Π° шинС I2C.

PORT_GFEN

PORT_MODE

Аналоговый Ρ€Π΅ΠΆΠΈΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΊΠΎΠ³Π΄Π° Ρ‡Π΅Ρ€Π΅Π· Π²Ρ‹Π²ΠΎΠ΄ заводится Π°Π½Π°Π»ΠΎΠ³ΠΎΠ²Ρ‹ΠΉ сигнал для ΠΎΡ†ΠΈΡ„Ρ€ΠΎΠ²ΠΊΠΈ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠΌ АЦП. ΠŸΡ€ΠΈ Π²Ρ‹Π²ΠΎΠ΄Π΅ Π°Π½Π°Π»ΠΎΠ³ΠΎΠ²ΠΎΠ³ΠΎ сигнала ΠΎΡ‚ встроСнного ЦАП ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Ρ‚Π°ΠΊΠΎΠΉ ΠΆΠ΅ Ρ€Π΅ΠΆΠΈΠΌ.

PORT_FUNC

Π’Ρ‹Π²ΠΎΠ΄AnalogDIGITAL
PORTMAINALTEROVERRID
Π Π•12Π Π•12ADDR28SSP1_RXDUART1_RXD

Π’ Π°Π½Π°Π»ΠΎΠ³ΠΎΠ²ΠΎΠΌ Ρ€Π΅ΠΆΠΈΠΌΠ΅ Π΄Π°Π½Π½Ρ‹ΠΉ ΠΏΠΎΡ€Ρ‚ Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ примСнСния.

Если для Ρ€Π°Π·Π½Ρ‹Ρ… Π²Ρ‹Π²ΠΎΠ΄ΠΎΠ² Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ ΠΎΠ΄Π½Ρƒ ΠΈ Ρ‚Ρƒ ΠΆΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, TMR2_CH2, Ρ‚ΠΎ Ρ€Π΅Π°Π»ΡŒΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ задСйствован Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ Π²Ρ‹Π²ΠΎΠ΄, ΠΏΡ€ΠΈΡ‡Ρ‘ΠΌ Π²Ρ‹Π±ΠΎΡ€ Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠ³ΠΎ осущСствляСтся Π² порядкС ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Π° ΠΏΠΎ названию ΠΏΠΎΡ€Ρ‚Π°, Ρ‚.Π΅. сначала ΠΏΠΎΡ€Ρ‚ А, Π΄Π°Π»Π΅Π΅ ΠΏΠΎΡ€Ρ‚ B ΠΈ Ρ‚.Π΄.

PORT_SPEED

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ PORT_SPEED опрСдСляСт врСмя ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ логичСских состояний, ΠΏΠΎ сущСству, Π΄Π»ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ Ρ„Ρ€ΠΎΠ½Ρ‚ΠΎΠ². Π’ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Π΅ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹:

ΠŸΡ€ΠΈ быстрых Ρ„Ρ€ΠΎΠ½Ρ‚Π°Ρ… возрастаСт ΠΏΠΎΡ‚Ρ€Π΅Π±Π»Π΅Π½ΠΈΠ΅ ΠΌΠΈΠΊΡ€ΠΎΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€Π°, Π½ΠΎ Π·Π°Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΡ‚ΡŒ ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½Π½ΠΎΠΉ ΠΏΠ΅Ρ€ΠΈΡ„Π΅Ρ€ΠΈΠ΅ΠΉ. Для мигания свСтодиодом ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ Π½Π΅ Π²Π°ΠΆΠ½Π° ΠΈ Π»ΡƒΡ‡ΡˆΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ с PORT_SPEED_SLOW.

Π£ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΏΠΎΡ€Ρ‚Π°ΠΌΠΈ Ρ‡Π΅Ρ€Π΅Π· рСгистры

SPL Π΄Π΅Π»Π°Π΅Ρ‚ настройку ΠΏΠΎΡ€Ρ‚ΠΎΠ² Π±ΠΎΠ»Π΅Π΅ Ρ‡ΠΈΡ‚Π°Π΅ΠΌΠΎΠΉ ΠΈ Π·Π°Ρ‰ΠΈΡ‰Π°Π΅Ρ‚ ΠΎΡ‚ случайных ошибок. Π’ ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠΌ ΠΈΡ‚ΠΎΠ³Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ SPL Π·Π°Π΄Π°ΡŽΡ‚ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ Π² рСгистры настроСк Π²Ρ‹Π²ΠΎΠ΄ΠΎΠ² ΠΏΠΎΡ€Ρ‚ΠΎΠ². Π­Ρ‚ΠΈ рСгистры прСдставлСны Π½Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ΅, описаниС ΠΆΠ΅ находится Π² Π‘Ρ…Π΅ΠΌΠΎΡ‚Π΅Ρ…Π½ΠΈΠΊΠ° ΠΏΠΎΡ€Ρ‚ΠΎΠ² GPIO.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ

Π­Π»Π΅ΠΊΡ‚Ρ€ΠΎΠ½ΠΈΠΊΠ° для всСх

Π‘Π»ΠΎΠ³ ΠΎ элСктроникС

Π Π°Π±ΠΎΡ‚Π° с ΠΏΠΎΡ€Ρ‚Π°ΠΌΠΈ Π²Π²ΠΎΠ΄Π°-Π²Ρ‹Π²ΠΎΠ΄Π° ΠΌΠΈΠΊΡ€ΠΎΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€ΠΎΠ² Π½Π° Π‘ΠΈ++

ΠŸΡ€ΠΈ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ для ΠΌΠΈΠΊΡ€ΠΎΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€ΠΎΠ² (МК) Ρ€Π°Π±ΠΎΡ‚Π° с Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠΉ ΠΈ внСшнСй ΠΏΠ΅Ρ€ΠΈΡ„Π΅Ρ€ΠΈΠ΅ΠΉ являСтся ΠΎΡ‡Π΅Π½ΡŒ Π²Π°ΠΆΠ½ΠΎΠΉ Ρ‡Π°ΡΡ‚ΡŒΡŽ (Π° ΠΈΠ½ΠΎΠ³Π΄Π° ΠΈ СдинствСнной) ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. Π­Ρ‚ΠΎ своСго Ρ€ΠΎΠ΄Π° Ρ„ΡƒΠ½Π΄Π°ΠΌΠ΅Π½Ρ‚, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ основываСтся Π±ΠΎΠ»Π΅Π΅ высокоуровнСвая Π»ΠΎΠ³ΠΈΠΊΠ° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. ΠžΡ‚ эффСктивности взаимодСйствия с ΠΏΠ΅Ρ€ΠΈΡ„Π΅Ρ€ΠΈΠ΅ΠΉ Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ зависит ΡΡ„Ρ„Π΅ΠΊΡ‚ΠΈΠ²Π½ΠΎΡΡ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π² Ρ†Π΅Π»ΠΎΠΌ. Под ΡΡ„Ρ„Π΅ΠΊΡ‚ΠΈΠ²Π½ΠΎΡΡ‚ΡŒΡŽ здСсь слСдуСт ΠΏΠΎΠ½ΠΈΠΌΠ°Ρ‚ΡŒ Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ выполнСния ΠΈ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΊΠΎΠ΄Π°, Π½ΠΎ ΠΈ ΡΡ„Ρ„Π΅ΠΊΡ‚ΠΈΠ²Π½ΠΎΡΡ‚ΡŒ написания ΠΈ сопровоТдСния ΠΊΠΎΠ΄Π°.
МногиС внСшниС устройства ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‚ΡΡ ΠΊ МК Ρ‡Π΅Ρ€Π΅Π· ΠΏΠΎΡ€Ρ‚Ρ‹ Π²Π²ΠΎΠ΄Π°-Π²Ρ‹Π²ΠΎΠ΄Π° ΠΎΠ±Ρ‰Π΅Π³ΠΎ назначСния (GPIO). Π­Ρ„Ρ„Π΅ΠΊΡ‚ΠΈΠ²Π½ΠΎΡΡ‚ΡŒ взаимодСйствия с этими устройствами Π²ΠΎ ΠΌΠ½ΠΎΠ³ΠΎΠΌ зависит ΠΎΡ‚ способа Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΠΏΠΎΡ€Ρ‚Π°ΠΌΠΈ Π²Π²ΠΎΠ΄Π°-Π²Ρ‹Π²ΠΎΠ΄Π°.

Π’ΡƒΡ‚ Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡŽΡ‚ Π΄Π²Π°, Π½Π° ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ взгляд, ΠΏΡ€ΠΎΡ‚ΠΈΠ²ΠΎΡ€Π΅Ρ‡ΠΈΠ²Ρ‹Ρ… трСбования:

Битуация ослоТняСтся ΠΎΠ³Ρ€ΠΎΠΌΠ½Ρ‹ΠΌ количСством способов ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΎΠ΄Π½ΠΎΠ³ΠΎ внСшнСго устройства ΠΊ ΠΎΠ΄Π½ΠΎΠΌΡƒ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€Ρƒ ΠΈ Π² Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π΅ случаСв опрСдСляСтся удобством изготовлСния ΠΏΠ΅Ρ‡Π°Ρ‚Π½ΠΎΠΉ ΠΏΠ»Π°Ρ‚Ρ‹ Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ΠΌ свободных Π»ΠΈΠ½ΠΈΠΉ Π² ΠΏΠΎΡ€Ρ‚Ρƒ, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒΡŽ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π»ΠΈΠ½ΠΈΠΈ ΠΏΠΎΡ€Ρ‚ΠΎΠ² для ΠΈΡ… ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Ρ… возмоТностСй ΠΈ Ρ‚.Π΄. Устройство ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΎ ΠΊΠ°ΠΊ ΠΊ ΠΎΠ΄Π½ΠΎΠΌΡƒ ΠΏΠΎΡ€Ρ‚Ρƒ, Ρ‚Π°ΠΊ ΠΈ ΠΊ нСскольким, Π»ΠΈΠ½ΠΈΠΈ ΠΏΠΎΡ€Ρ‚Π° ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΊΠ°ΠΊ упорядочСны ΠΏΠΎ ΠΈΡ… логичСскому вСсу Π² ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½Π½ΠΎΠΌ устройствС, Ρ‚Π°ΠΊ ΠΈ Π½Π΅Ρ‚. Оно Π²ΠΎΠΎΠ±Ρ‰Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΎ Ρ‡Π΅Ρ€Π΅Π· ΠΊΠ°ΠΊΠΎΠΉ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ Ρ€Π°ΡΡˆΠΈΡ€ΠΈΡ‚Π΅Π»ΡŒ Π²Π²ΠΎΠ΄Π°-Π²Ρ‹Π²ΠΎΠ΄Π°, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, сдвиговый рСгистр. ΠŸΡ€ΠΈ Ρ‚Π°ΠΊΠΎΠΌ Ρ€Π°Π·Π½ΠΎΠΎΠ±Ρ€Π°Π·ΠΈΠΈ ΠΎΡ‡Π΅Π½ΡŒ слоТно, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€ устройства Π½Π΅ Π±Ρ‹Π» Π·Π°Ρ‚ΠΎΡ‡Π΅Π½ ΠΏΠΎΠ΄ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΉ способ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ этого устройства, ΠΈΠ»ΠΈ-ΠΆΠ΅ Π½Π΅ Π±Ρ‹Π» слишком Π³Ρ€ΠΎΠΌΠΎΠ·Π΄ΠΊΠΈΠΌ ΠΈ ΠΌΠ΅Π΄Π»Π΅Π½Π½Ρ‹ΠΌ Π² случаС Π±ΠΎΠ»Π΅Π΅ ΡƒΠ½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ.

ΠšΠ°ΠΆΠ΅Ρ‚ΡΡ, Ρ‡Ρ‚ΠΎ Π½Π°ΠΉΡ‚ΠΈ ΡƒΠ½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½ΠΎΠ΅ ΠΈ эффСктивноС Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ здСсь Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ. ΠžΡ‡Π΅Π½ΡŒ часто Π² ΠΏΠΎΠ»ΡŒΠ·Ρƒ скорости ΠΈ компактности ΠΊΠΎΠ΄Π° ΠΆΠ΅Ρ€Ρ‚Π²ΡƒΡŽΡ‚ ΠΈ ΡƒΠ½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒΡŽ ΠΈ логичСской структурой ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΈ ΠΊΠ°ΠΊ слСдствиС Ρ‡ΠΈΡ‚Π°Π΅ΠΌΠΎΡΡ‚ΡŒΡŽ ΠΊΠΎΠ΄Π°, просто Π½Π΅ отдСляя способ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ устройства ΠΎΡ‚ Π»ΠΎΠ³ΠΈΠΊΠΈ Π΅Π³ΠΎ Ρ€Π°Π±ΠΎΡ‚Ρ‹. ΠŸΡ€ΠΈ этом ΠΊΠΎΠ΄ Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€Π° модифицируСтся ΠΈ подгоняСтся Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ ΠΏΠΎΠ΄ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚, ΠΏΠΎΠ΄ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ способ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ.

Π”Π°Π²Π°ΠΉΡ‚Π΅ разбСрСмся, ΠΊΠ°ΠΊΠΈΠ΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΠΏΠΎΡ€Ρ‚Π°ΠΌΠΈ Π²Π²ΠΎΠ΄Π°-Π²Ρ‹Π²ΠΎΠ΄Π° Ρ‚Ρ€Π°Π΄ΠΈΡ†ΠΈΠΎΠ½Π½ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ ΠΏΡ€ΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ Π½Π° чистом Π‘ΠΈ.
МоТно Π²Ρ‹Π΄Π΅Π»ΠΈΡ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Ρ‹ (Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ с ТСстко Π·Π°Π΄Π°Π½Π½Ρ‹ΠΌΠΈ Π² ΠΊΠΎΠ΄Π΅ ΠΈΠΌΠ΅Π½Π°ΠΌΠΈ ΠΏΠΎΡ€Ρ‚ΠΎΠ² ΠΈ Π½ΠΎΠΌΠ΅Ρ€Π°ΠΌΠΈ Π½ΠΎΠΆΠ΅ΠΊ Π½Π΅ рассматриваСм):

ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Ρ‹ для МК сСмСйства AVR. ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ‚ΠΎΡ€ avr-gcc, Π½ΠΎ описываСмыС ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Ρ‹ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½Ρ‹ ΠΊ Π»ΡŽΠ±Ρ‹ΠΌ Π΄Ρ€ΡƒΠ³ΠΈΠΌ МК, для ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… имССтся стандартный Π‘ΠΈ/Π‘ΠΈ++ компилятор.

1. ΠŸΡ€Π΅ΠΏΡ€ΠΎΡ†Π΅ΡΡΠΎΡ€
Бпособов использования прСпроцСссора для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΠΏΠΎΡ€Ρ‚Π°ΠΌΠΈ Π² МК сущСствуСт Π²Π΅Π»ΠΈΠΊΠΎΠ΅ мноТСство. Π’ самом простом ΠΈ самом распространСнном случаС просто объявляСм ΠΏΠΎΡ€Ρ‚ ΠΈ Π½ΠΎΠΌΠ΅Ρ€Π° Π½ΠΎΠΆΠ΅ΠΊ, ΠΊ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΎ нашС устройство с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹ #define, Π½Π΅ Π·Π°Π±Ρ‹Π², ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ, ΠΏΡ€ΠΎ DDR ΠΈ PIN рСгистры, Ссли ΠΎΠ½ΠΈ Π½ΡƒΠΆΠ½Ρ‹.
НСт Π½ΠΈΡ‡Π΅Π³ΠΎ ΠΏΡ€ΠΎΡ‰Π΅, Ρ‡Π΅ΠΌ ΠΏΠΎΠΌΠΈΠ³Π°Ρ‚ΡŒ свСтодиодом, ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½Π½Ρ‹ΠΌ ΠΊ ΠΎΠ΄Π½ΠΎΠΌΡƒ ΠΈΠ· Π²Ρ‹Π²ΠΎΠ΄ΠΎΠ² МК:

reg->data_pin_bm; //Ρ‚Π°ΠΊΡ‚ΠΎΠ²Ρ‹ΠΉ ΠΈΠΌΠΏΡƒΠ»ΡŒΡ *reg->port |= reg->clk_pin_bm; value >>= 1; *reg->port &=

reg->clk_pin_bm; > //Π·Π°Ρ‰Ρ‘Π»ΠΊΠΈΠ²Π°Π΅ΠΌ Π΄Π°Π½Π½Ρ‹Π΅ Π² рСгистр *reg->port |= reg->latch_pin_bm; *reg->port &=

Π€Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ ассСмблСрного листинга WriteShiftReg

LD r30, X+ LD r31, X SBIW r26, 0x01 ; 1 LD r24, Z ADIW r26, 0x04 ; 4 LD r25, X SBIW r26, 0x04 ; 4 OR r24, r25 ST Z, r24

Как Π²ΠΈΠ΄Π½ΠΎ, компилятор Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΡΠΎΠΏΡ€ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ ΠΊ ΠΏΠΎΡ€Ρ‚Ρƒ ΠΈ установка Π±ΠΈΡ‚Π° Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ‚ 9 инструкций вмСсто ΠΎΠ΄Π½ΠΎΠΉ.

Π§Ρ‚ΠΎΠ±Ρ‹ нСсколько ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠ΄ ΠΌΠΎΠΆΠ½ΠΎ ввСсти Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ограничСния, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π·Π°Π΄Π°Ρ‚ΡŒ Π½ΠΎΠΌΠ΅Ρ€Π° Π½ΠΎΠΆΠ΅ΠΊ константами, ΠΈ Π²Ρ‹ΠΊΠΈΠ½ΡƒΡ‚ΡŒ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ ΠΈΠΌ Π±ΠΈΡ‚ΠΎΠ²Ρ‹Π΅ маски. Π’ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ со сдвиговым рСгистром ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ константами data_pin_bm ΠΈ clk_pin_bm ΠΈ ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ ΠΈΡ… ΠΈΠ· структуры, Π° latch_pin_bm ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ ΠΊΠ°ΠΊ Π΅ΡΡ‚ΡŒ для ΡƒΠ½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ:

>data_pin_bm; //Ρ‚Π°ΠΊΡ‚ΠΎΠ²Ρ‹ΠΉ ΠΈΠΌΠΏΡƒΠ»ΡŒΡ *reg->port |= clk_pin_bm; value >>= 1; *reg->port &= clk_pin_bm; > //Π·Π°Ρ‰Ρ‘Π»ΠΊΠΈΠ²Π°Π΅ΠΌ Π΄Π°Π½Π½Ρ‹Π΅ Π² рСгистр *reg->port |= reg->latch_pin_bm; *reg->port &=

Вакая оптимизация сократит ΠΊΠΎΠ΄ WriteShiftReg ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ Π½Π° 25 % с Π½Π΅Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ ΠΏΠΎΡ‚Π΅Ρ€Π΅ΠΉ Π² удобствС.

3. Π’ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠΎΡ€Ρ‚Ρ‹
НуТно ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ ΠΊ МК нСсколько устройств Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‰ΠΈΡ… достаточно ΠΌΠ½ΠΎΠ³ΠΎ Π»ΠΈΠ½ΠΈΠΉ Π²Π²ΠΎΠ΄Π°-Π²Ρ‹Π²ΠΎΠ΄Π°, Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΎΠ±Π»Π°Π΄Π°Π΅Ρ‚ достаточно слоТной ΠΈ ΠΎΠ±ΡŠΡ‘ΠΌΠ½ΠΎΠΉ Π»ΠΎΠ³ΠΈΠΊΠΎΠΉ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ρ‚ΠΎΡ‚-ΠΆΠ΅ дисплСй HD44780 (ΠΏΡ€ΠΈ использовании 4Ρ… Π±ΠΈΡ‚Π½ΠΎΠ³ΠΎ интСрфСйса Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ 7 Π»ΠΈΠ½ΠΈΠΉ). К Ρ‚ΠΎΠΌΡƒ-ΠΆΠ΅ устройства ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½Ρ‹ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌΠΈ способами – ΠΊ Ρ€Π°Π·Π½Ρ‹ΠΌ линиям ΠΏΠΎΡ€Ρ‚ΠΎΠ², ΠΈΠ»ΠΈ Ρ‡Π΅Ρ€Π΅Π· сдвиговый рСгистр. Π”ΡƒΠ±Π»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠ΄ Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€Π° ΠΈ ΠΏΠΎΠ΄Π³ΠΎΠ½ΡΡ‚ΡŒ Π΅Π³ΠΎ ΠΏΠΎΠ΄ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ способ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ устройства – Π½Π΅Ρ‚ ΡƒΠΆ, спасибо. Π”Π° ΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ€ скомпилированного ΠΊΠΎΠ΄Π° рискуСт Π½Π΅ помСстится Π² Ρ†Π΅Π»Π΅Π²ΠΎΠΉ МК. ΠŸΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒ ΠΏΠΎΡ€Ρ‚Ρ‹ Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€Ρƒ Π² Ρ‡Π΅Ρ€Π΅Π· ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ? Блишком большиС Π½Π°ΠΊΠ»Π°Π΄Π½Ρ‹Π΅ расходы ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с ΠΏΠΎΡ€Ρ‚Π°ΠΌΠΈ Ρ‡Π΅Ρ€Π΅Π· ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ, ΠΌΠ½ΠΎΠ³ΠΎ памяти, ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ ΠΈ Π³Ρ€ΠΎΠΌΠΎΠ·Π΄ΠΊΠΎ.
Π—Π΄Π΅ΡΡŒ Π»ΡƒΡ‡ΡˆΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ, Ρ‚Π°ΠΊ Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΡ‹Π΅ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠΎΡ€Ρ‚Ρ‹. На языкС Π‘ΠΈ ΠΎΠ½ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Ρ‹ ΠΊΠ°ΠΊ Π³Ρ€ΡƒΠΏΠΏΠ° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‰ΠΈΡ… Π²Ρ…ΠΎΠ΄Π½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‰ΠΈΡ… ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π²Π²ΠΎΠ΄Π°-Π²Ρ‹Π²ΠΎΠ΄Π°:

Π’Π΅ΠΏΠ΅Ρ€ΡŒ становится Π½Π΅ Π²Π°ΠΆΠ½ΠΎ ΠΊΠ°ΠΊ ΠΈΠΌΠ΅Π½Π½ΠΎ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ дисплСй ΠΊ МК. Всё тяТёлая Ρ€Π°Π±ΠΎΡ‚Π° ΠΏΠΎ манипуляции ΠΏΠΎΡ€Ρ‚Π°ΠΌΠΈ Π²ΠΎΠ·Π»ΠΎΠΆΠ΅Π½Π° Π½Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ VPort1Write. Для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ способа ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ дисплСя Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΡƒΡŽ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΏΠΎΡ€Ρ‚Π°, Ρ‚ΡƒΡ‚ ΡƒΠΆΠ΅ насколько Ρ„Π°Π½Ρ‚Π°Π·ΠΈΠΈ Ρ…Π²Π°Ρ‚ΠΈΡ‚. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΡƒΠΆΠ΅ Π½Π°ΠΏΠΈΡΠ°Π½Π½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ WriteShiftReg, Π»Π΅Π³ΠΊΠΎ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ дисплСй Ρ‡Π΅Ρ€Π΅Π· сдвиговый рСгистр:

ShiftReg reg1 = <&PORTA, 1>; void VPort2Write(uint8_t value)

Π§Π΅Π³ΠΎ-ΠΆΠ΅ ΠΌΡ‹ добились с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΏΠΎΡ€Ρ‚ΠΎΠ²:

ΠŸΠΎΠ΄Ρ…ΠΎΠ΄ Π‘ΠΈ++ ΠΊ Ρ€Π°Π±ΠΎΡ‚Π΅ с ΠΏΠΎΡ€Ρ‚Π°ΠΌΠΈ.
Π§Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π°ΠΌ ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠΈΡ‚ΡŒ язык Π‘ΠΈ++ ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с ΠΏΠΎΡ€Ρ‚Π°ΠΌΠΈ Π²Π²ΠΎΠ΄Π°-Π²Ρ‹Π²ΠΎΠ΄Π° ΠΏΠΎ ΡΡ€Π°Π²Π½Π΅Π½ΠΈΡŽ чистым Π‘ΠΈ? Π”Π°Π²Π°ΠΉΡ‚Π΅ сначала сформулируСм, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ Π½Π°ΡˆΠΈΡ… изысканий:

ΠžΡ‚ динамичСской ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ Π»ΠΈΠ½ΠΈΠΉ Π²Π²ΠΎΠ΄Π°-Π²Ρ‹Π²ΠΎΠ΄Π° сразу отказываСмся ΠΈΠ·-Π·Π° нСобходимости доступа ΠΊ ΠΏΠΎΡ€Ρ‚Π°ΠΌ Ρ‡Π΅Ρ€Π΅Π· ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ со всСми Π²Ρ‹Ρ‚Π΅ΠΊΠ°ΡŽΡ‰ΠΈΠΌΠΈ послСдствиями.
Π£Π΄ΠΎΠ±Π½ΠΎ Π±Ρ‹Π»ΠΎ Π±Ρ‹ ΠΎΠΏΠΈΡΠ°Ρ‚ΡŒ линию Π²Π²ΠΎΠ΄Π°-Π²Ρ‹Π²ΠΎΠ΄Π° Π² Π²ΠΈΠ΄Π΅ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠΉ сущности, Ρ‚.Π΅. класса. Π’ Π‘ΠΈ++ Π΄Π°ΠΆΠ΅ Ссли Π² классС Π½Π΅ объявлСно Π½ΠΈ ΠΎΠ΄Π½ΠΎΠ³ΠΎ поля, пСрСмСнная этого класса всё Ρ€Π°Π²Π½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΊΠ°ΠΊ ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌ ΠΎΠ΄ΠΈΠ½ Π±Π°ΠΉΡ‚, ΠΏΠΎΡ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ пСрСмСнная Π΄ΠΎΠ»ΠΆΠ½Π° ΠΈΠΌΠ΅Ρ‚ΡŒ адрСс. Π—Π½Π°Ρ‡ΠΈΡ‚, Π½Π°ΠΌ Π½Π΅ Π½Π°Π΄ΠΎ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ этого класса, Π° всС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² Π½Π΅ΠΌ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ статичСскими. А ΠΊΠ°ΠΊ Ρ‚ΠΎΠ³Π΄Π° Ρ€Π°Π·Π»ΠΈΡ‡Π°Ρ‚ΡŒ Ρ€Π°Π·Π½Ρ‹Π΅ Π»ΠΈΠ½ΠΈΠΈ? МоТно ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ этот класс шаблоном, Π° ΠΏΠΎΡ€Ρ‚ ΠΈ Π½ΠΎΠΌΠ΅Ρ€ Π±ΠΈΡ‚Π° ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒ Π² Π²ΠΈΠ΄Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² шаблона. Π‘ Π½ΠΎΠΌΠ΅Ρ€ΠΎΠΌ Π±ΠΈΡ‚Π° всё ясно – это Ρ†Π΅Π»ΠΎΠ΅ число, Π΅Π³ΠΎ Π»Π΅Π³ΠΊΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ ΠΊΠ°ΠΊ Π½Π΅Ρ‚ΠΈΠΏΠΎΠ²ΠΎΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ шаблона. А ΠΊΠ°ΠΊ Π±Ρ‹Ρ‚ΡŒ с ΠΏΠΎΡ€Ρ‚ΠΎΠΌ? ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΠΌ, ΠΊΠ°ΠΊ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹ ΠΏΠΎΡ€Ρ‚Ρ‹ Π²Π²ΠΎΠ΄Π°-Π²Ρ‹Π²ΠΎΠ΄Π° Π² Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»Π°Ρ… avr-gcc:

#define _MMIO_BYTE(mem_addr) (*(volatile uint8_t *)(mem_addr)) #define _SFR_MEM8(mem_addr) _MMIO_BYTE(mem_addr + __SFR_OFFSET) #define PORTB _SFR_IO8(0x18)

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ шаблона ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚ΠΈΠΏΠΎΠ²Ρ‹ΠΌΠΈ ΠΈΠ»ΠΈ цСлочислСнными константными выраТСниями, вычисляСмыми Π²ΠΎ врСмя компиляции. Ни ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ, Π½ΠΈ ссылку нСльзя ΠΏΡ€Π΅Π΄Π°Ρ‚ΡŒ ΠΊΠ°ΠΊ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ шаблона:

template //ошибка class Pin <. >;

ΠœΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΠΎΠΏΡ€ΠΎΠ±ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒ адрСс ΠΏΠΎΡ€Ρ‚Π° Π² Π²ΠΈΠ΄Π΅ Ρ†Π΅Π»ΠΎΠ³ΠΎ числа, Π° ΠΏΠΎΡ‚ΠΎΠΌ Π΅Π³ΠΎ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Ρ‹Π²Π°Ρ‚ΡŒ Π² ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ:

Π’Π·ΡΡ‚ΡŒ адрСс PORTB ΠΏΠΎ ΠΈΠΌΠ΅Π½ΠΈ Π½Π΅ получится ΠΏΠΎΡ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ опСрация взятия адрСса Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΡΠ²Π»ΡΡ‚ΡŒΡΡ Π² константных выраТСниях, ΠΊΠΎΠΈΠΌΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ шаблона:

typedef Pin Pin1; // ошибка

Однако, Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒ Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ адрСс ΠΏΠΎΡ€Ρ‚Π°, Π΅Ρ‰Ρ‘ Π½ΡƒΠΆΠ½Ρ‹ PINx ΠΈ DDRx рСгистры. К Ρ‚ΠΎΠΌΡƒ-ΠΆΠ΅, Π² Ρ‚Π°ΠΊΠΎΠΌ Π²ΠΈΠ΄Π΅ ΠΎ пСрСносимости Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΈ Ρ€Π΅Ρ‡ΠΈ. МоТно, ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ, Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ макрос, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‘ΠΌ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ ΠΈΠΌΠ΅Π½Π° рСгистров, ΠΈ ΠΎΠ½ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ класс. Но Ρ‚ΠΎΠ³Π΄Π° Pin Π±ΡƒΠ΄Π΅Ρ‚ слишком ТСстко завязан Π½Π° ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΡƒΡŽ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ ΠΏΠΎΡ€Ρ‚ΠΎΠ².
МоТно Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ пСрСчислСниС Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½Ρ‹ всС ΠΏΠΎΡ€Ρ‚Ρ‹ с ΡƒΠ΄ΠΎΠ±ΠΎΡ‡ΠΈΡ‚Π°Π΅ΠΌΡ‹ΠΌΠΈ ΠΈΠΌΠ΅Π½Π°ΠΌΠΈ ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, которая Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π½ΡƒΠΆΠ½Ρ‹ΠΉ ΠΏΠΎΡ€Ρ‚ Π² зависимости ΠΎΡ‚ ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° шаблона.

() < return PORTA; >template<> volatile uint8_t & GetPort

ΠŸΠΎΡΡ‚ΠΎΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π΅Π³ΠΎ использования:

Π’Ρ‹Π·ΠΎΠ² Reg1::Write компилируСтся Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ассСмблСрный листинг:

Π‘Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ листинг Π½Π΅ уступаСт написанному Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ Π½Π° ассСмблСрС. И ΠΊΡ‚ΠΎ Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚, Ρ‡Ρ‚ΠΎ Π‘ΠΈ++ ΠΈΠ·Π±Ρ‹Ρ‚ΠΎΡ‡Π΅Π½ ΠΏΡ€ΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ для МК? ΠŸΠΎΠΏΡ€ΠΎΠ±ΡƒΠΉΡ‚Π΅ ΠΏΠ΅Ρ€Π΅ΠΏΠΈΡΠ°Ρ‚ΡŒ этот ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π½Π° чистом Π‘ΠΈ, сохранив чистоту ΠΈ ΠΏΠΎΠ½ΡΡ‚Π½ΠΎΡΡ‚ΡŒ ΠΊΠΎΠ΄Π°, Ρ€Π°Π·Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π»ΠΎΠ³ΠΈΠΊΠΈ Ρ€Π°Π±ΠΎΡ‚Ρ‹ устройства ΠΎΡ‚ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΉ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΏΠΎΡ€Ρ‚ΠΎΠ² Π’/Π’ ΠΈ Ρ‚Π°ΠΊΡƒΡŽ-ΠΆΠ΅ ΡΡ„Ρ„Π΅ΠΊΡ‚ΠΈΠ²Π½ΠΎΡΡ‚ΡŒ.

Бписки Π»ΠΈΠ½ΠΈΠΉ Π²Π²ΠΎΠ΄Π°-Π²Ρ‹Π²ΠΎΠ΄Π°
Π­Ρ‚ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π°Ρ‡Π°Π»ΠΎ. Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π½Π°ΠΌ прСдстоит самоС интСрСсноС β€” Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ эффСктивный Π²Ρ‹Π²ΠΎΠ΄ ΠΌΠ½ΠΎΠ³ΠΎΠ±ΠΈΡ‚Π½Ρ‹Ρ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ. Для этого Π½Π°ΠΌ Π½ΡƒΠΆΠ½Π° ΡΡƒΡ‰Π½ΠΎΡΡ‚ΡŒ ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½ΡΡŽΡ‰Π°Ρ Π³Ρ€ΡƒΠΏΠΏΡƒ Π»ΠΈΠ½ΠΈΠΉ Π’/Π’ – своСобразный список Π»ΠΈΠ½ΠΈΠΉ Π’/Π’. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΈ ΠΏΠΎΡ€Ρ‚Ρ‹ ΠΈ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Π΅ Π»ΠΈΠ½ΠΈΠΈ Ρƒ нас прСдставлСны Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌΠΈ классами, Ρ‚ΠΎ Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Ρ‹Π²Π°Ρ‚ΡŒ список Π»ΠΈΠ½ΠΈΠΉ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ шаблонов. Но здСсь Π΅ΡΡ‚ΡŒ ΠΎΠ΄Π½Π° ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°: список Π»ΠΈΠ½ΠΈΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΎΠ΅ число Π»ΠΈΠ½ΠΈΠΉ, Π° ΡˆΠ°Π±Π»ΠΎΠ½Ρ‹ Π² Π‘ΠΈ++ ΠΈΠΌΠ΅ΡŽΡ‚ фиксированноС число ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² (Π° стандартС Cxx03, Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ вСрсии появятся Variadic templates). Нам ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ‚ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Loki, написанная АндрССм АлСксандрСску. Π’ Π½Π΅ΠΉ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ΠΎ мноТСство ΡˆΠ°Π±Π»ΠΎΠ½Π½Ρ‹Ρ… Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠ² для манипуляций со списками Ρ‚ΠΈΠΏΠΎΠ² ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½ΠΎΠΉ Π΄Π»ΠΈΠ½Π½Ρ‹. Π­Ρ‚ΠΎ Π½Π°ΠΌ ΠΏΠΎΠ΄ΠΎΠΉΠ΄Ρ‘Ρ‚ – списки Ρ‚ΠΈΠΏΠΎΠ² ΠΏΡ€Π΅Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ΡΡ Π² списки Π»ΠΈΠ½ΠΈΠΉ Π²Π²ΠΎΠ΄Π°-Π²Ρ‹Π²ΠΎΠ΄Π°. Π§Ρ‚ΠΎ, собствСнно, Ρ‚Π°ΠΊΠΎΠ΅ списки Ρ‚ΠΈΠΏΠΎΠ² Π»ΡƒΡ‡ΡˆΠ΅ всСго ΠΏΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ Ρƒ ΠΈΡ… Π°Π²Ρ‚ΠΎΡ€Π° АндрСя АлСксандрСску Π² ΠΊΠ½ΠΈΠ³Π΅ Π‘ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠ΅ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π½Π° Π‘++. ΠžΡ‡Π΅Π½ΡŒ Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΡŽ ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ, хотя-Π±Ρ‹ мСльком, Π³Π»Π°Π²Ρƒ «Бписки Ρ‚ΠΈΠΏΠΎΠ²Β» Π² этой ΠΊΠ½ΠΈΠ³Π΅. Π‘Π΅Π· этого Π±ΡƒΠ΄Π΅Ρ‚ ΠΌΠ°Π»ΠΎ понятно, Ρ‡Ρ‚ΠΎ происходит дальшС.

НС Π²ΠΎ всСх МК прСдусмотрСны ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ для манипуляций с ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ Π±ΠΈΡ‚Π°ΠΌΠΈ Π² ΠΏΠΎΡ€Ρ‚Π°Ρ… Π’/Π’. Π’ сСмСйствС MegaAVR Ρ‚ΠΎΠΆΠ΅ Π΅ΡΡ‚ΡŒ ΠΏΠΎΡ€Ρ‚Ρ‹ для ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… нСдоступны Π±ΠΈΡ‚ΠΎΠ²Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ с ΠΏΠΎΡ€Ρ‚Π°ΠΌΠΈ максимально эффСктивными Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΠΎΡ‚ΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ ΠΎΡ‚ ΠΏΠΎΠ±ΠΈΡ‚ΠΎΠ²ΠΎΠ³ΠΎ Π²Ρ‹Π²ΠΎΠ΄Π° – ΠΎΠ΄Π½ΠΎ Ρ‡Ρ‚Π΅Π½ΠΈΠ΅, модификация значСния ΠΈ запись.

Π’ΠΎ Π΅ΡΡ‚ΡŒ Π½ΡƒΠΆΠ½ΠΎ Π·Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ N Π±ΠΈΡ‚ΠΎΠ² ΠΈΠ· Π²Ρ…ΠΎΠ΄Π½ΠΎΠ³ΠΎ значСния Π² N Π±ΠΈΡ‚ΠΎΠ² ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½ΠΎ располоТСнных Π² Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΠΏΠΎΡ€Ρ‚Π°Ρ… Π’/Π’. Или ΠΏΠΎ Π΄Ρ€ΡƒΠ³ΠΎΠΌΡƒ говоря, ΡΠ³Ρ€ΡƒΠΏΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ записываСмыС Π±ΠΈΡ‚Ρ‹ ΠΏΠΎ ΠΏΠΎΡ€Ρ‚Π°ΠΌ ΠΈ вывСсти ΠΈΡ… Π·Π° Ρ€Π°Π·.

Π’ ΡƒΠΏΡ€ΠΎΡ‰Π΅Π½Π½ΠΎΠΌ Π²ΠΈΠ΄Π΅ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ записи значСния Π² ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½Ρ‹ΠΉ список Π»ΠΈΠ½ΠΈΠΉ Π’/Π’ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ Ρ‚Π°ΠΊ:
1. ΠžΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ список ΠΏΠΎΡ€Ρ‚ΠΎΠ² ΠΊ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½Ρ‹ Π»ΠΈΠ½ΠΈΠΈ ΠΈΠ· списка.
2. Для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΏΠΎΡ€Ρ‚Π°:

Выглядит всё это ΠΎΡ‡Π΅Π½ΡŒ слоТно. Когда ΠΌΡ‹ пишСм Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΏΠΎΡ€Ρ‚ΠΎΠ² Π½Π° Π‘ΠΈ, Ρ‚ΠΎ всС эти ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ ΠΏΡ€ΠΎΠ΄Π΅Π»Ρ‹Π²Π°Π΅ΠΌ Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ, Π° сСйчас наша Π·Π°Π΄Π°Ρ‡Π° Π·Π°ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ компилятор Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ эту Ρ€Π°Π±ΠΎΡ‚Ρƒ. Для этого Π² нашСм распоряТСнии Π΅ΡΡ‚ΡŒ списки Ρ‚ΠΈΠΏΠΎΠ² ΠΈ Ρ‚Π΅Ρ…Π½ΠΈΠΊΠ° шаблонного мСтапрограммирования. ΠŸΡƒΡΡ‚ΡŒ компилятор сам тасуСт Π±ΠΈΡ‚Ρ‹ ΠΈ считаСт Π±ΠΈΡ‚ΠΎΠ²Ρ‹Π΅ маски! ΠŸΡ€ΠΈΡΡ‚ΡƒΠΏΠΈΠΌ.

Π£ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Π»ΠΈΠ½ΠΈΠΈ Π² спискС Π΅ΡΡ‚ΡŒ Π΄Π²Π° Π½ΠΎΠΌΠ΅Ρ€Π°:

Оба ΠΎΠ½ΠΈ понадобятся для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠΏΡ€ΠΎΠ΅Ρ†ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π±ΠΈΡ‚Ρ‹ ΠΈΠ· Π²Ρ…ΠΎΠ΄Π½ΠΎΠ³ΠΎ значСния Π² ΠΏΠΎΡ€Ρ‚.
Π’Ρ‚ΠΎΡ€ΠΎΠΉ Π½ΠΎΠΌΠ΅Ρ€ класс TPin ΠΏΠΎΠΌΠ½ΠΈΡ‚ сам, ΠΎΠ½ΠΎ хранится Π² enum-Π΅:

Π§Ρ‚ΠΎΠ±Ρ‹ Π·Π°ΠΏΠΎΠΌΠ½ΠΈΡ‚ΡŒ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ Π½ΠΎΠΌΠ΅Ρ€ понадобится Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ шаблон:

Π₯отя ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ этого ΠΈ Π½Π΅ Π΄Π΅Π»Π°Ρ‚ΡŒ, Π° Π²Ρ‹Ρ‡ΠΈΡΠ»ΡΡ‚ΡŒ Π±ΠΈΡ‚ΠΎΠ²Ρ‹ΡŽ ΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ ΠΏΠΎΡ‚ΠΎΠΌ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° IndexOf.

Π­Ρ‚ΠΎΡ‚ шаблон Ρ…Ρ€Π°Π½ΠΈΡ‚ Ρ‚ΠΈΠΏ Π»ΠΈΠ½ΠΈΠΈ Π’/Π’ ΠΈ Π΅Π΅ Π±ΠΈΡ‚ΠΎΠ²ΡƒΡŽ ΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ Π² спискС. Π’Π΅ΠΏΠ΅Ρ€ΡŒ приступим ΠΊ Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ собствСнно списка Π»ΠΈΠ½ΠΈΠΉ. Для опрСдСлённости ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΠΌ Π΄Π»ΠΈΠ½Ρƒ списка 16-ю линиями, Π΅Π»ΠΈ Π½Π°Π΄ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΈ большС, ΠΏΠΎΡ‚ΠΎΠΌ. Для этого Π²ΠΎΠ·ΡŒΠΌΡ‘ΠΌ шаблон MakeTypelist ΠΈΠ· Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Loki ΠΈ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΡƒΠ΅ΠΌ Π΅Π³ΠΎ ΠΏΠΎΠ΄ свои Π½ΡƒΠΆΠ΄Ρ‹:

Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ Π½Π° Π²Ρ‹Ρ…ΠΎΠ΄Π΅ ΠΈΠΌΠ΅Π΅ΠΌ Β«Π³ΠΎΠ»Ρ‹ΠΉΒ» список Ρ‚ΠΈΠΏΠΎΠ² Π½Π°ΡˆΠΈΡ… Π»ΠΈΠ½ΠΈΠΉ Π²Π²ΠΎΠ΄Π° Π²Ρ‹Π²ΠΎΠ΄Π°. ΠœΡ‹ ΡƒΠΆΠ΅ ΠΌΠΎΠΆΠ΅ΠΌ ΠΎΠ±ΡŠΡΠ²ΠΈΡ‚ΡŒ список ΠΈΠ· Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… Π»ΠΈΠ½ΠΈΠΉ, ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ с Π½ΠΈΠΌ ΠΏΠΎΠΊΠ° Π½ΠΈΡ‡Π΅Π³ΠΎ нСльзя – для Π½Π΅Π³ΠΎ Π½Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹ Π½ΠΈΠΊΠ°ΠΊΠΈΠ΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ:

Π—Π°Ρ‚ΠΎ Π΅Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ Π² Π΄Ρ€ΡƒΠ³ΠΎΠΉ шаблон ΠΊΠ°ΠΊ ΠΎΠ΄ΠΈΠ½ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€. Π’ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡΡ этим ΠΈ напишСм класс Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‰ΠΈΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ с этим списком:

Π”Π°Π»Π΅Π΅ напишСм Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ для прСобразования списка Π»ΠΈΠ½ΠΈΠΉ Π² список ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… ΠΈΠΌ ΠΏΠΎΡ€Ρ‚Π°ΠΌ:

//шаблон ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ список Π»ΠΈΠ½ΠΈΠΉ Π² качСствС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° template struct GetPorts; // для пустого списка Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ – пустой Ρ‚ΠΈΠΏ template <> struct GetPorts < typedef NullType Result; >; // для нСпустого списка // ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚ΠΈΠ·ΠΈΡ€ΡƒΠ΅ΠΌ, Ρ‡Ρ‚ΠΎ это Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ список Ρ‚ΠΈΠΏΠΎΠ² // содСрТащий Π³ΠΎΠ»ΠΎΠ²Ρƒ Head ΠΈ хвост Tail template struct GetPorts > < private: // класс TPin ΠΏΠΎΠΌΠ½ΠΈΡ‚ свой ΠΏΠΎΡ€Ρ‚ // Π·Π°ΠΏΠΎΠΌΠΈΠ½Π°Π΅ΠΌ этот Ρ‚ΠΈΠΏ ΠΏΠΎΡ€Ρ‚Π° typedef typename Head::Pin::Port Port; //рСкурсивно Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅ΠΌ хвост typedef typename GetPorts ::Result L1; public: // опрСдСляСм список ΠΏΠΎΡ€Ρ‚ΠΎΠ² ΠΈΠ· Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ ΠΏΠΎΡ€Ρ‚Π° (Port) ΠΈ хвоста (L1) typedef Typelist

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΊΠΎΠ½Π²Π΅Ρ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ список Π»ΠΈΠ½ΠΈΠΉ Π² ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ список ΠΏΠΎΡ€Ρ‚ΠΎΠ², ΠΎΠ΄Π½Π°ΠΊΠΎ ΠΎΠ΄ΠΈΠ½ ΠΈ Ρ‚ΠΎΡ‚-ΠΆΠ΅ ΠΏΠΎΡ€Ρ‚ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒΡΡ Π² Π½Π΅ΠΌ нСсколько Ρ€Π°Π·. Нам Π½ΡƒΠΆΠ½Ρ‹ Π½Π΅ ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΡΡŽΡ‰ΠΈΠ΅ΡΡ ΠΏΠΎΡ€Ρ‚Ρ‹, ΠΏΠΎ этому Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡΡ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠΌ NoDuplicates ΠΈΠ· Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Loki:

// ΠΊΠΎΠ½Π²Π΅Ρ€Ρ‚ΠΈΡ€ΡƒΠ΅ΠΌ список Π»ΠΈΠ½ΠΈΠΉ Π² ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ список ΠΏΠΎΡ€Ρ‚ΠΎΠ² typedef typename GetPorts

::Result PinsToPorts; // Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅ΠΌ список ΠΏΠΎΡ€Ρ‚ΠΎΠ² Π±Π΅Π· Π΄ΡƒΠ΄Π»ΠΈΠΊΠ°Ρ‚ΠΎΠ² typedef typename NoDuplicates

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ рСкурсивный ΠΏΡ€ΠΎΡ…ΠΎΠ΄ ΠΏΠΎ списку ΠΏΠΎΡ€Ρ‚ΠΎΠ² понадобится Π΅Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ шаблон класса. Назовём Π΅Π³ΠΎ PortWriteIterator. Π’ качСствС ΡˆΠ°Π±Π»ΠΎΠ½Π½Ρ‹Ρ… ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² ΠΎΠ½ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ список ΠΏΠΎΡ€Ρ‚ΠΎΠ² ΠΈ исходный список Π»ΠΈΠ½ΠΈΠΉ:

template struct PortWriteIterator;

Π’ этом классС ΠΈ Π±ΡƒΠ΄Π΅Ρ‚ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ рСализация ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ с ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ ΠΏΠΎΡ€Ρ‚Π°ΠΌΠΈ. ΠžΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠΌ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ этого класса для пустого списка Π»ΠΈΠ½ΠΈΠΉ.

Π”Π°Π»Π΅Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ ΠΈΠ· списка Π»ΠΈΠ½ΠΈΠΉ, Ρ‚Π΅ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠ°Ρ‚ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½ΠΎΠΌΡƒ ΠΏΠΎΡ€Ρ‚Ρƒ.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ вычислим Π±ΠΈΡ‚ΠΎΠ²ΡƒΡŽ маску для ΠΏΠΎΡ€Ρ‚Π°.

//ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ TList Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ список Π»ΠΈΠ½ΠΈΠΉ template struct GetPortMask; // Для пустого списка Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌ 0. template <> struct GetPortMask < enum; >; template struct GetPortMask > < //value = битовая маска для Π³ΠΎΠ»ΠΎΠ²Ρ‹ | битовая маска ΠΎΡΡ‚Π°Π²ΡˆΠ΅ΠΉΡΡ части списка enum; >;

Π’Π΅ΠΏΠ΅Ρ€ΡŒ напишСм Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ для Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ записи Π² ΠΏΠΎΡ€Ρ‚:

::Result Pins; // ΠŸΠΎΡΡ‡ΠΈΡ‚Π°Π΅ΠΌ Π±ΠΈΡ‚ΠΎΠ²ΡƒΡŽ маску для ΠΏΠΎΡ€Ρ‚Π° enum

::UppendValue(value); // Ссли ΠΊΠΎΠ»-Π²ΠΎ Π±ΠΈΡ‚ Π² записываСмом Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΈ совпадаСт с ΡˆΠΈΡ€ΠΈΠ½ΠΎΠΉ ΠΏΠΎΡ€Ρ‚Π°, // Ρ‚ΠΎ записываСм ΠΏΠΎΡ€Ρ‚ Ρ†Π΅Π»ΠΈΠΊΠΎΠΌ. // это условиС вычислится Π²ΠΎ врСмя компиляции if((int)Length

::value == (int)Port::Width) Port::Write(result); else < // PORT = PORT & Mask | result; Port::ClearAndSet(Mask, result); >// рСкурсивно ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅ΠΌ ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠΎΡ€Ρ‚Ρ‹ Π² спискС PortWriteIterator ::Write(value); > >

Ѐункция PinWriteIterator::UppendValue ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅Ρ‚ Π±ΠΈΡ‚Ρ‹ Π²ΠΎ Π²Ρ…ΠΎΠ΄Π½ΠΎΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΈ Π² ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ ΠΈΠΌ Π±ΠΈΡ‚Ρ‹ Π² ΠΏΠΎΡ€Ρ‚Ρƒ. Π­Ρ„Ρ„Π΅ΠΊΡ‚ΠΈΠ²Π½ΠΎΡΡ‚ΡŒ списков Π»ΠΈΠ½ΠΈΠΉ Π² Ρ†Π΅Π»ΠΎΠΌ зависит Π² ΠΏΠ΅Ρ€Π²ΡƒΡŽ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ ΠΈΠΌΠ΅Π½Π½ΠΎ ΠΎΡ‚ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ этого отобраТСния, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ½ΠΎ, Π² ΠΎΠ±Ρ‰Π΅ΠΌ случаС, Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ динамичСски ΠΈ Π½Π΅ всСгда ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ вычислСно Π²ΠΎ врСмя компиляции. Π’ зависимости ΠΎΡ‚ распрСдСлСния записываСмых Π±ΠΈΡ‚ Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚ΠΈΡ€ΡƒΡŽΡ‰Π΅ΠΌ ΠΏΠΎΡ€Ρ‚Ρƒ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΠΌ нСсколько стратСгий отобраТСния Π±ΠΈΡ‚:

Для опрСдСлСния Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ Π»ΠΈΠ½ΠΈΠΈ Π² ΠΏΠΎΡ€Ρ‚Ρƒ располоТСны ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ напишСм ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ шаблон.

Π‘ ΡƒΡ‡Ρ‘Ρ‚ΠΎΠΌ всСго Π²Ρ‹ΡˆΠ΅ написанного класс PinSet Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ Ρ‚Π°ΠΊ:

::Result PinsToPorts; public: typedef PINS PinTypeList; // Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅ΠΌ список ΠΏΠΎΡ€Ρ‚ΠΎΠ² Π±Π΅Π· Π΄ΡƒΠ΄Π»ΠΈΠΊΠ°Ρ‚ΠΎΠ² typedef typename NoDuplicates

::Result Ports; // длинна списка линий enum

::value>; // Π²Ρ‹Π±ΠΈΡ€Π°Π΅ΠΌ Ρ‚ΠΈΠΏ Π΄Π°Π½Π½Ρ‹Ρ… записываСмый Π² список Π»ΠΈΠ½ΠΈΠΉ // Ссли Π΄Π»ΠΈΠ½Π½Π° списка мСньшС ΠΈΠ»ΠΈ Ρ€Π°Π²Π½Π° 8 Π±Π΅Ρ€Ρ‘ΠΌ Ρ‚ΠΈΠΏ uint8_t, // Ссли большС – uint16_t typedef typename IoPrivate::SelectSize ::Result DataType; //Π·Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π² список Π»ΠΈΠ½ΠΈΠΉ static void Write(DataType value) < PortWriteIterator

БобствСнно списки Π»ΠΈΠ½ΠΈΠΉ ΡƒΠΆΠ΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ:

Однако, ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΈΠΌΠΈ ΠΏΠΎΠΊΠ° Π½Π΅ ΠΎΡ‡Π΅Π½ΡŒ ΡƒΠ΄ΠΎΠ±Π½ΠΎ. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ сдСлаСм Π²ΠΎΠΊΡ€ΡƒΠ³ нашСй Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ списков Π»ΠΈΠ½ΠΈΠΉ ΠΏΡ€ΠΎΠ·Ρ€Π°Ρ‡Π½ΡƒΡŽ ΠΈ ΡƒΠ΄ΠΎΠ±Π½ΡƒΡŽ ΠΎΠ±Ρ‘Ρ€Ρ‚ΠΊΡƒ:

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ±ΡŠΡΠ²Π»ΡΡ‚ΡŒ списки Π»ΠΈΠ½ΠΈΠΉ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

Π‘Ρ‚Π°Π»ΠΎ достаточно ΡƒΠ΄ΠΎΠ±Π½ΠΎ – ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π· ΠΎΠ±ΡŠΡΠ²ΠΈΡ‚ΡŒ Ρ‚Π°ΠΊΠΎΠΉ список Π»ΠΈΠ½ΠΈΠΉ, Π° ΠΏΠΎΡ‚ΠΎΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ Π³Π΄Π΅ ΡƒΠ³ΠΎΠ΄Π½ΠΎ, ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒ Π΅Π³ΠΎ ΠΊΠ°ΠΊ ΡˆΠ°Π±Π»ΠΎΠ½Π½Ρ‹ΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ Π² классы ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‰ΠΈΠ΅ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€ΠΈΡ„Π΅Ρ€ΠΈΠ΅ΠΉ. А для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ способ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ достаточно ΠΏΠΎΠ΄ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½Ρƒ строку.

Настало врСмя ΠΏΡ€ΠΎΡ‚Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ списки Π»ΠΈΠ½ΠΈΠΉ с Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌΠΈ конфигурациями ΠΈ Π½Π° Ρ€Π°Π·Π½Ρ‹Ρ… МК.
Π’Ρ‹ΡˆΠ΅ ΠΏΡ€ΠΈΠ²Π΅Π΄Ρ‘Π½Π½Ρ‹ΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ компилируСтся Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ассСмблСрный листинг:

//Π²Ρ‹Π²ΠΎΠ΄ Π² PORTA in r24, 0x1b andi r24, 0xF1 ori r24, 0x0A out 0x1b, r24 //Π²Ρ‹Π²ΠΎΠ΄ Π² PORTB in r24, 0x18 andi r24, 0xE7 ori r24, 0x10 out 0x18, r24

Как Π²ΠΈΠ΄Π½ΠΎ, компилятору всС значСния Π±Ρ‹Π»ΠΈ извСстны ΠΈ ΠΎΠ½ Π±Π»Π°Π³ΠΎΠΏΠΎΠ»ΡƒΡ‡Π½ΠΎ посчитал всС Π±ΠΈΡ‚ΠΎΠ²Ρ‹Π΅ маски ΠΈ логичСскиС ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ, Π½Π΅ оставив Π½ΠΈΡ‡Π΅Π³ΠΎ лишнСго Π½Π° врСмя выполнСния. А ΠΊΠ°ΠΊ ΠΎΠ½ ΠΏΠΎΠ²Π΅Π΄Ρ‘Ρ‚ сСбя Ссли записываСмоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π½Π΅ извСстно Π²ΠΎ врСмя компиляции? Рассмотрим ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ (список Π»ΠΈΠ½ΠΈΠΉ Ρ‚ΠΎΡ‚-ΠΆΠ΅ самый):

// MCU AtMega16 MyPins::Write(PORTC); // Ρ‡ΠΈΡ‚Π°Π΅ΠΌ PORTC in r18, 0x15 ; 21 //Π²Ρ‹Π²ΠΎΠ΄ Π² PORTA in r25, 0x1b ; 27 mov r24, r18 add r24, r24 andi r24, 0x0E ; 14 andi r25, 0xF1 ; 241 or r24, r25 out 0x1b, r24 ; 27 //Π²Ρ‹Π²ΠΎΠ΄ Π² PORTB in r24, 0x18 ; 24 andi r18, 0x18 ; 24 andi r24, 0xE7 ; 231 or r18, r24 out 0x18, r18 ; 24

Π’ качСствС значСния нСизвСстного ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ PORTC. Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ впСчатляСт, Π½Π΅ΠΏΡ€Π°Π²Π΄Π°-Π»ΠΈ? Π”Π°ΠΆΠ΅ Π½Π° ассСмблСрС слоТно Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ эффСктивнСС. К Ρ‚ΠΎΠΌΡƒ-ΠΆΠ΅ Ссли Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ всС эти Π±ΠΈΡ‚ΠΎΠ²Ρ‹Π΅ маски, Ρ‚ΠΎ ΠΎΡ‡Π΅Π½ΡŒ Π²Π΅Π»ΠΈΠΊ риск ΠΎΡˆΠΈΠ±ΠΈΡ‚ΡŒΡΡ.
Рассмотрим Ρ‚ΠΎΡ‚-ΠΆΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ скомпилированный для AtXMega128a1. Π’ этом МК ΠΏΠΎΡ€Ρ‚Ρ‹ Π’/Π’ находятся Π² Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½Π½ΠΎΠΌ пространствС Π²Π²ΠΎΠ΄Π°-Π²Ρ‹Π²ΠΎΠ΄Π° ΠΈ нСдоступны для ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ in ΠΈ out. РСализация ΠΏΠΎΡ€Ρ‚ΠΎΠ², ΡƒΡ‡ΠΈΡ‚Ρ‹Π²Π°ΡŽΡ‰Π°Ρ особСнности сСмСйства XMega Ρƒ нас ΡƒΠΆΠ΅ написана.

// Ρ‡ΠΈΡ‚Π°Π΅ΠΌ PORTC.IN lds r18, 0x0648 mov r25, r18 add r25, r25 andi r25, 0x0E ; 14 //Π²Ρ‹Π²ΠΎΠ΄ Π² PORTA ldi r30, 0x00 ; 0 ldi r31, 0x06 ; 6 ldi r24, 0x0E ; 14 std Z+6, r24 ; 0x06 std Z+5, r25 ; 0x05 andi r18, 0x18 ; 24 //Π²Ρ‹Π²ΠΎΠ΄ Π² PORTB ldi r30, 0x20 ; 32 ldi r31, 0x06 ; 6 ldi r24, 0x18 ; 24 std Z+6, r24 ; 0x06 std Z+5, r18 ; 0x05

Как Π²ΠΈΠ΄Π½ΠΎ, Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ΡŒ ΠΎΠ± избыточности ΠΈ Π½Π°ΠΊΠ»Π°Π΄Π½Ρ‹Ρ… расходах, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠ²Π»Π΅Ρ‡ΡŒ использованиС Π‘ΠΈ++ здСсь Π½Π΅ приходится. Аналогичным ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅ΠΌ запись направлСния Π»ΠΈΠ½ΠΈΠΉ. ЕдинствСнноС ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ это Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ записываСтся Π² рСгистры управлСния Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ΠΌ Π»ΠΈΠ½ΠΈΠΉ (DDRx).

::Write(value); > //запись направлСния static void DirWrite(DataType value) < PortWriteIterator

И ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ дополнСния Π² класс PortWriteIterator.

::value == (int)Port::Width) Port::DirWrite(result); else < Port::DirClear(Mask); Port::DirSet(result); >PortWriteIterator ::DirWrite(value); > >;

Для ΠΏΠΎΠ»Π½ΠΎΡ‚Ρ‹ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ, Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½Ρ‹ΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Set, Clear, DirSet, DirClear для установки ΠΈ обнулСния Π±ΠΈΡ‚ΠΎΠ² соотвСтствСнно Π² рСгистрах ΠΏΠΎΡ€Ρ‚Π° ΠΈ рСгистрах направлСния.

ΠžΡΡ‚Π°Ρ‘Ρ‚ΡΡ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ состояния ΠΏΠΎΡ€Ρ‚Π°. Π­Ρ‚ΠΎ нСсколько ΠΏΡ€ΠΎΡ‰Π΅, Ρ‡Π΅ΠΌ запись:

ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ Π½Π° Ρ‡Ρ‚Π΅Π½ΠΈΠΈ ΠΎΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒΡΡ Π½Π΅ Π±ΡƒΠ΄Π΅ΠΌ.

Π˜Ρ‚Π°ΠΊ Ρƒ нас ΡƒΠΆΠ΅ Π΅ΡΡ‚ΡŒ срСдство для эффСктивной манипуляции ΠΏΠΎΡ€Ρ‚Π°ΠΌΠΈ Π²Π²ΠΎΠ΄Π°-Π²Ρ‹Π²ΠΎΠ΄Π° МК. Но вСдь Π·Π°Π΄Π°Ρ‡Π° Π±Ρ‹Π»Π° ΠΈΠ·Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎ ΡˆΠΈΡ€Π΅ – ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ ΠΈΠ·ΠΎΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€Π° ΠΎΡ‚ с способа ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ устройств. И эта Ρ†Π΅Π»ΡŒ ΡƒΠΆΠ΅ достигнута. Класс TPin, Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‰ΠΈΠΉ линию Π²Π²ΠΎΠ΄Π°-Π²Ρ‹Π²ΠΎΠ΄Π°, ΠΊΠ°ΠΊ ΠΈ списки Π»ΠΈΠ½ΠΈΠΉ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ ΠΈΠ·ΠΎΠ»ΠΈΡ€ΠΎΠ²Π°Π½Ρ‹ ΠΎΡ‚ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΏΠΎΡ€Ρ‚ΠΎΠ² Π’/Π’. Π­Ρ‚ΠΎ Π±Ρ‹Π»ΠΎ Π²ΠΈΠ΄Π½ΠΎ Π½Π° Ρ‚ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅, Ρ‡Ρ‚ΠΎ Ρƒ нас ΡƒΠΆΠ΅ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Ρ‹ ΠΏΠΎΡ€Ρ‚Ρ‹ ΠΊΠ°ΠΊ для сСмСйств Tiny/Mega AVR, Ρ‚Π°ΠΊ ΠΈ для XMega. Π’Π°ΠΊ Π²ΠΎΡ‚, достаточно Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ класс, Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‰ΠΈΠΉ интСрфСйс ΠΏΠΎΡ€Ρ‚Π° Π’/Π’, ΠΈ списки Π»ΠΈΠ½ΠΈΠΉ Π±ΡƒΠ΄ΡƒΡ‚ с Π½ΠΈΠΌ прСкрасно Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ. Для ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° Π²ΠΎΠ·ΡŒΠΌΡ‘ΠΌ, ΡƒΠΆΠ΅ рассмотрСнный Ρ€Π°Π½Π΅Π΅, сдвиговый рСгистр ΠΈ Π±ΡƒΠ΄Π΅ΠΌ Π΅Π³ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ количСства доступных Π»ΠΈΠ½ΠΈΠΉ Π’/Π’.

template class ThreePinLatch < public: typedef T DataT; // Π½ΡƒΠΆΠ΅Π½ для сортировки ΠΏΠΎΡ€Ρ‚ΠΎΠ² Π² списках Π»ΠΈΠ½ΠΈΠΉ enum; //Ρ€Π°Π·Ρ€ΡΠ΄Π½ΠΎΡΡ‚ΡŒ рСгистра enum; // запись значСния static void Write(T value) < _currentValue = value; for(uint8_t i=0; i >= 1; ClockPin::Clear(); > LatchPin::Set(); LatchPin::Clear(); > static DataT Read() < return _currentValue; >static void ClearAndSet(DataT clearMask, DataT value) < Write(_currentValue = (_currentValue &

clearMask) | value); > static void Set(DataT value) < Write(_currentValue |= value); >static void Clear(DataT value) < Write(_currentValue &=

value); > static void Togle(DataT value) < Write(_currentValue ^= value); >static void DirWrite(DataT value) < /*Π½Π΅ ΠΌΠΎΠΆΠ΅ΠΌ ΠΌΠ΅Π½ΡΡ‚ΡŒ Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅*/ >static DataT DirRead() < return 0xff; //всСгда Π²Ρ‹Ρ…ΠΎΠ΄ >static void DirSet(DataT value) static void DirClear(DataT value) static void DirTogle(DataT value) protected: // Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π² рСгистрС static DataT _currentValue; >; template T ThreePinLatch ::_currentValue = 0;

ΠœΡ‹ Π½Π΅ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ состояниС Π²Ρ‹Ρ…ΠΎΠ΄Π½Ρ‹Ρ… Π»ΠΈΠ½ΠΈΠΉ рСгистра – ΠΎΠ½ всСгда Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π½Π° Π²Ρ‹Ρ…ΠΎΠ΄, поэтому Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ чтСния состояния Π½Π΅ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅ΠΌ ΠΈ Π½Π΅ объявляСм. ΠŸΠΎΠΏΡ‹Ρ‚ΠΊΠ° ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ состояниС Ρ‚Π°ΠΊΠΎΠ³ΠΎ ΠΏΠΎΡ€Π° Π²Ρ‹Π·ΠΎΠ²Π΅Ρ‚ ΠΎΡˆΠΈΠ±ΠΊΡƒ компиляции. Π—Π°Ρ‚ΠΎ Π½Π° запись Π½Π΅Ρ‚ Π½ΠΈΠΊΠ°ΠΊΠΈΡ… ограничСния. И ΠΌΡ‹ свободно ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ этот Β«ΠΏΠΎΡ€Ρ‚Β» со списками Π»ΠΈΠ½ΠΈΠΉ.

ΠŸΡ€ΠΈΡ‡Π΅ΠΌ Π½Π΅Ρ‚ Π½ΠΈΠΊΠ°ΠΊΠΈΡ… ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠΉ Π½Π° состав списка Π»ΠΈΠ½ΠΈΠΉ – ΠΌΠΎΠΆΠ½ΠΎ ΡΠΌΠ΅ΡˆΠΈΠ²Π°Ρ‚ΡŒ Π² ΠΎΠ΄Π½ΠΎΠΌ спискС Π»ΠΈΠ½ΠΈΠΈ сдвигового рСгистра ΠΈ Π»ΠΈΠ½ΠΈΠΈ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Ρ… ΠΏΠΎΡ€Ρ‚ΠΎΠ².

Π’ Π½Π°ΡˆΠΈΡ… цСлях значится Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ€Π°Π±ΠΎΡ‚Π° с ΠΌΠ½ΠΎΠ³ΠΎΠ±ΠΈΡ‚Π½Ρ‹ΠΌΠΈ значСниями, Π½ΠΎ ΠΈ манипуляции ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ Π±ΠΈΡ‚Π°ΠΌΠΈ, поэтому Π΄ΠΎΠ±Π°Π²ΠΈΠΌ Π² интСрфСйс списков Π»ΠΈΠ½ΠΈΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ для этого. Π’ΠΎ ΠΏΠ΅Ρ€Π²Ρ‹Ρ…, это доступ ΠΊ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΌ линиям ΠΈΠ· списка. Для этого Π² класс PinSet допишСм ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠ΄:

template class Pin :public TypeAt

Π—Π΄Π΅ΡΡŒ ΠΌΡ‹ воспользовались Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠΌ TypeAt ΠΈΠ· Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Loki, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΈΠ· списка Ρ‚ΠΈΠΏΠΎΠ² ΡƒΠΊΠ°Π·Π°Π½Π½ΡƒΡŽ Π² ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π΅ ΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ. ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ этим достаточно просто:

ΠžΠ±ΠΎΠ±Ρ‰Π°Ρ доступ ΠΊ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΌ Π±ΠΈΡ‚Π°ΠΌ Π² спискС Π»ΠΈΠ½ΠΈΠΉ ΠΏΡ€ΠΈΡ…ΠΎΠ΄ΠΈΠΌ ΠΊ ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΠΈ срСза. НС Π±ΡƒΠ΄Ρƒ Π²Π΄Π°Π²Π°Ρ‚ΡŒΡΡ Π² подробности ΠΈΡ… Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ, ΠΏΡ€ΠΈΠ²Π΅Π΄Ρƒ лишь ΠΏΡ€ΠΈΠΌΠ΅Ρ€ использования:

// Π±Π΅Ρ€Ρ‘ΠΌ срСз ΠΈΠ· MyPins начиная с 4-Π³ΠΎ Π±ΠΈΡ‚Π°, Π΄Π»ΠΈΠ½Π½ΠΎΠΉ 4 Π±ΠΈΡ‚Π°. typedef MyPins::Slice OtherPins;

Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ Π½ΠΎΠ²Ρ‹ΠΉ список Π»ΠΈΠ½ΠΈΠΉ OtherPins, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ:

Π­Ρ‚ΠΎΡ‚ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ ΡƒΠ΄ΠΎΠ±Π΅Π½ для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ значСния ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠΉ Π³Ρ€ΡƒΠΏΠΏΡ‹ Π»ΠΈΠ½ΠΈΠΉ, Π½Π΅ измСняя ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Ρ…. ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ‚ΠΎΡ€ для этого случая ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠ³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ эффСктивный ΠΊΠΎΠ΄. Π’ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π²Ρ‹Π·ΠΎΠ² OtherPins::Write(Ρ‡Ρ‚ΠΎ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ) Π·Π°ΠΏΠΈΡˆΠ΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π² 4 Π±ΠΈΡ‚Π° PORTB, Π½Π΅ Π·Π°Ρ‚Ρ€ΠΎΠ½ΡƒΠ² Π»ΠΈΠ½ΠΈΠΈ Π² сдвиговом рСгистрС.

ΠŸΠΎΠ΄Π²Π΅Π΄Ρ‘ΠΌ ΠΈΡ‚ΠΎΠ³ΠΈ
Π¦Π΅Π»ΠΈ поставлСнныС ΠΏΠ΅Ρ€Π΅Π΄ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ Π²Π²ΠΎΠ΄Π°-Π²Ρ‹Π²ΠΎΠ΄Π° для МК Π½Π° Π‘ΠΈ++ Π±Ρ‹Π»ΠΈ достигнуты Π² ΠΏΠΎΠ»Π½ΠΎΠΉ ΠΌΠ΅Ρ€Π΅. Достигнута ΠΊΠ°ΠΊ ΡΡ„Ρ„Π΅ΠΊΡ‚ΠΈΠ²Π½ΠΎΡΡ‚ΡŒ манипуляций с ΠΌΠ½ΠΎΠ³ΠΎΠ±ΠΈΡ‚ΠΎΠ²Ρ‹ΠΌΠΈ значСниями, Ρ‚Π°ΠΊ ΠΈ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ линиями Π²Π²ΠΎΠ΄Π°-Π²Ρ‹Π²ΠΎΠ΄Π°. Бписки Π»ΠΈΠ½ΠΈΠΉ, ΠΊΠ°ΠΊ ΠΈ ΠΊΠΎΠ΄ ΠΈΡ… ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΠΉ, ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ ΠΈΠ·ΠΎΠ»ΠΈΡ€ΠΎΠ²Π°Π½Ρ‹ ΠΎΡ‚ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΉ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΏΠΎΡ€Ρ‚ΠΎΠ². Π§Ρ‚ΠΎΠ±Ρ‹ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π½ΠΎΠ²Ρ‹ΠΉ способ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Ρ‡Π΅Ρ€Π΅Π· SPI Ρ€Π°ΡΡˆΠΈΡ€ΠΈΡ‚Π΅Π»ΡŒ ΠΏΠΎΡ€Ρ‚ΠΎΠ²) устройства ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰Π΅Π³ΠΎ списки Π»ΠΈΠ½ΠΈΠΉ, ΠΈΠ»ΠΈ ΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ Π½Π° Π΄Ρ€ΡƒΠ³ΠΎΠ΅ сСмСйство МК, достаточно Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ класс Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‰ΠΈΠΉ интСрфСйс ΠΏΠΎΡ€Ρ‚Π° Π²Π²ΠΎΠ΄Π°-Π²Ρ‹Π²ΠΎΠ΄Π°.
ЕдинствСнными сущСствСнными нСдостатками этого ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π° являСтся ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½Π°Ρ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ списков Π»ΠΈΠ½ΠΈΠΉ (Π½ΠΎ вСдь ΠΎΠ½ΠΈ ΡƒΠΆΠ΅ написаны) ΠΈ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ изучСния языка Π‘ΠΈ++.

Β© ΠšΠΎΠ½ΡΡ‚Π°Π½Ρ‚ΠΈΠ½ Π§ΠΈΠΆΠΎΠ²
Email: klen1@mail.ru Π‘Π΅Π½Ρ‚ΡΠ±Ρ€ΡŒ 2010

Бпасибо. Π’Ρ‹ ΠΏΠΎΡ‚Ρ€ΡΡΠ°ΡŽΡ‰ΠΈΠ΅! ВсСго Π·Π° мСсяц ΠΌΡ‹ собрали Π½ΡƒΠΆΠ½ΡƒΡŽ сумму Π² 500000 Π½Π° Ρ…ΠΎΠΊΠΊΠ΅ΠΉΠ½ΡƒΡŽ ΠΊΠΎΡ€ΠΎΠ±ΠΊΡƒ для дСтского Π΄ΠΎΠΌΠ° АистСнок. Из ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… 125000+ Π±Ρ‹Π»ΠΎ ΠΎΡ‚ вас, Ρ‡ΠΈΡ‚Π°Ρ‚Π΅Π»Π΅ΠΉ EasyElectronics. Π‘Ρ‹Π»ΠΈ Π΄Π°ΠΆΠ΅ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Ρ‹ Π½Π° 25000+ ΠΈ просто ΠΏΠΎΡ‚ΠΎΠΊ ΠΏΠ»Π°Ρ‚Π΅ΠΆΠ΅ΠΉ Π½Π° 251 Ρ€ΡƒΠ±Π»ΡŒ. Π­Ρ‚ΠΎ нСвСроятно ΠΊΡ€ΡƒΡ‚ΠΎ. БСйчас ΠΈΠ΄Π΅Ρ‚ Π·Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Π΄ΠΎΠ³ΠΎΠ²ΠΎΡ€Π° ΠΈ ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΊΠ° ΠΊ ΡΡ‚Ρ€ΠΎΠΈΡ‚Π΅Π»ΡŒΡΡ‚Π²Ρƒ!

А я встрял Π½Π° Ρ‚Ρ€ΠΈ Π³ΠΎΠ΄Π°, ΠΊΠ°ΠΊ ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌ, СТСмСсячной ΠΏΠ°Ρ…ΠΎΡ‚Ρ‹ Π½Π°Π΄ ΡΡ‚Π°Ρ‚ΡŒΡΠΌΠΈ :)))))))))))) Бпасибо Π²Π°ΠΌ Π·Π° Ρ‚Π°ΠΊΠΎΠΉ ΠΌΠΎΡ‰Π½Ρ‹ΠΉ ΠΏΠΈΠ½ΠΎΠΊ.

86 thoughts on β€œΠ Π°Π±ΠΎΡ‚Π° с ΠΏΠΎΡ€Ρ‚Π°ΠΌΠΈ Π²Π²ΠΎΠ΄Π°-Π²Ρ‹Π²ΠΎΠ΄Π° ΠΌΠΈΠΊΡ€ΠΎΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€ΠΎΠ² Π½Π° Π‘ΠΈ++”

О_ΠΎ πŸ™‚
Вёска:)
ΠŸΠΏΡ† такая большая ΡΡ‚Π°Ρ‚ΡŒΡ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΠΏΠΎΡ€Ρ‚Π°ΠΌΠΈ Π’Π’))

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ

Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ

Π’Π°Ρˆ адрСс email Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π½. ΠžΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ поля ΠΏΠΎΠΌΠ΅Ρ‡Π΅Π½Ρ‹ *