Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Неясности с работой порта
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > MCS51, AVR, PIC, STM8, 8bit
vv_gulyaev
Использую МК 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;
        };
    };
};
mempfis_
Цитата(vv_gulyaev @ Oct 30 2009, 16:26) *
Использую МК ATtiny25. Частота работы 16 МГц. С порта PB3 вывожу импульс, который должен придти на порт PB2 этого же МК. Если разрешаю прерывание по входу INT0(PB2), то сигнал искажается (уменьшается частота). Можно ли как-нибудь предотвратить такое искажение?


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

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

p.s. по поводу как получить стабильный период - если вам нужен очень маленький период то врятли чтото получится, а при периоде от нескольких десятков мкс можно заставить дёргаться ножку по прерыванию от таймера.
vv_gulyaev
Цитата(mempfis_ @ Oct 30 2009, 15:43) *
А что вы в принципе хотите получить? Зачем нужна такая странная конструкция - вызов внешнего прерывания через дёргание своей-же ножки контроллера?


Собираюсь составить цепь из нескольких МК. Количество МК в цепи может менятьсь от 1 до 4. Соответственно, если имеем 2 и более МК, то вывод PB3 приходит на PB2 следующего МК, а если в цепи 1 МК, то на PB2 этого же. Как я подозреваю, если я выведу PB3 с одного МК на PB2 другого, то частота все равно уменьшится.
Обработчик прерывания не описывается. Добавление строки GIMSK = 0x40; вносит искажение в сигнал.
=GM=
Ничего удивительного, вы же формируете сигнал программно, а программа перешла на обработку прерывания. Попробуйте формировать импульсы аппаратно, например, с помощью пина OC1А.

Кстати, для тайни25 изменять состояние пина можно одной командой PINB=0x08.
mempfis_
Цитата(vv_gulyaev @ Oct 30 2009, 16:52) *
Собираюсь составить цепь из нескольких МК. Количество МК в цепи может менятьсь от 1 до 4. Соответственно, если имеем 2 и более МК, то вывод PB3 приходит на PB2 следующего МК, а если в цепи 1 МК, то на PB2 этого же. Как я подозреваю, если я выведу PB3 с одного МК на PB2 другого, то частота все равно уменьшится.


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

Вы так и не объяснили что вы хотите получить - если нужна генерация импульса с постоянным периодом поовторения то есть другие способы это сделать.
vv_gulyaev
Цитата(mempfis_ @ Oct 30 2009, 15:57) *
Вы так и не объяснили что вы хотите получить - если нужна генерация импульса с постоянным периодом поовторения то есть другие способы это сделать.

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


А вы планируете подтверждать приём сигнала завершения действия? Если МК будут расположен на одной плате то ваш вариант может в принципе пройти. Но если будут сильные помехи которые смогут создать на входах короткие импульсы но достаточные для срабатывания прерывания - как в этом случае будете поступать? Для вашего варианта нужно былобы или удлинить импульс чтобы после входа в обработчик прерывания второй МК по состоянию пина определил что это сигнал от МК а не помеха. Или построить систему на основе банального опроса входа с алгоритмом фильтрации помех (аналог антидребезга). Каково время реакции на изменение состояния входа?
vv_gulyaev
Цитата(mempfis_ @ Oct 30 2009, 17:36) *
Если МК будут расположен на одной плате то ваш вариант может в принципе пройти. Но если будут сильные помехи которые смогут создать на входах короткие импульсы но достаточные для срабатывания прерывания - как в этом случае будете поступать? Для вашего варианта нужно былобы или удлинить импульс чтобы после входа в обработчик прерывания второй МК по состоянию пина определил что это сигнал от МК а не помеха. Или построить систему на основе банального опроса входа с алгоритмом фильтрации помех (аналог антидребезга).

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

Цитата(mempfis_ @ Oct 30 2009, 17:36) *
Каково время реакции на изменение состояния входа?

Я пока никак не обрабатывал изменение состояния входа, поэтому ничего не могу сказать о времени.
mempfis_
Цитата(vv_gulyaev @ Oct 30 2009, 17:48) *
Я пока никак не обрабатывал изменение состояния входа, поэтому ничего не могу сказать о времени.

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

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

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

А не хотите объединить ножки SPI-интерфейса? В принципе даже командами/статусами можно будет обмениваться и тоже будет занято 2 ножки МК.
vv_gulyaev
Цитата(mempfis_ @ Oct 30 2009, 18:01) *
Вопрос был насколько быстро второй МК доложен реагировать на сигнал от первого.

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

Цитата(mempfis_ @ Oct 30 2009, 18:01) *
А не хотите объединить ножки SPI-интерфейса? В принципе даже командами/статусами можно будет обмениваться и тоже будет занято 2 ножки МК.


Сейчас занято по 1 ноге на каждом МК (PB3 на первом и PB2 на втором).
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.