注册 登录
查看: 1387|回复: 26

山外哥 PIT LPT 脉冲计数求助

[复制链接]
发表于 2013-6-2 00:08:06 | 显示全部楼层 |阅读模式
本帖最后由 darksnipers 于 2013-6-2 23:45 编辑

山外哥 在你的LPT脉冲计数中断实验的程序里面 
while(1)

   if(LPT_INT_count>0)
              {
                       count= LPTMR0_CNR;
                       lptmr count clean();
                       printf("LPT产生一次中断啦:%d\n",LPT_INT_count*INT_COUNT+count);
                       LPT_INT_count=0;
               }
}
山外哥 您的LPT_INT_count用来表示进入中断的次数 INT_COUNT是每100个脉冲进一次中断  您后面的注 里面说
LPTMR0_CNR  这个一般为0  为什么呢  那岂不是count 也是0
回复

使用道具 举报

发表于 2013-6-2 13:31:53 | 显示全部楼层
lptmr_counter_init(LPT0_ALT2,INT_COUNT,2,LPT_Rising);
                            //初始化脉冲计数器,用 LPT0_ALT2,即 PTC5输入
                            //每隔 INT_COUNT个脉冲产生中断,延时 2个时钟滤波,上升沿触发



1、  "//每隔 INT_COUNT个脉冲产生中断,延时 2个时钟滤波,上升沿触发”这句话,用pit定时产生中断,干嘛还用每隔 INT_COUNT个脉冲产生中断,
2、//printf("脉冲数:%d个\n",LPT_INT_count*INT_COUNT+count);,脉冲数是根据这样计算,原理是什么,我相信很多用山外的车友都有这样的疑惑。


假设你用lpt来累加脉冲。在一段时间内,中断 n 次,每次累加 C 就产生一次中断,然后重新计数,结束计数时, 计数到 L ,则在这段时间内 的计数为 n * C + L
回复 支持 反对

使用道具 举报

发表于 2013-6-2 13:44:24 | 显示全部楼层
希望标题改成其他有意义的,简单的求助标题,我们可能会进行删帖操作,谢谢支持
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-6-2 23:13:34 | 显示全部楼层
山外メ雲ジ 发表于 2013-6-2 13:44
希望标题改成其他有意义的,简单的求助标题,我们可能会进行删帖操作,谢谢支持

明白 山外哥 你的延时2个时钟的滤波  是意思是在发现上升沿之后两个时钟的滤波 才确定计数器加1  是这样吗
  假如脉冲频率很高 会不会丢掉计数  山外哥 用你的山外的摄像头  DMA采集程序  用不用关掉其他的中断 如果我想用PIT定时 LPT计数脉冲 PIT就得从程序执行就要开始 这似乎没办法关吧  
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-6-2 23:20:22 | 显示全部楼层
山外メ雲ジ 发表于 2013-6-2 13:31
lptmr_counter_init(LPT0_ALT2,INT_COUNT,2,LPT_Rising);
                            //初始化脉冲计数器 ...

山外哥 如果我在山外程序摄像头采集解压完成之后 立即读取LPt的计数值 把低功耗定时器比较寄存器 设成最大值  不用PIT中断 用每一幅图像采集的时间起定时作用  这样可以吗
回复 支持 反对

使用道具 举报

发表于 2013-6-3 08:27:01 | 显示全部楼层
darksnipers 发表于 2013-6-2 23:13
明白 山外哥 你的延时2个时钟的滤波  是意思是在发现上升沿之后两个时钟的滤波 才确定计数器加1  是这样吗  ...

设置滤波后,假如脉冲频率很高 会丢掉计数 ,所以你可以取消滤波,设置为0

pit 中断,可以在采集图像后才开启(开启前应该清中断标志位和清零寄存器),利用图像处理的这段时间来进行计数,中间 pit 产生中断,求得 脉冲

回复 支持 反对

使用道具 举报

发表于 2013-6-3 08:28:09 | 显示全部楼层
darksnipers 发表于 2013-6-2 23:20
山外哥 如果我在山外程序摄像头采集解压完成之后 立即读取LPt的计数值 把低功耗定时器比较寄存器 设成最大值 ...

可以这样来确定定时的作用,不过有个地方要注意的是:

改变频率后,会改变 运算时间 的!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-6-3 20:43:22 | 显示全部楼层
虚竹 发表于 2013-6-3 08:27
设置滤波后,假如脉冲频率很高 会丢掉计数 ,所以你可以取消滤波,设置为0

pit 中断,可以在采集图像后 ...

那是不是说如果我采集完图像再开PIT中断  我设置的时间必须比我的处理图像的时间要短?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-6-3 20:44:38 | 显示全部楼层
虚竹 发表于 2013-6-3 08:28
可以这样来确定定时的作用,不过有个地方要注意的是:

改变频率后,会改变 运算时间 的!

改变频率?这样做 会改变频率吗 ?求教
回复 支持 反对

使用道具 举报

发表于 2013-6-4 07:58:32 | 显示全部楼层
darksnipers 发表于 2013-6-3 20:44
改变频率?这样做 会改变频率吗 ?求教

