Bonjour,
Je suis actuellement sur un programme en C, et je dois gérer trois interruptions (une de priorité haute, les deux autres basses).
A la base, j'avais un timer2, qui doit gérer une modulation de courant.
J'y ai ajouté une interruption lorsque le pic reçoit quelque chose en usart (afin de gérer des trames).
Jusqu'ici, ça fonctionnait plutôt bien.
Puis, j'ai ajouté un timer4, et là, ça a commencé à partir un peu n'importe comment.
J'ai quelque peu lutté avec les déclarations des interruptions, et je pense que le problème vient de là. Je n'ai pas trouvé grand chose sur internet à propos des interruptions multiples pour une même priorité, je suppose donc que c'est très simple...
Voilà un bout de code :
Pour l'instant, Timer2 n'est pas allumé, Timer4 fait commuter une del toutes les 250ms, et UsartInt ne fait rien tant qu'on envoi pas de trame.Code:void Timer2Int(void); #pragma code Hight_vector=0x08 // The hight interrupt vector is found at 0x08. void Interrupt_at_Hight_vector(void) { _asm GOTO Timer2Int _endasm // jump to the ISR } #pragma code // return to the default code section void Timer4Int(void); #pragma code Low_Vector=0x18 void InterruptTimer4(void) { _asm GOTO Timer4Int _endasm // jump to the ISR } #pragma code // return to the default code section void Usart1Int(void); //#pragma code IntUsart=0x18 // The low interrupt vector is found at 0x18. #pragma code Low_Vector void InterruptUsartInt(void) { _asm GOTO Usart1Int _endasm // jump to the ISR } #pragma code // return to the default code section
La del commute bien, c'est génial... sauf que si j'envoi une trame, elle se met à changer d'état toutes les 3µs.
(de plus usart ne reçoit alors qu'un seul octet de la trame, mais je pense que ça vient du fait que le programme est occupé dans le timer4)
Je commence à sécher là, et la doc de MPLab ou de C18 ne m'aide pas vraiment (faudrait-il passer par des nested interrupts ?)
-----