Total Привет!
Коты, помогите, пожалуйста. Нужно отправить на светодиодную матрицу данные через сдвиговый регистр 74hc595. Всё бы ничего и с аппаратной реализацией проблем не возникает, но есть желание использовать микроконтроллер Attiny13, а у него как известно аппаратной поддержки SPI нет.
Сам процесс вывода мне более чем понятен, но в дебрях Си я пока что не особо комфортно себя чувствую.
Если есть бескорыстные коты, помогите реализовать (Atmel Studio) следующую логику:
PB0-MOSI (последовательный вывод данных)
PB2-SCK (тактовые импульсы)
PB1- Строб (защёлка)
Выводить нужно просто 8 бит данных (байтовая переменная).
Ищу примеры два дня, но всё не то. То для CVAVR где всякие "PB .1" которые студия не понимает, то замудрено на все случаи жизни и по коду-конь и разобраться без бутылки никак, то на Асме вообще.
Попытался сделать "в лоб" ногодрыгом))) выводил просто константу, всё работает, а как передавать бит переменной, а потом её сдвигать я не понимаю.
Спасибо всем, кто прочитал до конца!
Tiny13 программный SPI 74hc595
- nicolasomsk
- Встал на лапы
- Сообщения: 148
- Зарегистрирован: Вс окт 23, 2011 13:27:09
- Откуда: Россия. Омск
- Контактная информация:
- Gisteresis
- Друг Кота
- Сообщения: 4732
- Зарегистрирован: Ср сен 18, 2013 10:08:26
- Откуда: Санкт-Петербург
Re: Tiny13 программный SPI 74hc595
А посмотреть примеры поставляемые с Atmel Studio, по аналогии понять на что нужно заменить "PB .1"? Это кстати фишка только CV и вообще говоря писать так не совсем верно, потому что код не портабельный получается. Кроме того в CV есть хеадер в котором прописаны все эти макросы типа PB .1, можно посмотреть там на что они заменяются. Правильней как раз было бы через сдвиг.
Re: Tiny13 программный SPI 74hc595
Последовательный вывод байта на ножку со вводом с другой ножки (программный SPI):
SWSPI_PORT, SWSPI_MOSI, SWSPI_MISO, SWSPI_SCLK задаете директивами #define по вкусу. Например,
Убрать ввод значения с MISO и дописать вывод строба - вам домашнее задание.
Ну и, разумеется, перед использованием порт надо настроить.
Код: Выделить всё
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 и дописать вывод строба - вам домашнее задание.
Разница между теорией и практикой на практике гораздо больше, чем в теории.
Re: Tiny13 программный SPI 74hc595
у меня на сцайте есть как раз под этот регистр код
тематические ответы только в форуме, в приват не пишите
- nicolasomsk
- Встал на лапы
- Сообщения: 148
- Зарегистрирован: Вс окт 23, 2011 13:27:09
- Откуда: Россия. Омск
- Контактная информация:
Re: Tiny13 программный SPI 74hc595
Ребят, всем спасибо за ответы. Разобрался.
- Кефир
- Встал на лапы
- Сообщения: 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;
}