16f84a

Fermé
willymix Messages postés 1 Date d'inscription samedi 31 mai 2008 Statut Membre Dernière intervention 31 mai 2008 - 31 mai 2008 à 19:26
 raphael - 31 mai 2008 à 23:07
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

hal anta far7an ana ana far7an^^ mok en el karba
0