16F84A

cs_willymix Messages postés 4 Date d'inscription mercredi 27 février 2008 Statut Membre Dernière intervention 31 mai 2008 - 31 mai 2008 à 19:05
Kevin.Ory Messages postés 840 Date d'inscription mercredi 22 octobre 2003 Statut Membre Dernière intervention 7 janvier 2009 - 31 mai 2008 à 19:13
salut a tous
je suis etudiant en electronique et j'ai un projet de fin d'etude a realiser mais je rencontre quelques  difficultés .
l'objectif:  metre port B4 a 0 pendant 16ms et mesurer la duree pendant laquelle port B0 reste a 1 et envoyer le resultat vers le pc. tout foctionne bien mais on ne recoi le temps pendant le quel port B0 reste a 1. voici ci dessous le code sourece si quelqu'un peu m'aider . merci

/* seriF84.c getchar putchar initserial for 16F84A */
/* Serial output is at PORTB.O   */
/* Serial input is at PORTB. 1    */


char getchar( void );/* fonction de réception */
void delay_ms( uns16 millisec); /*temporisation*/
void putchar( char d_out );      /*fonction d'envoi*/


void geNumber(char valeur);      /*fonction pour envoyer la mesure de la broche OUT*/
void main( void ) /* initialise */
{
unsigned char i=0 ,d_out, tp =0,x;
unsigned int centaine = 0 , nbr/*,comp,compl*/;


TRISB.4 = 0 ; /*configurer le port RB4 en sortie pour l'impulsion de la pompe*/


TRISB.0 = 1 ; /*configurer le port RBO en entrée pour mesurer le temps qui vient de la broche OUT*/


TRISA.1 = 1; /*configurer le port RAI en entrée pour la réception*/
TRISA.0 = 0;    /*configurer le port RAO en sortie pour l'émission*/
           PORTB.4 = 1;       /*on prédéfinit préalablement RB4 al*/
           PORTA.0 = 1 ;      /*on prédéfinit aussi RAO al*/


do
 {
          i = getchar();
          if(i == 0X01)


         {


 
              PORTB.4 = 0 ; /*on met RB4 à l'état bas*/
              delay_ms(16); /*on laisse cet état bas pendant 16ms*/
              PORTB.4 = 1 ; /*on remet RB4 à son état d'initialisation*/
              nbr=15 ; /*nombre de compensation*/


        while ( PORTB.0 == 1 ) /*On attend le signal OUT*/


          {


        delay_ms(1); /*delay de 1ms*/
        nbr++;


        if (nbr==100)
           
             nbr=0;
            
             centaine++;
         
          }
   
    }


    tp= centaine/10;
    x =tp+ 48;
    putchar(x); 
    tp=tp*10;
    tp= centaine-tp;
    x =tp+ 48;
    putchar(x);


    tp= nbr/10;
    x =tp+ 48;
    putchar(x);
    tp=tp*10;
    tp= nbr-tp;
    x =tp+ 48;
    putchar(x);
    putchar(127);
    centaine=0;


    }


    while(1) ;
  }
     char getchar( void ) /* recieves one char */


    {
   
       /* One start bit, one stop bit, 8 data bit, no parity = 10 bit. */
       /* Baudrate: 9600 baud => 104.167 usée, per bit. */
          char d_in, bitCount, ti;


          while( PORTA.1 == 1 ) /* wait for startbit */ ;
       /* delay 1,5 bit 156 usée at 4 MHz ( 5+47*3-1+2+9=156)       */
              ti = 47; do ; while(--ti > 0); nop2();
          for( bitCount = 8; bitCount > 0 ; bitCount--)


        {


            Carry = PORTA.1;
            d_in = rr( d_in); /* rotate carry */
            /* delay one bit 104 usée at 4 MHz (5+30*3-1+1+9=104) */
            ti = 30; do ; while( --ti > 0); nop();
}
return d_in;


   }


   void putchar( char d_out ) /* sends one char */


        {


            char bitCount, ti;


            if( PORTA.0 == '\0') ; /* refuse to send "end of string"   */
            PORTA.0 = 0; /* set startbit */
            for ( bitCount = 10; bitCount > 0 ; bitCount-- )
           
                             {


            /* delay one bit 104 usée at 4 MHz (5+30*3-1+1+9=104)    */
               ti = 30; do ; while( --ti > 0); nop();
               Carry = 1;         /* stopbit */
               d_out = rr( d_out ); /* Rotate Right through Carry      */
               PORTA.0 = Carry;


                             }


        }


   void delay_ms( uns16 millisec)


        {


            char next = 0;
                
                 OPTION = 2; // prescaler divide TMRO rate by 8
                 TMR0 = 2; // deduct 2*8 fixed instruction cycles delay


    do
        {
            next += 125;
            clrwdt(); // needed only if watchdog is enabled             while (TMR0 !next)   // 125 * 8 1000 (= 1ms)
            ;
        }
          while ( -- millisec != 0);
    }

1 réponse

Kevin.Ory Messages postés 840 Date d'inscription mercredi 22 octobre 2003 Statut Membre Dernière intervention 7 janvier 2009 11
31 mai 2008 à 19:13
Resalut,

Tout ce code pour mesurer un temps entre 2 moments?
Je suis pas d'humeur pour comprendre ton code en ce moment, mais il sera beaucoup plus simple d'utiliser les interrupts et un timer.

1. Tu lance le timer et tu met PORTB.O à 1
2. Dès que tu recoit un signal sur une entré (interrupt), tu lis la valeur de ton timer.
3. Tu envois l'info au PC

J'ai pas compris comment tu envois les info au PC, par le port série?

J'ajoute que je ne comprend pas ce que cette question fait dans la section Visual Basic 6...
0
Rejoignez-nous