74HC165, SPI...
- Войдите на сайт для отправки комментариев
Пт, 13/02/2015 - 11:25
Добрый день
Появилась необходимость считать дискретную информацию с 132 датчиков (простые фотодиоды). Понятно, что выходов у той же Mega не хватит для этого. Думаю, что для моей цели подойдут 74HC165 через аппатный SPI.
Но так как с SPI ни разу не работал, появились вопросы:
1. какую частоту выбрать на интерфейсе SPI, если датчики надо опрашивать 8 раз в секунду?
2. какой тип данных использовать? подойдут ли 17 переменных типа байт? и как потом с ними работать на уровне битов? т.е. мне надо будет сравнивать предыдущие состояние и теперешнее.
Спасибо
На счет частоты опроса датчиков, я написал примерную частоту, в идеале будет реализовано не прерывании (импульс с еще одного датчика)
1. 132_датчика x 8_развсекунду x 1_бит = 1056Гц (минимум). То есть, хватит с большим запасом - частота SPI обычно во много раз выше.
2. Да, конечно, любой целочисленный тип подойдёт. SPI контроллер работает с байтами, и сама atmega тоже, поэтому выбирать более "длинный" тип смысла нет. Пусть будут байты. И скорее всего, именно двумя массивами - для предыдущего состояния, и для нового. А работать как обычно - битовыми операциями. Можно, для удобства, написать функцию для обращения к определёному биту.
Получается, что лучше использовать для каждого регистра перемененную 1 байт? И как я смогу обратится к определенную биту?
Как-нибудь так, например:
byte Data[17]; byte DataBit( int BitNumber ) { return 1 & ( Data[ BitNumber / 8 ] >> ( BitNumber % 8 ) ); } ..... ..... Serial.print( DataBit( 0 ) ); Serial.print( DataBit( 5 ) ); Serial.print( DataBit( 125 ) );Спасибо огромное! Буду пробовать
Подскажите по коду, если мне надо приняться с SPI допустим 3 массива типа byte, так будет работать:
#include <SPI.h> int REG_LATCH = 8 ; byte Data[17]; void setup(){ Serial.begin(9600); SPI.begin(); /* Включаем защёлку */ pinMode(REG_LATCH, OUTPUT); digitalWrite(REG_LATCH, HIGH); } void loop(){ digitalWrite(REG_LATCH, LOW); digitalWrite(REG_LATCH, HIGH); Data[0] = SPI.transfer(0); Data[1] = SPI.transfer(0); Data[2] = SPI.transfer(0); }