搜索
bottom↓
回复: 78

如何解决万用表表棒碰引脚导致LGT复位问题?

[复制链接]

出0入0汤圆

发表于 2012-6-3 16:49:00 | 显示全部楼层 |阅读模式
本帖最后由 bozai 于 2012-6-4 14:34 编辑

---------------------------------------------
经logicgreen指点,polling方式会随机当机或者复位的问题和镊子碰引脚会导致系统复位没有联系。
当读端口时,不能直接写成诸如 PINA & 1<<PA0 之类的语句,而是先把PINA的值读到一个变量,再去判断变量的相应bit的值。
具体可参看LGT的programming guide中关于GPIO的描述。
---------------------------------------------

前几天做了个东西,有个功能可以用管脚电平变化中断来做,也可以不用中断在一个while循环里不停的检测引脚电平来实现。 奇怪的是,用中断做的看起来都正常,用polling的方式却出现随机当机或者复位,有点像是跑飞了。找不到原因,怀疑是板子焊的不好。有一次偶然发现用万用表量端口电压时,系统复位了。 再试,还有且概率很大。当时怀疑是不是自己超频导致的。

今天重新编译,把频率降到16M,发现没效果。 还是会复位。 在端口上加上5V的TVS(手里没有3.3的),还是会复位。 又重新换了个芯片,还是有问题。

于是我又找来demo板。 写了个hello world程序,然后一个while(1)循环检测某个PA0的输入电平,使用内部RC,工作在16MHz。烧到芯片里,接上电脑串口。开始测试。 用手摸没问题。 用不锈钢镊子碰PA0,发现系统立马复位打印出hello world,而且复位很多次。
然后又把检测PA0的代码去掉,直接while(1); 什么都不干。看会不会复位,结果还是会。
把所有端口上拉打开,再试还是会复位。
直接用镊子碰地,不碰IO 也会复位。

又找来一个之前我已经做好的一个小东西,用xmodem烧写spi flash的。 这个板子芯片已经被我用热熔胶封死了,只留有ISP接口,芯片是工作在内部RC,并且被校准到14.7MHz。通上电,用镊子碰引出的ISP引脚,除了碰reset,其它引脚都不会复位。这个板子跟我的另一个板子和demo板比,IO口的线很短,整个板子才2cm*4cm.

想到是不是demo板电源不好,于是又在芯片gnd 和 vcc引脚之间加了0.1uf的电容和10uf电解电容,结果还是会复位,但是复位几率下降了很多。(碰GND是不会复位了,之前的太夸张了)  

看起来是板子的问题。可以试了一下午都没有解决。我做的两个板子和demo都是用LDO供电,LDO输入输出都会并一个10uf钽电容,和0.1uf的电容。 这种接法应该没问题才是。

大家有碰到这个问题么? 可否帮忙试下你那是否也有这个问题? (难道是我身上的电太强了。。。)

附上测试程序, 烧进去,如果碰引脚串口会显示hello world就代表复位了。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

发表于 2012-6-3 17:17:17 | 显示全部楼层
LDO之前是什么样的电源很关键。

出0入0汤圆

 楼主| 发表于 2012-6-3 17:19:31 | 显示全部楼层
bg6ixm 发表于 2012-6-3 17:17
LDO之前是什么样的电源很关键。

demo板是自用LM317做的可调电源。
我自己的那块板子是USB供电的
那块不会复位的板子,用的电源和demo板一样。

出0入0汤圆

发表于 2012-6-3 17:26:20 | 显示全部楼层
看看你的电源接地是否良好,简单办法是用万用表交流电压档,一只表笔接板子电源或地都行,手捏另一只表笔,接地好的最多几伏电压,没接地的尤其开关电源,几十伏都可能。或者改用电池供电试试。

出0入0汤圆

 楼主| 发表于 2012-6-3 17:44:16 | 显示全部楼层
elecboy 发表于 2012-6-3 17:26
看看你的电源接地是否良好,简单办法是用万用表交流电压档,一只表笔接板子电源或地都行,手捏另一只表笔, ...

谢谢! 这个主要不是接地的问题。 即使接地了,人体没有接地也会导致复位的。 电源没有接地。只要一只手碰板子的地,另一只手拿镊子碰IO 也不会出现问题。

出0入0汤圆

