Hi,
I am trying to find a way to configure a eMIOS DAOC output pin to output a pulse at specific timer values - as in the example in the eMIOS section of the reference manual.
The RTD interface only allows DAOC with the PWM interface, so the only plausible function to set the timing is Pwm_SetPeriodAndDuty. But this always sets A to 1, while I would like to base the start of the event on a timestamp captured via the Icu.
The PWM code also generates a useless interrupt...
Is there a way to do that with the current RTD or is this something that I would need to write by hand?
Thanks!
G
Solved! Go to Solution.
1. No such API is provided
I looked at our driver, in DAOC mode it will only update the value of reg B, and the default reg A is set to 1
2. Your understanding is correct, but this does not affect anything. It should be possible to pause the counter count in the DAOC interrupt handler
Hi@grol
I don't quite understand your question, do you want us to provide you with a DAOC routine or something?
Hi @Senlent ,
thanks for your response - yes, I basically would like to have a fast interface to set up a DAOC event.
So far I have figured out that DAOC is represented in RTD in the Pwm module, but I could not find an Pwm_* interface to set up a single pulse at a specific time.
I have eMIOS channel 23 set up as my counter and would like to use DAOC to output a pulse (using CH14 at the moment) starting at A and ending at B - with A and B being arbitrary "timestamps" of my CH23 counter.
Then trigger an interrupt at B (falling edge).
My question was basically if this is something supported by the RTD and if yes, what is the function to use?
Thanks a lot!
grol
Maybe my misunderstanding is based on the fact that I don't actually want a PWM output but just a single fire event
The attachment is the eMIOS DAOC routine based on RTD 2.0.3, you can refer to it
Hi @Senlent ,
thanks for the demo project.
Unfortunately this does only cover the RTD configuration itself, not any interfacing to change timing parameters during runtime.
I am testing a function like this now - which I added as a new function in Emios_Pwm_Ip.c:
Emios_Pwm_Ip_StatusType Emios_Pwm_Ip_SetDaocAB(uint8 Instance,
uint8 Channel,
Emios_Pwm_Ip_PeriodType A,
Emios_Pwm_Ip_PeriodType B)
{
[...]
/* Configure Leading Edge in reg A */
Emios_Pwm_Ip_SetUCRegA(Base, Channel, A);
/* Configure Trailing Edge in reg B */
Emios_Pwm_Ip_SetUCRegB(Base, Channel, B);
/* Push A/B */
Emios_Pwm_Ip_SetOutputUpdate(Base, Channel, TRUE);
[...]
}
This is what I was searching for, am I right that nothing like this exists?
I also don't really understand why the function Emios_Pwm_Ip_IrqDaocHandler always re-enables the DAOC, so I end up with a blinking LED in the example - my understanding was that DAOC is supposed to be a one-time event.
Thanks!
Best regards,
grol
1. No such API is provided
I looked at our driver, in DAOC mode it will only update the value of reg B, and the default reg A is set to 1
2. Your understanding is correct, but this does not affect anything. It should be possible to pause the counter count in the DAOC interrupt handler
Hi @Senlent ,
Thanks for the clarification!
I will use a custom implementation similar to the one shown above to create a pulse for my use case then.
Best regards,
grol