搜索
bottom↓
回复: 6

红外报警!示波器显示接收数据与发送数据一致,但就是不能进行报警?(附源程序)

[复制链接]

出0入0汤圆

发表于 2006-3-4 21:35:21 | 显示全部楼层 |阅读模式
红外报警的原理是参照该网站范例,不过,由于我现在用的是汇编,所以只能自己按照的思路编程了!但现在却不能报警!查了几天也没有查出个结果来,搞得很是郁闷!

报警原理:正常情况下,蜂鸣器不响,红色LED不亮,绿色LED亮,当有障碍物时,绿色LED熄灭,红色LED亮起,同时蜂鸣器响十次。之后恢复正常情况。如此循环!

.include"tn2313def.inc"

.list

;*

;************************Register definition***************************

.def      temp = r16

.def      next_temp = r17

.def      save_temp  =  r18

.def      delay_temp  =  r19

.def      move_temp = r20

.def      loop_counter = r21

.def      comp_temp = r22

.def      timer0_temp = r15

.def      timer0_counter = r14

;*

;************************I/O ports definition**************************

.equ    LED_RED  =  0X00                ; PD0

.equ    LED_GREEN  =  0X01              ; PD1

.equ    LED_RED_DDR  =  DDRD

.equ    LED_RED_PORT  =  PORTD

.equ    LED_GREEN_DDR  =  DDRD

.equ    LED_GREEN_PORT  =  PORTD

.equ    IR_RECEIVER  =  0X02            ; PD2

.equ    IR_TRANSMITTER  =  0X04         ; PD4

.equ    IR_RECEIVER_DDR  =  DDRD

.equ    IR_RECEIVER_PORT  =  PORTD

.equ    IR_TRANSMITTER_DDR  =  DDRD

.equ    IR_TRANSMITTER_PORT  =  PORTD

.equ    BUZZER  =  0X05                 ; PD5

.equ    BUZZER_DDR  =  DDRD

.equ    BUZZER_PORT  =  PORTD

.equ    INT_INPUT  =  0X06                   ; PD6

.equ    INT0_DDR  =  DDRD

.equ    INT0_PORT  =  PORTD

;*

;************************program code*******************************************

.org    $0000

      rjmp    reset      ; reset port

      reti               ; external interrupt request 0

      reti               ; external interrupt request 1

      reti               ; Timer/counter 1 capture event

      reti               ; Timer/counter 1 compare match A

      reti               ; Timer/counter 1 overflow

      rjmp    timer0_ovf ; Timer/counter 0 overflow

      reti               ; Usart0, Rx complete

      reti               ; Usart0 data regrister empty

      reti               ; Usart0 Tx complete

      reti               ; analog comparator

      reti               ; Pin charge interrupt

      reti               ; Timer/counter 1 compare match B

      reti               ; Timer/counter 0 compare match A

      reti               ; Timer/counter 0 compare match B

      reti               ; USI start condition

      reti               ; USI overflow

      reti               ; EEPROM ready

      reti               ; Watchdog Timer overflow

.org    $0014

reset:

      ldi    temp,  low(ramend)        ;set stack address

      out    spl,  temp

      ser    temp

      out    ddrb,  temp

      clr    temp

      out    portb,  temp               ; set pb port as output low level

      clr    save_temp

      ldi    move_temp,  $ac            ; modulate signal code

      clt

      sbi    LED_RED_DDR,  LED_RED

      cbi    LED_RED_PORT,  LED_RED               ; close the red led

      sbi    LED_GREEN_DDR,  LED_GREEN

      sbi    LED_GREEN_PORT,  LED_GREEN           ; open the green led

      sbi    BUZZER_DDR,  BUZZER

      cbi    BUZZER_PORT,  BUZZER                 ; close the buzzer

      cbi    IR_RECEIVER_DDR,  IR_RECEIVER

      sbi    IR_RECEIVER_PORT,  IR_RECEIVER       ; set input high level

      sbi    IR_TRANSMITTER_DDR,  IR_TRANSMITTER

      sbi    IR_TRANSMITTER_PORT,  IR_TRANSMITTER ; set output high level

;*

