【问题标题】:issue in counting down timer from 60 to 0 on 7segment在 7 段上将计时器从 60 倒计时到 0 的问题
【发布时间】:2021-10-16 15:16:03
【问题描述】:
   /*
T=1/8MHz=0.125us
0>>>256=32us time for 1 clock
1/32*(10^-6)
so we need 31250 clock to generate 1 sec 
for prescaling 256 we need 123 clock
*/ 


/*
123 CLOCK FOR 1 SEC 
SO 1230 CLOCK FOR 10 SEC

*/
#define F_CPU 8000000UL
#include <avr/io.h>


void T0delay()
{
   TCNT0 = 0;
   TCCR0 = 0x04;
   while (TIFR & (1<<TOV0)==0);
   TCNT0 = 0;
   TIFR =0x01;
}

int main(void)
{
   int counter=0;
   int i=0;
   int j=6;
   DDRC=0xff;
   DDRD=0xff;
   PORTC=i;
   PORTD=j;
   while (1) 
   {
      T0delay();
      counter++ ;
        if(counter == 123)
      {  
          i--;
          
          if(i < 0)
          {
              i = 9;
              PORTD--;
              if(PORTD == 0 & PORTC == 0 )
              {
                  PORTD =0;
                  PORTC =0;
              }
          }
          
           PORTC=i;
           
       }
   }
}

端口 c 用于将计时器从 9 降到 0,每秒计数。 行为不准确,因为它不会等待整整一秒。 而端口 d 用于将定时器从 6 降到 0 计数端口 c 7 段的每个周期(9 到 0)。 该行为不正确,因为它从 6 计数到 0,然后显示不需要的片段。

Schematics

【问题讨论】:

  • 您可能需要说明您使用哪种设备来帮助回答问题。
  • 我认为if(PORTD == 0 &amp; PORTC == 0 ) 中的&amp; 运算符看起来非常可疑。你的意思是if(PORTD == 0 &amp;&amp; PORTC == 0 )
  • @JonathonS。设备 atmega 16
  • @Cheatah 还是没什么区别
  • 对 PORTC 和 PORTD 进行 if 测试有什么意义:如果两者都是 0,则将它们设置为 0?

标签: c timer embedded atmega


【解决方案1】:

要解决您的问题,您需要分析您要分支的值(if 语句)的不同情况以及您如何处理它们的值。

首先,PORTDPORTC 是 GPIO 寄存器,这意味着它们的值是无符号的,所以我相信您的代码的问题就在这里:

      PORTD--;
      if(PORTD == 0 & PORTC == 0 )
      {
          PORTD =0;
          PORTC =0;
      }

当使用if(PORTD == 0 &amp; PORTC == 0 ) 分支时,PORTD 设置为 0。下次使用 if(i &lt; 0) 时,PORTD 会递减,这会导致溢出,从而导致您遇到不想要的行为。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多