佳礼资讯网

 找回密码
 注册

ADVERTISEMENT

查看: 2375|回复: 33

IF里有多重OUTPUT会弄到SYSTEM不STABLE??

[复制链接]
发表于 3-5-2009 02:01 AM | 显示全部楼层 |阅读模式
这是小弟我令个PROJECT,是做交通灯的,A0到B7都会接去LED来代表交通灯的颜色,由於之后还要放7SEGMENT跟我需要准确的1秒时间所以我用TIMER INTERRUPT来做。
可是出现一个很奇怪的问题,就是当MAIN FUNCTION 的IF里只有一个OUTPUT时就没有问题,但是当我在IF里放很几个OUTPUT就有问题了,那OUTPUT的LED一直在闪然后TIMER不能走,我试了整个晚上都还解决不到,希望这里的大大帮忙。一下是我的CODE。
  1. #include <16F877A.h>               
  2. #use delay(clock=1000000)
  3. #fuses XT,NOWDT,NOPROTECT,NOLVP  
  4. #define ar PIN_A0
  5. #define ay PIN_A1
  6. #define ag PIN_A2
  7. #define br PIN_A3
  8. #define by PIN_A5
  9. #define bg PIN_B7
  10. #define cr PIN_B6
  11. #define cy PIN_B5
  12. #define cg PIN_B4
  13. #define dr PIN_B3
  14. #define dy PIN_B2
  15. #define dg PIN_B1




  16. int time, cnt=0, intflag=0;

  17. void main()
  18. {   
  19.    set_tris_b (0x00);
  20.    set_tris_a (0x00);
  21.    set_tris_d (0x00);
  22.    output_a (0x00);
  23.    output_b (0x00);
  24.    output_d (0x00);
  25.    
  26.    setup_timer_1 (T1_INTERNAL|T1_DIV_BY_8);
  27.    enable_interrupts(GLOBAL);
  28.    enable_interrupts(INT_TIMER1);
  29.    set_timer1(34286);
  30.    
  31.    while(1){
  32.       do{
  33.       
  34.       time=23-cnt;
  35.       
  36.       if(time<=23&&time>=18){
  37.       output_high(ag);
  38.       output_high(br);
  39.       output_high(cr);
  40.       output_high(dr);
  41.       }
  42.       
  43.       else if(time<=17&&time>=14){
  44.       output_high(ay);
  45.       output_high(br);
  46.       output_high(cr);
  47.       output_high(dr);
  48.       }
  49.       
  50.       else{
  51.       output_high(ar);
  52.       output_high(br);
  53.       output_high(cr);
  54.       output_high(dr);
  55.       }
  56.       
  57.       output_d (time);
  58.       
  59.       if(cnt>23){
  60.       cnt=0;
  61.       }
  62.    
  63.       intflag=0;
  64.    
  65.       }while(intflag==1);  //end do
  66.    }                      //end while
  67. }                         //end main


  68. #INT_TIMER1
  69. void timer1_interrupt ()
  70. {
  71.    cnt=cnt+1;
  72.       
  73.    set_timer1(34286);
  74.    
  75.    intflag=1;
  76.    
  77. }
复制代码

[ 本帖最后由 fritlizt 于 3-5-2009 12:42 PM 编辑 ]
回复

使用道具 举报


ADVERTISEMENT

发表于 3-5-2009 09:32 PM | 显示全部楼层
如果你要一秒loop一次。
应该while(intflag==0);
不是while(intflag==1);
回复

使用道具 举报

 楼主| 发表于 4-5-2009 12:08 AM | 显示全部楼层
原帖由 fritlizt 于 3-5-2009 09:32 PM 发表
如果你要一秒loop一次。
应该while(intflag==0);
不是while(intflag==1);


我是要等到INTERRUPT了才LOOP的,但这不是我面对的问题,我的问题是在IF里我不能放多个OUTPUT_HIGH,放多个整个PROGRAM不能走,放一个就没有问题。
为什么会这样??有什么方法可以解决吗?
回复

