Фильтр I2C
Фильтр I2C
народ помогите сделать фильтр на запись в еепром. пишутся данные в бинарном формате лог 0 и 1 как как сделать чтобы проц их фильтровал и не писал если поступает на процессор больше десяти 11 или 00 чтобы их он игнорировал и писал только меньшее например приходят 0011 то он их пишет в память если же приходит 111111111 или 000000000 он игнарирует такие данные.
- Реклама
- pyzhman
- Друг Кота
- Сообщения: 7016
- Зарегистрирован: Вс июл 12, 2009 19:15:29
- Откуда: Ижевск
- Контактная информация:
Re: Фильтр I2C
Задача изначально в чем состоит? Может проще есть метода.
А по идее - типа подавления дребезга, только с точностью до наоборот.
А по идее - типа подавления дребезга, только с точностью до наоборот.
Docendo discimus
Re: Фильтр I2C
в том то и заключается что процесоор обрабатывая данные заносит логи в память но есть внешние помехи которые он не должен обработать и записать. вот функция поглядите может глядя на неё будет яснее.
Код: Выделить всё
#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
ребят не уж то не выполнимая задача? помогите кто может.
- ibiza11
- Поставщик валерьянки для Кота
- Сообщения: 1900
- Зарегистрирован: Сб фев 21, 2009 13:11:40
- Откуда: Москва
Re: Фильтр I2C
заведите переменную (А) хранящую последние несколько значений битов.
при вызове функции записи запоминайте записываемый бит в старшем бите переменной (А) и сдвигайте переменную (А) на один бит вправо, уничтожая при этом самый "старый" бит.
после этого сравниваете переменную (А) с (0) и с (~0) и в зависимости от результата либо записываете в i2c бит, либо не записываете, при этом отодвигая адрес записи назад на кол-во бит в переменной (А) (но это делать только один раз, в момент, когда определили, что данные начинают тупо повторяться).
Надеюсь понятно объяснил.
Если вдруг последовательность битов опять будет содержать актуальную информацию, то и переменная A будет отлична и от (0) и от (~0). Соответственно запись в этом случае восстановится.
Если, что не понятно - спрашивайте.
при вызове функции записи запоминайте записываемый бит в старшем бите переменной (А) и сдвигайте переменную (А) на один бит вправо, уничтожая при этом самый "старый" бит.
после этого сравниваете переменную (А) с (0) и с (~0) и в зависимости от результата либо записываете в i2c бит, либо не записываете, при этом отодвигая адрес записи назад на кол-во бит в переменной (А) (но это делать только один раз, в момент, когда определили, что данные начинают тупо повторяться).
Надеюсь понятно объяснил.
Если вдруг последовательность битов опять будет содержать актуальную информацию, то и переменная A будет отлична и от (0) и от (~0). Соответственно запись в этом случае восстановится.
Если, что не понятно - спрашивайте.
Ставим плюсы: )
- Реклама
Re: Фильтр I2C
частично понятно но кодер из меня увы для сложных задач, на примере хотелось бы увидеть чтобы догнать что к чему.
- ibiza11
- Поставщик валерьянки для Кота
- Сообщения: 1900
- Зарегистрирован: Сб фев 21, 2009 13:11:40
- Откуда: Москва
Re: Фильтр I2C
пример:
Код: Выделить всё
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);
} Ставим плюсы: )


