Petit probleme sur un petit programme en C

Fermé
daminocg - 3 févr. 2008 à 11:38
 daminocg - 3 févr. 2008 à 17:25
Bonjour, je vien demander votre aide car je suis étudiant en électronique et mon prof m'a posé une colle...

Nous sommes en train d'étudier un programme:

TRISAbits.TRISA4=1 ; ---------> initialisation des lignes
TRISAbits.TRISAB0=0 ; ---------> initialisation des lignes

loop1:

PORTbits.RB0=0 ; ----------> eteindre la diode
While (PORTAbits.RA4==1) ; ----------> attendre appui sur Bouton Poussoir
PORTBbits.RB=1 ; ----------> allume la diode
Delay 10KTCYx(200) ; ----------> temporisation 2 sec
Delay 10KTCYx(200) ; ----------> temporisation 2 sec

goto loop1 ;


Voici le programme, je précise que nous travaillons avec MPLABIDE, nous avons un circuit imprimé branché a l'ordinateur sur lequel se trouve une diode et un BP.
Mon probleme est le suivant : avec ce programme, quand j'appui sur le BP le diode reste allumer 4 sec et s'éteint. Par contre si je reste appuyer sur le BP le diode reste allumer car la durée entre l'instruction qui éteint la diode et l'instruction qui la rallume n'est pas perceptible.

Mais il faut que je modifie le code pour qu'il fasse exactement la meme chose, mais que quand je reste appuyer sur le BP il ne faut pas que la diode passe par l'état ETEINT.

J'espere que vous m'aiderez, paskque je n'y arrive pas.
Merci d'avance.

6 réponses

Salut
Ce que tu veux c'est pas detecter si le bouton est appuyé, mais detecter le passage du niveau bas au niveau haut sur le BP. Je fais pas d'electronique, bon je suis pas sur mais ca devrait ressembler à ca:

TRISAbits.TRISA4 = 1 ; ---------> initialisation des lignes
TRISAbits.TRISAB0 = 0 ; ---------> initialisation des lignes

loop1:

if ( PORTAbits.RA4 == 0 ) { ----------> Verifie que le BP n'est pas pressé
PORTbits.RB0 = 0 ; ----------> eteint la diode
While (PORTAbits.RA4 == 1) ; ----------> attendre appui sur Bouton Poussoir
PORTBbits.RB = 1; ----------> allume la diode
}
Delay 10KTCYx(200) ; ----------> temporisation 2 sec
Delay 10KTCYx(200) ; ----------> temporisation 2 sec

goto loop1 ;
0
en fait non plutot

if ( PORTAbits.RA4 == 0 ) { ----------> Verifie que le BP n'est pas pressé
PORTbits.RB0 = 0 ; ----------> eteint la diode
While (PORTAbits.RA4 == 1) ; ----------> attendre appui sur Bouton Poussoir
PORTBbits.RB = 1; ----------> allume la diode
Delay 10KTCYx(200) ; ----------> temporisation 2 sec
Delay 10KTCYx(200) ; ----------> temporisation 2 sec
}

@+
0
ben non en fait il me semble bien que l'instruction

While (PORTAbits.RA4==1) ;

cela veut dire : tant que l'on appui pas sur le BP ne rien faire (car RA4==1 veut dire que le BP est ouvert et non fermé)

merci de m'aider svp
0
T'es sympa mais je suis pas censé savoir que ton BP est ouvert a 1 ! Je suis en ecole d'info, donc moi jme base sur 0 pas de courant 1 ya du jus :)

Donc du coup ca marcherait ca :

TRISAbits.TRISA4 = 1 ;
TRISAbits.TRISAB0 = 0 ;

loop1:

PORTbits.RB0 = 0 ;
if ( PORTAbits.RA4 == 1 ) {
While (PORTAbits.RA4 == 1) ;
PORTBbits.RB = 1;
Delay 10KTCYx(200) ;
Delay 10KTCYx(200) ;
}

goto loop1 ;

Pour la loop1, on met la diode a 0, le test n'est validé que si ton bouton poussoir est ouvert, donc ca elimine le moment ou tu reste appuyé...
Apres c'est tout pareil, on attend que le bouton poussoir passe a 0, puis on passe la diode a 1, et on attend 4 sec pour repartir sur loop1 qui eteint ta diode avant de tester si tées resté appuyé sur le bouton ou pas, etc.

Au passage pourquoi t'ecris
Delay 10KTCYx(200) ;
Delay 10KTCYx(200) ;

plutot que
Delay 10KTCYx(400) ;
?
@+
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
oui mais dans ton prog dans tous les cas si tu retourne au loop1 tu eteint la diode

je vien de penser a un prog si tu pouré me confirmé ça serais bien...

TRISAbits.TRISA4=1 ; ---------> initialisation des lignes
TRISAbits.TRISAB0=0 ; ---------> initialisation des lignes

loop1:

PORTbits.RB0=0 ; ----------> eteindre la diode
While (PORTAbits.RA4==1) ; ----------> attendre appui sur Bouton Poussoir
PORTBbits.RB=1 ; ----------> allume la diode

loop2 :

Delay 10KTCYx(200) ; ----------> temporisation 2 sec
Delay 10KTCYx(200) ; ----------> temporisation 2 sec

if (PORTAbits.RA4==0) { ------------> si j'appui toujours je recommence la temporisation
goto loop2
}

goto loop1 ; --------------> sinon je retourne eteindre la diode




esque sa puré marcher comme cela.


PS: j'ai 2 tempo de 200 car je suis en format char (8bits) et ça s'arette a 256 donc je ne peut pas mettre 400
0
aidez moi svp
0