Изменения в библиотеке DigitalPins

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Я тут недавно с удивлением обнаружил, что разработанной когда-то по моей просьбе библиотекой DigitalPins пользуюсь не я один. Потому решил выложить сделанные сегодня изменения.

Изменение позволяет использовать пины XTAL1, XTAL2 и RESET как обычные GPIO в ATmega328 (раньше они не поддерживались).

Только прошу правильно понять. Выкладываю исключительно потому, что увидел её в «Проектах». Факт выкладывания не означает, что она стала «поставляться». Она по-прежнему является внутренней поделкой для внутреннего пользования. Использовать или не использовать её Вы можете только на собственный страх и риск.

 

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

А маски для трёх новых пинов? Те, что в строках 378-399? Забыл? Или не посчитал нужным? 

Green
Offline
Зарегистрирован: 01.10.2015

А ещё бы инверсию одной командой.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Ворота пишет:

А маски для трёх новых пинов? Те, что в строках 378-399? Забыл? Или не посчитал нужным? 

Забыл.

Вставьте, если не в лом, а то мне не до сук сегодня.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Green пишет:

А ещё бы инверсию одной командой.

Это есть (и было давно, с самого начала) - _pinInvert(pin)

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

ЕвгенийП пишет:

Вставьте, если не в лом

Не вопрос

Green
Offline
Зарегистрирован: 01.10.2015

Меня смущает
#define __pinInvert(port,mask) ((port) |= (mask))
так же как и
#define __Invert(port,mask) \

1asm volatile (  \
2"in __tmp_reg__,__SREG__    \n\t"   \
3"cli    \n\t"   \
4"in r24,%0  \n\t"   \
5"or r24,%1  \n\t"   \
6"out %0,r24 \n\t"   \
7"out __SREG__,__tmp_reg__   \n\t"   \
8: : "I" (_SFR_IO_ADDR(port)), "r" ((mask)) : "r24"  \
9)
По моему нужно просто устанавливать, а не добавлять, не?
Green
Offline
Зарегистрирован: 01.10.2015

ЕвгенийП пишет:

...сичтают...

У меня тоже, когда выпью, одна рука опережает другую.)
Не, извиняюсь, это не тот случай - тут одна рука.)

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Green пишет:

Меня смущает

Читайте строки №№ 17-19. Этот текст НЕ является универсальной библиотекой, НЕ поддерживается и НЕ сопровожадется. Это домашняя вещь для домашнего использования. Я просто увидел, что она как-то расползлась и даже появилась у нас в одном из проектов в соответсвующем разделе. Потому и решил выложить изменения, о чём уже жалею.

В любом случае, я не консультирую по этому коду и не помогаю решать связанные с ним вопросы. Сейчас сделаю исключение, но впредь, имейте в виду.

Что до Вашего смущения, Вы полезли в групповые операции. Они не делаются одной командой по определению. Однокомандное инвертирование возможно для одиночного пина - _pinInvert(pin). Видимо, Ваш вопрос связан с тем, почему групповое инвертирование не сделано записью в PINx, как это сделано для единичного пина. Так при такой записи, туда (в PINx) полезут не только единицы "куда надо", но и нули "во все остальные биты". Вы уверены. что это будет нормально восприниматься?

Green
Offline
Зарегистрирован: 01.10.2015

Да, я уверен (хотя верить нельзя никому), потому что только запись 1-цы влияет на инверсию порта, не более. 0 не влияет ни на что. Ни на PIN, ни на PORT.

Цитата:
13.2.2 Toggling the Pin
Writing a logic one to PINxn toggles the value of PORTxn, independent on the value of DDRxn.

Плюс этого варианта ещё в том, что операция атомарна.

 
ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Green пишет:

Да, я уверен ... только запись 1-цы влияет на инверсию порта, не более. 0 не влияет ни на что. 

Ну, в даташите этого не написано, а вопросы веры мы тут обсуждать точно не будем. Мне жаль что тот кусок оскорбил Ваши чувства верующего, но обсуждение прекращаем. Как я уже сказал, библиотека не поддерживается а тот мой ответ был исключением.

Green
Offline
Зарегистрирован: 01.10.2015

Да ради бога. Я не пытался вам что то доказать, я просто обратил ваше внимание.)

Green
Offline
Зарегистрирован: 01.10.2015

ЕвгенийП, на самом деле классная библиотека.) Может Вам копирайт какой то следовало поставить? Пусть даже чисто символически.)

sadman41
Offline
Зарегистрирован: 19.10.2016

Если позволите - тоже влезу. Я такое вот у себя пользую для того, чтобы значения на "защищаемых" пинах не портить (во всяком случае так полагаю):

01#include <util/atomic.h>
02 
03uint8_t writeToPort(const uint8_t _port, const uint8_t _value, const uint8_t _protectMask = B00000000)
04{
05  volatile uint8_t *portRegister;
06 
07  portRegister = portOutputRegister(_port);
08  if (NOT_A_PORT == portRegister) return false;
09  // Port write transaction
10  // Use protection mask when write to port to save some pins state
11  ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {
12    *portRegister = (*portRegister & _protectMask) | (_value & ~_protectMask);
13  }
14  return true;
15}

В _protectMask '1' препятствует изменению пина, '0' - разрешает изменение. 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

может и мне когда-нибудь пригодится!

Green
Offline
Зарегистрирован: 01.10.2015

sadman41 пишет:

Я такое вот у себя пользую...


С виду норм. Только тип возвращаемого значения желательно bool, по красивому.)