使用道具 举报

发表于 4-5-2009 08:29 AM | 显示全部楼层
原帖由 crazybear 于 4-5-2009 12:08 AM 发表


我是要等到INTERRUPT了才LOOP的,但这不是我面对的问题,我的问题是在IF里我不能放多个OUTPUT_HIGH,放多个整个PROGRAM不能走,放一个就没有问题。
为什么会这样??有什么方法可以解决吗?


IF是指interrupt function吗?
我不懂“就是当MAIN FUNCTION 的IF里只有一个OUTPUT时就没有问题,但是当我在IF里放很几个OUTPUT就有问题了“”是什么意思
回复

使用道具 举报

发表于 4-5-2009 09:46 AM | 显示全部楼层
err...想问几个问题:

1。为什么你只是 set 你要的 pin 去 high,但却没有 clear 不要的 pin ?
2。你的 output pin 是直接接去 LED,还是有经过电阻?
3。所有的 output 都有问题,还是只是 PORTA?
回复

使用道具 举报

 楼主| 发表于 4-5-2009 02:46 PM | 显示全部楼层
原帖由 fritlizt 于 4-5-2009 08:29 AM 发表


IF是指interrupt function吗?
我不懂“就是当MAIN FUNCTION 的IF里只有一个OUTPUT时就没有问题,但是当我在IF里放很几个OUTPUT就有问题了“”是什么意思


我的INTERRUPT FUNCTION都没有OUTPUT HIGH,所以不是指INTERRUPT FUNCTION里的IF了。
当我放一个OUTPUT HIGH。

if (condition){
output_high (PIN_A0);
}
else{
output_high (PIN_B1);
}

这样就没事,但如果我放多个OUTPUT HIGH

if (condition){
output_high (PIN_A0);
output_high (PIN_A3);
output_high (PIN_B1);
}
else{
output_high (PIN_A1);
output_high (PIN_B5);
}

整个PROGRAM不能走,然后那OUTPUT的LED一直在闪。
回复

使用道具 举报

Follow Us
 楼主| 发表于 4-5-2009 02:52 PM | 显示全部楼层
原帖由 waiweng83 于 4-5-2009 09:46 AM 发表
err...想问几个问题:

1。为什么你只是 set 你要的 pin 去 high,但却没有 clear 不要的 pin ?
2。你的 output pin 是直接接去 LED,还是有经过电阻?
3。所有的 output 都有问题,还是只是 PORTA?


1。因为我用IF,如果CONDITION不MATCH那MICROC就不会PROCESS那个IF了,所以我就不用去CLEAR不要的PIN了。(这是我自己觉得的,如果有错请指导)

2。因为我是用PROTEUS来SIMULATE,所以都没放RESISTOR,但是在SCHMATIC跟PCB我都会放470ohm的RESISTOR。

3。是所有PORT都有问题,不是只是PORT A 罢了。
回复

使用道具 举报

 楼主| 发表于 4-5-2009 02:56 PM | 显示全部楼层
其实我用OUTPUT整个PORT就解决了我的问题,我算那PORT什么PIN要HIGH,什么PIN要LOW,然后换去DECIMAL就可以了,就象
OUTPUT_A (DECIMAL VALUE);
这方式我放几个OUTPUT都没问题。

虽然我的问题解决了,但是我还是希望能知道为什么我放多个OUTPUT_HIGH就不能走。
回复

使用道具 举报


ADVERTISEMENT

发表于 4-5-2009 05:27 PM | 显示全部楼层
原帖由 crazybear 于 4-5-2009 02:46 PM 发表


我的INTERRUPT FUNCTION都没有OUTPUT HIGH,所以不是指INTERRUPT FUNCTION里的IF了。
当我放一个OUTPUT HIGH。

if (condition){
output_high (PIN_A0);
}
else{
output_high (PIN_B1);
}

