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

 
 
> Не срабатывает 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



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

 


RSS Текстовая версия Сейчас: 19th July 2025 - 23:47
Рейтинг@Mail.ru


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