;************************************************************ ; Диммер 4 каналa, упр 250 Кб, FF - начало отсчета* ; с транзистором - на 50 Гц. Плата с реле ;************************************************************ ; Filename : out250xx.asm ; Date : aprel 2007 ; File Version : 2.2 ; Assembler : mpasm 3.20 ; Author : Bogdanov Andrew ; E-Mail : Bogdanov@tsrv.ru ;************************************************************ #include C:\PHYTON\MACROS\basMacro.mac ; макросы инициализации #include C:\PHYTON\MACROS\pic628.mac ; * ;************************************************************ #define gate_50 PORTB,3 ; импульсы фазы 50гц * #define pSimist1 PORTB,4 ; выход на симистор 1 * #define pSimist2 PORTB,5 ; выход на симистор 2 * #define pSimist3 PORTB,6 ; выход на симистор 3 * #define pSimist4 PORTB,7 ; выход на симистор 4 * ;*** Value ************************************************** Faza equ 0x30 ; движущаяся фаза ;************************************************************* Area250 equ 0x40 ; 1-16 байт строки 250 kb ;************* ячейки для приема DMX ************************* temp_s equ 0x70 ; \ Int сохранение регистров temp_w equ 0x71 ; \ во время прерывания temp_fsr equ 0x72 ; \ temp_pc equ 0x73 ; \ mRx250 equ 0x75 ; принятый байт DMX mChannel equ 0x76 ; номер канала в устройстве ;************************************************************ org 0x00 ;************************************************************ goto Start ;************************************************************ org 0x04 ;************************************************************* PUSH ;-------- проверка режима ------------------------------------- mov mRx250,RCREG ; считать принятый байт btfsc RCSTA,2 ; проверка - ошибка STOP-BIT goto ret_int250 ; выключить запись байтов cpi mRx250,0xFF ; jz int_ustFF ; установка флага спец байта goto int_write250 ; режим записи строки ;--------------------------------------------------------------- int_ustFF: ; установка флага спец байта ;--------------------------------------------------------------- clrf mChannel ; первый канал goto ret_int250 ; выходим из прерывания ;--------------------------------------------------------------- int_write250: ; запись в AREA ;--------------------------------------------------------------- mvi FSR,Area250 ; вычисление movf mChannel,w ; текущего адреса addwf FSR,f ; канала mov INDF,mRx250 ; запись очередного байта incf mChannel,f ; следующий канал ;--------------------------------------------------------------- ret_int250: ;--------------------------------------------------------------- bcf PIR1,5 ; USART - Флажок !!! POP ;************************************************************ Start: ; Main Programm ;************************************************************ bsf STATUS,RP0 ; cтраница 1 movlw b'11111111' ; movwf TRISA ; movlw b'00001011' ; movwf TRISB ; movlw b'00000000' ; HS->Prescaler->Timer0, movwf OPTIONR ; 1:2 ;------------------------------------------------------------- clrf VRCON ; 628 Выкл источник опорного clrf PCON ; 628 ;------------------------------------------------------------- movlw b'00100000' ; прерывание от movwf PIE1 ; USART movlw d'000' ; Скорость=0, brg=0 movwf SPBRG ; USART movlw b'00100010' ; УПРАВЛЕНИЕ BRGH =1 high movwf TXSTA ; USART bit2 =0 low clrf STATUS ; cтраница 0 ;************************************************************ ;------------------------------------------------------------ mvi CMCON,0x07 ; 628 port A in-out ;------------------------------------------------------------ movf RCREG,w movf RCREG,w movlw b'10010000' ; УПР приемником movwf RCSTA ; USART clrf PIR1 ; USART - Флажок !!! movlw b'11000000' ; разрешить все movwf INTCON ; прерывания clrwdt ; сброс WDT таймера ;************************************************************ mvi Area250+0,.10 mvi Area250+1,.20 mvi Area250+2,.30 mvi Area250+3,.40 ;************************************************************ ; сделать тест - проверку. При подаче на вывод X лог 0 схема ; превращается в бегушку ;************************************************************ ;************************************************************ ; если будет светиться, значит нет связи с главным MPU ;************************************************************ ;************************************************************ ; проверка на наличие фазы, если нет - в режим свитчера ;************************************************************ ;************************************************************ WaveCuc: ; *** основная обработка вкл-выкл симисторов *** ;************************************************************ ;------------------------------------------------------------ ; ожидаем делитель на 255 значений ;------------------------------------------------------------ btfss TMR0,6 ; T=6 проверка следующей goto WaveCuc ; градации (256 уровней) clrf TMR0 ; таймер сначала ;------------------------------------------------------------ ; отслеживаем и включем фазы ;------------------------------------------------------------ cmp Area250+0,Faza ; 1-5-9 сравниваем с фазой jnz OffSimist1 ; первый уровень, если bcf pSimist1 ; совпадает, включаем OffSimist1: ; симистор 1 cmp Area250+1,Faza ; 2-6-10 сравниваем с фазой jnz OffSimist2 ; первый уровень, если bcf pSimist2 ; совпадает, включаем OffSimist2: ; симистор 2 cmp Area250+2,Faza ; 3-7-11 сравниваем с фазой jnz OffSimist3 ; первый уровень, если bcf pSimist3 ; совпадает, включаем OffSimist3: ; симистор 3 cmp Area250+3,Faza ; 4-8-12 сравниваем с фазой jnz OffSimist4 ; первый уровень, если bcf pSimist4 ; совпадает, включаем OffSimist4: ; симистор 4 ;------------------------------------------------------------ clrwdt ; сброс WDT таймера decf Faza,f ; двигаемся по фазе jnz WaveCuc ; фаза не закончилась ;------------------------------------------------------------ WaitDown: ; если волна еще не закончилась ;------------------------------------------------------------ clrwdt ; сброс WDT таймера btfss gate_50 ; если 0 -> повтор goto WaitDown ; цикл ожидания ;------------------------------------------------------------ ClearWave: ; выкл симисторы, обнуляем счетчики, когда нет уже гребня ;------------------------------------------------------------ clrf TMR0 ; таймер сначала mvi Faza,0xFF ; счетчик фазы сначала bsf pSimist1 ; выключаем bsf pSimist2 ; выключаем bsf pSimist3 ; выключаем bsf pSimist4 ; выключаем ;------------------------------------------------------------- WaitUp: ; ждем новой волны ;------------------------------------------------------------- clrwdt ; сброс WDT таймера btfsc gate_50 ; если 0 повтор, ждем goto WaitUp ; разрешения на работу ;------------------------------------------------------------- goto WaveCuc ; ;************************************************************** End ; BrSoft Copyright (C) 2007 Bogdanov Andrew ;**************************************************************