Tengo algunas preguntas sobre los temporizadores de software e interrupciones en un microcontrolador. Solo para información, uso un microcontrolador dsPIC33E.
El objetivo final es implementar un protocolo de comunicación en serie: RS485 con Modbus. Logré transmitir y recibir un mensaje, y ahora tengo que hacer una parte de procesamiento de mensajes.
Dado que necesito un montón de temporizadores para todo tipo de tareas diferentes (por ejemplo, 3.5 caracteres de retardo necesarios para la comunicación en serie, algo de retardo necesario para los botones de rebote, etc.), planeo implementar los temporizadores en un software usando un solo temporizador de hardware . Por ejemplo, el período del temporizador de hardware se establece en 100 us, y se genera una interrupción en cada "desbordamiento", es decir, cada 100 us. En el ISR acabo de actualizar los contadores globales, que básicamente son temporizadores de software con una resolución de 100, mientras que el ISR del temporizador de hardware tiene la máxima prioridad. ¿Es esta una buena manera de hacer esto o hay alguna mejor manera?
Cada contador (es decir, un temporizador de software) ha definido su propio período, y una vez que el contador alcanza su "valor de período", quiero llamar a alguna función. Ahora no es una buena idea llamar a esta función desde dentro del ISR del temporizador de hardware, porque esa función se procesará con la mayor prioridad ya que la rutina de llamada es el ISR del temporizador de hardware. Lo que quiero es definir alguna función, digamos:
void Modbus_Protocol(void);
y poder definirlo como una interrupción, que no será de la más alta prioridad. Solo el temporizador de hardware principal tiene la mayor prioridad en este concepto. De esa manera, una vez que el contador en el temporizador de hardware ISR alcanza su valor de período, no llamará a su función, sino que simplemente establecerá un indicador para activar una interrupción (por ejemplo, void Modbus_Protocol (void) ), que se activará después de que el ISR principal regrese, dependiendo de su prioridad. ¿Se puede hacer algo como esto, es decir, puedo definir interrupciones de software?
Sé que existe la posibilidad de usar interrupciones de hardware que no se usan, y simplemente establecer un indicador de interrupción desde dentro del software. Pero no creo que esta sea una forma elegante de implementar interrupciones si las interrupciones de software definidas por el usuario son posibles.