;*****************************timer 0 set program ******************************

      ldi    temp,  $02

      out    tccr0b,  temp              ; one/eight frequency

      ldi    temp,  244

      mov    timer0_temp,  temp

      out    tcnt0,  timer0_temp        ; tcnt0 = 244

      ldi    temp,  $02

      out    timsk,  temp               ; toie0 = 1

      ldi    temp,  43

      mov    timer0_counter,  temp      ; timer 0 number

      clr    r0   

      clr    comp_temp

      ldi    loop_counter,  9

      cbi    INT0_DDR,  INT_INPUT

      sbi    INT0_PORT,  INT_INPUT

      sei                               ; open the interrupt

;*

;***************************** main program ************************************

ir_receiver_check:

      cpi    comp_temp,  2

      breq    ir_receiver_end

      brtc    ir_receiver_check

      clt                               ; clear sign bit

      sbi    INT0_PORT,  INT_INPUT

      sbis    pind,  INT_INPUT

      rjmp    ir_receiver_check

      ldi    delay_temp,  $0c           ; delay about 850us

      rcall    delay_time

      sbi    INT0_PORT,  INT_INPUT

      sbis    pind,  INT_INPUT

      rjmp    set_one_sign

      sec  

      rol    save_temp

      rjmp    move_sign

set_one_sign:

      clc

      rol    save_temp

move_sign:

      cpi    save_temp,  $ac

      brne    ir_receiver_check

      ldi    temp,  10

loop_start:

      cbi    LED_GREEN_PORT,  LED_GREEN

      sbi    LED_RED_PORT,  LED_RED

      sbi    BUZZER_PORT,  BUZZER

      ldi    delay_temp,  $48

      rcall    delay_time

      cbi    BUZZER_PORT,  BUZZER

      ldi    delay_temp,  $48

      rcall    delay_time

      dec    temp

      brne    loop_start

      rjmp    ir_receiver_check

ir_receiver_end:

      clr    save_temp

      cpi    comp_temp,  2

      breq    ir_receiver_end

      rjmp    ir_receiver_check

;*

;*****************************delay 500ms program ******************************

delay_time:

       push    delay_temp

delay2ms_next:

       push    delay_temp

delay2ms_three:

       push    delay_temp

delay2ms_four:

       push    delay_temp

delay2ms_five:

       dec    delay_temp

       brne    delay2ms_five

       pop     delay_temp

       dec    delay_temp

       brne    delay2ms_four

       pop    delay_temp

       dec    delay_temp

       brne    delay2ms_three

       pop     delay_temp

       dec    delay_temp

       brne    delay2ms_next

       pop    delay_temp

       ret

;*

;***************************** Timer 0 interrupt program ***********************

timer0_ovf:

      in    temp,  sreg

      out    tcnt0,  timer0_temp        ; resume counter initial value

      cpi    comp_temp,  0

      breq    carrier_wave_tran         ; crrier wave transmitter

      rjmp    modulate_stop_tran

carrier_wave_tran:

      inc    r0

      sbrs   r0,  0

      rjmp    high_level_timer0

      cbi    IR_TRANSMITTER_PORT,  IR_TRANSMITTER

      rjmp    next_start

high_level_timer0:

      sbi    IR_TRANSMITTER_PORT,  IR_TRANSMITTER

next_start:

      dec    timer0_counter

      brne     end_timer0_reti

      set                               ; set sign bit

      lsl    move_temp

      brcc    zero_tran_prepare

      cbi    IR_TRANSMITTER_PORT,  IR_TRANSMITTER

      ldi    comp_temp,  1

      ldi    temp,  129                      ; timer about 560*3us

      mov    timer0_counter,  temp

      dec    loop_counter

      breq    stop_tran_prepare

      rjmp    end_timer0_reti

zero_tran_prepare:

      cbi    IR_TRANSMITTER_PORT,  IR_TRANSMITTER

      ldi    comp_temp,  1

      ldi    temp,  43                       ; timer about 560us

      mov    timer0_counter,  temp

      dec    loop_counter

      breq    stop_tran_prepare

      rjmp    end_timer0_reti

stop_tran_prepare:

      sbi    IR_TRANSMITTER_PORT,  IR_TRANSMITTER

      ldi    move_temp,  $ac            ; resume modulate code

      ldi    comp_temp,  2

      ldi    loop_counter,  9           ; resume counter initial value

      ldi    temp,  154

      mov    timer0_counter,  temp       ;timer about 2ms

      rjmp    end_timer0_reti

