Перейти к содержанию
    

vladsizov

Участник
  • Постов

    4
  • Зарегистрирован

  • Посещение

Репутация

0 Обычный

Контакты

  • ICQ
    Array
  1. Возьми быстродействующий тригер Шмидта серии 74HC - это раз. Включи в конфигурации ICP распознавание по 3 семплам (Noise Canceller) - это два. Грамотно было бы еще после прихода ICP блокировать его следующий приход на время, задаваемое из расчета минимального времени между изменениями входного сигнала. В сумме все эти методы должны помочь. PS И не забывай о конденсаторах по питанию. Пин включен на вход и подтянут к питанию ,я не понял почему по 3 сэмплам а не по 4 , а если блокировать ICP то надо точно знать что пришедший фронт не ложный иначе могу пропустить истинный фронт
  2. CAPTURE ЗАТЯНУТОГО ФРОНТА

    Дайте совет. Измеряю длительность интервалов принимемых на вход ICP в прерывании ICP по фронту и срезу сигнала. Интервалы тактируются ЧАСТОТОЙ 18кгц и принимаются через 561лн2 на вход ICP .У ATMEGA КВАРЦ 10МГЦ. Где-то 2 - 3 раза на 100 принимаемых пакетов неправильно входит прерывание ICP так как сразу после входа в прерывание по фронту ICP проверяю состояние пина ICP и он в нуле . Помех в линии нет ,подозрение на генерацию на затянутых фронтах на связке atmega - 561лн2 , тригеры шмидта не помогли .Помогите устранить эти ошибки
  3. Нет, там написано именно то, что хотели, просто так хотели (неподумавши). Там циклический буфер размеорм 1/2/4/8К, "указатели" IP - 32-битные, но в буфере может не более его размера, поэтому для размера (в другом месте - для свободного места в буфере) достаточно 16-битной переменной. Для количества принятых данных вычитать всегда надо из указателя головы указатель хвоста и всё. <{POST_SNAPBACK}> Если циклический буфер, то так писать можно при условии, что размер буфера равен макс. числу в перенной size (65536 для 16bit int). Иначе надо писать size = (wr_ptr - rd_ptr) % BUFFER_SIZE; без всяких if. Или, для оригинального варианта, следует заменить 0 на BUFFER_SIZE: uint size; ulong wr_ptr,rd_ptr; if(wr_ptr >= rd_ptr) size = wr_ptr - rd_ptr; else size = BUFFER_SIZE - rd_ptr + wr_ptr; консенсус? :cheers: <{POST_SNAPBACK}> Может быть тогда не uint size; ulong wr_ptr,rd_ptr; if(wr_ptr >= rd_ptr) size = wr_ptr - rd_ptr; else size = BUFFER_SIZE - rd_ptr + wr_ptr; а uint size; ulong wr_ptr,rd_ptr; if(wr_ptr >= rd_ptr) size = wr_ptr - rd_ptr; else size = (0xFFFF + 1 ) - rd_ptr + wr_ptr; для понятности
  4. Компилятор WINAVR процессор AVR пример взят из firmware WIZNET uint size; ulong wr_ptr,rd_ptr ; if(wr_ptr >= rd_ptr) size = wr_ptr - rd_ptr ; else size = 0 - rd_ptr + wr_ptr ; чем отличаются выражения для size и какова последовательность неявных приведений для этого компилятора ?
×
×
  • Создать...