реклама на сайте
подробности

 
 
> Не срабатывает INT2, не пойму в чем дело
Vasily Hohlov
сообщение Sep 26 2008, 16:42
Сообщение #1





Группа: Участник
Сообщений: 8
Регистрация: 26-09-08
Пользователь №: 40 508



Привет всем!
пишу обработчик клавиатуры для 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;
                }


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

что может быть такого, из-за чего пропускается первый спадающий фронт?

Сообщение отредактировал Vasily Hohlov - Sep 26 2008, 16:48
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Vasily Hohlov
сообщение Sep 27 2008, 12:27
Сообщение #2





Группа: Участник
Сообщений: 8
Регистрация: 26-09-08
Пользователь №: 40 508



_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

эта ширина зависит от частоты мк?

Сообщение отредактировал Vasily Hohlov - Sep 27 2008, 12:32
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd August 2025 - 10:26
Рейтинг@Mail.ru


Страница сгенерированна за 0.01365 секунд с 7
ELECTRONIX ©2004-2016