Perché no? Imposta due interrupt sui rollover dei timer e fai partire uno dopo un numero di cicli predefinito dall'altro.
- Codice: Seleziona tutto
Void main()
{
...
TMR1ON = 1;
__delay_us(TON);
TMR2ON = 1;
...
}
Void interrupt_TMR1()
{
toggle_PWM1();
TMR1IF = 0;
return;
}
Void interrupt_TMR2()
{
toggle_PWM2();
TMR2IF = 0;
return;
}
Alternativamente fai partire il secondo timer tramite il primo direttamente dall'interrupt:
- Codice: Seleziona tutto
Void interrupt_TMR1()
{
toggle_PWM1();
TMR2 = 0xFF - delay_cycles;
TMR2ON = 1;
TMR1IF = 0;
return;
}
Void interrupt_TMR2()
{
toggle_PWM2();
TMR2ON = 0;
TMR2IF = 0;
return;
}
Nel secondo caso devi calcolare i cicli da sottrarre al secondo timer per avere il tuo ritardo, nel codice ho ipotizzato che il rollover avvenga a 0xFF ma devi dirmi tu che dispositivo stai usando. Inoltre i cicli di ritardo devono tenere conto dell'overhead di scrittura ai registri, di chiamata alle routine di toggle e di accesso all'interrupt (è più difficile a dirsi che a farsi). Se usi PIC potresti avere per certi timer un registro PRx e si può usare quello.
toggle_PWMx() è fatta più o meno così:
- Codice: Seleziona tutto
Void toggle_PWMx()
{
Pin_PWMx = !Pin_PWMx;
return;
}
Questo è uno pseudo-codice che segue la sintassi XC8 di Microchip.