发新帖本帖赏金 1.50元(功能说明)我要提问
123
返回列表
打印
[STM8]

小白求助

[复制链接]
楼主: sang523
手机看帖
扫描二维码
随时随地手机跟帖
41
sang523|  楼主 | 2016-10-13 17:13 | 只看该作者 回帖奖励 |倒序浏览
我自己写的stm8s103的tim1中断定时程序(IAR)
void TIM1_Init(void)
{
TIM1_IER=0X00;
TIM1_EGR=0X00;
TIM1_PSCRH=0X3E;//15999分频,16M晶振,记数周期为1ms
TIM1_PSCRL=0X7F;
TIM1_ARRH=0X01;//自动重载寄存器为500,每计数500次产生一次中断
TIM1_ARRL=0XF4;
TIM1_CNTRH=0X00;
TIM1_CNTRL=0X00;
TIM1_CR1=0X81;
TIM1_IER=0X01;
}
#pragma vector=TIM1_OVR_UIF_vector
__interrupt void TIM1_OVR_UIF(VOID)
{
  i++;
  TIM1_SR1=0X00;
  if(i==10)
  {PWMPFF();}
}
功能是5s后PWM输出关闭,麻烦大家看看对吗

使用特权

评论回复
42
sang523|  楼主 | 2016-10-13 17:18 | 只看该作者
wahahaheihei 发表于 2016-10-13 17:04
楼主把全部代码贴出来吧,这么描述太费劲了。

麻烦看下程序,谢了

使用特权

评论回复
43
wuhuikai| | 2016-10-13 17:22 | 只看该作者
PwmOn();
DelayMs(5000);
PwmOff();

使用特权

评论回复
44
wuhuikai| | 2016-10-13 17:26 | 只看该作者
本帖最后由 wuhuikai 于 2016-10-13 17:27 编辑

void Tim1PwmInit(void){         //定时器1,
  uint16_t pscr=1600-1;// 1600-1    6000-1 (600ms)   16-1(1.6ms)
  uint16_t arr=6000-1;  //
  uint16_t value = (arr+1)/2 ;   //Pwm占空比50%
  TIM1_CR1_OPM=0;               //更新不停止计数
  TIM1_CR1_URS=0;               //计数溢出,会发送中断请求 0为寄存器更新(计数器溢出)时立即发送一个中断请求。
  TIM1_CR1_UDIS=0;              //
  TIM1_PSCRH=pscr>>8;
  TIM1_PSCRL=(uint8_t)pscr;                  //
  TIM1_ARRH=arr>>8;                  //重装载
  TIM1_ARRL=(uint8_t)arr;
  
  TIM1_CCER1_CC1E = 1;
  
  TIM1_CCER1_CC1P=0;    //有效位
  
  TIM1_CCMR1_OC1M =0X7;  //pwm1 先有效位输出
  TIM1_OISR_OIS1 = 0;  //空闲
  
  TIM1_CCR1H = value>>8;
  TIM1_CCR1L = (uint8_t)value;//
  TIM1_BKR_MOE = 1;//PWM输出使能
  TIM1_IER_CC1IE=1;                //中断允许
  TIM1_CR1_CEN=0;                //使能计数器
  TIM1_SR1_CC1IF=0;
}

#pragma vector=0xE
__interrupt void TIM1_CAP_COM_IRQHandler(void)
{
  TIM1_SR1_CC1IF=0;
    Moto.M1Steps--;
  if(Moto.M1Steps==0){
    TIM1_CR1_CEN=0;
  }
}

可以参考下我之前写步进电机,可以精确的计数。

使用特权