发表于 2012-6-3 18:37:01 | 显示全部楼层
芯片的复位电路怎么接的?是悬空的还是接VCC?
如果是悬空的,建议直接接VCC测试一下。

出0入0汤圆

 楼主| 发表于 2012-6-3 19:01:31 | 显示全部楼层
inter_zhou 发表于 2012-6-3 18:37
芯片的复位电路怎么接的?是悬空的还是接VCC?
如果是悬空的,建议直接接VCC测试一下。 ...

谢谢!
试过,不行的

出0入0汤圆

发表于 2012-6-3 20:40:30 | 显示全部楼层
LZ读端口建议用IN W,PINA

再判断W,因为LGT读IO是异步的,所以用IN指令同步一下试试。

出0入0汤圆

 楼主| 发表于 2012-6-4 14:27:57 | 显示全部楼层
logicgreen 发表于 2012-6-3 20:40
LZ读端口建议用IN W,PINA

再判断W,因为LGT读IO是异步的,所以用IN指令同步一下试试。 ...

谢谢!
听了你的建议,把那段代码,读IO的地方先读到一个寄存器,然后用sbrc/sbrs指令,而不是直接sbic/sbis。 这样居然就解决了最早困惑我的问题。 不用中断方式也很稳定,而且试了很多次都不会出现程序复位的问题。 但是一旦换成sbic/sbis来做就有问题。
由于在C里把变量用volatile 生命会导致出来的代码效率很糟,所以直接用汇编写了段代码来实现。 代码见下面。
  1. .globl infiniteRun
  2. infiniteRun:

  3.         in        r24, PINA
  4.         lds        r25, pinMask
  5.         and        r24, r25
  6.         cp        r25, r24
  7.         breq        infiniteRun1
  8.         cbi        PORTD, PD1
  9.         rjmp infiniteRun2
  10.        
  11. infiniteRun1:       
  12.         sbi        PORTD, PD1

  13. infiniteRun2:
  14. #ifdef NO_SBISC
  15.         in        r24, PIND
  16.         sbrs        r24, PD0
  17. #else
  18.         sbis        PIND, PD0
  19. #endif
  20.         rjmp        infiniteRun3

  21.         in        r24, PORTA
  22.         lds        r25, pinMask
  23.         or        r24, r25
  24.         out        PORTA, r24
  25.         rjmp infiniteRun

  26. infiniteRun3:
  27.         in        r24, PORTA
  28.         lds        r25, pinMaskInv
  29.         and        r24, r25
  30.         out        PORTA, r24
  31.         rjmp infiniteRun
复制代码
上面的代码,一旦宏NO_SBISC 没有定义,进入这个死循环后,工作一阵子后系统就会复位或者死机。

很奇怪,为什么在这段代码里用sbis会导致系统复位?
另外系统中还有其他地方,比如读按键状态,最终也会翻译成sbis/sbic。 这些地方用这个会不会也会导致异常呢?
如果都需要改岂不是有很多地方都得换。C语言里就不能用 PINA & 1<<PA0 之类的语句了。

(不过这个问题解决了,也证明我那段工作异常的代码 跟镊子碰引脚会引起系统复位没有关系,至少还是可以安心使用了。)

出0入618汤圆

发表于 2012-6-4 14:33:46 | 显示全部楼层
logicgreen 发表于 2012-6-3 20:40
LZ读端口建议用IN W,PINA

再判断W,因为LGT读IO是异步的,所以用IN指令同步一下试试。 ...

异步不会造成复位的吧?

出0入0汤圆

 楼主| 发表于 2012-6-4 14:42:54 | 显示全部楼层
gzhuli 发表于 2012-6-4 14:33
异步不会造成复位的吧?

是啊, 即使端口电平状态不对,顶多也就是误判而已。

但是从我的实验看,一旦把那个宏去掉就出问题了。难道是sbic sbis这两条指令存在缺陷?

出0入0汤圆

发表于 2012-6-4 15:25:53 | 显示全部楼层
看来处理按键的时候要小心了。

出0入0汤圆

发表于 2012-6-4 15:54:41 | 显示全部楼层
关注。指令的问题?

出0入0汤圆

发表于 2012-6-5 00:26:27 | 显示全部楼层
主要是针对IO缓慢电平变化的情况不要用异步读IO,SBIC,SBIS。IO的固定电平的判断是可以用的。

