RCP 信号处理
2011-08-30 10:16
141 查看
刚进公司时做的一个电子产品,由电路给予单片机(Mega8)一个RCP信号,然后根据信号长度转换成相应的PWM(调宽脉冲).
电路环境: RCP信号接入到外部中断INT0(pin32).
设计思想:
把TIMER0计算器软件扩增为16位.
把外部中断INT0设置成边缘触发.然后在中断中切换上升/下降弦
ADDR_T0_TEMP 为内存地址, RCP_HIGH 是rcp信号的最大长度,RCP_LOW是rcp信号最小长度
以上代码段完成了RCP的处理.每次检测 R27.6是否高电平. 如果RCP准备好即为高.取出数据后把R27.6设在为低.以便下一次的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_vect: in R0,_SFR_IO_ADDR(SREG) push r20 push r21 push r22 push r23 in R20,_SFR_IO_ADDR(TCNT0) mov R21,R6 ; 为了保持计算器的一致性.必须检测溢出是否发升. in r22,_SFR_IO_ADDR(TIFR) sbrs r22,TOV0 rjmp 1f ; 内容不一致,重新再读一次timer0 in R20,_SFR_IO_ADDR(TCNT0) inc r21 1: ; 计算当前中断发生距离上一次的时间 lds R22,ADDR_T0_TEMP lds R23,ADDR_T0_TEMP+1 sts ADDR_T0_TEMP,R20 sts ADDR_T0_TEMP+1,R21 sub R20,R22 sbc R21,R23 ; 检查信号的状态.如果是上升弦触发, RCP 信号开始 in R22,_SFR_IO_ADDR(MCUCR) sbrs R22,ISC00 rjmp 1f ; 上升弦触发,下一次中断必须改为下降弦 ; triggered by falling edge at next time ldi r23,_BV(ISC01) out _SFR_IO_ADDR(MCUCR),r23 rjmp 3f 1: ; 下降弦触发, RCP 结束.比较 RCP 长度 movw R10,R20 ; if(r20:r21 > RCP_LOW && r20:r21 < RCP_HIGH) subi R20,lo8(RCP_LOW) sbci R21,hi8(RCP_LOW) subi R20,lo8(RCP_HIGH-RCP_LOW) sbci R21,hi8(RCP_HIGH-RCP_LOW) brcc 1f ; 在合理范围内的RCP signal sbr r27,_BV(6) ldi r22, RCP_ERROR_COUNT mov r7, r22 rjmp 2f 1: dec r7 cbr r27,_BV(6) 2: ; 下次中断改上升弦触发 ldi r23,_BV(ISC01)+_BV(ISC00) out _SFR_IO_ADDR(MCUCR),r23 3: pop r23 pop r22 pop r21 pop r20 out _SFR_IO_ADDR(SREG),r0 reti
以上代码段完成了RCP的处理.每次检测 R27.6是否高电平. 如果RCP准备好即为高.取出数据后把R27.6设在为低.以便下一次的RCP输入判断.
注意:以上代码片段是从一个成熟产品中抽取出来.不保证在读者的程序里正确运行.但是在产品中是工作的.这里只是为了描述程序设计思路才列出来的.
以后我会把产品中其他的部分也放出来,主要是PWM控制.下一步我们的产品是无刷马达的控制.希望能把这个项目也拿下,把技术拿出来和大家分享.
相关文章推荐
- Linux程序设计入门--信号处理
- 基于信号处理的在线云评测+社区系统( 3)
- 大白话讲解信号处理中的频谱泄露
- Linux信号与信号处理
- 基于FPGA的跨时钟域信号处理——借助存储器
- LTE-发送端信号处理
- 阵列信号处理
- Linux 信号详解二(信号分类,信号处理,kill)
- [离散时间信号处理学习笔记] 5. 离散时间信号与系统的频域表示
- QLineEdit 无法发信号,该如何处理
- Linux系统编程4.信号处理
- Linux SIGCHLD信号处理
- C语言中的信号处理
- gdb中忽略信号处理 SIGPIPE
- Linux下多线程编程与信号处理易疏忽的一个例子
- linux内核中的信号机制--信号处理
- 语音信号处理
- 基于阵列信号处理的矩阵基础知识心得(持续更新中)
- linux进程管理之信号处理(1)
- 巧用QSignalMapper分类有序地处理大量信号