Параллельная работа ШИМ и SPI

vlakar
Offline
Зарегистрирован: 08.01.2013
Для разработки устройства на Atmega 8 необходимо задействовать ШИМ (PB1-PB3)и аппаратный SPI (PB1-PB4) но вся беда в том что они занимают одни и те же ноги
можно как то реализовать их параллельную работу или нет ?
И вообще это реализуемо ?
rkit
Offline
Зарегистрирован: 23.11.2016

И как ты себе представляешь "параллельную работу"?

Kakmyc
Offline
Зарегистрирован: 15.01.2018

Неодновременно можно, но нахер оно не уперлось.
Проще взять другой контроллер или пересмотреть схему устройства. Скажем включив в него микросхему которая может ШИМ и управляется по SPI

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

Или что то делать софтово, если есть такая возможность.

b707
Offline
Зарегистрирован: 26.05.2017

vlakar пишет:

 
можно как то реализовать их параллельную работу или нет ?
 

нет

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

vlakar пишет:

Для разработки устройства на Atmega 8 необходимо задействовать ШИМ (PB1-PB3)и аппаратный SPI (PB1-PB4) но вся беда в том что они занимают одни и те же ноги
можно как то реализовать их параллельную работу или нет ?
И вообще это реализуемо ?

Используй Atmega88

b707
Offline
Зарегистрирован: 26.05.2017

vlakar пишет:

Для разработки устройства на Atmega 8 необходимо задействовать ШИМ (PB1-PB3)и аппаратный SPI (PB1-PB4) но вся беда в том что они занимают одни и те же ноги

вообще-то смотрю распиновку Атмега8

и вижу что ШИМ - это PB1 PB2, а SPI - это PB3-PB5. то есть они не пересекаются.

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

b707 пишет:

вообще-то смотрю распиновку Атмега8

и вижу что ШИМ - это PB1 PB2, а SPI - это PB3-PB5. то есть они не пересекаются.

А PB2 ? )

Вообще, PB1 точно не пересекается. Сколько ШИМ нужно то? Все три?

b707
Offline
Зарегистрирован: 26.05.2017

BOOM пишет:

А PB2 ? )

SS можно переназначить на любой другой пин, он не привязан к железу, так что уже два ШИМ есть.

ЗЫ то, что PB3 тоже ШИМ - каюсь, не заметил, потому и написал "не пересекаются". Правильнее - пересекаются на 1 пин :)

 

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

Не, не. SS нужен для SPI.)

b707
Offline
Зарегистрирован: 26.05.2017

Green пишет:

Не, не. SS нужен для SPI.)

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

 

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

Для ведомых устройств да, но Ардуино SPI не сможет работать без SS, который определяет мастер/слэйв (направление).

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Green пишет:

Для ведомых устройств да, но Ардуино SPI не сможет работать без SS, который определяет мастер/слэйв (направление).

Да ты угараешь штоли?  SS жестко задан, када ардуино ведомое устройство, а когда ведущее - хоть A0 назначай

Кстати, в известной биб-ке для SD карт, SS пин 4, памойму.

b707
Offline
Зарегистрирован: 26.05.2017

Green пишет:

Для ведомых устройств да, но Ардуино SPI не сможет работать без SS, который определяет мастер/слэйв (направление).

еще раз, никто не говорит "работать без SS". Но пин для SS можно выбрать любой, не обязательно PB2

напомню известную картинку:

допустим тут SS1 - это наш PB2 Атмеги8, SS1 SS2 - какие-то другие пины.

Ты хочешь сказать, что если отключить зеленого клиента, у которого SS = PB2 . два других тоже перестанут работать? - мне кажется ты неправ.

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

DetSimen пишет:

Да ты угараешь штоли? 


Что ли.

