ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Воскресенье
30 июня
275778 Топик полностью
mazur (30.09.2011 22:10, просмотров: 137) ответил MBedder на >>
На железе еще не проверял. Сейчас занялся макеткой для таких случаев, заколебался с кучей плат париться. После на ней уже в реале погоняю. Код вроде должен работать. Посмотри пожалуйста.  Proc_Weld_Comp: ; Обработчик одного из состояний. Check_Timer Param_Timer_Weld_0_1_s sbrs r16,n_ST_TIME_OUT ret ldd r16,Y+DISP_COMP_TIMER ldd r17,Y+DISP_COMP_VALUE_BUF inc r16 std Y+DISP_COMP_TIMER,r16 cp r16,r17 brlo Proc_Weld_Comp_End cbr FLAGS,f_WELD_COMP ldd r16,Y+DISP_WELD_VALUE_BUF cpi r16,0 breq Proc_Weld_Set_Wait_Run ; Run Timer0 ldi r16,1<<CS00 | 1<<CS01 out TCCR0,r16 ; Запуск счетчика TIMER0. ; EXT_INT0_INIT ldi r16,1<<INTF0 out GIFR,r16 ; Сброс флага внешнего прерывания. ldi r16,1<<ISC00 | 1<<ISC01 out MCUCR,r16 ; Прерывание по фронту. ldi r16,1<<INT0 out GICR,r16 ; Разрешение внешнего прерывания. sbr FLAGS,f_WELD_YES ; Разрешение управления тиристором. st Y,FLAGS Proc_Weld_Comp_B: Set_State DISP_PROC_FSM_WELD,_PROC_WELDING Proc_Weld_Comp_End: ret EXT_INT0: in RSREG,SREG push r16 push r17 push YL push YH ldiy PROC_WELD_FLAGS ld r16,Y sbrc r16,n_WELD_YES rjmp EXT_INT0_A ; EXT_INT0 out GICR,RCLR ; Запрет прерывания EXT_INT0. ; TIMER0 in r16,TIMSK cbr r16,1<<OCIE0 out TIMSK,r16 ; Запрет прерывания по совпадению. in r16,TCCR0 cbr r16,1<<CS00 | 1<<CS01 out TCCR0,r16 ; Остановка счетчика TIMER0. rjmp EXT_INT0_C EXT_INT0_A: EXT_INT0_B: ; EXT_INT0 out GICR,RCLR ; Запрет прерывания EXT_INT0. ; TIMER0 in r16,TIFR andi r16,1<<OCF0 out TIFR,r16 ; Очистка флага прерывания по совпадению. in r16,OCR0 subi r16,-(XTAL/64/1000) out OCR0,r16 ; Загрузка в регистр сравнения нужного значения. in r16,TIMSK sbr r16,1<<OCIE0 out TIMSK,r16 ; Разрешение прерывания по совпадению. ; WELD_IMP_PIN_OUT=1 WELD_IMP_OUT_1 EXT_INT0_C: pop YH pop YL pop r17 pop r16 out SREG,RSREG reti TIMER0_COMP: in RSREG,SREG push r16 ; WELD_IMP_PIN_OUT=0 WELD_IMP_OUT_0 ; TIMER0 in r16,TIMSK cbr r16,1<<OCIE0 out TIMSK,r16 ; Запрет прерывания по совпадению. in r16,TCCR0 cbr r16,1<<CS00 | 1<<CS01 out TCCR0,r16 ; Остановка счетчика TIMER0. ; EXT_INT0 ldi r16,1<<INTF0 out GIFR,r16 ; Сброс флага внешнего прерывания. ldi r16,1<<INT0 out GICR,r16 ; Разрешение внешнего прерывания. pop r16 out SREG,RSREG reti