
Programme 16F877A
#1
Posté 16 mai 2008 - 05:22
J'aimerai utiliser un PIC 16F877A pour rendre autonome mon robot.
Quelqu'un aurait t'il un programme a m'envoyer ( en C si possible car l'assembleur n'est pas ma tasse de thé) afin que je vois comment il est fait et essayer un peu de comprendre le fonctionnement?
Merci d'avance
Cordialement
Julien
#2
Posté 16 mai 2008 - 08:05
Sinon , moi , s'est plutôt
void main()
{
start();
demarage();//fonction qui boucle pour attendre le démarage ( bouton )
while(1)
{
capteurs();
}
}
Le programme capteur :
1 capture x 10
2 moyenne ( filtrage numérique)
3 test pour les corrections .
Je vais pas donner mes programmes car ils sont long et font beaucoup de chose un programme simple serai mieux pour toi ...
#3
Posté 17 mai 2008 - 10:22
je pense que le plus intéressant pour toi et pour ceux qui passeraient sur ce sujet, est de t'aider à réaliser ton prog et non te fournir un déjà tout fait.
Il faudrait que tu nous dises ce que ton robot doit faire et les entrées/sorties que tu utilises. De là, on pourra te guider dans ton prog.
@+
#5
Posté 19 mai 2008 - 06:42
Ensuite, il faut que tu les déclares. Exple :
#define Sens_Dr RA2
#define Sens_Ga RA3
#define Vit_Ga RA4
#define Vit_Dr RA5
#define Bout_ma RB0
#define capteur1 RA0
#define capteur2 RA1
etc.
Ensuite, il faut que dans ton programme, tu es un séance d'initialisation (pour configurer les bits des ports en entrée/sortie, etc). Exple :
void Init(void)
{
ADCON1 = 0x07;
GIE=1; PEIE=1; // Autorise les interruptions
OPTION=0b10000001; // Configure tmr0 pour 64µs par bit
TRISA=0b00000011; //en entree c 1
TRISB=0b11111111;
TRISC=0b11011111;
TMR0=0; // Confiqure la valeur de départ du registre TMR0
T0IE=1; // Active l'interruption de débordement du registre TMR0
Sens_Dr = 0;
Vit_Dr = 0;
Sens_Ga = 0;
Vit_Ga = 0;
}
Ensuite, il faut construire ton prog principal. Exple:
main()
{
Init();
while(1) // Répéter toujours
{
action1();
action2();
...
}
}
Ca fait déjà pas mal de chose.
Maintenant à toi de jouer.
Essaies de nous proposer un début de programme pour que nous puissions en discuter.
@+
#6
Posté 19 mai 2008 - 06:47
motg(unsigned char direction, unsigned char puissance)
{
switch(direction)
{
case av:
break;
case ar:
break;
case stop:
...........
}
CCP21L=puissance;
}
S'est pas se qui a de plus optimiser , mais s'est bien pratique ...
#8
Posté 19 mai 2008 - 09:56
RB0 : interruption sur front montant ou descendant
RBI : interruption sur un front de RB4 a RB7
SCL et SDA pour l'I2C ( Port C )
PWM ( CCP1 ET CCP2 )( port c )
En gros regarde bien se que tu as besoin , et fait ton typon ensuite ...
#9
Posté 19 mai 2008 - 10:04
En tout cas merci de votre aide
A bientot
#11
Posté 20 mai 2008 - 10:06
--Déclaration
#define IN1 pin_A0
#define capteur_Dr RB1
#define capteur_Ga RB2
#define capteur_Ha RB3
#define moteur_Ga_s1 RB4
#define moteur_Ga_s2 RB5
#define moteur_Dr_s1 RB6
#define moteur_Dr_s2 RB7
#define moteur_Ha_s1 RC0
#define moteur_Ha_s2 RC1
--initialisation (pour configurer les bits des ports en entrée/sortie, etc):
void Init(void)
{
ADCON1 = 0x07;
GIE=1; PEIE=1; // Autorise les interruptions
OPTION=0b10000001; // Configure tmr0 pour 64µs par bit
TRISB=0b11100000;
TRISC=0b00111111;
TMR0=0; // Confiqure la valeur de départ du registre TMR0
T0IE=1; // Active l'interruption de débordement du registre TMR0
capteur_Dr =0 ;
capteur_Ga =0 ;
capteur_Ha =0 ;
moteur_Ga_s1= 1;
moteur_Dr_s1= 1;
moteur_GA_s2= 0;
moteur_Dr_s2= 0;
moteur_Ha_s1=0 ;
moteur_Ha_s2=0 ;
}
-- prog principal:
main()
{
Init();
while(1) // Répéter toujours
{
action1();
action2();
...
}
}
j'ai quelques petites questions:
Au niveau des déclarations, je suis obligé de mettre tout sa:
ADCON1 = 0x07;
GIE=1; PEIE=1; // Autorise les interruptions
OPTION=0b10000001; // Configure tmr0 pour 64µs par bit
TRISA=0b00000011; //en entree c 1
TRISB=0b11111111;
TRISC=0b11011111;
TMR0=0; // Confiqure la valeur de départ du registre TMR0
T0IE=1; // Active
ou alors je n'en ai pas l'utilité?
Aussi au niveau du programme principal
je laisse mon while(1) pour boucler a l'infini mais au niveau ds actions 1 ... je fais quoi?
si je veux faire un :
while capteur_Ga=1 then moteur_Ga_sens_2=1 and moteur_Ga_sens_1=0
or while capteur_Dr=1 then moteur_Dr_sens_2=1 and moteur_Dr_sens_1=0
or while capteur_Ha=1 and capteur_Ga=1 and capteur_Dr=1 then moteur_Ha_sens_1=1
...
comment l'integrer a mon programme principal?
Merci
#12
Posté 20 mai 2008 - 11:15
if(capteur_Ha==pre)demi_tour();
else if(capteur_Dr ==pre)a_gauche();
else if(capteur_Ga==pre) a_droite();
else tt_droit();
Voila une solution , après si sa se passe comme moi et mon suiveur de ligne tu va avoir des parasites , donc il faut faire 10 mesures avant et prendre la moyenne . ( filtrage numérique )
Bon courage.
Ps: n'hésite pas a mettre pre pour présent et abs pour absent , car parfois on marque 1 pour présent et s'est 0 donc sa fonctionne pas ...
#14
Posté 21 mai 2008 - 01:38
#define pre 0
S'est tout
après j'ai mis demi_tour();
Pour m'éviter de faire
if...............
{
motg(av,100);
motd(ar,100);
}
Tu peux faire aussi
#define demi_tour()\
{\
motg(av,100);\
motd(ar,100);\
}
En gros sa te remplace demi tour si tu l'utilise souvant ... sa te permet d'économiser de la ram . ( mais tu perd en rom... )
#15
Posté 21 mai 2008 - 03:32
--Déclaration
#define IN1 pin_A0
#define capteur_Dr RB1
#define capteur_Ga RB2
#define capteur_Ha RB3
#define moteur_Ga_s1 RB4
#define moteur_Ga_s2 RB5
#define moteur_Dr_s1 RB6
#define moteur_Dr_s2 RB7
#define moteur_Ha_s1 RC0
#define moteur_Ha_s2 RC1
#define tt_droit()
{
moteur_Ga_s1(av,100);
moteur_Dr_s1(ar,100);
}
#define a_gauche()
{
while (capteur_Dr!=0)
{
moteur_Ga_s2(av,100);
moteur_Dr_s1(ar,100);
}
}
#define a_droite()
{
while (capteur_Ga!=0)
{
moteur_Ga_s1(av,100);
moteur_Dr_s2(ar,100);
}
}
#define demi_tour()
{
while(capteur_ga!=0) and (capteur_ga!=0)
{
moteur_Ga_s2(av,100);
moteur_Dr_s1(ar,100);
}
}
--initialisation (pour configurer les bits des ports en entrée/sortie, etc):
void Init(void)
{
ADCON1 = 0x07;
GIE=1; PEIE=1; // Autorise les interruptions
OPTION=0b10000001; // Configure tmr0 pour 64µs par bit
TRISB=0b11100000;
TRISC=0b00111111;
TMR0=0; // Confiqure la valeur de départ du registre TMR0
T0IE=1; // Active l'interruption de débordement du registre TMR0
capteur_Dr =0 ;
capteur_Ga =0 ;
capteur_Ha =0 ;
moteur_Ga_s1= 1;
moteur_Dr_s1= 1;
moteur_GA_s2= 0;
moteur_Dr_s2= 0;
moteur_Ha_s1=0 ;
moteur_Ha_s2=0 ;
}
-- prog principal:
main()
{
Init();
while(1) // Répéter toujours
{
if(capteur_Dr==1)and(capteur_Ga==1)demi_tour();
else if(capteur_Dr ==1)a_gauche();
else if(capteur_Ga==1) a_droite();
else tt_droit();
}
}
Par contre je ne suis pas sur qu'avec (av, 100) sa fonctionne.
Je doit mettre quoi (1, 100) non ?
Juste ce petit bout se code peut me faire éviter les obstacles?
#17
Posté 21 mai 2008 - 05:07
Il faut le faire sous Mplab avec un compilateur C comme Hi Tech Picc mais je n'arrive pas a configurer Mplab avec HI tech Picc donc je fais d'abord mon prog en attendant de trouver un PC ou sa tourne bien avec un prog de PIC.voila voila
#18
Posté 21 mai 2008 - 05:15
C:\Program Files\HI-TECH Software\PICC ligt\9.50\BIN\picl.exe ( attention , le lien peux être faut )
Ou si tu as la version commerciale , s'est
C:\Program Files\HI-TECH Software\PICC\9.50\BIN\picc.exe
Bon courage
Répondre à ce sujet

1 utilisateur(s) li(sen)t ce sujet
0 members, 1 guests, 0 anonymous users