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