Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Не срабатывает INT2
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
Vasily Hohlov
Привет всем!
пишу обработчик клавиатуры для Atmega16

никак не могу понять в чем дело, когда посылаю данные на клавиатуру
делаю так
Код
//включаем прерывание INT2 (GICR) по спаду фронта (MCUCSR)
    MCUCSR &= 0b10111111;
    GICR|= (1<<5);

.....
.....
//disable INT2
        GICR&=0b11011111;
    
    PORTB |= 0b101;
    DDRB |= 0b101;
// make CLOCK  LOW    
    PORTB&=0b11111011;
    _delay_us(64);

//   make KB_data LOW
    PORTB&=0b11111010;

    keyb_char0=data;
    status=1;

// release CLOCK line set HIGH
    PORTB |=0b00000100;
    DDRB &= 0b11111011;

// enable INT2
    GIFR|=(1<<5);
    GICR|=(1<<5);


далее идет посылка битов по синхроимпульсу CLOCK, прерывание вызывается по спадающему фронту

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

если делаю не по прерыванию , а вот так
Код
edge=0;
while (bitcounter0<11)
{    
    i=PINB;
    i>>=2;
    i&=1;    
    if (i) {
            edge=0;
            if (bitcounter0==10) DDRB &= 0b11111110;
            }
    else
        if (!(edge))
          {          
               if     ((bitcounter0<8) )
                {
                 if ( (keyb_char0>>bitcounter0)&1 )  { PORTB|=1; par_bit^=1; }
                    else                 PORTB&=0b11111110;
                }


то всё посылается нормально.

что может быть такого, из-за чего пропускается первый спадающий фронт?
_Pasha
Цитата(Vasily Hohlov @ Sep 26 2008, 19:42) *
что может быть такого, из-за чего пропускается первый спадающий фронт?

Насколько я увидел, Вы то и дело настраиваете на вывод линию порта, по которой осуществляется ввод. Так можно еще и что-то нагнуть походу.
Ruslan Konovalov
Не пробовали подсмотреть у Atmel AVR313 ?
Может поможет Вам.
Нажмите для просмотра прикрепленного файла
Vasily Hohlov
_Pasha, по этой линии идет ввод-вывод, почему что-то тут может нагнуться?

Ruslan Konovalov, спасибо, но к сожалению там только приём данных с клавиатуры, а у меня запарка была с посылкой на неё.


поднял частоту с 1Мгц до 8Мгц, всё заработало как следует....

Pulses on INT2 wider than the minimum pulse width given in Table 36 will generate an interrupt.
Shorter pulses are not guaranteed to generate an interrupt.


Minimum pulse width for asynchronous external interrupt 50ns

эта ширина зависит от частоты мк?
_Pasha
Цитата(Vasily Hohlov @ Sep 27 2008, 16:27) *
поднял частоту с 1Мгц до 8Мгц, всё заработало как следует....
эта ширина зависит от частоты мк?

Ширина не зависит, зато время реакции на прерывание получалось большое.
Листинг выложите - там все видно будет.
Кстати, в который раз возникает стратегическая ошибка: GIFR |= 1<<INTF2 нельзя, надо GIFR = 1<<INTF2, чтобы не сбрасывать ненароком все остальные флаги.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.