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

Неясности с работой порта

Использую МК ATtiny25. Частота работы 16 МГц. С порта PB3 вывожу импульс, который должен придти на порт PB2 этого же МК. Если разрешаю прерывание по входу INT0(PB2), то сигнал искажается (уменьшается частота). Можно ли как-нибудь предотвратить такое искажение?

 

iint main(void){

    PORTB = 0xFC;//set default value of pins
        DDRB = 0xEB;//set direction of pins

//    GIMSK = 0x40;//external pin interrupt is enabled
    MCUCR = 0x02;//interrupt by falling edge
    sei();

    while(1){
        flag = 0;
        if (!flag){
            PORTB ^= 0x08;
            PORTB ^= 0x08;
        };
    };
};

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Использую МК ATtiny25. Частота работы 16 МГц. С порта PB3 вывожу импульс, который должен придти на порт PB2 этого же МК. Если разрешаю прерывание по входу INT0(PB2), то сигнал искажается (уменьшается частота). Можно ли как-нибудь предотвратить такое искажение?

 

Частота уменьшается скорее всего за счёт входа в обработчик внешнего прерывания (если он есть). Даже если нет и если стоит инструкция RETI то всёравно будет тратится время на прыжок на вектор прерывания и выход по RETI.

 

А что вы в принципе хотите получить? Зачем нужна такая странная конструкция - вызов внешнего прерывания через дёргание своей-же ножки контроллера?

 

p.s. по поводу как получить стабильный период - если вам нужен очень маленький период то врятли чтото получится, а при периоде от нескольких десятков мкс можно заставить дёргаться ножку по прерыванию от таймера.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А что вы в принципе хотите получить? Зачем нужна такая странная конструкция - вызов внешнего прерывания через дёргание своей-же ножки контроллера?

 

Собираюсь составить цепь из нескольких МК. Количество МК в цепи может менятьсь от 1 до 4. Соответственно, если имеем 2 и более МК, то вывод PB3 приходит на PB2 следующего МК, а если в цепи 1 МК, то на PB2 этого же. Как я подозреваю, если я выведу PB3 с одного МК на PB2 другого, то частота все равно уменьшится.

Обработчик прерывания не описывается. Добавление строки GIMSK = 0x40; вносит искажение в сигнал.

Изменено пользователем vv_gulyaev

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ничего удивительного, вы же формируете сигнал программно, а программа перешла на обработку прерывания. Попробуйте формировать импульсы аппаратно, например, с помощью пина OC1А.

 

Кстати, для тайни25 изменять состояние пина можно одной командой PINB=0x08.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Собираюсь составить цепь из нескольких МК. Количество МК в цепи может менятьсь от 1 до 4. Соответственно, если имеем 2 и более МК, то вывод PB3 приходит на PB2 следующего МК, а если в цепи 1 МК, то на PB2 этого же. Как я подозреваю, если я выведу PB3 с одного МК на PB2 другого, то частота все равно уменьшится.

 

Уменьшится только если вы закоротите ножки одного МК (постоянно) или если с другого МК будут приходить импульсы на вход внешенго прерывания (будет запаздывание на время обработки внешнего прерывания).

 

Вы так и не объяснили что вы хотите получить - если нужна генерация импульса с постоянным периодом поовторения то есть другие способы это сделать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вы так и не объяснили что вы хотите получить - если нужна генерация импульса с постоянным периодом поовторения то есть другие способы это сделать.

Есть цепочка из МК. Один МК сделал какие-то действия и должен подать короткий сигнал второму. Я думал сделать это так: вывести импульс с PB3 одного на PB2 другого и по прерыванию обработать его. При отладке использовал один МК, т.е. заводил импульс на тот же самый МК. Хотелось бы чтобы этот импульс был как можно короче, но при разрешении прерывания (GIMSK = 0x40) этот импульс затягивается. При этом я еще никак не описывал процедуру обработки прерывания, только разрешил его.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Есть цепочка из МК. Один МК сделал какие-то действия и должен подать короткий сигнал второму. Я думал сделать это так: вывести импульс с PB3 одного на PB2 другого и по прерыванию обработать его. При отладке использовал один МК, т.е. заводил импульс на тот же самый МК. Хотелось бы чтобы этот импульс был как можно короче, но при разрешении прерывания (GIMSK = 0x40) этот импульс затягивается. При этом я еще никак не описывал процедуру обработки прерывания, только разрешил его.

 

А вы планируете подтверждать приём сигнала завершения действия? Если МК будут расположен на одной плате то ваш вариант может в принципе пройти. Но если будут сильные помехи которые смогут создать на входах короткие импульсы но достаточные для срабатывания прерывания - как в этом случае будете поступать? Для вашего варианта нужно былобы или удлинить импульс чтобы после входа в обработчик прерывания второй МК по состоянию пина определил что это сигнал от МК а не помеха. Или построить систему на основе банального опроса входа с алгоритмом фильтрации помех (аналог антидребезга). Каково время реакции на изменение состояния входа?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если МК будут расположен на одной плате то ваш вариант может в принципе пройти. Но если будут сильные помехи которые смогут создать на входах короткие импульсы но достаточные для срабатывания прерывания - как в этом случае будете поступать? Для вашего варианта нужно былобы или удлинить импульс чтобы после входа в обработчик прерывания второй МК по состоянию пина определил что это сигнал от МК а не помеха. Или построить систему на основе банального опроса входа с алгоритмом фильтрации помех (аналог антидребезга).

МК будут расположены на одной плате, так что о помехах пока особо не задумывался, но все же потребуется как-то их убирать.

 

Каково время реакции на изменение состояния входа?

Я пока никак не обрабатывал изменение состояния входа, поэтому ничего не могу сказать о времени.

Изменено пользователем vv_gulyaev

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я пока никак не обрабатывал изменение состояния входа, поэтому ничего не могу сказать о времени.

Вопрос был насколько быстро второй МК доложен реагировать на сигнал от первого.

 

При необходимости очень быстрой реакции думаю следует установить вывод на первом МК и подождать некоторое время (зависит от времени вхождения в обработчик внешнего прерывания второго МК). А во втором МК в обработчике прерывания проверить что это сигнал от первого МК а не помеха путём опроса состояния входа.

 

Если время реакции не критично то можно во втором МК по таймеру например раз в 500 мкс опрашивать состояние входа с фильтрацией. Если в течение определённого времени состояние остаётся стабильным то считать что это сигнал от первого МК.

 

А не хотите объединить ножки SPI-интерфейса? В принципе даже командами/статусами можно будет обмениваться и тоже будет занято 2 ножки МК.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вопрос был насколько быстро второй МК доложен реагировать на сигнал от первого.

Второй МК должен реагировать как можно быстрей.

 

А не хотите объединить ножки SPI-интерфейса? В принципе даже командами/статусами можно будет обмениваться и тоже будет занято 2 ножки МК.

 

Сейчас занято по 1 ноге на каждом МК (PB3 на первом и PB2 на втором).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...