Tiny13 программный SPI 74hc595

Дисплеи, датчики и прочие функциональные узлы, управляемые МК.
Ответить
Аватара пользователя
nicolasomsk
Встал на лапы
Сообщения: 148
Зарегистрирован: Вс окт 23, 2011 13:27:09
Откуда: Россия. Омск
Контактная информация:

Tiny13 программный SPI 74hc595

Сообщение nicolasomsk »

Total Привет!
Коты, помогите, пожалуйста. Нужно отправить на светодиодную матрицу данные через сдвиговый регистр 74hc595. Всё бы ничего и с аппаратной реализацией проблем не возникает, но есть желание использовать микроконтроллер Attiny13, а у него как известно аппаратной поддержки SPI нет.
Сам процесс вывода мне более чем понятен, но в дебрях Си я пока что не особо комфортно себя чувствую.
Если есть бескорыстные коты, помогите реализовать (Atmel Studio) следующую логику:
PB0-MOSI (последовательный вывод данных)
PB2-SCK (тактовые импульсы)
PB1- Строб (защёлка)
Выводить нужно просто 8 бит данных (байтовая переменная).

Ищу примеры два дня, но всё не то. То для CVAVR где всякие "PB .1" которые студия не понимает, то замудрено на все случаи жизни и по коду-конь и разобраться без бутылки никак, то на Асме вообще.
Попытался сделать "в лоб" ногодрыгом))) выводил просто константу, всё работает, а как передавать бит переменной, а потом её сдвигать я не понимаю.
Спасибо всем, кто прочитал до конца!
Аватара пользователя
Gisteresis
Друг Кота
Сообщения: 4732
Зарегистрирован: Ср сен 18, 2013 10:08:26
Откуда: Санкт-Петербург

Re: Tiny13 программный SPI 74hc595

Сообщение Gisteresis »

А посмотреть примеры поставляемые с Atmel Studio, по аналогии понять на что нужно заменить "PB .1"? Это кстати фишка только CV и вообще говоря писать так не совсем верно, потому что код не портабельный получается. Кроме того в CV есть хеадер в котором прописаны все эти макросы типа PB .1, можно посмотреть там на что они заменяются. Правильней как раз было бы через сдвиг.
Аватара пользователя
YS
Друг Кота
Сообщения: 7518
Зарегистрирован: Вс мар 29, 2009 22:09:05
Контактная информация:

Re: Tiny13 программный SPI 74hc595

Сообщение YS »

Последовательный вывод байта на ножку со вводом с другой ножки (программный SPI):

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

uint8_t SWSPI_ByteRxTx(uint8_t txbyte)
{
  uint8_t rxbyte=0,mask;
 
  //mask for MSB first
  for (mask=0x80; mask; mask = mask >> 1)
  {
    if (txbyte & mask)
    {
      SWSPI_PORT|=SWSPI_MOSI;
    }
    else
    {
      SWSPI_PORT&=~SWSPI_MOSI;
    }
   
    SWSPI_PORT|=SWSPI_SCLK;

    if (SWSPI_PIN & SWSPI_MISO)
    {
      rxbyte|=mask;
    }
   
    SWSPI_PORT&=~SWSPI_SCLK;
  }

  return rxbyte;
}


SWSPI_PORT, SWSPI_MOSI, SWSPI_MISO, SWSPI_SCLK задаете директивами #define по вкусу. Например,

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

#define SWSPI_PORT        PORTB
#define SWSPI_MOSI        (1<<PB0)
#define SWSPI_SCLK        (1<<PB2)


Убрать ввод значения с MISO и дописать вывод строба - вам домашнее задание. :wink: Ну и, разумеется, перед использованием порт надо настроить.
Разница между теорией и практикой на практике гораздо больше, чем в теории.
kalobyte
Друг Кота
Сообщения: 13796
Зарегистрирован: Чт сен 20, 2007 14:08:00

Re: Tiny13 программный SPI 74hc595

Сообщение kalobyte »

у меня на сцайте есть как раз под этот регистр код
тематические ответы только в форуме, в приват не пишите
Аватара пользователя
nicolasomsk
Встал на лапы
Сообщения: 148
Зарегистрирован: Вс окт 23, 2011 13:27:09
Откуда: Россия. Омск
Контактная информация:

Re: Tiny13 программный SPI 74hc595

Сообщение nicolasomsk »

Ребят, всем спасибо за ответы. Разобрался.
Аватара пользователя
Кефир
Встал на лапы
Сообщения: 131
Зарегистрирован: Пт апр 01, 2011 20:59:47
Откуда: Саратов
Контактная информация:

Re: Tiny13 программный SPI 74hc595

Сообщение Кефир »

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

void spi_H(void)
{
    SPICS |= CS1;
}

void spi_L(void)
{
    SPICS &= ~CS1;
}

unsigned char SPI_WritRead(unsigned char Data)
{
    unsigned char res=0;
    for (unsigned char i = 0; i < 8; i++)
    {
        if ((Data & 128) == 0)
        {
            SPIIO &= ~SDO;
        }
        else
        {
            SPIIO |= SDO;
        }
        Data = Data << 1;
        SPIIO |= SCK;
        res = res << 1;
        if ((P2IN & SDI)!=0x00)
        res=res|0x01;
        SPIIO &= ~SCK;
    }
    return res;
}
Ответить

Вернуться в «Периферия»