МК ATxmega64a3u.
Возникла необходимость в двух шим со сдвигом в 180.
Записал в регистр счетчика Tcf0_cnt значение в два раза меньше чем в регистр периода Tcf0_per.
Генерит как положено - со сдвигом на 180, но до тех пор пока не перейду на вторую подпрограмму.
После возврата, фаза сигнала смещается непредсказуемо.
Подскажите в чем проблема ?
Хотя склоняюсь , что сам принцип реализации сдвига сигнала не совсем корректен.
$regfile = "xm64a3def.dat"
$crystal = 32000000
$hwstack = 64
$swstack = 64
$framesize = 64 '
'-------------------------------------------------------------------------------
$lib "xmega.lib" : $external _xmegafix_clear : $external _xmegafix_rol_r1014
'-------------------------------------------------------------------------------
Config Osc = Enabled , 32mhzosc = Enabled , 32khzosc = Enabled
Config Sysclock = 32mhz , Prescalea = 1 , Prescalebc = 1_1
'-------------------------------------------------------------------------------Config Tcf0 = Pwm , Prescale = 64
Tcf0_cnt = 5200
Config Tce1 = Pwm , Prescale = 64
'-------------------------------------------------------------------------------
Config Portf.0 = Output
Config Porte.5 = Output'-------------------------------------------------------------------------------
Config Pinb.6 = Input : Config Pinb.7 = Input
Button_mode Alias Pinb.6 : Button_start_stop Alias Pinb.7
'-------------------------------------------------------------------------------
'Dim Period As Word , Dlitelnost As Word
Dim Status_start_stop As Bit , Rejim As Bit
'===============================================================================
Do
If Rejim = 0 Then
Gosub Rejim_1 : Else : Gosub Rejim_2 : End IfDebounce Button_start_stop , 0 , Start_stop , Sub
Debounce Button_mode , 0 , Mode_select , Sub
Loop
'=========================== КНОПКА СТАРТ / СТОП ===============================
Start_stop:
Toggle Status_start_stop
Return
'=============================== ВЫБОР РЕЖИМА ==================================
Mode_select:
If Status_start_stop = 0 Then Toggle Rejim
Return
'============================== РЕЖИМ_1 ========================================
Rejim_1:Tcf0_perbuf = 10400
Tcf0_ccabuf = 2400Tce1_perbuf = 10400
Tce1_ccbbuf = 2400If Status_start_stop = 0 Then
Tcf0_ctrla = 0 : Tce1_ctrla = 0 : Tcf0_ctrlb = &B00000011 : Tce1_ctrlb = &B00000011 : Portf.0 = 1 : Porte.5 = 0
Else
Tcf0_ctrla = 5 : Tce1_ctrla = 5 : Tcf0_ctrlb = &B00010011 : Tce1_ctrlb = &B00100011
End IfReturn
'============================== РЕЖИМ_2 ========================================
Rejim_2:
Tcf0_perbuf = 5400
Tcf0_ccabuf = 1400Tce1_perbuf = 5400
Tce1_ccbbuf = 1400If Status_start_stop = 0 Then
Tcf0_ctrla = 0 : Tce1_ctrla = 0 : Tcf0_ctrlb = &B00000011 : Tce1_ctrlb = &B00000011 : Portf.0 = 0 : Porte.5 = 1
Else
Tcf0_ctrla = 5 : Tce1_ctrla = 5 : Tcf0_ctrlb = &B00010011 : Tce1_ctrlb = &B00100011
End IfReturn
'===============================================================================