;laser.asm ;ШИ управление моторчиками ;PIC16F84A XT генератор 4 Мгц LIST P=16F84A ;установка типа МК __CONFIG 03FF5H ;бит защиты выкл,WDT вкл, ;XT-генератор,PWRTE-выкл ;Определение регистров спец назначения STATUS equ 03h TRISB equ 06h ;1-й банк PORTB equ 06h INTCON equ 0Bh OPTION_R equ 01h ;1-й банк TMR0 equ 01h ;Определение регистров общего назначения POVTOR equ 0Ch ; IZM equ 0Dh ; MOT11 equ 0Eh ; MOT10 equ 0Fh ; MOT11VR equ 10h ; MOT10VR equ 11h ; ZAD equ 12h ; TRIGGER equ 13h ; TIM1 equ 14h ; TIM0 equ 15h ; WVR equ 16h ; STATVR equ 17h ; BOLCIKL equ 18h ; UHOD equ 19h ;Присвоение буквенных обознач операциям и битам для удобства чтения F equ 1 ;результат оставить в регистре W equ 0 ;результат - в аккумуляторе RP0 equ 5 ;присвоение 5-му биту рег STATUS назв. RP0 ;Определение точки входа в программу org 0 goto START ; Определение точки входа в прерывание org 4 ;назначение вектора прерывания ;---------------------------------------------------------------- ;Начало прерывания ;---------------------------------------------------------------- INT incf UHOD ;подсчет кол-ва уходов в ПП INT за ; отслеживаемый интервал (для отладки) movwf WVR ;сохранение содержимого регистров movf STATUS,W ;STATUS и W в ОЗУ movwf STATVR ; incf TRIGGER ;инкремент рег TRIGGER btfss TRIGGER,0 ;проверка состояния 0 бита goto RESET ;уйти на RESET если =0 bsf PORTB,4 ;0-й бит=1 уст вывод RB4 в "1" movf TIM1,W ;и записать в регистр TMR0 конст movwf TMR0 ;длительности "1" goto ENDINT ;уйти на метку окончания ПП INT RESET bcf PORTB,4 ;0-й бит=0-сбросить вывод RB4 в "0" movf TIM0,W ;и записать в рег TMR0 конст movwf TMR0 ;длительности "0" ;Снятие флага и восстановление содержимого регистров STATUS и W ENDINT bcf INTCON,2 ;сброс флага переполнения movf STATVR,W ;восстановление movwf STATUS ; содержимого swapf WVR,F ; swapf WVR,W ; регистров retfie ;возврат из ПП прерывания INT ;----------------------------------------------------------------- ;Конец прерывания ;----------------------------------------------------------------- START clrf UHOD ;очистка регистра UHOD clrwdt ;очистка WDT clrf INTCON ;запретить все прерывания bsf STATUS,RP0 ;перейти в 1-й банк movlw .0 ;записать 0 в регистр TRISB (установить movwf TRISB ;все выводы порта В на выход) movlw .150 ;предделитель перед TMR0, movwf OPTION_R ; коэф-т дел 1:128 (10010110), ост неважно bcf STATUS,RP0 ;возврат в 0-й банк movlw .192 ;нач конст длительности "1"(64 до перепол- movwf TIM1 ;нения - в регистр TIM1 2-го моторчика movlw .64 ;нач конст длит "0" (192 до переполнения) movwf TIM0 ;2-го моторчика movlw .5 ;закладка константы для подсчета числа movwf BOLCIKL ;полных циклов 1-го ("быстрого") моторчика movlw .160 ;.160=10100000 - глобальное разрешение movwf INTCON ;прерываний, разреш прерываний ;по переполнению TMR0 KRUG clrwdt ;очистка WDT movlw .190 ;константа числа изменений коэф-та заполнения имп. movwf IZM movlw .55 ;начальная длительность сигнала "1" movwf MOT11 movlw .200 ;нач. длительность паузы "0" movwf MOT10 KZ movlw .100 ;записываем константу чсла повторов периода(1-0) movwf POVTOR ; movlw .1 ;при каждом цикле измен КЗ увел.конст."1" на 1 addwf MOT11,F movlw .1 ; -------"------ уменьшаем константу "0" на 1 subwf MOT10,F PVT movf MOT11,W ;копируем полученные константы movwf MOT11VR ; во временные регистры movf MOT10,W movwf MOT10VR clrwdt ;очистка WDT bsf PORTB,0 ;устанавливаем выход RB0 в единицу CIKL1 movlw .10 ;маленький счетчик задержки movwf ZAD ;для увеличения длительности UDL decfsz ZAD ;отсчитываемого интервала goto UDL ;времени decfsz MOT11VR ;отсчитываем длительность единицы goto CIKL1 bcf PORTB,0 ; уст вых RB0 в ноль CIKL0 movlw .10 ;такой же счетчик задержки, как movwf ZAD ;и при отсчитывании UDL1 decfsz ZAD ;интервала времени "1" goto UDL1 decfsz MOT10VR ;отсчитываем длительность ноля goto CIKL0 decfsz POVTOR ;повторяем 100 раз с заданным коэф-том заполнения goto PVT decfsz IZM ;190 раз меняем коэф-т заполнения (увеличиваем goto KZ ;длит "1" и уменьшаем длит "0") decfsz BOLCIKL ;отсчитываем 5 циклов малого круга goto USTTIM ;если содержимое рег BOLCIKL не =0 goto START ;если прошло 5 циклов малого круга USTTIM clrf INTCON ;запрет всех прерываний movlw .26 ;на 26 уменьшаем содержимое рег TIM1,тем самым subwf TIM1,F ;увеличиваем время досчета до переполнения TMR0 ;(длительность "1" увеличивается) movlw .26 ;на 26 увеличиваем содержимое рег TIM0,тем самым addwf TIM0,F ;уменьшаем время досчета до переполнения TMR0 ;(длительность "0" уменьшается) movlw .160 ;.160=10100000 - глобальное разрешение movwf INTCON ;прерываний, разреш прерываний ;по переполнению TMR0 goto KRUG end