Bonjour à tous.
C’est mon premier message sur un forum, pardonnez la forme !
Je souhaite développer une carte à microcontrôleur pour du modélisme ferroviaire. Elle doit piloter une douzaine d’aiguillages et une vingtaine de leds. Et autant de boutons poussoirs. Elle évoluera surement vers un fonctionnement « capteurs » plutôt que boutons, mais pour démarrer, c’est bien comme ça.
J’ai décidé d’utiliser un PIC1F87J60 car on m’a donné une carte dévaluation EasyPic V7 qui en est équipée.
J’ai un peu bidouillé dessus et réalisé un programme tout simple qui allume une led en appuyant sur un BP. Je l’ai ensuit modifié pour intégrer une tempo… Et là ça se complique. Je m’explique : J’appuie sur mon BP, la led s’allume pendant 30 secondes puis se coupe. Jusqu’ici tout va bien. Mon problème, c’est que pendant que le µ exécute cette boucle, une action sur tout autre bouton n’est pas prise en compte. Le µ n’est pas à l’écoute, il termine d’abord sa tempo…
Dans le code ci-dessous, typiquement, une fois que ma boucle aiguillage 2 est lancée, je ne peux pas intervenir sur l’aiguillage 1 tant que la routine " case 3 " n’est pas finie. C’est tout à fait normal vu mon programme, mais je ne sais pas comment faire autrement pour gérer ça (surtout pour une trentaine d’E/S et de cas différents entre les éclairages et les aiguillages) !
Comment dois-je aborder le µC et le programme pour pouvoir commander plusieurs taches "en même temps" ? Est-ce possible ? Les interruptions, oui, mais pas suffisantes pour tous les boutons…
Avez-vous des pistes à me donner SVP ? Vos conseils sont les bienvenus !
Cordialement,
Arnaud
Le code :
Code:bit PN1_UP; // Passage à Niveau aiguillage 1 bit PN1_DOWN; bit PN2_UP; // Passage à Niveau aiguillage 2 bit PN2_DOWN; int Bcmd; //Sélecteur tache void tempo_PN1_UP() { Delay_ms(5000); // Tempo passage niveau 5 secondes } void tempo_PN1_DOWN() { Delay_ms(5000); // Tempo 5 secondes } void tempo_PN2_UP() { Delay_ms(4000); // Tempo 4 secondes } void tempo_PN2_DOWN() { Delay_ms(4000); // Tempo 4 secondes } void tempo_TrainTA() { Delay_ms(7000); // Tempo passage train Type A : 7 secondes } void main() { ADCON0 = 0; // Configure le PORTB en digital TRISB = 0xFF; // conf PORT en entrée TRISE = 0x00; // Configure PORTD en sortie LATE = 0x00; // initialise PORTD à 0 do { if (Button(&PORTB, 0, 1, 1)) { // détection niveau logique 1 avec anti-rebond Bcmd=1; } if (Button(&PORTB, 1, 1, 1)) { // détection niveau logique 1 avec anti-rebond Bcmd=2; } if (Button(&PORTB, 2, 1, 1)) { // détection niveau logique 1 avec anti-rebond Bcmd=3; } switch(Bcmd){ case 1 : { //Aiguillage n°1 (manuel) Bcmd=0; LATE0_bit=1; //moteur Descente barrière PN1 Run tempo_PN1_DOWN(); LATE0_bit=0; //moteur Descente barrière PN1 Stop break;} case 2 : { //Aiguillage n°1 (manuel) Bcmd=0; LATE1_bit=1; //moteur Montée barrière PN1 Run tempo_PN1_UP(); LATE1_bit=0; //moteur Montée barrière PN1 Stop break;} case 3 : { //Aiguillage n°2 (automatique) Bcmd=0; LATE2_bit=1; //moteur Descente barrière PN1 Run tempo_PN2_DOWN(); LATE2_bit=0; //moteur Descente barrière PN1 Stop tempo_TrainTA(); //Tempo Passage du train LATE3_bit=1; //moteur Montée barrière PN1 Run tempo_PN2_UP(); LATE3_bit=0; //moteur Montée barrière PN1 Stop break;} case 0 : break; } } while(1); // Boucle sans fin }
-----