不是,是假如你修改了频率,那图像处理的那段时间就不相同的了。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-6-4 16:27:58 | 显示全部楼层
山外メ雲ジ 发表于 2013-6-4 07:58
不是,是假如你修改了频率,那图像处理的那段时间就不相同的了。

山外哥 用的是你的50帧稳定版的 150M 图像处理部分应该不用修改频率吧  这样我是不是就不需要考虑了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-6-4 16:40:30 | 显示全部楼层
山外メ雲ジ 发表于 2013-6-4 07:58
不是,是假如你修改了频率,那图像处理的那段时间就不相同的了。

山外哥 我想等到图像解压完再打开PIT定时中断  在中断里面读取LPT的脉冲值 计数清零 清PIT中断 关闭PIT
这样写可以吗
       while(1)
      {
        ov7725_get_img();
        img_extract((u8 *)img_buff,(u8 *)img_bin_buff,2400);
        DisableInterrupts;
        pit_init_ms(PIT0,10);
        lptmr_counter_init(LPT0_ALT2 ,65530,0,LPT_Rising);
        EnableInterrupts;
        ...............
        ...............
}
PIT中断函数
void PIT0_IRQHandler(void)
{   extern  int count;
    count=LPTMR0_CNR;
    lptmr_counter_clean();
    PIT_Flag_Clear(PIT0);//清中断标志位
    PIT_TCTRL(PIT0) &= (~ PIT_TCTRL_TEN_MASK);
}
在主函数里面DisableInterrput和EnableInterrupts可以不加吗?关闭PIT中断是不是只要  PIT_TCTRL(PIT0) &= (~ PIT_TCTRL_TEN_MASK); 这个位清零就可以了
  
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-6-4 17:16:02 | 显示全部楼层
山外メ雲ジ 发表于 2013-6-4 07:58
不是,是假如你修改了频率,那图像处理的那段时间就不相同的了。

山外哥 在您的lptmr_counter_init这个函数中 有一句
LPTMR_PSR_REG(LPTMR0_BASE_PTR)  =   LPTMR_PSR_PCS(0x1) | LPTMR_PSR_PBYP_MASK  |  LPTMR_PSR_PRESCALE(PrescaleValue);
这里不已经选择预分频绕道 为什么还要设置PRESCALE的值呢?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-6-4 17:37:52 | 显示全部楼层
虚竹 发表于 2013-6-3 08:27
设置滤波后,假如脉冲频率很高 会丢掉计数 ,所以你可以取消滤波,设置为0

pit 中断,可以在采集图像后 ...

如果照您的思路 在图像采集完之后打开PIT 进入PIT中断之后 是不是要关闭PIT和LPT
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-6-4 17:43:28 | 显示全部楼层
虚竹 发表于 2013-6-3 08:27
设置滤波后,假如脉冲频率很高 会丢掉计数 ,所以你可以取消滤波,设置为0

pit 中断,可以在采集图像后 ...

求教:PIT 的CVALn寄存器只能读  不能写 怎么清零呀 直接在采集完图像之后调用一下pit_init_ms(PIT0,10)函数可以吗
回复 支持 反对

使用道具 举报

发表于 2013-6-4 17:57:49 | 显示全部楼层
darksnipers 发表于 2013-6-4 16:40
山外哥 我想等到图像解压完再打开PIT定时中断  在中断里面读取LPT的脉冲值 计数清零 清PIT中断 关闭PIT
这 ...

关中断,用 disable_irq

采集图像后,重新初始化pit定时就可以了,或者清0pit计数值。在中断里面读取LPT的脉冲值 计数清零 清PIT中断 关闭PIT
回复 支持 反对

使用道具 举报

发表于 2013-6-4 17:58:09 | 显示全部楼层
darksnipers 发表于 2013-6-4 17:43
求教:PIT 的CVALn寄存器只能读  不能写 怎么清零呀 直接在采集完图像之后调用一下pit_init_ms(PIT0,10)函 ...

可以
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-6-4 22:45:49 | 显示全部楼层
山外メ雲ジ 发表于 2013-6-4 17:57
关中断,用 disable_irq

采集图像后,重新初始化pit定时就可以了,或者清0pit计数值。在中断里面读取L ...

山外哥 在PIT中断里面LPT是不是也得关呀 否则它还会继续计数脉冲吧?
回复 支持 反对

使用道具 举报

发表于 2013-6-5 09:03:30 | 显示全部楼层
darksnipers 发表于 2013-6-4 22:45
山外哥 在PIT中断里面LPT是不是也得关呀 否则它还会继续计数脉冲吧?

关不关不重要,重要的是开始计时的时候记得清0
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-6-5 19:37:12 | 显示全部楼层
山外メ雲ジ 发表于 2013-6-5 09:03
关不关不重要,重要的是开始计时的时候记得清0