出0入0汤圆

发表于 2012-6-5 06:01:30 | 显示全部楼层
多谢波仔,这个得严重标记......。

出0入0汤圆

发表于 2012-6-5 06:03:14 | 显示全部楼层
logicgreen 发表于 2012-6-5 00:26
主要是针对IO缓慢电平变化的情况不要用异步读IO,SBIC,SBIS。IO的固定电平的判断是可以用的。 ...

这个能改进吗?要不然非常多的人会出错,致使软件随机性出问题。

出0入0汤圆

发表于 2012-6-5 06:59:36 | 显示全部楼层
貌似avr读io都不需要这样吧?貌似老妖怪的单片机io也不怎么正常,要有个delay的!

出0入0汤圆

 楼主| 发表于 2012-6-5 09:12:36 | 显示全部楼层
关于sbic/sbis会引起复位我猜想可能原因是:

由于端口异步设计,直接反应端口值。 sbic/sbis指令直接依靠端口电平来判断PC指针该加多少。 不巧的是在判决PC指针该加多少的时候,端口电平变化了。对应于ALU内的电平也变化了。这个电平的变化需要一个时间,中间有一段不稳定期,输出值不确定。然后PC值就加了不确定的值,程序就飞了。

【以上内容纯属猜想】

出0入0汤圆

发表于 2012-6-6 14:01:21 | 显示全部楼层
标记一下

出0入0汤圆

发表于 2012-6-6 15:11:31 | 显示全部楼层
如果是电池供电,应该会好很多,如果是AC-DC电源,就不奇怪.

出0入0汤圆

发表于 2012-6-6 15:15:05 | 显示全部楼层
国产MCU看来还是有很长的路要走的.

出0入0汤圆

发表于 2012-6-6 15:33:00 | 显示全部楼层
bozai 发表于 2012-6-5 09:12
关于sbic/sbis会引起复位我猜想可能原因是:

由于端口异步设计,直接反应端口值。 sbic/sbis指令直接依靠 ...

仁兄猜想的有点道理。

出0入10汤圆

发表于 2012-6-6 16:25:18 | 显示全部楼层
这个幸亏发现得早。。。。。。

出0入0汤圆

发表于 2012-6-6 19:48:52 | 显示全部楼层
哎。心凉了一截。

出0入0汤圆

发表于 2012-6-6 20:01:19 | 显示全部楼层
logicgreen 发表于 2012-6-6 15:33
仁兄猜想的有点道理。

不会啊,这部分应该是数字信号,不是0就是1,顶多判断错误,跑错分支,不该跑飞啊

出0入0汤圆

发表于 2012-6-6 20:34:23 | 显示全部楼层
sf49ers 发表于 2012-6-6 20:01
不会啊,这部分应该是数字信号,不是0就是1,顶多判断错误,跑错分支,不该跑飞啊 ...

0到1有个变化的过程。

出0入0汤圆

发表于 2012-6-6 20:43:53 | 显示全部楼层
lyyyuna 发表于 2012-6-6 19:48
哎。心凉了一截。

不会影响使用。即使加了IN指令,对IO的判断速度还是很快的。

出0入0汤圆

 楼主| 发表于 2012-6-6 21:27:10 | 显示全部楼层
本帖最后由 bozai 于 2012-6-6 21:28 编辑

刚才写了个小程序,验证复位这个问题。 证实复位问题果然存在。

程序刚开始运行会大有 hello world! test2
然后一个while循环不停检测PB0的按键输入。有按键则会打印字符a 刚开始接了个按键,按了好久才出现一次复位。
后来我干脆接一个有源晶振,把晶振输出接到PB0上。 然后按复位键。这是现象很明显。 2秒钟内程序最终必死,中间可能会有几次复位。

程序附上:
下面图这是我的板子,demo板加一个6M有源晶振。
还有按一次复位键console上的结果。可以看到有多次复位,并且最终挂住了:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入22汤圆

发表于 2012-6-6 21:33:35 | 显示全部楼层
关注,那如果用C的话,应该如何处理这样的读取io的操作?

出0入0汤圆

发表于 2012-6-6 23:09:53 | 显示全部楼层
证实复位问题果然存在


