MBedder, терминатор (03.07.2016 13:24, просмотров: 282) ответил Крок на Б...! (это я про TRISD, вроде бы все обнулял. Рассеянность). Ну а вот OCxTMR молотят не всегда, к сожалению. Или опять рассеянность.
Он молотит, когда выбран Clock Source и выставлен нужный режим. Кроме того, нужно вывести выход ОСх на нужную ногу и не прозабыть сбросить соответствующий бит TRIS. Попробуй запустить такой код (не проверял - я на даче, железа нету) ; OC1 edge aligned PWM pulse generation on RD2 example
; Should generate a 20% duty cycle PWM with period of 1000*Tcy on RD2
.global __reset
.include "p33Exxxx.inc"
; Move immediate value to any near register file (including any SFR) macro (trashes W0)
.macro mvi value,file
mov \value,w0
mov w0,\file
.endm
oc_per = 1000 ; Desired OC2 PWM cycle length
oc_duty = 20 ; Desired OC2 PWM duty cycle, %
__reset:
mov #__SP_init,w15 ; Initalize the Stack Pointer
mvi #__SPLIM_init,SPLIM ; Initialize the Stack Pointer Limit Register
nop ; Add NOP to follow SPLIM initialization
bclr TRISD,#TRISD2 ; TRISx bits are all ones (ports are input) upon reset, so make some outputs
mvi #oc_per,OC2RS ; Set OC2 PWM period
mvi #(oc_duty*oc_per)/100,OC2R ; Set OC2 PWM duty cycle
mvi #(7<<OCTSEL0)|(6<<OCM0),OC2CON1 ; Select OC2 clock source and mode (e.g. Fp and edge aligned PWM)
mvi #(0x1F<<SYNCSEL0),OC2CON2 ; Make OC2RS to determine OC2 PWM period
mvi #(17<<RP66R0),RPOR1 ; Map OC2 output to RP66 (= RD2) pin
bra . ; Endless loop (note a period character after BRA)