З.ы. И еще вопросик - не могу понять как загружается константа
ldi R16,(0<<ISC00)|(1<<ISC01)
Что написано после запятой?
- Вложения
-
- Work.rar
- (17.23 КБ) 189 скачиваний
Код: Выделить всё
;AT90S2313 @ External 4Mhz
.nolist
.include "2313def.inc"
.list
;***************??????????*****************
.def temp=R16
.def temp1=r17
.def temp2=r18
.def temp3=r19
.def count=r20
.def count1=r21
.def temp4=r22
;***********************************************
.cseg
.org 0
rjmp RESET ; Reset Handler
.org INT1addr
rjmp EXT_INT1 ; IRQ1 Handler
.org OC1addr
rjmp OC1
;***************?????????????*****************
RESET: ldi temp,RamEnd ;????????????? ?????
out SPL,temp
;cli зачем запрещаэш преривания? по-моему, это лишнее
ldi temp,0b11111111;????? ? ?????? ????? B
out DDRB,temp
ldi temp,0b10000011;????? ? ?????? ????? D
out DDRD,temp
ldi temp,0b00000000;????????? ????????? ????? B ? ????????
out PortB,temp
ldi temp,0b00000000;????????? ????????? ????? D ? ????????
out PortD,temp
ldi Temp,0b11000000;????????? ?????????? INT0 ? INT1
out GIMSK,Temp
ldi Temp,0b00001010; INT0 ?? ?? ?????????? ??????, INT1 ?? ?????????? ??????
out MCUCR,Temp
ldi temp,(1<<CS10)|(1<<CS12)
;деления частоты 1024
out TIMSK, temp
;таймера обнулять не надо пока
;и еще посчитай количество импульсов Х за 0,5 сек при деления частоты МК на 1024 по формуле 0.5 / (1 / (частота МК / 1024)) вручную и запиши в OCR1A округленное значение
Х - двухбайтовые значение
ldi temp,X1
out OCR1AL,temp
ldi temp,X2
out OCR1AH,temp
sei
Start: ldi temp4,0b10000000
out GIFR,temp4
rjmp Start; ??????????? ????
EXT_INT1:
rcall Antidrebezg
in temp3, SREG
push temp3
sbi PortB,4; ??????? ?????
rcall Zadergka
cbi PortB,4;??????? ?????
pop temp3
out SREG,temp3
reti; ????? ?? ??????????? ?????????? INT1
;*****************???????????*********************
; ??? ?????? 4 ??? ???? ?????? ????? ???????? 10 ??, ????????? ?????????? count
;???????? 2 ??????? - ???????? 20 ??
Antidrebezg:
push Temp1
push Temp2
ldi Temp1,0
ldi Temp2,50
ldi count,2
d11: dec Temp1
brne d11
dec Temp2
brne d11
pop Temp2
pop Temp1
dec count
brne d11
ret
Zadergka:
in temp,TIMSK
sbr temp,OCIE1A
out TIMSK,temp
sei
clr R23 ;R23=0000 0000
While: cpi R23,6
brlo While ;если R17=6, т.е. прошло 3 сек (6 по 0.5), тогда запрещаем прерывание от таймера 1, выходим из функции, а иначе дальше будут прерывания каждые 0,5 сек
cbr temp,OCIE1A
out TIMSK, temp
ret
OC1:
;обнуление таймера
;засветки светодиода
inc R23
retiКод: Выделить всё
;AT90S2313 @ External 4Mhz
.nolist
.include "2313def.inc"
.list
;***************??????????*****************
.def temp=R16
;***********************************************
.cseg
.org 0
rjmp RESET ;Reset Handler
.org INT1addr
rjmp INT_1
;***************?????????????*****************
RESET: ldi temp,RamEnd ;????????????? ?????
out SPL,temp
sbi DDRD,0
cbi DDRD,3
sbi DDRB,4
ldi temp,(1<<ISC10)|(1<<ISC11)
out MCUCR,temp
ldi temp,(1<<INT1)
out GIMSK,temp
sei
Start: rjmp Start;
INT_1:
ldi R26,6
while:
rcall Svitim
rcall Zadergka
rcall Gasim
rcall Zadergka
dec R26
brne while
reti
Gasim:
cbi PortD,0;??????? ?????
cbi PortB,4;??????? ?????
ret
Svitim:
sbi PortD,0; ??????? ?????
sbi PortB,4; ??????? ?????
ret
Zadergka:
ldi R25,5
for:
dec R23
brne for
dec R24
brne for
dec R25
brne for
ret
Код: Выделить всё
INT_1:
sbi DDRD,3 ;íà âèâ³ä,ùîá íå íàäõîäèëî ñèãíàë³â\
sbi PortD,3
ldi R26,6
while:
rcall Svitim
rcall Zadergka
rcall Gasim
rcall Zadergka
dec R26
brne while
cbi DDRD,3
retiНу во-первых, не надо трогать регистров ...IFR (GIFR, TIFR и т.д), их биты изменяют свое состояние сами при возникновении прерываний. Поэтому в своей первоначальной версии сотрыте обращения к GIFR, оставте следующее: Start: rjmp StartНо так как я учусь, то мне очень важно понять что я сдел не так?
Код: Выделить всё
;AT90S2313 @ External 4Mhz
.nolist
.include "2313def.inc"
.list
;***************??????????*****************
.def temp=R16
.def temp1=r17
.def temp2=r18
.def temp3=r19
.def count=r20
.def count1=r21
.def temp4=r22
;***********************************************
.cseg
.org 0
rjmp RESET ; Reset Handler
rjmp EXT_INT0 ; IRQ0 Handler
rjmp EXT_INT1 ; IRQ1 Handler
rjmp TIM_CAPT1 ; Timer1 Capture Handler
rjmp TIM_COMP1 ; Timer1 Compare Handler
rjmp TIM_OVF1 ; Timer1 Overflow Handler
rjmp TIM_OVF0 ; Timer0 Overflow Handler
rjmp UART_RXC ; UART RX Complete Handler
rjmp UART_DRE ; UDR Empty Handler
rjmp UART_TXC ; UART TX Complete Handler
rjmp ANA_COMP ; Analog Comparator Handler
EXT_INT0: ret
TIM_COMP1: ret
TIM_OVF1:ret
TIM_CAPT1 : ret
TIM_OVF0 : ret
UART_RXC : ret
UART_DRE : ret
UART_TXC : ret
ANA_COMP : ret
;***************?????????????*****************
RESET: ldi temp,RamEnd ;????????????? ?????
out SPL,temp
cli
ldi temp,0b11111111;????? ? ?????? ????? B
out DDRB,temp
ldi temp,0b10000011;????? ? ?????? ????? D
out DDRD,temp
ldi temp,0b00000000;????????? ????????? ????? B ? ????????
out PortB,temp
ldi temp,0b00000000;????????? ????????? ????? D ? ????????
out PortD,temp
ldi Temp,0b11000000;????????? ?????????? INT0 ? INT1
out GIMSK,Temp
ldi Temp,0b00001010; INT0 ?? ?? ?????????? ??????, INT1 ?? ?????????? ??????
out MCUCR,Temp
ldi Temp,0b11000000; ???????? ?????????? ?? ???????????? 1 ???????
out TIMSK, Temp
ldi Temp,0 ;????????? ???????
out TCNT1H,Temp
out TCNT1L,Temp
sei
Start: rjmp Start; ??????????? ????
EXT_INT1:
in temp3, SREG
push temp3
ldi R23,3
While:
sbi PortB,4 ;??????? ?????
sbi PortD,0
rcall Zadergka
cbi PortB,4 ;??????? ?????
cbi PortD,0
rcall Zadergka
dec R23
brne While
pop temp3
out SREG,temp3
reti; ????? ?? ??????????? ?????????? INT1
;*****************???????????*********************
; ??? ?????? 4 ??? ???? ?????? ????? ???????? 10 ??, ????????? ?????????? count
;???????? 2 ??????? - ???????? 20 ??
Zadergka:
push Temp1
push Temp2
ldi Temp1,0
ldi Temp2,0
ldi count,15
ldi count1,2
d12: dec Temp1
brne d12
dec Temp2
brne d12
dec count
brne d12
pop Temp2
pop Temp1
retДа, я уже исправил ошибку. При инициализации MCUCR я задал изменении входного сигнала по переднему фронту при любом изменении значения на выводе PD3:p.s. ваш способ антидребезга странно работате: диод моргает 12 раз и время увеличилось в 2 раза
Код: Выделить всё
ldi temp, (1 <<ISC10) | (1 <<ISC11)
out MCUCR, tempКод: Выделить всё
ldi temp,(0<<ISC10)|(0<<ISC11)
out MCUCR,temp