what if you read the port into ram and then test its bits?

Why would the chip be so easily reset?

出0入0汤圆

发表于 2012-6-6 23:11:44 | 显示全部楼层
what will happen if the same code is run on a comparable avr?

出0入0汤圆

发表于 2012-6-6 23:59:23 | 显示全部楼层
bozai 发表于 2012-6-6 21:27
刚才写了个小程序,验证复位这个问题。 证实复位问题果然存在。

程序刚开始运行会大有 hello world! test2 ...

还是用SBIC,SBIS指令?

出0入169汤圆

发表于 2012-6-7 00:23:43 | 显示全部楼层
问题看来有点严峻,关注。

出0入0汤圆

发表于 2012-6-7 00:29:49 | 显示全部楼层
logicgreen 发表于 2012-6-6 23:59
还是用SBIC,SBIS指令?

是的,看了汇编程序,还是用SBIC
按键没有去抖动,我测的时候,PB0一接地,输出全是'X',奇怪

这是他的main
int main(void)
{
        PMCR |= _BV(CFDS);

        CLKPR = _BV(CLKPCE);
        CLKPR = _BV(CLKPCE); /* Set main clock to 16M */

        OSCCAL = 0x06;       

        Uart_Init(115200);

        UART_SendStrP(PSTR("\nhello world! test2\n"));
       
        KEY_DDR &= ~(1<<KEY_BIT);
        KEY_PORT |= 1<<KEY_BIT;

        while(1)
        {
                if(!GETKEY)
                        UART_SendByte('a');       
        }

        return 0;
}

出0入169汤圆

发表于 2012-6-7 00:39:46 | 显示全部楼层
试了下,问题确实有点严重啊,随意用镊子碰下就挂了,无论配置成输入或是输出。

出0入169汤圆

发表于 2012-6-7 00:47:43 | 显示全部楼层
甚至剪了一节两厘米长的带皮导线(手执绝缘皮),触碰任意引脚都会复位。
没有检测按键。

出0入0汤圆

发表于 2012-6-7 00:58:25 | 显示全部楼层
继续测试
1,波特率改为9600,能够稳定输出'a'
2,PB0加1khz方波,没有出现复位
3,PB0加到1Mhz方波,频繁复位
4,波特率降到1200,依然会复位
5,方波再降到1k,测试了50k数据,没有复位

总结,因为对AVR不是很熟悉,只能说下大体感觉
复位应该和串口通讯有关,UART部分不了解,把原程序附后面,有经验的看看
还有,他的这个测试程序写的很简单,并不十分严谨,不适合作为一个测试程序
void UART_SendByte(unsigned char data)
{/*sending frame with 5 to 8 data bit*/
        loop_until_bit_is_set(UCSR0A,UDRE0);//while( !(UCSRA & (1<<UDRE)) );// 查询发送寄存器是否为空
        UDR0 = data;
}

出0入0汤圆

发表于 2012-6-7 04:06:23 | 显示全部楼层
datasheet有关IO那里也说了这个问题,这种情况不要使用SBIC,SBIS指令,我们内部很久以前有测试到这个问题。在1.3的datasheet里早已有说明了。

出0入0汤圆

发表于 2012-6-7 04:28:30 | 显示全部楼层
这种情况不要使用SBIC,SBIS指令


that's a valid get-around if you are coding in assembly. what if you are coding in a high-level language like C?

出0入0汤圆

 楼主| 发表于 2012-6-7 07:08:11 | 显示全部楼层
本帖最后由 bozai 于 2012-6-7 07:09 编辑
millwood0 发表于 2012-6-7 04:28
that's a valid get-around if you are coding in assembly. what if you are coding in a high-level la ...


采用内嵌汇编的方式可以达到效果。 编译出来的只要两条指令。 手册上给的方法不好,编译出来会多两条指令。编译器会先把PIN的值读到通用寄存器,再把通用寄存器数据存到ram里,然后再从ram里把数据读到通用寄存器,然后采用sbrc/sbis 。

如果把code写成这样就可以了
  1. inline unsigned char LGT_PINB()
  2. {
  3.         register unsigned char temp asm("r24");
  4.         temp=PINB;
  5.         asm volatile ("" : "+r"(temp));
  6.         return temp;       
  7. }

  8. #define KEY_DDR                DDRB
  9. #define KEY_PORT        PORTB
  10. //#define KEY_PIN                PINB
  11. #define KEY_PIN                LGT_PINB()
  12. #define KEY_BIT                PB0
  13. #define GETKEY                (KEY_PIN & (1<<KEY_BIT))