评论回复
45
皈依| | 2016-10-13 19:46 | 只看该作者
sang523 发表于 2016-10-13 17:00
还有比如说tim1输出PWM,我要求其启动后一段时间停止,我用的delay,delay1ms();PWMOFF();(延时子程序已 ...

你在定时器里面计数,比如说定时器中断一次是1us 你计数1000次 就是1ms 这个时候你把pwm关掉就可以

使用特权

评论回复
46
sang523|  楼主 | 2016-10-13 20:10 | 只看该作者
皈依 发表于 2016-10-13 19:46
你在定时器里面计数,比如说定时器中断一次是1us 你计数1000次 就是1ms 这个时候你把pwm关掉就可以 ...

对啊,41楼有我写的关于tim1定时程序,但试了不行。。

使用特权

评论回复
47
皈依| | 2016-10-13 20:16 | 只看该作者
是什么不行?
PWM输出也要初始化啊?没看到你有PWM输出啊

使用特权

评论回复
48
sang523|  楼主 | 2016-10-13 20:47 | 只看该作者
皈依 发表于 2016-10-13 20:16
是什么不行?
PWM输出也要初始化啊?没看到你有PWM输出啊

那个肯定有的,我只是把中断定时拿出来了

使用特权

评论回复
49
皈依| | 2016-10-14 08:23 | 只看该作者
sang523 发表于 2016-10-13 20:47
那个肯定有的,我只是把中断定时拿出来了

你可以试一下 第一 测量引脚有没有PWM的波形,第二,在中断里面抬高放低引脚测试一下有没有波形,看看有没有进入中断,这样就知道问题在什么位置了

使用特权

评论回复
50
sang523|  楼主 | 2016-10-14 08:38 | 只看该作者
皈依 发表于 2016-10-14 08:23
你可以试一下 第一 测量引脚有没有PWM的波形,第二,在中断里面抬高放低引脚测试一下有没有波形,看看有 ...

ok,懂了,中断最后还需要加上i=0吗,我开头直接unsigned int i,这样行吗

使用特权

评论回复
51
皈依| | 2016-10-14 13:58 | 只看该作者
sang523 发表于 2016-10-14 08:38
ok,懂了,中断最后还需要加上i=0吗,我开头直接unsigned int i,这样行吗

嗯 在改变完PWM的时候把I置零重新计数,把 i设置成全局变量 然后赋值为0
可以的 你再试试

使用特权

评论回复
52
sang523|  楼主 | 2016-10-15 08:40 | 只看该作者
皈依 发表于 2016-10-14 13:58
嗯 在改变完PWM的时候把I置零重新计数,把 i设置成全局变量 然后赋值为0
可以的 你再试试 ...

我debug下观察寄存器的值发现跟我设定的不一样是不是说明我程序错了?

使用特权

评论回复
53
皈依| | 2016-10-15 09:56 | 只看该作者
sang523 发表于 2016-10-15 08:40
我debug下观察寄存器的值发现跟我设定的不一样是不是说明我程序错了?

嗯 有很大可能是程序错了

使用特权

评论回复
54
sang523|  楼主 | 2016-10-15 15:10 | 只看该作者
皈依 发表于 2016-10-15 09:56
嗯 有很大可能是程序错了

谢谢了,还有stm8s单片机的延时如何达到分钟,小时级

使用特权

评论回复
55
皈依| | 2016-10-15 15:56 | 只看该作者
sang523 发表于 2016-10-15 15:10
谢谢了,还有stm8s单片机的延时如何达到分钟,小时级

举个例子 在中断里面100ms计数一次 那么计数10次就是一秒,计数600次就是一分钟,那么计数满一分钟就让另外一个变量a++,当a=60的时候就是一小时

使用特权

评论回复

打赏榜单

sang523 打赏了 1.50 元 2016-10-17

56
sang523|  楼主 | 2016-10-17 09:18 | 只看该作者
皈依 发表于 2016-10-15 15:56
举个例子 在中断里面100ms计数一次 那么计数10次就是一秒,计数600次就是一分钟,那么计数满一分钟就让另 ...

如果我要在delay延时后迅速进入中断服务程序怎么做,还有上面那个中断的小时程序能简单私给我吗

使用特权

评论回复
57
皈依| | 2016-10-17 09:21 | 只看该作者
sang523 发表于 2016-10-17 09:18
如果我要在delay延时后迅速进入中断服务程序怎么做,还有上面那个中断的小时程序能简单私给我吗 ...

可以的 我私聊你

使用特权

评论回复
发新帖 本帖赏金 1.50元(功能说明)我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则