Собственно сабж. Скоро лопну от злости.
В режиме без буфера все работает.
В режиме с буфером содержимое трех регистров переносится, а TRDGRD0 не переносится в TRDGRB0 (вижу в отладчике).
Код
#define BUFFERED
#ifndef BUFFERED
#define PERIOD_REG0 trdgra0
#define PERIOD_REG1 trdgra1
#define PWM_REG0 trdgrb0
#define PWM_REG1 trdgrb1
#else
#define PERIOD_REG0 trdgrc0
#define PERIOD_REG1 trdgrc1
#define PWM_REG0 trdgrd0
#define PWM_REG1 trdgrd1
#endif
void ConfigureTimerRD(void)
{ trdstr = 0x00; // stop timer
#ifdef BUFFERED
trdmr = 0xf1; // registers 0 and 1 work Synchro with buffer
#else
trdmr = 0x01;
#endif
trdpmr = 0x11; // TRDIOB0, TRDIOB1 : PWM
trdfcr = 0x80; // not PWM3 mode
trdpocr0 = 0x07; // output active level = high
trdocr = 0x00; // initial output = 0
trdoer1 = 0xff; // disable all outputs of PWM
trdoer2 = 0x00; // disable outputs by INT0
trdiora0= 0xaa;
trdiora1= 0xaa;
trdiorc0= 0xaa;
trdiorc1= 0xaa;
trdcr0 = 0x23; // count at both edges f8 , clear together with 1
trdcr1 = 0x23; // count at both edges f8
PERIOD_REG0 = TIMER_PWM_RESOL-1;
PERIOD_REG1 = TIMER_PWM_RESOL-1;
PWM_REG0 = TIMER_PWM_RESOL; // change point of PWM
PWM_REG1 = 0; // change point of PWM
trd0 = 0xffff; // counter itself
trd1 = 0xffff;
trdier0 = 0x00; // enable compare A0 interrupt
trdier1 = 0x00; // disable all interrupts in 1 channel
// trd0ic = 0x04; // interrupts priority register - enabled
trdstr = 0x0F; // Go!
OFF_PIN_DU3();
OFF_PIN_DU4();
}
Уходя, оставьте свет...