刚进公司时做的一个电子产品,由电路给予单片机(Mega8)一个RCP信号,然后根据信号长度转换成相应的PWM(调宽脉冲).
电路环境: RCP信号接入到外部中断INT0(pin32).
设计思想:
; 中断设置
; TIMER0 扩展到R6, CLK/8
ldi r16, _BV(CS01)
out _SFR_IO_ADDR(TCCR0),r16
; INT0 上升弦发生中断
ldi r16,_BV(ISC01)+_BV(ISC00)
out _SFR_IO_ADDR(MCUCR),r16
ldi r16,_BV(INT0)
out _SFR_IO_ADDR(GICR),r16
把TIMER0计算器软件扩增为16位.
.global TIMER0_OVF_vect
TIMER0_OVF_vect:
in R0,_SFR_IO_ADDR(SREG)
push r21
; r6 timer0的高8位
inc R6
breq 1f
rjmp 3f
1:
dec r7
mov R21,r7
subi r21,110
; if r21 > 110 goto 3f
brcc 3f
; 丢信号,可能是硬件故障.
; 关闭相应的操作
cli
rjmp halt_mcu
3:
pop r21
out _SFR_IO_ADDR(SREG),R0
reti
把外部中断INT0设置成边缘触发.然后在中断中切换上升/下降弦
ADDR_T0_TEMP 为内存地址, RCP_HIGH 是rcp信号的最大长度,RCP_LOW是rcp信号最小长度
.global INT0_vect
INT0_