sonic 发表于 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

lhlmm 发表于 2006-3-5 08:27:47

SPH=?

sonic 发表于 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

      sbiLED_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

alisha 发表于 2006-3-6 10:58:15

看不懂汇编

mored 发表于 2006-3-6 12:53:33

硬件是什么样的?那个网站?

sonic 发表于 2006-3-6 18:24:06

硬件电路比较上是参照该网站上的那个范例,不过,网站上的那个是用M8,而我现在是采用ATTINY2313的,红外发射引脚是PD4,红外接收引脚是PD2,红色LED是接PD0的引脚,绿色LED是接PD1的引脚,蜂鸣器是接PD5引脚。

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

sonic 发表于 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

      ......
页: [1]
查看完整版本: 红外报警!示波器显示接收数据与发送数据一致,但就是不能进行报警?(附源程序)