void SPIClass::begin()
{
  uint8_t sreg = SREG;
  noInterrupts(); // Protect from a scheduler and prevent transactionBegin
  if (!initialized) {
    // Set SS to high so a connected chip will be "deselected" by default
    uint8_t port = digitalPinToPort(SS);
    uint8_t bit = digitalPinToBitMask(SS);
    volatile uint8_t *reg = portModeRegister(port);

    // if the SS pin is not already configured as an output
    // then set it high (to enable the internal pull-up resistor)
    if(!(*reg & bit)){
      digitalWrite(SS, HIGH);
    }

    // When the SS pin is set as OUTPUT, it can be used as
    // a general purpose output port (it doesn't influence
    // SPI operations).
    pinMode(SS, OUTPUT);

    // Warning: if the SS pin ever becomes a LOW INPUT then SPI
    // automatically switches to Slave, so the data direction of
    // the SS pin MUST be kept as OUTPUT.
    SPCR |= _BV(MSTR);
    SPCR |= _BV(SPE);

 

b707
Offline
Зарегистрирован: 26.05.2017

Дед, тут есть другой вопрос.

При работе с СТМ32 я сталкивался, что хоть SS для SPI и можно выбрать любой, но к "системному" SS при этом все равно подключать ничего нельзя - SPI перестает работать. Но думаю, что это вывихи СТМ-овского аддона...

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

Более того, настроил ты SPI мастером, и вдруг коротнул SS на землю. Всё, мастер стал слэйвом. Это у AVR и лично со мной.

b707
Offline
Зарегистрирован: 26.05.2017

Green пишет:

Что ли.

void SPIClass::begin()
{
  uint8_t sreg = SREG;
  noInterrupts(); // Protect from a scheduler and prevent transactionBegin
  if (!initialized) {
    // Set SS to high so a connected chip will be "deselected" by default
    uint8_t port = digitalPinToPort(SS);
    uint8_t bit = digitalPinToBitMask(SS);
    volatile uint8_t *reg = portModeRegister(port);

    // if the SS pin is not already configured as an output
    // then set it high (to enable the internal pull-up resistor)
    if(!(*reg & bit)){
      digitalWrite(SS, HIGH);
    }

    // When the SS pin is set as OUTPUT, it can be used as
    // a general purpose output port (it doesn't influence
    // SPI operations).
    pinMode(SS, OUTPUT);

    // Warning: if the SS pin ever becomes a LOW INPUT then SPI
    // automatically switches to Slave, so the data direction of
    // the SS pin MUST be kept as OUTPUT.
    SPCR |= _BV(MSTR);
    SPCR |= _BV(SPE);

вот ты упертый. Что этот кусок кода доказывает? - ничего. Инициализации значения SS в нем нет. Этот код никак не опровергает мои слова, что пин для SS может быть назначен любой.

Green пишет:

Более того, настроил ты SPI мастером, и вдруг коротнул SS на землю. Всё, мастер стал слэйвом. Это у AVR и лично со мной.

ты правда не проснулся? - заведи другой пин и не трогай его

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

Green пишет:

Более того, настроил ты SPI мастером, и вдруг коротнул SS на землю. Всё, мастер стал слэйвом. Это у AVR и лично со мной.

с этим я согласен.  тогда да, тогда я идиот, чо с меня взять.  

b707
Offline
Зарегистрирован: 26.05.2017

млин, еше раз!

Никто не спорит, что SS нужен. Но прописанный на распиновке чипа пин PB2 - ТОЛЬКО ДЛЯ ПРИМЕРА.

#define PIN_SPI_SS    (53)
#define PIN_SPI_MOSI  (51)
#define PIN_SPI_MISO  (50)
#define PIN_SPI_SCK   (52)

static const uint8_t SS   = PIN_SPI_SS;
static const uint8_t MOSI = PIN_SPI_MOSI;
static const uint8_t MISO = PIN_SPI_MISO;
static const uint8_t SCK  = PIN_SPI_SCK;

 

SS можно перекинуть на любой другой GPIO сменой макроса #define PIN_SPI_SS, потому что он, в отличии от SCK MOSI MISO -  не привязан к железу

 

Грин, вообще непонятно, о чем спор... ты мне про мягкое, я - про соленое.

 

И, кстати, в ветке по твоей ссылке ты САМ ПИШЕШЬ, что SS можно использовать как OUTPUT. Насколько я помню, в авр нет отдельного режима пина для ШИМ, это тоже OUTPUT, так что ТС вполне может совместить SPI и два ШИМ

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

Да, согласен, виноват.( SS настраивается на выход ТОЛЬКО при инициализации SPI, но в дальнейшем его можно использовать для ШИМ.
Прошу пардону у всех запутанных мною.)