我正在尝试做一些微控制器练习,我有点像n00b,如果这太明显就很抱歉。
基本上我们所拥有的是PIC16F877A,其连接按钮连接到RC4和RC5上的PORTC,配置为输入。我们的想法是使用RC5激活中断并等待TMR0中断来激活蜂鸣器(我们现在正在使用LED)。然后,RC4必须停用中断并停止蜂鸣器/ LED(连接在RC0,配置为输出)。
我们制作了我们的程序,它在MPLAB上运行得很好,但是我们遇到了让它在真实场景上运行的问题。
这是该计划:
list p=16f877a
include "p16f877a.inc"
__CONFIG _CP_OFF & _DEBUG_OFF & _WRT_OFF & _CPD_OFF & _LVP_OFF & _BODEN_OFF & _PWRTE_ON & _WDT_OFF & _HS_OSC
DELH EQU 0x2C
DELL EQU 0x2F
DELI EQU 0x2E
ORG 0x00
GOTO MAIN
ORG 0x04
GOTO INTERRUMPE
MAIN BCF STATUS,RP0
BCF STATUS,RP1
CLRF PORTC
CLRF PORTB
BSF STATUS,RP0
MOVWF 0xF0
MOVWF TRISC
MOVWF 0x00
MOVWF TRISB
MOVLW 0x83
MOVWF OPTION_REG
BCF STATUS,RP0
TECLA BTFSS PORTC,5
GOTO TECLA
MOVLW 0xB8
MOVWF INTCON
MOVLW 0x63
MOVWF TMR0
TECLA2 BTFSS PORTC,4
GOTO TECLA2
BCF INTCON,7
BCF PORTC,0
GOTO TECLA
INTERRUMPE BTFSS INTCON,2
GOTO REGRESO
BSF PORTC,0
MOVLW 0xBF
MOVWF TMR0
BCF INTCON,T0IF
REGRESO RETFIE
END
我们必须遵循最低系统:
在我们将振荡器从4Mhz改为12Mhz之前它没有做任何事情。使用12 Mhz振荡器它有点工作,但有点疯狂。我们也尝试了20Mhz,但它也没有很好地工作。 我们甚至尝试了不同的配置词,但我们没有得到任何好的结果。
请帮助,我有点绝望。
答案 0 :(得分:0)
首先,代码
MOVWF 0xF0
MOVWF TRISC
MOVWF 0x00
MOVWF TRISB
没有做它应该做的事情,MOVWF将工作寄存器的内容移动到GPR或SFR或其地址,所以你正在做的是填充地址0xF0(一个GPR)和0x00(间接寻址)寄存器)具有工作寄存器的未知值。相反,您的代码应该以
开头 MOVLW 0xF0
MOVWF TRISC
MOVLW 0x00
MOVWF TRISB
此外,如果RC4和RC4输入是按钮或开关,请考虑在HW或SW中实施去抖动解决方案
最后,对于时钟设置,如果使用8MHz或更高的时钟,MPLAB中的配置字应设置为HS,如果使用的是4 MHz,则应为XT。