红外报警!示波器显示接收数据与发送数据一致,但就是不能进行报警?(附源程序)
红外报警的原理是参照该网站范例,不过,由于我现在用的是汇编,所以只能自己按照的思路编程了!但现在却不能报警!查了几天也没有查出个结果来,搞得很是郁闷!报警原理:正常情况下,蜂鸣器不响,红色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 SPH=? 我看了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 看不懂汇编 硬件是什么样的?那个网站? 硬件电路比较上是参照该网站上的那个范例,不过,网站上的那个是用M8,而我现在是采用ATTINY2313的,红外发射引脚是PD4,红外接收引脚是PD2,红色LED是接PD0的引脚,绿色LED是接PD1的引脚,蜂鸣器是接PD5引脚。
我现在怀疑是不是因为在延时期间(850us的延时)与定时器0溢出产生中断相冲突? 今晚再查看该程序,再次作了部分的修改,但还是没有取得实质性的进展!搞得郁闷死了!
修改程序如下:
;***************************** 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]