查看: 2375|回复: 33
|
IF里有多重OUTPUT会弄到SYSTEM不STABLE??
[复制链接]
|
|
这是小弟我令个PROJECT,是做交通灯的,A0到B7都会接去LED来代表交通灯的颜色,由於之后还要放7SEGMENT跟我需要准确的1秒时间所以我用TIMER INTERRUPT来做。
可是出现一个很奇怪的问题,就是当MAIN FUNCTION 的IF里只有一个OUTPUT时就没有问题,但是当我在IF里放很几个OUTPUT就有问题了,那OUTPUT的LED一直在闪然后TIMER不能走,我试了整个晚上都还解决不到,希望这里的大大帮忙。一下是我的CODE。
- #include <16F877A.h>
- #use delay(clock=1000000)
- #fuses XT,NOWDT,NOPROTECT,NOLVP
- #define ar PIN_A0
- #define ay PIN_A1
- #define ag PIN_A2
- #define br PIN_A3
- #define by PIN_A5
- #define bg PIN_B7
- #define cr PIN_B6
- #define cy PIN_B5
- #define cg PIN_B4
- #define dr PIN_B3
- #define dy PIN_B2
- #define dg PIN_B1
- int time, cnt=0, intflag=0;
- void main()
- {
- set_tris_b (0x00);
- set_tris_a (0x00);
- set_tris_d (0x00);
- output_a (0x00);
- output_b (0x00);
- output_d (0x00);
-
- setup_timer_1 (T1_INTERNAL|T1_DIV_BY_8);
- enable_interrupts(GLOBAL);
- enable_interrupts(INT_TIMER1);
- set_timer1(34286);
-
- while(1){
- do{
-
- time=23-cnt;
-
- if(time<=23&&time>=18){
- output_high(ag);
- output_high(br);
- output_high(cr);
- output_high(dr);
- }
-
- else if(time<=17&&time>=14){
- output_high(ay);
- output_high(br);
- output_high(cr);
- output_high(dr);
- }
-
- else{
- output_high(ar);
- output_high(br);
- output_high(cr);
- output_high(dr);
- }
-
- output_d (time);
-
- if(cnt>23){
- cnt=0;
- }
-
- intflag=0;
-
- }while(intflag==1); //end do
- } //end while
- } //end main
- #INT_TIMER1
- void timer1_interrupt ()
- {
- cnt=cnt+1;
-
- set_timer1(34286);
-
- intflag=1;
-
- }
复制代码
[ 本帖最后由 fritlizt 于 3-5-2009 12:42 PM 编辑 ] |
|
|
|
|
|
|
|
发表于 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一直在闪。 |
|
|
|
|
|
|
|
楼主 |
发表于 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就不能走。 |
|
|
|
|
|
|
|
发表于 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);
}
这样就没事 ...
- if (condition){
- output_high (PIN_A0);
- delay_us(1);
- output_high (PIN_A3);
- delay_us(1);
- output_high (PIN_B1);
- }
- else{
- output_high (PIN_A1);
- delay_us(1);
- output_high (PIN_B5);
- }
复制代码
试试这个。 |
|
|
|
|
|
|
|
楼主 |
发表于 4-5-2009 11:30 PM
|
显示全部楼层
回复 9# pic 的帖子
也是一样,不能。。 |
|
|
|
|
|
|
|
发表于 5-5-2009 08:46 AM
|
显示全部楼层
|
|
|
|
|
|
|
楼主 |
发表于 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里 ...
改成这个看看
- while(1){
- if (intflag==1){
-
- time=23-cnt;
-
- if(time<=23&&time>=18){
- output_high(ag);
- output_high(br);
- output_high(cr);
- output_high(dr);
- }
-
- else if(time<=17&&time>=14){
- output_high(ay);
- output_high(br);
- output_high(cr);
- output_high(dr);
- }
-
- else{
- output_high(ar);
- output_high(br);
- output_high(cr);
- output_high(dr);
- }
-
- output_d (time);
-
- if(cnt>23){
- cnt=0;
- }
-
- intflag=0;
-
- } //end if
- } //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都不能走。。 |
|
|
|
|
|
|
|
发表于 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
|
显示全部楼层
|
|
|
|
|
|
|
发表于 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时间。
|
|
|
|
|
|
|
| |
本周最热论坛帖子
|