Страница 1 из 1

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

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

Ищу примеры два дня, но всё не то. То для CVAVR где всякие "PB .1" которые студия не понимает, то замудрено на все случаи жизни и по коду-конь и разобраться без бутылки никак, то на Асме вообще.
Попытался сделать "в лоб" ногодрыгом))) выводил просто константу, всё работает, а как передавать бит переменной, а потом её сдвигать я не понимаю.
Спасибо всем, кто прочитал до конца!

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

Добавлено: Пн сен 01, 2014 11:48:01
Gisteresis
А посмотреть примеры поставляемые с Atmel Studio, по аналогии понять на что нужно заменить "PB .1"? Это кстати фишка только CV и вообще говоря писать так не совсем верно, потому что код не портабельный получается. Кроме того в CV есть хеадер в котором прописаны все эти макросы типа PB .1, можно посмотреть там на что они заменяются. Правильней как раз было бы через сдвиг.

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

Добавлено: Пн сен 01, 2014 14:36:00
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: Ну и, разумеется, перед использованием порт надо настроить.

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

Добавлено: Ср сен 03, 2014 19:13:30
kalobyte
у меня на сцайте есть как раз под этот регистр код

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

Добавлено: Чт сен 04, 2014 18:47:44
nicolasomsk
Ребят, всем спасибо за ответы. Разобрался.

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

Добавлено: Пн сен 08, 2014 22:40:49
Кефир

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

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;
}