Страница 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);
}