Страница 1 из 1
Фильтр I2C
Добавлено: Вс апр 14, 2013 07:50:59
kotriks
народ помогите сделать фильтр на запись в еепром. пишутся данные в бинарном формате лог 0 и 1 как как сделать чтобы проц их фильтровал и не писал если поступает на процессор больше десяти 11 или 00 чтобы их он игнорировал и писал только меньшее например приходят 0011 то он их пишет в память если же приходит 111111111 или 000000000 он игнарирует такие данные.
Re: Фильтр I2C
Добавлено: Вс апр 14, 2013 07:53:41
pyzhman
Задача изначально в чем состоит? Может проще есть метода.
А по идее - типа подавления дребезга, только с точностью до наоборот.
Re: Фильтр I2C
Добавлено: Вс апр 14, 2013 08:22:36
kotriks
в том то и заключается что процесоор обрабатывая данные заносит логи в память но есть внешние помехи которые он не должен обработать и записать. вот функция поглядите может глядя на неё будет яснее.
Код: Выделить всё
#define BIT 1
void writeBit(unsigned char c1){
if (page_stop_status==1) {
i2c_start();
i2c_write(0xa0);
i2c_write(addr>>8);
i2c_write(addr & 0x00FF);
page_stop_status=0; }
i2c_write(c1);
addr++;
pageSize++;
if (pageSize==128) {
pageSize=0;
i2c_stop();
}
}
void ReadBytes(){
unsigned char bitCnt,cnt;
unsigned int tmpBuf;
for(cnt=0;cnt<88;cnt++){
if(cnt==44){
writeBit('B');
writeBit('I');
writeBit('T');
}
tmpBuf=0;
for(bitCnt=0;bitCnt<16;bitCnt++) {
delay_us(3);
tmpBuf<<=1;
if(!(PINB & (1<<BIT))) tmpBuf|=1;
}
if(tmpBuf!=0) {
writeBit(tmpBuf>>8);
writeBit(tmpBuf);
}
}
return;
}
}
}
Re: Фильтр I2C
Добавлено: Пн апр 15, 2013 13:30:44
kotriks
ребят не уж то не выполнимая задача? помогите кто может.
Re: Фильтр I2C
Добавлено: Пн апр 15, 2013 15:07:39
ibiza11
заведите переменную (А) хранящую последние несколько значений битов.
при вызове функции записи запоминайте записываемый бит в старшем бите переменной (А) и сдвигайте переменную (А) на один бит вправо, уничтожая при этом самый "старый" бит.
после этого сравниваете переменную (А) с (0) и с (~0) и в зависимости от результата либо записываете в i2c бит, либо не записываете, при этом отодвигая адрес записи назад на кол-во бит в переменной (А) (но это делать только один раз, в момент, когда определили, что данные начинают тупо повторяться).
Надеюсь понятно объяснил.
Если вдруг последовательность битов опять будет содержать актуальную информацию, то и переменная A будет отлична и от (0) и от (~0). Соответственно запись в этом случае восстановится.
Если, что не понятно - спрашивайте.
Re: Фильтр I2C
Добавлено: Пн апр 15, 2013 19:00:43
kotriks
частично понятно но кодер из меня увы для сложных задач, на примере хотелось бы увидеть чтобы догнать что к чему.
Re: Фильтр I2C
Добавлено: Пн апр 15, 2013 20:33:24
ibiza11
пример:
Код: Выделить всё
void SetWriteAddr(uint32_t); /* установка адреса записи */
uint32_t GetWriteAddr(void); /* получение адреса записи */
#define CUT_OFF_LEVEL_BITS 20
#define CUT_OFF_MASK ((1 << CUT_OFF_LEVEL_BITS) - 1)
#define ACTIVE_BIT 0 /* номер записываемого бита в байте */
void write_eeprom_i2c(uint8_t bit)
{
static uint32_t Accum = 0xAAAAAAAA;
static uint8_t CutOff_f; /* флаг режима отсечки ненужных битов */
static uint8_t AddrChange_f; /* флаг изменения адреса записи */
Accum >>= 1;
if (bit & (1 << ACTIVE_BIT))
Accum |= (1 << (CUT_OFF_LEVEL_BITS-1));
else
Accum &= ~(1 << (CUT_OFF_LEVEL_BITS-1));
switch (Accum & CUT_OFF_MASK) {
case 0:
case CUT_OFF_MASK:
CutOff_f = 1;
if (!AddrChange_f) {
AddrChange = 1;
SetWriteAddr(GetWriteAddr()-CUT_OFF_LEVEL_BITS);
}
break;
default:
CutOff_f = 0;
AddrChange = 0;
break;
}
if (!CutOff_f)
writeBit(bit);
}