Bonjour,
J'ai besoin d'aide (assez urgent) pour réaliser un petit programme en C pour une entreprise électronique (virtuelle)-Programme an assembleur du PIC 16F628-
Le collègue n'est plus disponible, je ne peux assurer tout seul le boulot, je suis débutant en C.
Voici le problème (il y a 3 programmes mais en fait ils sont basés sur le même principe) :
Réalisation d’un module électronique de commande moteur par contact relais.
Ce module est composé d’un commutateur 3 positions pour les entrées, de deux sorties temporisées S1 et S2
Suivant la position du commutateur, on délivre en sortie différente temporisation.
Programme 1:
-Position P1
S1 déclenche pendant 3 mm (180s) ensuite s’arrête 15 mm (720s)
S2 déclenche au bout de 9 mm (720s) pendant 30s.
le cycle se poursuit sur 24 heures
-Position P2
S1 déclenche pendant 6 mm ensuite s’arrête 15 mm
S2 déclenche au bout de 9 mm pendant 30s.
le cycle se poursuit sur 24 heures
-Position P3
S1 déclenche pendant 9 mm ensuite s’arrête 15 mm
S2 déclenche au bout de 12 mm pendant 30s.
le cycle se poursuit sur 24 heures
Programme2:
-Position P1
S1 déclenche pendant 10 mm (600s) ensuite s’arrête 20 mm (1200s)
S2 déclenche au bout de la 19éme mm (1140s) de l’arrêt de S1 pendant 40s.
Durée du cycle 30 mn (1800s)
le cycle se poursuit sur en continu
-Position P2
S1 déclenche pendant 15 mm (900s) ensuite s’arrête 25 mm (1500s)
S2 déclenche au bout de 24éme mm (1440s) de l’arrêt de S1 pendant 55s.
Durée du cycle 40 mn (2400s)
le cycle se poursuit sur en continu
-Position P3
S1 déclenche pendant 15 mm (900s) ensuite s’arrête 25 mm (1500s)
S2 déclenche au bout de 24éme mm (1440s) de l’arrêt de S1 pendant 55s.
Durée du cycle 18 mn (1080s)
le cycle se poursuit sur en continu
Programme3:
-Position P1
S1 déclenche pendant 3 mm (180s) ensuite s’arrête 17 mm (1020s)
S2 déclenche au bout de 19 mm (1140s) pendant 20s.
Durée du cycle 20 mn (1200s)
le cycle se poursuit sur en continu
-Position P2
S1 déclenche pendant 4 mm (240s) ensuite s’arrête 16 mm (960s)
S2 déclenche au bout de 19 mm (1140s) pendant 20s.
Durée du cycle 20 mn (1200s)
le cycle se poursuit sur en continu
-Position P3
S1 déclenche pendant 5 mm (300s) ensuite s’arrête 16 mm (960s)
S2 déclenche au bout de 20 mm (1200s) pendant 20s.
Durée du cycle 21 mn (1260s)
le cycle se poursuit sur en continu
Voici mon code pour l'instant :
Exemple Programme 1:
Programme 2:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59 #include<P16F628.h> // Manque les .asm qui vont bien avec le composant ?? #include<time.h> int State = 0; int delaiAvantMarche1; //Le délai avant que S1 se mette en position ON int delaiAvantMarche2; //Le délai avant que S2 se mette en position ON int delaiEnMarche1; //Le délai avant que S1 se mette en position OFF int delaiEnMarche2; //Le délai avant que S2 se mette en position OFF TRISA = 0b00010011; //Configuration du port A (RA 0,1,4 en entrée - 2,3,4,5,6 en sortie) TRISB = 0b00000000; //Port B configuré en sortie (pour des raisons de sécurité) OSCCON=0b11111111; //Ceci est une configuration personnelle que j'utilise donc à toi d'adapter OSCTUNE=0b01000000; //idem While(1) { //Ici dans les if tu vas jouer sur les delais if(PORTAbits.RA0 == 0){ //position P1 //bons délais pour P1 en secondes delaiEnMarche1 = 180 ; delaiAvantMarche1 = 900 ; delaiAvantMarche2 = 540 ; delaiEnMarche2 = 30 ; }else if(PORTAbits.RA1 == 0){ //position P2 delaiEnMarche1 = 360; delaiAvantMarche1 = 900; delaiAvantMarche2 = 540 ; delaiEnMarche2 = 30 ; }else if(PORTAbits.RA4 == 0){ //position P3 delaiEnMarche1 = 540; delaiAvantMarche1 = 900; delaiAvantMarche2 = 720 ; delaiEnMarche2 = 30 ; } //Dans le switch les actions vont se suivre en fonction des délais que tu as mis switch(State){ case 0 : Delay(delaiAvantMarche1); //attente du délai avant la mise en marche LATAbits.LATA3 = 0; //S2 : OFF LATAbits.LATA2 = 1; //S1 : ON Delay(delaiEnMarche1); //attente du délai avant l'arret LATAbits.LATA2 = 0; //S1 : OFF State = 1 ; //on passe à l'état suivant break ; case 1 : Delay(delaiAvantMarche2); //attente du délai avant la mise en marche LATAbits.LATA2 = 0; //S1 : OFF LATAbits.LATA3 = 1; //S2 : ON Delay(delaiEnMarche2); //attente du délai avant l'arret LATAbits.LATA3 = 0; //S2 : OFF State = 0 ; break ; } }
Programme 3:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58 #include<P16F628.h> // Manque les .asm qui vont bien avec le composant ?? #include<time.h> int State = 0; int delaiAvantMarche1; //Le délai avant que S1 se mette en position ON int delaiAvantMarche2; //Le délai avant que S2 se mette en position ON int delaiEnMarche1; //Le délai avant que S1 se mette en position OFF int delaiEnMarche2; //Le délai avant que S2 se mette en position OFF TRISA = 0b00010011; //Configuration du port A (RA 0,1,4 en entrée - 2,3,4,5,6 en sortie) TRISB = 0b00000000; //Port B configuré en sortie (pour des raisons de sécurité) OSCCON=0b11111111; //Ceci est une configuration personnelle que j'utilise donc à toi d'adapter OSCTUNE=0b01000000; //idem While(1) { //Ici dans les if tu vas jouer sur les delais if(PORTAbits.RA0 == 0){ //position P1 //bons délais pour P1 en secondes delaiEnMarche1 = 180 ; delaiAvantMarche1 = 1020 ; delaiAvantMarche2 = 1140 ; delaiEnMarche2 = 20 ; }else if(PORTAbits.RA1 == 0){ //position P2 delaiEnMarche1 = 240; delaiAvantMarche1 = 960; delaiAvantMarche2 = 1140 ; delaiEnMarche2 = 20 ; }else if(PORTAbits.RA4 == 0){ //position P3 delaiEnMarche1 = 300; delaiAvantMarche1 = 960; delaiAvantMarche2 = 1200 ; delaiEnMarche2 = 20 ; } //Dans le switch les actions vont se suivre en fonction des délais que tu as mis switch(State){ case 0 : Delay(delaiAvantMarche1); //attente du délai avant la mise en marche LATAbits.LATA3 = 0; //S2 : OFF LATAbits.LATA2 = 1; //S1 : ON Delay(delaiEnMarche1); //attente du délai avant l'arret LATAbits.LATA2 = 0; //S1 : OFF State = 1 ; //on passe à l'état suivant break ; case 1 : Delay(delaiAvantMarche2); //attente du délai avant la mise en marche LATAbits.LATA2 = 0; //S1 : OFF LATAbits.LATA3 = 1; //S2 : ON Delay(delaiEnMarche2); //attente du délai avant l'arret LATAbits.LATA3 = 0; //S2 : OFF State = 0 ; break ; } }
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58 #include<P16F628.h> // Manque les .asm qui vont bien avec le composant ?? #include<time.h> int State = 0; int delaiAvantMarche1; //Le délai avant que S1 se mette en position ON int delaiAvantMarche2; //Le délai avant que S2 se mette en position ON int delaiEnMarche1; //Le délai avant que S1 se mette en position OFF int delaiEnMarche2; //Le délai avant que S2 se mette en position OFF TRISA = 0b00010011; //Configuration du port A (RA 0,1,4 en entrée - 2,3,4,5,6 en sortie) TRISB = 0b00000000; //Port B configuré en sortie (pour des raisons de sécurité) OSCCON=0b11111111; //Ceci est une configuration personnelle que j'utilise donc à toi d'adapter OSCTUNE=0b01000000; //idem While(1) { //Ici dans les if tu vas jouer sur les delais if(PORTAbits.RA0 == 0){ //position P1 //bons délais pour P1 en secondes delaiEnMarche1 = 600 ; delaiAvantMarche1 = 1200 ; delaiAvantMarche2 = 2940 ; delaiEnMarche2 = 40 ; }else if(PORTAbits.RA1 == 0){ //position P2 delaiEnMarche1 = 900; delaiAvantMarche1 = 1500; delaiAvantMarche2 = 3840 ; delaiEnMarche2 = 55 ; }else if(PORTAbits.RA4 == 0){ //position P3 delaiEnMarche1 = 900; delaiAvantMarche1 = 1500; delaiAvantMarche2 = 3840 ; delaiEnMarche2 = 55 ; } //Dans le switch les actions vont se suivre en fonction des délais que tu as mis switch(State){ case 0 : Delay(delaiAvantMarche1); //attente du délai avant la mise en marche LATAbits.LATA3 = 0; //S2 : OFF LATAbits.LATA2 = 1; //S1 : ON Delay(delaiEnMarche1); //attente du délai avant l'arret LATAbits.LATA2 = 0; //S1 : OFF State = 1 ; //on passe à l'état suivant break ; case 1 : Delay(delaiAvantMarche2); //attente du délai avant la mise en marche LATAbits.LATA2 = 0; //S1 : OFF LATAbits.LATA3 = 1; //S2 : ON Delay(delaiEnMarche2); //attente du délai avant l'arret LATAbits.LATA3 = 0; //S2 : OFF State = 0 ; break ; } }
Donc, manque les include restant (.asm), la fonction Delay() à écrire, je ne sais pas comment elle s'utilise dans ce cas là et la configuration de la partie TIMER 0 ou 1 ou 2 celui que je veux et regarder que je dois configurer quels registres (débordement, pré-diviseur, post-diviseur, oscillateur...). A la fin je devrais arriver à configurer mon timer mais je en sais pas comment faire.
ça va dépendre directement de la fréquence de mon oscillateur (j'en ai pas vu sur le schéma donc je suppose que c'est l'oscillateur interne du PIC) généralement les oscillateurs internes des PIC sont à 40MHz.
Merci de m'aider.
Partager