поможите пожалуйста. ничего не понимаю. вместо прямоугольников подал на вход capture unit замечательную синусоиду и все сдохло...
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено ,,,, 05 августа 2003 г. 21:36

Микроконтроллеров в схеме пока нет, но они планируются после пробных распаек!!

По каждому фронту генерятся прерывания. Если прямоуголиники- все ок. Если синусоида > 100Hz- все ок.
Если синусоида 1...10Hz - прерывания генерятся, но обработчик не дергает мою программу? После оптронов синусоида -> идеальная трапеция. Что за x1234ня?

extern volatile pid_t pci_proxy;
extern volatile pid_t tm_proxy;
extern int pci_irqid;
extern int tm_irqid;

volatile unsigned long altera_iobase;
volatile unsigned long rspeed[4];
volatile unsigned long tm_reload;
volatile unsigned char cc_flags[4];

extern unsigned long r_tm; // registration time
extern volatile int irq_counter;

/
/*==============================================*/
pid_t __far irq_handler(void)
{int adr, creg_adr, i;
unsigned long v;
unsigned char lsr, iir, nothing;
static unsigned long tm_val[4]={TMVAL_MAX, TMVAL_MAX, TMVAL_MAX, TMVAL_MAX};
static unsigned char otm_irq[4]={1, 1, 1, 1};

disable();
cc_flags[0]= cc_flags[1]=cc_flags[2]= cc_flags[3]=0;

for(nothing=0; !nothing;)
{for(i=0, nothing =1, adr= altera_iobase; i < 4 ; i++, adr+=0x08)
{creg_adr=adr + 0x04;
if( (iir= inp(creg_adr)) & IRQ_EXIST)
{outp (creg_adr, 0x18);
outp (creg_adr, 0x3b);
cc_flags[i]|=iir;
nothing= 0;
v= inpd(adr);
if(iir & CAPTURE_IRQ)
{lsr= inp(altera_iobase +0x20) & 0x0f;
if(v < tm_val[i])
{if(lsr & (0x01 << i) )
{if(!otm_irq[i])
{rspeed[i]= TMVAL_MAX - v;
cc_flags[i]&=CAPTURE_IRQ;
}
otm_irq[i]=0;
}
continue;
}
}
if(iir & TIMER_IRQ)
{rspeed[i]= 0x7fffffff;
outp (creg_adr, 0x00);
outpd(adr , TMVAL_MAX);
outp (creg_adr, 0x18);
outp (creg_adr, 0x3b);
otm_irq[i]=1;
}
}
}
}
enable();
irq_counter++;
return pci_proxy;
}

main()
{
for(; 1; )
{pid= Receive(0,NULL,0);
if(pid == pci_proxy)
{irq_counter--;
}
..............
printf("abs>%d\n", irq_counter);fflush(stdout); // эта хрень при глюке начинеет расти, при прямоугольнике ==0
.............
}


Составить ответ  |||  Конференция  |||  Архив

Ответы



Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание  |||  Без кадра

E-mail: info@telesys.ru