74HC165, SPI...

sirik
Offline
Зарегистрирован: 10.11.2012

 

Добрый день

Появилась необходимость считать дискретную информацию с 132 датчиков (простые фотодиоды). Понятно, что выходов у той же Mega не хватит для этого. Думаю, что для моей цели подойдут 74HC165 через аппатный SPI.

Но так как с SPI ни разу не работал, появились вопросы:

1. какую частоту выбрать на интерфейсе SPI, если датчики надо опрашивать 8 раз в секунду?

2. какой тип данных использовать? подойдут ли 17 переменных типа байт? и как потом с ними работать на уровне битов? т.е. мне надо будет сравнивать предыдущие состояние и теперешнее.

Спасибо

 

 

sirik
Offline
Зарегистрирован: 10.11.2012

 

На счет частоты опроса датчиков, я написал примерную частоту, в идеале будет реализовано не прерывании (импульс с еще одного датчика)

Datak
Offline
Зарегистрирован: 09.10.2014

1. 132_датчика x 8_развсекунду x 1_бит = 1056Гц (минимум). То есть, хватит с большим запасом - частота SPI обычно во много раз выше.

2. Да, конечно, любой целочисленный тип подойдёт. SPI контроллер работает с байтами, и сама atmega тоже, поэтому выбирать более "длинный" тип смысла нет. Пусть будут байты. И скорее всего, именно двумя массивами - для предыдущего состояния, и для нового. А работать как обычно - битовыми операциями. Можно, для удобства, написать функцию для обращения к определёному биту.

sirik
Offline
Зарегистрирован: 10.11.2012

Получается, что лучше использовать для каждого регистра перемененную 1 байт? И как я смогу обратится к определенную биту?

Datak
Offline
Зарегистрирован: 09.10.2014

Как-нибудь так, например:



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

 

sirik
Offline
Зарегистрирован: 10.11.2012

Спасибо огромное! Буду пробовать

sirik
Offline
Зарегистрирован: 10.11.2012

Подскажите по коду, если мне надо приняться с 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);        
}