Фильтр I2C

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить
kotriks
Грызет канифоль
Сообщения: 274
Зарегистрирован: Чт апр 28, 2011 15:08:58

Фильтр I2C

Сообщение kotriks »

народ помогите сделать фильтр на запись в еепром. пишутся данные в бинарном формате лог 0 и 1 как как сделать чтобы проц их фильтровал и не писал если поступает на процессор больше десяти 11 или 00 чтобы их он игнорировал и писал только меньшее например приходят 0011 то он их пишет в память если же приходит 111111111 или 000000000 он игнарирует такие данные.
Реклама
Аватара пользователя
pyzhman
Друг Кота
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск
Контактная информация:

Re: Фильтр I2C

Сообщение pyzhman »

Задача изначально в чем состоит? Может проще есть метода.
А по идее - типа подавления дребезга, только с точностью до наоборот.
Docendo discimus
Реклама
kotriks
Грызет канифоль
Сообщения: 274
Зарегистрирован: Чт апр 28, 2011 15:08:58

Re: Фильтр I2C

Сообщение 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;
}
 }   
} 

kotriks
Грызет канифоль
Сообщения: 274
Зарегистрирован: Чт апр 28, 2011 15:08:58

Re: Фильтр I2C

Сообщение kotriks »

ребят не уж то не выполнимая задача? помогите кто может.
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
ibiza11
Поставщик валерьянки для Кота
Сообщения: 1900
Зарегистрирован: Сб фев 21, 2009 13:11:40
Откуда: Москва

Re: Фильтр I2C

Сообщение ibiza11 »

заведите переменную (А) хранящую последние несколько значений битов.
при вызове функции записи запоминайте записываемый бит в старшем бите переменной (А) и сдвигайте переменную (А) на один бит вправо, уничтожая при этом самый "старый" бит.
после этого сравниваете переменную (А) с (0) и с (~0) и в зависимости от результата либо записываете в i2c бит, либо не записываете, при этом отодвигая адрес записи назад на кол-во бит в переменной (А) (но это делать только один раз, в момент, когда определили, что данные начинают тупо повторяться).
Надеюсь понятно объяснил.
Если вдруг последовательность битов опять будет содержать актуальную информацию, то и переменная A будет отлична и от (0) и от (~0). Соответственно запись в этом случае восстановится.
Если, что не понятно - спрашивайте.
Ставим плюсы: )
Реклама
kotriks
Грызет канифоль
Сообщения: 274
Зарегистрирован: Чт апр 28, 2011 15:08:58

Re: Фильтр I2C

Сообщение kotriks »

частично понятно но кодер из меня увы для сложных задач, на примере хотелось бы увидеть чтобы догнать что к чему.
Реклама
Аватара пользователя
ibiza11
Поставщик валерьянки для Кота
Сообщения: 1900
Зарегистрирован: Сб фев 21, 2009 13:11:40
Откуда: Москва

Re: Фильтр I2C

Сообщение 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);
} 
Ставим плюсы: )
Ответить

Вернуться в «Разные вопросы по МК»