我做的一个编码器调速实现,直接用PIO接收编码器的脉冲信号,但是为什么 if(((IORD_ALTERA_AVALON_PIO_DATA(PIO_0_BASE))&yi)==1) {i+=1;}这句只要把编码器接上就开始计数了呢,而且改为 if(((IORD_ALTERA_AVALON_PIO_DATA(PIO_0_BASE))&yi)==0) {i+=1;}仍然执行这句,太奇怪了,望大家指点。 #include "system.h" #include "altera_avalon_pio_regs.h" #include "alt_types.h" #include "priv/alt_busy_sleep.h" #include "sys/alt_irq.h" #include <stdio.h> #include <io.h> #include "sys/alt_alarm.h" #include "timer_struct.h" #include "sys/alt_timestamp.h" #define alt_cpu_freq 50000000 np_timer *na_timer=SYS_CLK_TIMER_BASE; volatile alt_u32 done=0; volatile int edge_capture; int i=0,j=0,k=0; int en; #define yi (1<<0) #define er (1<<1) #define san (1<<2) static void myfire_interrupts(void* context,alt_u32 id) { volatile int* edge_capture_ptr=(volatile int*) context; *edge_capture_ptr=IORD_ALTERA_AVALON_PIO_EDGE_CAP(PIO_0_BASE); if(((IORD_ALTERA_AVALON_PIO_DATA(PIO_0_BASE))&yi)==1) {i+=1;} IOWR_ALTERA_AVALON_PIO_EDGE_CAP(PIO_0_BASE, 0x00); } void InitPIO(void) { void* edge_capture_ptr=(void *)&edge_capture; //IOWR_ALTERA_AVALON_PIO_DIRECTION(PIO_0_BASE, 0x00); IOWR_ALTERA_AVALON_PIO_EDGE_CAP(PIO_0_BASE, 0x00); IOWR_ALTERA_AVALON_PIO_IRQ_MASK(PIO_0_BASE, 0x07); alt_irq_register(PIO_0_IRQ,edge_capture_ptr,myfire_interrupts); } /*void InitPIO(void) { IOWR(PIO_0_BASE,0,0); IOWR_ALTERA_AVALON_PIO_EDGE_CAP(PIO_0_BASE, 0x00); IOWR_ALTERA_AVALON_PIO_IRQ_MASK(PIO_0_BASE, 0x0); IOWR_ALTERA_AVALON_PIO_DATA(PIO_0_BASE,0x07); } */ int main() { na_timer->np_timerperiodl=(short)(alt_cpu_freq&0x0000ffff); na_timer->np_timerperiodh=(short)((alt_cpu_freq>>16)&0x0000ffff); na_timer->np_timercontrol=np_timercontrol_start_mask+np_timercontrol_cont_mask; int write1,write2,write3; InitPIO(); printf("successful!\n"); while(1) { if(na_timer->np_timerstatus&np_timerstatus_to_mask) { printf("%8d%8d%8d\n",i,j,k); na_timer->np_timerstatus=0; } } return 0; }
|