В общем стоит такая задача:
Через мультиплексор на вход контроллера последовательно подаются 4 разных сигнала (разная частота). Номер входа, попадающего на мультиплексор, определяется контроллером. После этого, контроллер начинает считать пришедшие на вход импульсы, сохраняя результат в переменной, соответствующей номеру сигнала. Через 1 секунду после начала отсчета, контроллер должен подать сигнал мультиплексору на смену входа. После прохождения всех 4 сигналов в контроллер, результаты в переменных должны обнуляться. После этого все опять повторяется.
Схема в протеусе (8 версия) прилагается.
CODE
.device ATtiny2313
.include "tn2313def.inc"
.def temp=r16
.def Count_time=r17
.def Flag=r18
.def Counter1=r19
.def Counter2=r20
.def Counter3=r21
.def Counter4=r22
.org 0
rjmp RESET
rjmp _INT0
reti
reti
reti
reti
.org $6
rjmp TIM0
reti
reti
reti
reti
_INT0:
clr temp
out GIMSK, temp
ldi temp, $FF
out GIFR, temp
sbrc Flag, 0
clr temp
in temp,PinD
CPI temp,0b000000
BRNE action_a
BRCC action_b
action_a:
inc Counter1
RJMP next_action
action_b:
CPI temp,0b010000
BRNE action_a1
BRCC action_b1
action_a1:
inc Counter2
RJMP next_action
action_b1:
CPI temp,0b100000
BRNE action_a2
BRCC action_b2
action_a2:
inc Counter3
RJMP next_action
action_b2:
CPI temp,0b110000
BRNE action_a3
action_a3:
inc Counter4
next_action:
sbr Flag, 1
ldi Count_time, 255
ldi temp, 0b00000011
out TCCR0, temp
reti
TIM0:
dec Count_time
breq end_timer
reti
end_timer:
clr temp
out TCCR0, temp
in temp,PinD
CPI temp,0b000000
BRNE action_a4
BRCC action_b4
action_a4:
ldi temp, 0b010000
out PORTD, temp
action_b4:
in temp,PinD
CPI temp,0b010000
BRNE action_a5
BRCC action_b5
action_a5:
ldi temp, 0b110000
out PORTD, temp
action_b5:
in temp,PinD
CPI temp,0b110000
BRNE action_a6
action_a6:
ldi temp, 0b000000
out PORTD, temp
ldi temp, (1<<INT0)
out GIMSK, temp
reti
RESET:
ldi temp, low(RAMEND)
out SPL, temp
ldi temp, 0b00000100
out PORTB, temp
ldi temp, 0b00000111
out DDRB, temp
ldi temp, 0b0000000
out PORTD, temp
clr Counter1
clr Counter2
clr Counter3
clr Counter4
clr Flag
ldi temp, (1<<TOIE0)
out TIMSK, temp
ldi temp, (1<<ISC01|1<<ISC11)
out MCUCR, temp
ldi temp, (1<<INT0)
out GIMSK, temp
sei
Main:
rjmp Main
Помогите доделать, а то не могу понять в чем дело.
Сообщение отредактировал IgorKossak - Dec 24 2015, 15:48
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!!!
Прикрепленные файлы
my.zip ( 18.39 килобайт )
Кол-во скачиваний: 10