;=======================================================
; Проект 21. Программный ШИМ — плавная яркость светодиода
; ATmega8, 8 МГц. Светодиод на PB0
;=======================================================
.include "m8def.inc"
.def    temp = r16
.def    duty = r17
.def    pcnt = r18
.def    reps = r19

.cseg
.org    0x0000
        rjmp    RESET

RESET:
        ldi     temp, low(RAMEND)
        out     SPL, temp
        ldi     temp, high(RAMEND)
        out     SPH, temp
        ldi     temp, (1<<PB0)
        out     DDRB, temp
        clr     duty

MAIN:
UP:                                     ; разгораемся
        rcall   PWM_BLOCK
        inc     duty
        cpi     duty, 255
        brne    UP
DOWN:                                   ; гаснем
        rcall   PWM_BLOCK
        dec     duty
        brne    DOWN
        rjmp    MAIN

;--- держим текущую яркость несколько периодов ---
PWM_BLOCK:
        ldi     reps, 8
REP:
        clr     pcnt
PERIOD:
        cp      pcnt, duty              ; счётчик меньше скважности?
        brsh    PWM_OFF
        sbi     PORTB, PB0
        rjmp    PWM_NEXT
PWM_OFF:
        cbi     PORTB, PB0
PWM_NEXT:
        nop
        nop
        inc     pcnt
        brne    PERIOD                  ; 256 шагов — период ШИМ
        dec     reps
        brne    REP
        ret