复制代码
反汇编出的结果:

  1. inline unsigned char LGT_PINB()
  2. {
  3.         register unsigned char temp asm("r24");
  4.         temp=PINB;
  5. 23a:        83 b1               in        r24, 0x03        ; 3
  6.         KEY_DDR &= ~(1<<KEY_BIT);
  7.         KEY_PORT |= 1<<KEY_BIT;

  8.         while(1)
  9.         {
  10.                 if(!GETKEY)
  11. 23c:        80 fd               sbrc        r24, 0
  12. 23e:        fd cf               rjmp        .-6              ; 0x23a <main+0x32>
  13.                         UART_SendByte('a');       
  14. 240:        81 e6               ldi        r24, 0x61        ; 97
  15. 242:        0e 94 a5 00         call        0x14a        ; 0x14a <UART_SendByte>
  16. 246:        f9 cf               rjmp        .-14             ; 0x23a <main+0x32>
复制代码

出0入0汤圆

 楼主| 发表于 2012-6-7 07:14:08 | 显示全部楼层
logicgreen 发表于 2012-6-7 04:06
datasheet有关IO那里也说了这个问题,这种情况不要使用SBIC,SBIS指令,我们内部很久以前有测试到这个问题 ...

手册上这样写:
  1. 考虑到软件能够及时获得端口信号的变化, PINA/B/C/D输入为异步设计,直接反应端口的状态。但这样的做法也同时带来了一些信号同步的问题。建议用户在直接使用端口状态进行程序流程控制时,采用必要的软件滤波算法。 同时也避免直接使用PINA/B/C/D寄存器的值进行程序流程控制,而是首先使用IN指令将其读到内部寄存器,然后使用寄存器的值作后续处理。下面将给出建议的使用端口作为程序流程控制的代码
复制代码
也许我理解力不行,我没能看出直接用会造成什么问题。因为里面用了“建议” 一词,我还以为不会造成多大的问题的。
最好直接写明 会造成系统复位,程序跑飞。 这样别人看了就知道不能直接用。

出0入0汤圆

发表于 2012-6-7 07:15:00 | 显示全部楼层
如果把code写成这样就可以了


how do you know that R24 (or any other registers) isn't being used by the compiler for something else?

to be safe, you probably have to push/pop them.

that's a pain.

出0入0汤圆

 楼主| 发表于 2012-6-7 07:16:46 | 显示全部楼层
本帖最后由 bozai 于 2012-6-7 07:19 编辑

重复发了,删除

出0入0汤圆

发表于 2012-6-7 07:21:49 | 显示全部楼层
如果直接写会造成系统复位,程序跑飞,


regardless of if the ports are asynchronous or not, it is not clear via what mechanism reading from / writing to them would trigger a reset.

出0入0汤圆

 楼主| 发表于 2012-6-7 07:23:35 | 显示全部楼层
millwood0 发表于 2012-6-7 07:15
how do you know that R24 (or any other registers) isn't being used by the compiler for something e ...

这个编译器应该会去检查的吧。
不指定r24也可以
  1. inline unsigned char LGT_PINB()
  2. {
  3.         register unsigned char temp;
  4.         temp=PINB;
  5.         asm volatile ("" : "+r"(temp));
  6.         return temp;       
  7. }

  8. #define KEY_DDR                DDRB
  9. #define KEY_PORT        PORTB
  10. //#define KEY_PIN                PINB
  11. #define KEY_PIN                LGT_PINB()
  12. #define KEY_BIT                PB0
  13. #define GETKEY                (KEY_PIN & (1<<KEY_BIT))
复制代码
编译出来的效果也是一样的。
  1. inline unsigned char LGT_PINB()
  2. {
  3.         register unsigned char temp;
  4.         temp=PINB;
  5. 23a:        83 b1               in        r24, 0x03        ; 3
  6.         KEY_DDR &= ~(1<<KEY_BIT);
  7.         KEY_PORT |= 1<<KEY_BIT;

  8.         while(1)
  9.         {
  10.                 if(!GETKEY)
  11. 23c:        80 fd               sbrc        r24, 0
  12. 23e:        fd cf               rjmp        .-6              ; 0x23a <main+0x32>
  13.                         UART_SendByte('a');       
  14. 240:        81 e6               ldi        r24, 0x61        ; 97
  15. 242:        0e 94 a5 00         call        0x14a        ; 0x14a <UART_SendByte>
  16. 246:        f9 cf               rjmp        .-14             ; 0x23a <main+0x32>
复制代码

出0入0汤圆

发表于 2012-6-7 08:23:12 | 显示全部楼层
bozai 发表于 2012-6-7 07:08
采用内嵌汇编的方式可以达到效果。 编译出来的只要两条指令。 手册上给的方法不好,编译出来会多两条指令 ...

感谢bozai给出代码

出0入0汤圆

发表于 2012-6-7 10:38:49 | 显示全部楼层
bozai 发表于 2012-6-7 07:23
这个编译器应该会去检查的吧。
不指定r24也可以编译出来的效果也是一样的。 ...

原来AVR嵌入汇编是这么写法
用了你的程序,测试1Mhz方波没有复位
后来又测了6MHZ方波和正弦波,都没有问题
看来这是以后读IO的标准程序,多谢

出0入0汤圆

 楼主| 发表于 2012-6-7 12:25:48 | 显示全部楼层
lxvtag 发表于 2012-6-7 00:47
甚至剪了一节两厘米长的带皮导线(手执绝缘皮),触碰任意引脚都会复位。
没有检测按键。 ...

看来抗干扰能有有限啊。 不知道PCB做好点能不能解决问题。

出0入0汤圆

 楼主| 发表于 2012-6-7 12:29:49 | 显示全部楼层
sf49ers 发表于 2012-6-7 10:38
原来AVR嵌入汇编是这么写法
用了你的程序,测试1Mhz方波没有复位
后来又测了6MHZ方波和正弦波,都没有问 ...

多谢参与测试

出0入169汤圆

发表于 2012-6-7 12:53:30 | 显示全部楼层
读端口问题现在姑且不论,这个复位问题着实严重啊。

我的程序根本没有读端口,仅仅是在程序开始点亮LED,用金属随意触碰一个引脚几乎100%复位。

采用其他电源(原用笔记本USB),情况有很大改善。

出0入0汤圆

发表于 2012-6-7 13:01:33 | 显示全部楼层
我想知道使用ATMEL的AVR会不会出现上述问题?貌似对输入信号不作同步不是很合理的。

出0入0汤圆

 楼主| 发表于 2012-6-7 13:08:51 | 显示全部楼层
lupa 发表于 2012-6-7 13:01
我想知道使用ATMEL的AVR会不会出现上述问题?貌似对输入信号不作同步不是很合理的。 ...

这个目前不好比,环境不同。比出的东西没有参考意义。

我有用LGT做的很小的东西,引线都很短,碰了不会复位
demo板还有另一个自制的板子就会复位。
我试过以前用的AVR的板子,碰IO不会复位,碰reset会,那个板子reset没有接上拉。
以上三个都是用同一个电源。

所以这个不好说。

貌似对输入信号不作同步不是很合理的


这个主要是为了优化指令,LGT的只要一个时钟周期的。并且这个指令并不是只对外部IO口操作的,内部的也可以。 主要是为了提高内部的操作速度。外部的就出现了这个问题。需要手动同步。 运行速度跟AVR的相同,但是会多2Byte的程序空间。

出0入0汤圆

发表于 2012-6-10 23:16:36 | 显示全部楼层
logicgreen 发表于 2012-6-6 15:33
仁兄猜想的有点道理。

难道会多次读取接口的值?
给PC赋值的时候,怎么都会是同步的操作吧?
总应该只取决于一瞬间的值,不会把地址累加多次

期待LGT团队给出真实的原因,还有这个bug一定要改掉

出0入0汤圆

发表于 2012-6-10 23:22:23 | 显示全部楼层
lyyyuna 发表于 2012-6-6 20:34
0到1有个变化的过程。

对于数字信号来说,变化的过程就是不定态,但还是只有0和1,只是不知道是0还是1,所以还是应该跑错分支,而不是触发复位

出0入0汤圆

 楼主| 发表于 2012-6-11 09:57:34 | 显示全部楼层
xiaobenyi 发表于 2012-6-10 23:22
对于数字信号来说,变化的过程就是不定态,但还是只有0和1,只是不知道是0还是1,所以还是应该跑错分支, ...

但是PC指针的位宽不止一位啊。出问题时相当于加了一个16bit随机数。

出0入17汤圆

发表于 2012-6-11 10:37:31 | 显示全部楼层
期待有片子的多实验,找到干扰复位的原因和解决方法。。。发现问题,解决问题。

出0入0汤圆

发表于 2012-6-11 11:09:53 | 显示全部楼层
bozai 发表于 2012-6-11 09:57
但是PC指针的位宽不止一位啊。出问题时相当于加了一个16bit随机数。

也不应该是随机数,一个0~1变化过程中的变量,经过几个反相器缓冲之后,变化过程是非常非常陡的,所以还是二选一,而不会导致PC指针的地址加的16位都变成不定态

出0入618汤圆

发表于 2012-6-11 11:20:38 | 显示全部楼层
bozai 发表于 2012-6-11 09:57
但是PC指针的位宽不止一位啊。出问题时相当于加了一个16bit随机数。

估计不是这个原因,而是因为流水线的关系,当判断为跳转时,流水线预加载PC+2的指令,然后第二个周期PC才真正变化,如果这时状态改变,PC=PC+1,流水线加载的指令跟PC不一致,到下一条指令就很可能是非法指令了。

出0入0汤圆

 楼主| 发表于 2012-6-11 12:15:24 | 显示全部楼层
gzhuli 发表于 2012-6-11 11:20
估计不是这个原因,而是因为流水线的关系,当判断为跳转时,流水线预加载PC+2的指令,然后第二个周期PC才 ...

这个解释很合适,要是有仿真器说不定可以单步调试出来。

出0入17汤圆

发表于 2012-6-20 11:15:16 | 显示全部楼层
lxvtag 发表于 2012-6-7 12:53
读端口问题现在姑且不论,这个复位问题着实严重啊。

我的程序根本没有读端口,仅仅是在程序开始点亮LED, ...

请问,LGT受干扰复位的问题解决了吗,软件或硬件需要加什么保护呢。。。。

出0入169汤圆

发表于 2012-6-20 15:28:32 | 显示全部楼层
HZKJ 发表于 2012-6-20 11:15
请问,LGT受干扰复位的问题解决了吗,软件或硬件需要加什么保护呢。。。。 ...

没有,换用质量好的电源情况有较大改善。

出0入0汤圆

发表于 2013-6-16 00:20:56 | 显示全部楼层
记录下,,现在也是遇到读PIN死机的情况。

出0入8汤圆

发表于 2013-6-16 14:05:36 | 显示全部楼层
在复位端接一个104电容试试,我也遇到过这个问题,在相关管脚加滤波后解决。

出0入0汤圆

发表于 2013-6-18 23:47:11 | 显示全部楼层
今天客户打电话说做出去的机器工作出现异常,心凉了一截,等明天收到机器再分析

出0入0汤圆

发表于 2013-6-20 01:06:35 | 显示全部楼层
明天记得来发帖啊

出0入0汤圆

发表于 2013-6-20 23:41:47 | 显示全部楼层
这个问题原厂还没有解决吗?期待芯片硬件解决的消息。我还想用这个CPU呢。

出0入0汤圆

发表于 2013-6-21 16:30:53 | 显示全部楼层
结果出来了,跟大家报告下,我的问题跟楼主不一样,是继电器吸合导致LGT芯片复位,网上也有很多人提出继电器吸合导致单片机复位的问题,由于电路板做了好几千,最好有简单方法解决,各位有没有高招啊。
原厂工程师也外出了,说明天看看,要在芯片上加屏蔽外壳看能不能解决问题,感觉这个芯片抗干扰能力不强啊,同样的电路STC,ST,SAMSUNG,现代的单片机都没有这个问题。

出0入0汤圆

发表于 2013-6-22 16:17:34 | 显示全部楼层
hameyou 发表于 2013-6-22 12:50
不是吧,诸位,我做的闸机控制器,里面用了12V的继电器2个,用来控制24V的电磁铁,频繁使用,没出现复位的 ...

我串一个电阻后通过三极管控制继电器的,你的用什么?

出0入0汤圆

发表于 2013-6-22 17:20:20 | 显示全部楼层
wcg6268 发表于 2013-6-21 16:30
结果出来了,跟大家报告下,我的问题跟楼主不一样,是继电器吸合导致LGT芯片复位,网上也有很多人提出继电 ...

RST上拉1K。
电源并10u

出0入0汤圆

发表于 2013-6-22 18:14:20 | 显示全部楼层
xwkm 发表于 2013-6-22 17:20
RST上拉1K。
电源并10u

我的RST上拉10K,0.1UF到地,电源上也有10U电容,加了100UF也没用

出0入0汤圆

发表于 2013-6-22 18:16:40 | 显示全部楼层
wcg6268 发表于 2013-6-22 18:14
我的RST上拉10K,0.1UF到地,电源上也有10U电容,加了100UF也没用


RST上拉小一点。500R~1K试试。
操作IO口不要直接sbic。用IN+sbrs。具体我记得我改了一个
http://www.amobbs.com/thread-5514436-1-1.html

出0入0汤圆

发表于 2013-6-22 19:26:00 | 显示全部楼层
我也遇到这个问题了。

出0入0汤圆

发表于 2013-6-22 20:23:51 | 显示全部楼层
xwkm 发表于 2013-6-22 18:16
RST上拉小一点。500R~1K试试。
操作IO口不要直接sbic。用IN+sbrs。具体我记得我改了一个
http://www.amob ...

我是用的你这个

出0入0汤圆

发表于 2013-6-22 20:56:11 | 显示全部楼层
wcg6268 发表于 2013-6-21 16:30
结果出来了,跟大家报告下,我的问题跟楼主不一样,是继电器吸合导致LGT芯片复位,网上也有很多人提出继电 ...

通常继电器带的负载和采用消除电火花的办法:

1.阻性负载
用压敏电阻并联在负载的两端。
2.感性负载
用RC串联再并联在负载的两端。

有两个好处,一个是延长了继电器的寿命,再一个是消除电火花对外部的电器和系统的冲击。

出0入0汤圆

发表于 2013-6-24 04:02:23 | 显示全部楼层
看到这个帖子,都有点不敢用了,原本是打算用08A做量产产品.
我现在拿到LGT的样品,用万能板摆了个最小系统,控制LED发光,也遇到这个复位的问题,压根就没读IO口的程序,我该如何处理?
我的现像是除碰GND脚,碰其它脚都有复位的可能,08A的复位脚与VCC共用,我直接接+5V,没做其它处理.我提出的问题在另一个帖子,我是发了那个帖子,才看到这个帖子的存在.
http://www.amobbs.com/thread-5539533-1-1.html

出0入0汤圆

发表于 2013-6-24 16:40:37 | 显示全部楼层
sballbobo 发表于 2013-6-24 04:02
看到这个帖子,都有点不敢用了,原本是打算用08A做量产产品.
我现在拿到LGT的样品,用万能板摆了个最小系统,控 ...

1. 你说这个应该是8脚封装的08A, 8脚封装本身做特殊用途, 所以RST脚和VCC封装到一起
2. 08A是3.3V的工艺,是不能直接上5V的, 8脚封装的08A你只能接3.6V以下的供电
3. 因为8脚封装的RST和VCC封装到一起,一定要在靠近VCC引脚的地方加滤波电容
4. 只要写程序前按照编程手册上说明的方式处理直接根据I/O状态跳转,就不会出现复位问题。

出0入0汤圆

发表于 2013-6-24 23:26:12 | 显示全部楼层
LGT 发表于 2013-6-24 16:40
1. 你说这个应该是8脚封装的08A, 8脚封装本身做特殊用途, 所以RST脚和VCC封装到一起
2. 08A是3.3V的工 ...

3.3V吗?没注意看手册,明天用3.3V试试。不过为什么不推出5V的版本?5V在一般功能板上也是比较常用的啊。

复位的那个问题我也遇到,我的测试程序现在是完全没读IO口的,全是输出点LED用而已。现在IO口复位的问题暂时没见到,但碰VCC引脚会有复位的现像。明天直接在芯片引脚上并104试试。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-25 19:33

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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