modulate_stop_tran:

      dec    timer0_counter

      brne    end_timer0_reti

      clr    comp_temp

      ldi    temp,  43

      mov    timer0_counter,  temp

end_timer0_reti:

      out    sreg,  next_temp

      reti

出0入0汤圆

发表于 2006-3-5 08:27:47 | 显示全部楼层
SPH=?

出0入0汤圆

 楼主| 发表于 2006-3-5 22:46:53 | 显示全部楼层
我看了2313的PDF文档,不需要使用SPH的。

我今天重新看了仔细再了一篇程序,发现在一些问题,但还还是没有取得实质性的进展!

程序作了修改如下:

;***************************** main program ************************************

ir_receiver_check:

      cpi    comp_temp,  2

      breq    ir_receiver_end

      brtc    ir_receiver_check

      clt                               ; clear sign bit

      sbi    IR_RECEIVER_PORT,  IR_RECEIVER

      sbis    pind,  IR_RECEIVER

      rjmp    ir_receiver_check

      ldi    delay_temp,  $0c           ; delay about 850us

      rcall    delay_time

      sbi    IR_RECEIVER_PORT,   IR_RECEIVER

      sbis    pind,  IR_RECEIVER

      rjmp    set_one_sign

      sec   

      rol    save_temp

      rjmp    move_sign

set_one_sign:

      clc  

      rol    save_temp

move_sign:

      cpi    save_temp,  $ac

      brne    ir_receiver_check

      ldi    temp,  10                     ;loop delay number

      cbi    LED_GREEN_PORT,  LED_GREEN

      sbi    LED_RED_PORT,  LED_RED

loop_start:

      sbi    BUZZER_PORT,  BUZZER

      ldi    delay_temp,  $48

      rcall    delay_time

      cbi    BUZZER_PORT,  BUZZER

      ldi    delay_temp,  $48

      rcall    delay_time

      dec    temp

      brne    loop_start

      sbi  LED_GREEN_PORT,  LED_GREEN     ; open green led

      cbi   LED_RED_PORT,  LED_RED        ; close red led

      rjmp    ir_receiver_check

ir_receiver_end:

      clr    save_temp

      cpi    comp_temp,  2

      breq    ir_receiver_end

      rjmp    ir_receiver_check

出0入0汤圆

发表于 2006-3-6 10:58:15 | 显示全部楼层
看不懂汇编

出0入0汤圆

发表于 2006-3-6 12:53:33 | 显示全部楼层
硬件是什么样的?那个网站?

出0入0汤圆

 楼主| 发表于 2006-3-6 18:24:06 | 显示全部楼层
硬件电路比较上是参照该网站上的那个范例,不过,网站上的那个是用M8,而我现在是采用ATTINY2313的,红外发射引脚是PD4,红外接收引脚是PD2,红色LED是接PD0的引脚,绿色LED是接PD1的引脚,蜂鸣器是接PD5引脚。

我现在怀疑是不是因为在延时期间(850us的延时)与定时器0溢出产生中断相冲突?

出0入0汤圆

 楼主| 发表于 2006-3-6 20:46:55 | 显示全部楼层
今晚再查看该程序,再次作了部分的修改,但还是没有取得实质性的进展!搞得郁闷死了!

修改程序如下:

;***************************** main program ************************************  

ir_receiver_check:  

      cpi    comp_temp,  2  

      breq    ir_receiver_end  

      brtc    ir_receiver_check  

      clt                               ; clear sign bit  

      ;sbi    IR_RECEIVER_PORT,  IR_RECEIVER  ;删除

      ;sbis    pind,  IR_RECEIVER             ;删除

      ;rjmp    ir_receiver_check              ;删除

      ldi    delay_temp,  $0c           ; delay about 850us  

      rcall    delay_time  

      sbi    IR_RECEIVER_PORT,   IR_RECEIVER

      sbis    pind,  IR_RECEIVER

      rjmp    set_one_sign  

      sec   

      rol    save_temp  

      rjmp    move_sign  

set_one_sign:  

      clc   

      rol    save_temp  

move_sign:  

      set                        ; resume sign bit

      cpi    save_temp,  $ac     ; compare to modulate code

      brne    ir_receiver_check

      ......
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-5-9 07:46

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

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