这样就没事 ...

  1. if (condition){

  2. output_high (PIN_A0);

  3. delay_us(1);

  4. output_high (PIN_A3);

  5. delay_us(1);

  6. output_high (PIN_B1);

  7. }

  8. else{

  9. output_high (PIN_A1);
  10. delay_us(1);
  11. output_high (PIN_B5);

  12. }
复制代码

试试这个。
回复

使用道具 举报

 楼主| 发表于 4-5-2009 11:30 PM | 显示全部楼层

回复 9# pic 的帖子

也是一样,不能。。
回复

使用道具 举报

发表于 5-5-2009 08:46 AM | 显示全部楼层
原帖由 crazybear 于 4-5-2009 11:30 PM 发表
也是一样,不能。。
  1. if (condition){
  2. output_high (PIN_A0);
  3. output_high (PIN_A3);
  4. output_high (PIN_B1);
  5. }
  6. else{
  7. output_high (PIN_A1);
  8. output_high (PIN_B5);
  9. }
复制代码
你的程序, 走了后, 上面的都是output High了。。。
你都不需要output_low 的吗?

看来你的logic设计在开始就有问题了。。。。

要做交通灯, 用State Machine的写法。
回复

使用道具 举报

 楼主| 发表于 5-5-2009 09:11 AM | 显示全部楼层
原帖由 pic 于 5-5-2009 08:46 AM 发表
if (condition){
output_high (PIN_A0);
output_high (PIN_A3);
output_high (PIN_B1);
}
else{
output_high (PIN_A1);
output_high (PIN_B5);
}你的程序, 走了后, 上面的都是output High了。。。
你都 ...


没放OUTPUT_LOW这会影响的吗?我有看过些EXAMPLE,当这个CONDITION就OUTPUT_HIGH什么PIN,ELSE就OUTPUT_HIGH什么PIN,可是怎么我这样写时又不能走??

什么是STATE MACHINE??
回复

使用道具 举报

发表于 5-5-2009 09:55 AM | 显示全部楼层
原帖由 crazybear 于 4-5-2009 02:52 PM 发表

2。因为我是用PROTEUS来SIMULATE,所以都没放RESISTOR,但是在SCHMATIC跟PCB我都会放470ohm的RESISTOR。


不要把 Proteus 当成白痴,你必须要根据原来需要的电路途设计,不可以省例零件。不知道是不是这个问题,电阻必须要放。。。。
回复

使用道具 举报

发表于 5-5-2009 11:39 AM | 显示全部楼层
原帖由 crazybear 于 3-5-2009 02:01 AM 发表
这是小弟我令个PROJECT,是做交通灯的,A0到B7都会接去LED来代表交通灯的颜色,由於之后还要放7SEGMENT跟我需要准确的1秒时间所以我用TIMER INTERRUPT来做。
可是出现一个很奇怪的问题,就是当MAIN FUNCTION 的IF里 ...

改成这个看看
  1. while(1){
  2.       if (intflag==1){
  3.       
  4.       time=23-cnt;
  5.       
  6.       if(time<=23&&time>=18){
  7.       output_high(ag);
  8.       output_high(br);
  9.       output_high(cr);
  10.       output_high(dr);
  11.       }
  12.       
  13.       else if(time<=17&&time>=14){
  14.       output_high(ay);
  15.       output_high(br);
  16.       output_high(cr);
  17.       output_high(dr);
  18.       }
  19.       
  20.       else{
  21.       output_high(ar);
  22.       output_high(br);
  23.       output_high(cr);
  24.       output_high(dr);
  25.       }
  26.       
  27.       output_d (time);
  28.       
  29.       if(cnt>23){
  30.       cnt=0;
  31.       }
  32.    
  33.       intflag=0;
  34.    
  35.       }  //end if
  36.    }                      //end while
复制代码

[ 本帖最后由 fritlizt 于 5-5-2009 11:41 AM 编辑 ]
回复

使用道具 举报

 楼主| 发表于 5-5-2009 11:44 AM | 显示全部楼层
