Aller au contenu


Photo
- - - - -

Programme 16F877A


20 réponses à ce sujet

#1 babylone_59

babylone_59

    Membre

  • Membres
  • 28 messages

Posté 16 mai 2008 - 05:22

Bonjour
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 Matthieu

Matthieu

    Membre chevronné

  • Membres
  • PipPipPipPip
  • 604 messages
  • Gender:Male

Posté 16 mai 2008 - 08:05

Tu veux faire quoi comme type de robots ?

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 PZaf

PZaf

    Habitué

  • Membres
  • PipPip
  • 249 messages
  • Location:Toulon

Posté 17 mai 2008 - 10:22

salut,

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.

@+

#4 babylone_59

babylone_59

    Membre

  • Membres
  • 28 messages

Posté 18 mai 2008 - 10:35

Dans un premier temps j'aimerai juste faire fonctionner mon robot avec des capteurs infrarouge (led emettrice/receptrice).Lors que je me trouve devant un obstacle changer de direction.
J'ai 2 capteurs a l'avant et 2 moteurs.

#5 PZaf

PZaf

    Habitué

  • Membres
  • PipPip
  • 249 messages
  • Location:Toulon

Posté 19 mai 2008 - 06:42

Il faut que tu nous dises sur quels bits de quels ports sont connectés tes capteurs, ta carte moteur, ton bouton M/A, etc. (toutes tes entrées/sorties).

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 Matthieu

Matthieu

    Membre chevronné

  • Membres
  • PipPipPipPip
  • 604 messages
  • Gender:Male

Posté 19 mai 2008 - 06:47

Sinon , se que j'aime bien aussi , s'est d'utiliser le timer2 en mode PWM et faire une fonction pour la gession moteur

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 ...

#7 babylone_59

babylone_59

    Membre

  • Membres
  • 28 messages

Posté 19 mai 2008 - 09:05

OK merci je vais essayer.
Pour l'instant j'ai tout ce qui faut mais rien n'est connecté au pic.
L'utilisation d'un port et mieu qu'un autre port?

#8 Matthieu

Matthieu

    Membre chevronné

  • Membres
  • PipPipPipPip
  • 604 messages
  • Gender:Male

Posté 19 mai 2008 - 09:56

Non , mais regarde dans la doc du pic , il a certaines pin du pic qui ont des petit plus ( comme le port A : port analogique/ fonctionne aussi en numérique )
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 babylone_59

babylone_59

    Membre

  • Membres
  • 28 messages

Posté 19 mai 2008 - 10:04

En fait ma plaque est déja tiré et soudé. J'ai mon PIC qui est alimenté et son quartz ainsi que mon reset et chaque patte de mon PIC est relié a un bornié comme sa je viens connecter et déconnécter ce que je souhaite. Je vais tenter un programme et je l'afficherai pour avoir des conseils avant d'essayer de programmer mon pic et de tout foirer.
En tout cas merci de votre aide
A bientot


#10 Matthieu

Matthieu

    Membre chevronné

  • Membres
  • PipPipPipPip
  • 604 messages
  • Gender:Male

Posté 20 mai 2008 - 10:32

un bon truc a savoir :

#define IN1 pin_A0

Sa te permet de modifier rapidement ton programme .

#11 babylone_59

babylone_59

    Membre

  • Membres
  • 28 messages

Posté 20 mai 2008 - 10:06

Voici un début de mon programme, par contre je bloque au niveau de mon programme principal:

--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 Matthieu

Matthieu

    Membre chevronné

  • Membres
  • PipPipPipPip
  • 604 messages
  • Gender:Male

Posté 20 mai 2008 - 11:15

Tout dépend de se que tu veux faire , si s'est un robot qui évite les obstacles , je ferai

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 ...

#13 babylone_59

babylone_59

    Membre

  • Membres
  • 28 messages

Posté 21 mai 2008 - 12:43

Ok mais il faut définir les actions demi_tour(), a_gauche() et a_droite().
Ou et comment sont elles définies?
De meme il faut définir que pre==1 et abs==0?
Pour commencer j'aimerai juste que mon robot évite les obstacles.

#14 Matthieu

Matthieu

    Membre chevronné

  • Membres
  • PipPipPipPip
  • 604 messages
  • Gender:Male

Posté 21 mai 2008 - 01:38

pre=0 :

#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 babylone_59

babylone_59

    Membre

  • Membres
  • 28 messages

Posté 21 mai 2008 - 03:32

voila j'ai continuer mon programme, je le réaffiche:

--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?

#16 Matthieu

Matthieu

    Membre chevronné

  • Membres
  • PipPipPipPip
  • 604 messages
  • Gender:Male

Posté 21 mai 2008 - 03:43

Question , est ce que tu compile quand tu programme , si non , il faudrai commencer , car tu va avoir des surprise ... ( il a des erreurs ... )

#17 babylone_59

babylone_59

    Membre

  • Membres
  • 28 messages

Posté 21 mai 2008 - 05:07

En fait je n'est pas encore essayé de compiler.
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 Matthieu

Matthieu

    Membre chevronné

  • Membres
  • PipPipPipPip
  • 604 messages
  • Gender:Male

Posté 21 mai 2008 - 05:15

Si tu as pic c ligt : tu fait projet > projet wizard > ...> selection de hi tech softwaire> le lien , sa seras

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

#19 babylone_59

babylone_59

    Membre

  • Membres
  • 28 messages

Posté 21 mai 2008 - 05:44

As tu un lien pour telecharger Pic C ligt? si oui peux tu me le fournir je vais essayer avec se logiciel?
merci

#20 Matthieu

Matthieu

    Membre chevronné

  • Membres
  • PipPipPipPip
  • 604 messages
  • Gender:Male

Posté 21 mai 2008 - 07:41

S'est ton logiciel que tu me parle hi tech . Le light = version gratuite , mais a la place d'utiliser 100% de ton pic , tu est brider a 25 % , sa fait mal quand tu dois faire des gros programme ....



Répondre à ce sujet



  


0 utilisateur(s) li(sen)t ce sujet

0 members, 0 guests, 0 anonymous users