Répondre à la discussion
Affichage des résultats 1 à 15 sur 15

pic 16f877 et ultrason "ping"



  1. #1
    aniky8

    pic 16f877 et ultrason "ping"


    ------

    bonjours

    je veux realiser un telemetre ultrason a l'aide d'un pic 16f877 et un capteur ultrason "ping"


    voila mon code source :

    unsigned long data cmpt ;
    double data temps ;
    double data dist ;

    void main ()

    {
    TRISA = 0x01 ;
    PORTA = 0x00 ;


    do
    {

    cmpt = 0 ;


    do
    {
    cmpt = cmpt+1;
    }while( RA0_BIT );


    if ( cmpt >= 2 )
    {
    temps = cmpt * 0.000001 ; //temps ecoulé
    dist = (temps/2)*34000 ; //distance en CM

    if ( dist <= 20)
    {
    PORTA = 0x02 ; sortie vers led
    Delay_ms(5) ;
    PORTA = 0x00;
    }
    }

    }while[1]


    }



    le but etant de detecter les objet a une destance inferieur ou egal a 20CM


    mais ça ne marche pas ; alors je me demande si le 16f877 prenait en charger les operation de multiplication et de division ??



    mci

    -----

  2. Publicité
  3. #2
    mat64

    Re : pic 16f877 et ultrason "ping"

    voila pourquoi je ne suis pas fan de l'emploi du C à tous crins pour les petits micros : les gens ne comprennent pas ce qu'ils font.

    Bon voyons ton problème : non le 877 ne sait pas faire de multiplications ni de divisions. C'est à dire qu'il n'y a pas d'instruction qui permettent de la faire efficacement. Mais pour en faire on peut appeler une fonction qui combine les instructions dispo, c'est ce que doit faire le compilo C quand on lui demande un * ou un / . Mais ça va ramer.

    Dans la mesure du possible, on essaye de limiter les * et / à des opérations avec des puissances de 2 sur ce genre de micros : comme ça c'est réalisé avec des décalages.

    Dans ton cas le problème ne vient certainement pas de la : si ça compile sans erreur, c'est que le compilo à du s'arranger pour te coder tes *.

    Quand tu dis que ça ne marche pas :
    - qu'est-ce qui ne marche pas ?
    - qu'as tu essayé pour diagnostiquer le problème ?
    - de quel matériel dispose-tu ? (émulateur ? oscillo ?)

  4. #3
    mat64

    Post Re : pic 16f877 et ultrason "ping"

    et aussi quand tu mets du code dans un message il faut indenter (mettre les tabs) et utiliser la balise CODE (le symbole #), sinon c'est illisible :

    Code:
    unsigned long data cmpt ;
    double data temps ;
    double data dist ;
    
    void main ()
    { 
    	TRISA = 0x01 ;
    	PORTA = 0x00 ;
    
    	do
    	{ 
    		cmpt = 0 ;
    		do
    		{ 
    			cmpt = cmpt+1;
    		}while( RA0_BIT );
    
    		if ( cmpt >= 2 )
    		{ 
    			temps = cmpt * 0.000001 ; //temps ecoulé 
    			dist = (temps/2)*34000 ; //distance en CM
    
    			if ( dist <= 20)
    			{
    				PORTA = 0x02 ; sortie vers led 
    				Delay_ms(5) ;
    				PORTA = 0x00;
    			}
    		}
    	}while[1]
    }

    Ensuite il faut donner plus de détails sur ton hard (donne le schéma... bon OK, dans ce cas c'est simple, on devine) et surtout donne la datasheet de ton capteur machin-chose que l'on est pas sensé connaitre.

    Une remarque sur ton code :

    tu incrémentes un compteur dans une boucle, on devine que c'est pour mesurer une largeur d'impulsions, mais ce n'est pas la bonne manière de faire. Tu ne peut pas prévoir à quelle vitesse le compteur va être incrémenté (enfin si tu peux, il faut regarder le code ASM généré, compter les instructions en tenant compte que les branchements peuvent prendre 2 cycles dans certains cas...)
    Il faut utiliser les timers pour faire ça.

  5. #4
    aniky8

    Re : pic 16f877 et ultrason "ping"

    je but de la manipe etant de detecter les objet a une distance inferieur 20cm et d'envoyer une impulsion qui signale la detection vers une led

    pour cela j'utilise un pic 16f877 et une capteur ultrason "ping"
    datasheet :http://www.parallax.com/Portals/0/Do...-PING-v1.5.pdf

    je dispose d'une bord of education sur la quelle je branche mon montage et je teste directement

    j'ai modifier mon code source voila le nouveau :




    unsigned long data cmpt ;
    double data temps ;
    double data dist ;
    double data lim ;


    void main()
    {


    lim = 20 ; // distance de detction

    do
    {

    TRISA = 0x00 ;

    PORTA = 0x01 ;
    Delay_us( 5 ) ; // impulsion de comande de l'ultrason
    PORTA = 0x00 ;
    Delay_us( 1 ) ;

    TRISA = 0x01 ; // RA0 en sortie

    Delay_us( 760 ) ; // t holdoff

    cmpt = 0 ; // intialisation compteur


    do
    {
    cmpt = cmpt+1 ;
    // comptage du temps
    }while( RA0_bit) ;



    temps = cmpt * 0.000005
    //cconverssion du temps en seconde
    dist = (temps/2)*34000
    //calcul du la distance en CM

    if( dist <= lim ) // teste la distance
    {
    PORTA =0X01;
    Delay_ms( 500)
    // tansmission de l'information
    PORTA = 0x00 ;
    Delay_ms( 200 );
    }





    }while(1);




    }



    le capteur ne fait qu'emettre il ne capte rien !!!!!!!

    je c pas ou est le blem a l'aide

  6. A voir en vidéo sur Futura
  7. Comparatifs

    Gagnez du temps et de l'argent grâce à nos comparatifs de produits. Parmi nos sujets :
  8. #5
    aniky8

    Re : pic 16f877 et ultrason "ping"

    unsigned long data cmpt ;
    double data temps ;
    double data dist ;
    double data lim ;


    void main()
    {


    lim = 20 ; // distance de detction

    do
    {

    TRISA = 0x00 ;

    PORTA = 0x01 ;
    Delay_us( 5 ) ; // impulsion de comande de l'ultrason
    PORTA = 0x00 ;
    Delay_us( 1 ) ;

    TRISA = 0x01 ; // RA0 en sortie

    Delay_us( 760 ) ; // t holdoff

    cmpt = 0 ; // intialisation compteur


    do
    {
    cmpt = cmpt+1 ;
    // comptage du temps
    }while( RA0_bit) ;

    temps = cmpt * 0.000005
    //cconverssion du temps en seconde
    dist = (temps/2)*34000
    //calcul du la distance en CM

    if( dist <= lim )
    // teste la distance
    {
    PORTA =0X01;
    Delay_ms( 500)
    // tansmission de l'information
    PORTA = 0x00 ;
    Delay_ms( 200 );
    }





    }while(1);




    }desilé , voila comme ça le programme est peut etre lisible

  9. #6
    vede

    Cool Re : pic 16f877 et ultrason "ping"

    Citation Envoyé par aniky8 Voir le message
    (...)

    le capteur ne fait qu'emettre il ne capte rien !!!!!!!

    je c pas ou est le blem a l'aide
    Bonsoir,

    il emet quoi? vu qu'il ne capte rien...

    bis : un schéma serait bienvenu...

    vede
    ;O]

    ps : mets le code entre des balises [code]...
    pour le rendre réellement lisible...

    Code:
    code

  10. Publicité
  11. #7
    aniky8

    Re : pic 16f877 et ultrason "ping"

    le shema est le meme que sur le data sheet sauf qu j'utilise un 16f877

    pour l'mission on peut la voir car elle est signalée pas un voyant qui est sur le capteur

    il faut voir le datasheet

  12. #8
    aniky8

    Re : pic 16f877 et ultrason "ping"


  13. #9
    vede

    Cool Re : pic 16f877 et ultrason "ping"

    ok,

    comment tu sais qu'il ne capte rien?
    il doit "capter" puisqu'il "emet"...

    donc vu qu'il emet (led), il emet quoi?
    des données "invalides"?

  14. #10
    vede

    Cool Re : pic 16f877 et ultrason "ping"

    re ;O]

    j'ai commencé à lire le code...

    là tu t'es trompé dans le commentaire... RA0 en entrée...
    Code:
    TRISA = 0x01 ; // RA0 en sortie
    ///

    ensuite :
    Code:
    do
    {
    cmpt = cmpt+1 ;
    // comptage du temps
    }while( RA0_bit) ;
    temps très relatif... malgré la précision demandée...
    quelle est la vitesse de l'horloge du pic?

    ///

    et une remarque :
    les calculs sur des "doubles réels" avec un µC 8 bits...
    en asm, les 2 lignes doivent en faire 200 ;O]

  15. #11
    vede

    Cool Re : pic 16f877 et ultrason "ping"

    désolé pour le monologue...

    OUCH...

    200 lignes... j'étais gentil ;O]
    je viens de compiler ces 2 lignes...

    Code:
    dim temps, cmpt, dist as float
    
    main:
    temps = cmpt * 0.000005
    dist = (temps/2)*34000
    elles en génèrent plus de 1000 en "asm" pour un 16F88 avec le compilo MikroBasic...
    (bon y a quelques commentaires...)...
    Dernière modification par vede ; 12/03/2010 à 00h45.

  16. #12
    mat64

    Re : pic 16f877 et ultrason "ping"

    bon, sans oscillo, c'est un peu pénible à débugguer, mais on va y arriver

    commence par un code hyper simple, puis complexifie-le. Déjà commence par juste essayer de détecter le pulse de l'echo : tu met la pin en entrée, et tu allumes la leds sur interruption par exemple.

    lorsque tu sera rassuré sur les capacités du capteur à recevoir un echo, tu cherchera à mesurer sa taille...(mais encore une fois ce n'est pas la bonne méthode que tu emploies : il faut utiliser le timer pour ça).

  17. Publicité
  18. #13
    RISC

    Re : pic 16f877 et ultrason "ping"

    Salut,

    Faire du flottant et des doubles avec un PIC16 faut....oser

    Ne pas oublier les 2 points suivants :
    * un PIC16 tourne 1000 fois moins vite que le processeur d'un PC....et il n'a pas de processeur virgule flottante
    * un PIC16 a 1000000 de fois moins de RAM....

    As-tu VRAIMENT besoin de faire des calculs en flottant voir en double ?
    Si la réponse est oui, combien de temps pour faire les calculs ?
    Si tu disposes de BEAUCOUP de temps cela sera PEUT-ËTRE POSSIBLE (vérifier les formats numériques supportés par le compilateur).

    Mon conseil c'est de prendre un PIC24, un dsPIC33 ou un PIC32 qui feront ces types de calcul dans un temps raisonnable

    a+

  19. #14
    aniky8

    Re : pic 16f877 et ultrason "ping"

    bonsoir tous le monde , desolé la longue absence


    bref , mat64 j'ai suivi ton conseil en utilisan une interruption pour verifier la capacité de mon capteur .

    j'ai programmé mon pic 16f877a comme suit:

    void interrupt()
    {

    PORTA = 0x01 ;
    delay_ms( 500 ) ;
    PORTA = 0x00 ;
    delay_ms( 500 ) ;


    INTCON.INTF = 0 ;

    }


    void main ()
    {

    TRISB = 0x00 ;
    PORTB = 0x00 ; // intialisation portb

    TRISA = 0x00 ;
    PORTA = 0x00 ; // intialisation PORTA

    OPTION_REG = 0xc0 ;
    INTCON = 0x09 ;


    do
    {
    TRISB = 0x00 ;
    PORTB = 0x00 ;


    PORTB = 0x01 ;
    delay_us( 5 ) ; // signal emission ultrason
    PORTB = 0x01 ;

    TRISB = 0x01 ;


    delay_ms( 1000 ); // attente reception


    } while( 1 ) ;


    }


    ps : l'ultrason fonctonne parfaitement ( aprés avoir consulté fournideur , l'ultrason a été testé devant mois il marche , j'ai méme un pic programmé pour verifié tout au long de mon aprentissage )


  20. #15
    mat64

    Re : pic 16f877 et ultrason "ping"

    maintenant il te faut comprendre le fonctionnement du timer, qui te permettra de mesurer des largeurs d'impulsions.

Discussions similaires

  1. Questions d'ordre "général" (optique et ultrason)
    Par Freders dans le forum Physique
    Réponses: 5
    Dernier message: 10/02/2010, 14h16
  2. Question sur les "ping"
    Par klaodio81 dans le forum Internet - Réseau - Sécurité générale
    Réponses: 2
    Dernier message: 04/10/2009, 18h35
  3. [Brun] SonyTrinitron KV-21XRTB et probleme d'"ultrason"
    Par grosstete dans le forum Dépannage
    Réponses: 12
    Dernier message: 29/05/2008, 23h46
Découvrez nos comparatifs produits sur l'informatique et les technologies.