原帖由 rothmans 于 5-5-2009 09:55 AM 发表


不要把 Proteus 当成白痴,你必须要根据原来需要的电路途设计,不可以省例零件。不知道是不是这个问题,电阻必须要放。。。。


我没把PROTEUS当白痴啦!只是懒惰放罢了,反正都没问题。
我这很明显是CODE的问题,我放一个OUTPUT_HIGH没有问题,放几个OUTPUT_HIGH才有问题的。我换用OUTPUT_A (VALUE);就没问题了,PROTUES也走到很顺。

我继续这话题是因为我想了解做么放多个OUTPUT_HIGH会不能走。。
回复

使用道具 举报

 楼主| 发表于 5-5-2009 11:56 AM | 显示全部楼层

回复 14# fritlizt 的帖子

一样不能。。。但是比之前好,因为至少TIMER还能走,只是OUTPUT PIN没有跟这PROGRAM走。
之前是连TIMER都不能走。。
回复

使用道具 举报


ADVERTISEMENT

发表于 5-5-2009 12:36 PM | 显示全部楼层
原帖由 crazybear 于 5-5-2009 11:44 AM 发表


我没把PROTEUS当白痴啦!只是懒惰放罢了,反正都没问题。
我这很明显是CODE的问题,我放一个OUTPUT_HIGH没有问题,放几个OUTPUT_HIGH才有问题的。我换用OUTPUT_A (VALUE);就没问题了,PROTUES也走到很顺。

...


哦!酱也不行啊!既然你已经上载程序,而且也用 Proteus 画好你的电路图。不如也把proteus 电路上载好让论友直接用来模拟。你就方便多了。。。。
回复

使用道具 举报

发表于 5-5-2009 02:02 PM | 显示全部楼层
2。因为我是用PROTEUS来SIMULATE,所以都没放RESISTOR,但是在SCHMATIC跟PCB我都会放470ohm的RESISTOR。

你的Proteus 是接LED? 如是, 你一定要放电阻 。

原帖由 crazybear 于 5-5-2009 09:11 AM 发表
没放OUTPUT_LOW这会影响的吗?我有看过些EXAMPLE,当这个CONDITION就OUTPUT_HIGH什么PIN,ELSE就OUTPUT_HIGH什么PIN,可是怎么我这样写时又不能走??

你的程序把灯都开完了, 到最后所有的灯都开了。。。
然道交通灯开了就不用关吗?

你说有问题, 不可以, 是怎样的不可以法?

什么是STATE MACHINE??

你先Google 看看。。。
回复

使用道具 举报

发表于 5-5-2009 05:28 PM | 显示全部楼层
原帖由 crazybear 于 5-5-2009 11:56 AM 发表
一样不能。。。但是比之前好,因为至少TIMER还能走,只是OUTPUT PIN没有跟这PROGRAM走。
之前是连TIMER都不能走。。


根据你的program.你的led到最后全部会switch on。
你没有off。

你所谓的output pin没有跟program跑是不是led全on?
回复

使用道具 举报

 楼主| 发表于 6-5-2009 01:17 AM | 显示全部楼层
原帖由 rothmans 于 5-5-2009 12:36 PM 发表


哦!酱也不行啊!既然你已经上载程序,而且也用 Proteus 画好你的电路图。不如也把proteus 电路上载好让论友直接用来模拟。你就方便多了。。。。


这是我PROTEUS的图,从LED颜色排法是红,黄,绿上到下,那7SEGMENT是用来DISPLAY时间。

回复

使用道具 举报

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

本版积分规则

 

ADVERTISEMENT



ADVERTISEMENT



ADVERTISEMENT

ADVERTISEMENT


版权所有 © 1996-2023 Cari Internet Sdn Bhd (483575-W)|IPSERVERONE 提供云主机|广告刊登|关于我们|私隐权|免控|投诉|联络|脸书|佳礼资讯网

GMT+8, 8-1-2025 01:06 PM , Processed in 0.162659 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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