3813|9

67

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

再来一个新手问题,不要笑话。 [复制链接]

我做了一个led的动态显示,通过485连到工控机上,用来显示工控机从串口发过来的数据。

从工控机发1234,led上显示1234,但是有时候工控机开关机的时候,led就出现那种“跑马灯”的现象,第一位显示1,然后第二位显示2,第三位显示3,第四位显示4,是轮流显示的,正常应该看上去是一起显示的,把led关了再打开就好了。

请问是什么问题,如何解决?

最新回复

加了看门狗,现在可以达到应用的目的了,结账给分了。  详情 回复 发表于 2009-12-8 09:52
点赞 关注

回复
举报

69

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
刷新时间那不对,刷新的太慢了
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
同意楼上.要查查程序,看程序对串口怎么处理,可能在通讯断开之后程序占用了太多时间造成刷新太慢.
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

4
 
是显示刷新的时间有问题,显示时间和刷新太慢;

 
 
 

回复

60

帖子

0

TA的资源

一粒金砂(初级)

5
 
延时函数那块改改,改快点
 
 
 

回复

58

帖子

0

TA的资源

一粒金砂(初级)

6
 
晕,开机的时候,单片机还没有接收到工控机发送的数据呢?
怎么可能也显示“1.2.3.4”.
是不是你开始操作和结束操作,单片机接收数据的缓存区没有清零啊。
 
 
 

回复

65

帖子

0

TA的资源

一粒金砂(初级)

7
 
同意楼上.要查查程序,看程序对串口怎么处理,可能在通讯断开之后程序占用了太多时间造成刷新太慢
在通讯断开之后,通讯口会接受一些莫名其妙的字符,看程序对串口怎么处理的吧
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

8
 
把程序发上来,第一次写,大家嘴下留情,知道的帮看看。

平时一点问题没有,就是在工控机“开关机”的时候有时会出现我说的现象,也不是每次“开关机”都出现。


#include
#include

unsigned char temp,check,datadisp[4];
unsigned char num_code[20]={0XBF,0X86,0XDB,0XCF,0XE6,0XED,0XFD,0X87,0XFF,0XEF};
unsigned char receivedata[5];
unsigned char counter= 0;
unsigned char light;

void delay_ms(void)
{
unsigned int cnt;
for(cnt=0;cnt<255;cnt++);
}


void port_init(void)
{
PORTA = 0xFC;
DDRA  = 0x00;
PORTB = 0x00;
DDRB  = 0xFF;
PORTC = 0x00; //m103 output only
DDRC  = 0x00;
PORTD = 0xFF;
DDRD  = 0xFF;
}


void uart0_init(void)
{
UCSRB = 0x00; //disable while setting baud rate
UCSRA = 0x00;
UCSRC = BIT(URSEL) | 0x26;
UBRRL = 0xF9; //set baud rate lo
UBRRH = 0x00; //set baud rate hi
UCSRB = 0x90;
}


#pragma interrupt_handler uart0_rx_isr:12
void uart0_rx_isr(void)
{
//uart has received a character in UDR
unsigned char i;
check = UCSRA & 0X04;
if(!check)
  {
    temp = UDR;
        if(temp == 0x0c)
     {
           counter = 0;
           receivedata[counter] = temp;
           counter++;
         }  
        else if((temp<=9)&&receivedata[0]==0x0c)
         {
           receivedata[counter]= temp;
           counter++;
         }
        else
           counter = 0;   
          
   
   if(counter == 5)
    {
          
         datadisp[0] = receivedata[1];
     datadisp[1] = receivedata[2];
         datadisp[2] = receivedata[3];
     datadisp[3] = receivedata[4];
   
     for(i=0;i<5;i++)
      {
       receivedata=0x00;

      }
    }
  }
  

}


void timer2_init(void)
{
TCCR2 = 0x00; //stop
ASSR  = 0x00; //set async mode
TCNT2 = 0x01; //setup
OCR2  = 0xFF;
TCCR2 = 0x69; //start
}


void spi_init(void)
{
SPCR = 0x50; //setup SPI
SPSR = 0x00; //setup SPI
}




void pwm(void)
{
unsigned char switch1,switch2;

switch1 = PINA & 0X01;
switch2 = PINA & 0X02;

if((switch1==0)&&(switch2==0))
  light = 0Xdf;
else if((switch1==0)&&(switch2!=0))
  light = 0X9f;
else if((switch1!=0)&&(switch2==0))
  light = 0X4f;
else
  light = 0X0f;
  
}

void display(void)
{
unsigned char  pp,p,q,j;
for(pp=0;pp<4;pp++)
   {
   
   
         p = datadisp[pp];
     q = num_code[p] ;
         OCR2 = 0XFF;
     //CLEAR 595reg
         PORTB &= ~BIT(6);
         delay_ms();
         PORTB |= BIT(6);
         //end clear 595reg
         SPDR = q;
         while(!(SPSR & 0X80));
         PORTB &= ~BIT(4);
         delay_ms();
         PORTB |= BIT(4);
         OCR2 = light;

         PORTB |= BIT(pp);
         for(j=0;j<2;j++)
         delay_ms();
         PORTB &= 0Xf0;
       
         
         }
}


void init_devices(void)
{
//stop errant interrupts until set up
CLI(); //disable all interrupts
port_init();
uart0_init();
spi_init();
timer2_init();

MCUCR = 0x00;
GICR  = 0x00;
TIMSK = 0x00; //timer interrupt sources
SEI(); //re-enable interrupts
//all peripherals are now initialized
}

void main(void)
{

  init_devices();
  pwm();
  
  while(1)
    {  
          
           display();
          
          
        }
}
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

9
 
自己顶一下,希望有人看到。
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

10
 
加了看门狗,现在可以达到应用的目的了,结账给分了。
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表