我正试图搞砸一些电子产品,到目前为止还喜欢它!使用PIC16f1824获得PICKit 2进行编码。我有一个面包板,有一些LED,电线和超声波传感器。传感器有2个引脚,1个用于触发,1个用于回声。这是我的汇编代码,但它不起作用。红色LED根本没有点亮:S
据我所知,面包板正常工作,所有连接都正确连接。我已经测试过只需打开和关闭LED。
#include CBLOCK 0x70 ; DEFINE VARIABLES USED d1 d2 d3 d4 Count ENDC ORG 0x00 ;RESET VECTOR BANKSEL TRISA movlw b'00000010' ;Setting all but RA1 to output, RA1 is input movwf TRISA MAINLOOP CALL TRIG ;short burst to trigger pin GOTO COUNT ;cout untill a signal is received MLOOP GOTO COUNTCHECK ;RA1, or echo, receives a signal, check how far GOTO MAINLOOP TRIG CLRF Count BANKSEL LATA BSF LATA,0 ;trigger signal on CALL Delay BCF LATA,0 ;trigger signal off RETURN COUNT INCF Count,1 ;increase by 1 CALL Delay ;delay 0.001 seconds BANKSEL PORTA BTFSS PORTA,1 ;checking if RA1 has recevied anything GOTO COUNT ;loops GOTO MLOOP ;RA1 received, go to main loop middle COUNTCHECK movlw d'6' ;gives w a value of 6 ;movf Count,w ; subwf Count,w ;count - w BTFSC STATUS,C ;cheking c, is anything borrowed from w(nagative result) C is 0, nothing borrowed C is 1 ;if result is 0, Z is 1(set), negative or positive is 0(clear) GOTO REDLED ;turn on red led, Count is less than w(6) which means the obstacle is 1 meter away GOTO GREENLED ;Count is larger than w(6), took more than 0.6 seconds before echo return, which means more than 1 meter away REDLED BANKSEL LATA BCF LATA,3 ;turn off red led BSF LATA,2 ;turn on green led GOTO MAINLOOP ;go back to main loop, new trigger GREENLED BANKSEL LATA BCF LATA,2 ;turn off green led BSF LATA,3 ;turn on red led GOTO MAINLOOP ;go back to main loop, new trigger Delay ;1 millisecond, 0.001 seconds ;993 cycles movlw 0xC6 movwf d1 movlw 0x01 movwf d2 Delay_0 decfsz d1, f goto $+2 decfsz d2, f goto Delay_0 ;3 cycles goto $+1 nop ;4 cycles (including call) return END
答案 0 :(得分:0)
我建议你先修改示例代码。 链接在这里: http://www.microchip.com/DevelopmentTools/ProductDetails.aspx?PartNO=dm164130-9 有一个链接“PICkit 3入门套件源代码”,其中包含许多汇编程序和C中的示例。
答案 1 :(得分:0)
我对PIC很新,所以我不知道我的帮助是否有用。
我认为命令BTFSC,Status,C意味着如果STATUS,C为0,则跳过下一个命令GOTO REDLED,即如果Count-w的结果为正。但是,有一些事情让我感到震惊。 如果它是7或更大(忽略0条件),则计数将是正数,但如果总延迟超过0.007秒,则这将是7或更大,因为延迟是0.001秒延迟。根据你的评论,不是0.6秒。这会对您的预期接近阈值产生影响。
只有在Count-w的结果为负时才会调用GOTO REDLED,这需要Count不超过5(延迟0.005秒)。
此外,您在GOTO REDLED命令旁边的注释表明这会打开红色LED,但子程序REDLED似乎会关闭红色LED。
我不知道使用Watch窗口和特殊功能寄存器窗口进行调试是否会有所帮助,因为我之前没有通过实时端口监控程序进行操作。
但是,我认为它是一段很有吸引力的代码,通过它很有趣。对不起,如果我无法给出明确的答案。
答案 2 :(得分:0)
对不起,还应该提到: 我不确定是什么 ; movf Count,w;
Countcheck中的是为了,但我假设它是故意注释掉的。 一切顺利 - 我希望你能让它发挥作用。这听起来像一个有趣的项目。 马特