不是 山外哥 我不想让LPT进LPT的中断程序  我给LPT的 lptmr_counter_init(LPT0_ALT2 ,65530,0,LPT_Rising);我设置了一个比较大的值 如果不关LPT的话 那在我读完计数值之后 LPT不照样还会计数脉冲吗 就有可能达到65530 进中断呀  山外哥 如果进了PIT中断之后 不想让LPT继续计数 关PIT  LPTMR_CSR_REG(LPTMR0_BASE_PTR)  &=( ~ LPTMR_CSR_TEN_MASK)IT_TCTRL(pitn) &= ( ~ PIT_TCTRL_TEN_MASK );把他们的使能位清零 不再关中断了  这样可以吗
回复 支持 反对

使用道具 举报

发表于 2013-6-5 19:51:17 | 显示全部楼层
darksnipers 发表于 2013-6-5 19:37
不是 山外哥 我不想让LPT进LPT的中断程序  我给LPT的 lptmr_counter_init(LPT0_ALT2 ,65530,0,LPT_Rising); ...

你设置一个比较大的数,保证lpt 不会溢出,就直接关闭 lpt 的中断啊!完全不需要使用lpt中断
采集前记得清计数值
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-6-6 23:15:43 | 显示全部楼层
山外メ雲ジ 发表于 2013-6-5 19:51
你设置一个比较大的数,保证lpt 不会溢出,就直接关闭 lpt 的中断啊!完全不需要使用lpt中断
采集前记得 ...

   while(1)
    {   ov7725_get_img();
        img_extract((u8 *)img_buff,(u8 *)img_bin_buff,2400);
        DisableInterrupts;
        pit_init_ms(PIT0,10);
        lptmr_counter_init(LPT0_ALT2 ,65530,0,LPT_Rising);
        EnableInterrupts
    }这里的关总中断和开总中断可以不要吗 加上对摄像头采集有没有影响呀
回复 支持 反对

使用道具 举报

发表于 2013-6-7 07:50:27 | 显示全部楼层
darksnipers 发表于 2013-6-6 23:15
while(1)
    {   ov7725_get_img();
        img_extract((u8 *)img_buff,(u8 *)img_bin_buff,24 ...
  1.    while(1)
  2.     {   
  3.        // 这里关闭pit0中断

  4.        ov7725_get_img();
  5.         //这里开始pit中断
  6.         //应该先禁掉pit模块, 再开启
  7.         pit_init_ms(PIT0,10);
  8.         img_extract((u8 *)img_buff,(u8 *)img_bin_buff,2400);

  9.         lptmr_counter_init(LPT0_ALT2 ,65530,0,LPT_Rising);

  10.     }
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-6-15 17:42:13 | 显示全部楼层
山外メ雲ジ 发表于 2013-6-7 07:50

山外哥 开启PIT计时之后 为什么不立即让LPT计数脉冲  图像解压放在两个函数之间 应该会有误差吧
回复 支持 反对

使用道具 举报

发表于 2013-6-15 20:40:27 来自手机 | 显示全部楼层
darksnipers 发表于 2013-6-15 17:42:13

山外哥 开启PIT计时之后 为什么不立即让LPT计数脉冲  图像解压放在两个函数之间 应该会有误差吧

是,初始化后应该马上计数
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-6-15 21:08:02 | 显示全部楼层
山外メ雲ジ 发表于 2013-6-15 20:40
是,初始化后应该马上计数

山外哥 我照你的提示写的代码
   while(1)
    {   
       disable_irq(PIT0+68); // 这里关闭pit0中断

        ov7725_get_img();
        enable_irq(PIT0+68);//这里开始pit中断
        PIT_TCTRL(PIT0) &= ~PIT_TCTRL_TEN_MASK;
        PIT_TCTRL(PIT0) |=PIT_TCTRL_TEN_MASK; //应该先禁掉pit模块, 再开启
        pit_init_ms(PIT0,10);
        img_extract((u8 *)img_buff,(u8 *)img_bin_buff,2400);

        lptmr_counter_init(LPT0_ALT2 ,65530,0,LPT_Rising);

    }
PIT中断函数
extern int cesu;
void PIT0_IRQHandler(void)
{   
    cesu=LPTMR0_CNR;
    uart_putchar (UART1, cesu);
    lptmr_counter_clean();
   // LPTMR_CSR_REG(LPTMR0_BASE_PTR)&=~(LPTMR_CSR_TEN_MASK | LPTMR_CSR_TIE_MASK);
   // disable_irq(85u);
    PIT_Flag_Clear(PIT0);
    PIT_TCTRL(PIT0) &= ~ PIT_TCTRL_TEN_MASK;  
    //disable_irq(PIT0 + 68);                                               //清中断标志位
}
采集到的编码器的每次差距很大 电机空转 匀速 这是怎么回事  山外哥 在你的50帧稳定版里面  该怎么写编码器的程序 求指教
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-6-15 21:09:36 | 显示全部楼层
   while(1)
    {   
       // 这里关闭pit0中断

       ov7725_get_img();
        //这里开始pit中断
        //应该先禁掉pit模块, 再开启
        pit_init_ms(PIT0,10);
        img_extract((u8 *)img_buff,(u8 *)img_bin_buff,2400);

        lptmr_counter_init(LPT0_ALT2 ,65530,0,LPT_Rising);

    }
山外哥  你在这里 先关闭PIT中断 在开启 先禁用PIT中断 在打开 这是为了什么
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回列表 返回顶部