flag doit être déclaré comme variable de type bit.
-----
flag doit être déclaré comme variable de type bit.
Dans la vrai vie, il ne faut pas oublier les rebonds mécaniques de ton bouton poussoir, donc tu dois utiliser un antirebond, soit au niveau hardware en placant des composants pour créer une certain délai avant que l'action soit prise en compte, soit de manière logicielle.
En général une tempo de 100 à 200 ms donne de bons résultats mais il faut varier les valeurs au cas par cas selon la structure interne du BP
Dans la vrai vie, on commence modestement par faire clignoter une LED et on lit les docs.
Gérard,je sais faire clignoté une simple LED mdr.Et j'ai commencer par sa.Je veux me perfectionner se qui me semble normale.Maintenant certaine docs son mal faite mais il n'y a pas que sa,une personne peut avoir plus de capacité a comprendre certaine chose que d'autre on y peut rien.Tu me donne l'impression que sa t’ennuie de donner des explications, sa devrais plutôt te faire plaisirs que tes connaissances te servent a aider non? Moi quand j'ai une personne qui connais rien sa me fait plaisir de lui apprendre 2-3 choses.J'ai pas trop envie de passé pour un gas qui soule a demandé des explication x).
Ne pense pas que j'ai rien foutu,j'ai passé des mois a essayer de comprendre,je suis même passé en premier par l'apprentissage du language C bien avant de commencer les PIC,sauf que 1 j'aime pas lire et au chapitre 2 j'ai été largué,je comprenais déjà plus rien.
Paolo123 oui effectivement j'avais entendu parlé du rebond mécanique,on dirais que tu a devinée ma question future .Merci de l'info .
Je vais tester tous sa.
Ce n'est pas aider qui me pose problème mais tu ne fais pas beaucoup d'effort, tu dis avoir fait du C, tu oublies le ";" à la fin de la ligne, tu oublies une tempo pour voir ce qui se passe. Alors moi je dis, commence par faire clignoter une LED.
Pour progresser, il n'y a qu'une seule façon de faire : lire les docs, lire les docs et relire les docs.
Toi tu attends beaucoup trop des autres. Je pense que je t'ai déjà bien aidé et maintenant tu fais des remarques sans fondement.
De plus, ton orthographe est des plus lamentables ce que je n'aime pas du tout. Ce n'est pas parce qu'on fait de la technique qu'il ne faut pas un minimum de français. Comment écris-tu ton CV et ta lettre de motivation ? Avec autant de fautes ? Si je devais recruter, c'est direct à la poubelle.
Au fait, peux-tu montrer TON programme qui fait clignoter une LED ? Pas un truc pompé sur la toile !
Pour le français tant que tu comprend c'est le principale.
Pourquoi tu veux te compliqué la vie a mettre une lettre qui sert a rien du tous et qu'on ne prononce pas dans un mot! Moi je sais pourquoi,parceque on ta dit de le faire!
C'est pas parceque un mec a dit oué on écrit comme sa que forcément c'est mal de pas le suivre u_u.Le but quand on se parle c'est de se comprendre,le monde se complique trop la vie.
Que je note salut ou salu,la prononciation est la même.Tu va me dire que l'orthographe sert a l’esthétique (oué tu vois encore un H qui sert a rien) des texte,peut être et effectivement je fait aucune faute dans ma lettre de motivation ou dans le CV car si je fait pas sa ma vie est gâché (tien un accent qui sert aussi a rien) car j'aurais aucun boulot.
Maintenant tu pourras jamais comprendre se que je pense car tes aveuglé (comme la plupart des gens) des principe idiot du monde.J'ai fait des effort sa te va pas ben tempis mais arrête de remettre sa sur le tapis dès que un mot te plait pas.Oui tes conseil sont utile et je tant remercie,tu veux que je te remercie 1000 fois? Je peut rien te dire d'autre moi.
On a aussi le choix de faire se qu'on aime ou pas,j'aime pas lire et personne m'obligeras a le faire,j'apprend rien en lisant car sa me soul de lire j'en peux rien c'est comme sa.Pourquoi un défaut est forcément si grave que sa.
J'attend pas grand chose des autres,tu ma pas expliqué tous en programmation donc n’exagère pas.Ta réflexion me fait pensé a sa : Oui tu veux t'attaquer a un programme plus gros que tu ne sais même pas faire clignoté une LED.
Et toi,ta apprit ou la progra? Sur la toile aussi,dans un cour a l'école ou dans un livre que d'autre personne que toi on mit en oeuvre car il partage leur connaissance!!! Tous le monde s'inspire des connaissance autrui tu parle pour ne rien dire sur ce coup la.Me reproche donc pas de m'inspire de programme trouvé sur le NET.
Toi pourquoi ta pas deviné tous seul comment programmer sans rien comme doc alors si tes si parfait? (la doc c'est un autre qui la rédigé)
Tu comprend donc pas le terme 'Partager c'est connaissances".
Je t'ai remercie je ne sais combien de fois pour ton aide alors apprécie d'aider un autre et basta.
Gérard t'as données quelques pistes à suivre, c'est à toi de ton côté d'essayer d'y mettre du sien pour réussir à faire ce que tu veux, la programmation c'est le domaine ou tu peux pas pomper le travail des autres sans comprendre ce qui est fait sinon plus tard, tes projets n'aboutiront pas. Il faut te fixer des projets simples au début, cherche des informations sur google et si tu as vraiment une question à poser, poste le travail que tu as fait et la tu avanceras plus vite.
Commence par un truc tres simple, un programme qui
*lorsque t'appuie sur un bouton poussoir, t'allume une led
*lorsque t"appuie une deuxieme fois sur ce meme bouton poussoir, t'allume une deuxieme led
etc...
fais le marcher en vrai! C'est a dire tu programme ton microcontroleur et tu fais ton prototype de circuit avec les Poussoir, Micro, Alimentation, Condo de découplage etc...
tu verras que pour faire ce simple truc, tu auras effectuer un parcours du combattant mais la prochaine fois, ca sera un reflexe et de plus en plus simple
Voir #64, ce coup-ci, c'est définitif.
Paolo123 j'ai lu un cour ou il commence par le PIC c'est fonctionnalité ect,puis apprêt il parle des fonction TRIS,PORT et il explique sa clairement.Persos la aucun soucis j'ai compris de suite la logique.
Ensuite ils parle des boucles mais rentre pas dans les détails,j'ai du allé voir un autre cour pour avoir les bonne explication.Jusque la tous va bien je sais faire des boucle et il leur état inutile de parler de variable que j'avais apprit en C déjà avant.Ensuite il passe au chapitre 'Commande une LED avec un bouton' ok hum il mette le schéma d'une fonction pull-up avec bouton+résistance nickel.Ensuite boom un gros code et aucune fonction n'est expliquée.
??? Moi je vois sa je suis largué normale.
C'est comme si a ton premier cour d'électricité je te dit oué l'électricité c'est quand les électron libre passe d'atome en atome,jusque la tu va suivre comme tous. Après juste pour le fun de te taquiné un peut je te balance sans aucune explication la lois de pouillet et je te dit de me calculé la chute de tension d'un câble suivant la section du conducteur,la tension et l'intensité qui le traverse!!! mdr
Pire apprêt je te balance directe apprêt échauffement la lois de mathiessen!!,Comme sa t'apprendra vite .
poste ici le schéma et le code que tu n'as pas compris, ca ira plus vite
Voila
Il faut absolument que tu découvres la balise Code (# dans la barre d'outils du mode avancé).
Rien ne sert de penser, il faut réfléchir avant - Pierre Dac
Oui effectivement j'avoue que la sa prend de la place :'(.
Je vais regarder sa.
Sortie est associé au PORTB
Les variables inter1 à inter4 sont attribués au PORTA du PIC
inter1 est associé à RA0
inter2 est associé à RA1
etc..
c'est une facon d'optimiser son code,
c'est pareil pour les Led1 à Led4
Sortie = 0 initialise à 0 toutes les pattes du PORTB, à La mise sous tension, le potentiel électrique
de toute les pattes du PORTB est fixé à 0 Volt
TRISB = 0b11110000 configure RA0,RA1,RA2,RA3 en entrée et RB0,RB1,RB2,RB3 en sortie
le bit de poids faible étant tout à droite
l'état logique des variables inter sont ensuite recopié dans la variable etat_inters
suivant la valeur logique de cette variable, on positionne la sortie à 0 ou a 0xFF et on a
et on allume led que l'on veut
En général, pour lire la valeur d'une patte, on configure le registre TRIS associé à cette patte à 1, on le positionne en entrée
Pour écrire, on le configure à 0 c'est a dire on le positionne en sortie
Les résistances de pull up permettent de fixer le potentiel de l'entrée à un niveau logique précis pour éviter que cette entrée soit "flottante"
Donc si j'ai bien comprit,vu que inter peut prendre que 2 états soit 1 ou 0 il utilise une variable pour avoir plus d'état possible,c'est sa?
Non pas du tout, si la variable etat_inters te gene, tu peux l'ignorer et réecrire le code sans l'utiliser ca marchera tout aussi bien
ah bon et la variable sert a quoi alors?
Je t'ai écris un programme plus simple d'approche, essaye de le comprendre et de le modifier à ta guise, c'est tres facile,
Lorsque tu appui sur le bouton poussoir relié à RA0, la led0 s'allume, un compteur s'incrémente de 1, lorsque tu appuis une deuxieme fois le bouton poussoir, le compteur s'incrémente de nouveau, la led0 s'éteint et la led1 s'allume, tu appuis une troisieme fois, le compteur se remet à 0 et les deux leds s'éteignent et ainsi de suite.
Code:#define inter RA0 #define led0 RB0 #define led1 RB1 unsigned char compteur = 0; void main(){ TRISA = 1; PORTA = 0; TRISB = 0b11110000; PORTB = 0; while(1){ if (inter == 1){ delay_ms(50); while(!inter); delay_ms(50); led0 = 1; compteur++; if (compteur == 2){ led0 = 0; led1 = 1; } if (compteur == 3){ led0 = 0; led1 = 0; compteur = 0; } } } }
Oui je l'ai comprit.
while(!inter) dans le cour il dise que c'est une commande qui attend la réponse de... c'est juste?
c'est pour l'antirebond, on attend que le bouton soit relaché avant d'effectuer l'instruction d'après, dans une application temps réel, il faut passer par les interruptions parceque tu perds quand 100 ms avant de faire agir ton micro mais pour le moment ca passe tu peux l'utiliser
Ah d'accord,merci.
Ben je vais bosser tous sa je te dirais quoi .
Salut,
Après quelque mois de non pratique je m'y suis remit un peut.
J'ai réussi a établir mon code pour la fonction télérupteur.J'utilise maintenant microC j'aime mieux.
En gros :
sbit bp at RB0_bit;
sbit led at RB1_bit;
bit bascule; // variable binaire 1/0
void main () {
PORTB = 0; // int 0V
TRISB = 0b00000001; // int bit 1-7 sortie et bit 0 entrée
while(1)
{
if(bp == 1)
{
delay_ms(200); // anti rebond
bascule++; // incrémentation de la variable bascule
}
if(bascule == 1)
{
led=1;
il manque quelque chose haha! mais quoi :'(.
}
else
{
led=0;
}
}
Ça fonctionne mais si je laisse mon doigt sur le BP ben la led clignote sans arrêt.Donc il faut que le programme attende que je lâche le bouton quand il exécute la partie "led=1;".Je ne connais plus la fonction pour attendre une action dans un programme.
Tant que je ne lâche pas le bouton le programme doit attendre,une fois lâche il repart.Et je suis sur que je la connait cette fonction lol.
Si quelqu'un a des info se serais cool.
Et j'ai relus les ancien message et désoler de mon comportement u_u surtout a toi Gerard si tu revient un jour sur ce post.
Oups petite erreur que j'ai vu.
C'est pas if (bp == 1) mais if (bp == 0) on est en pull-up pardon pour la faute.
Et je vient de me rappelé de la fonction while(!bp) mais je ne sais pas si c'est a bonne.
Ok j'ai rajouter while(!bp) après l'incrémentation de la variable bascule et réduis le delay a 50ms et rajouter un delay après la commande while de 50ms et celas fonctionne parfaitement.L'anti rebond est nickel et celas fonctionne rapidement.
Que pensé vous du programme ? Peut t'on l'optimisé en tapant moins de code?
Salut,
un programme optimisé est un programme qui rempli sa tache tout en étant facilement modifiable.
En l'état actuel vu la légéreté du programme à faire tourner...on ne peut pas trop parler d'optimisation
tu as fait qql modif, si tu peux poster le code final ce sera plus simple à la compréhension.
Salut voici le code.
Code:sbit bp at RB0_bit; sbit led at RB1_bit; bit bascule; void main() { PORTB = 0b00000000; TRISB = 0b00000001; while(1) { if (bp == 0) { delay_ms(25); bascule++; while(!bp); delay_ms(25); } if (bascule == 1) { led = 1; } else { led = 0; } } }
Donc dans le cas ou tu relaches ton bouton ( bp va repasser à 1 si j'ai bien compris), imagine que tu as un rebond, et que bp vaut 0 un très court instant.
On rentre dans le if, et la on bloque sur le while !
pourquoi attendre après ce while qui plus est ?
if (bp == 0)
{
delay_ms(25);
if (bp == 0)
bascule++;
}
Si bp vaut 0, on attends 25ms, si après ca il vaut toujours encore 0, c'est que ce n'est pas un rebond.
Plus loins tu as :
if (bascule == 1)
et quand tu appuies plusieurs fois sur le bouton, bascule vaudra combien ? est ce que ton programme fonctionnera toujours ?
Hello,
Au départ oui BP faut bien 1 car il est en pull-down.Si celui si est pressé alors il doit incrémenté la variable bascule mais juste au moment ou j’appuie j'ai un delay anti rebond de 25ms on sais jamais et après le programme attend que je relâche le bouton pour continuer et la de nouveau 25ms pour le rebond du relâchement,car t'en auras un c'est sure.
Sans le while(bp!) ta LED clignote si tu laisse le BP appuyé.Celas ce produit car si tu laisse le bp enclenché,ton programme va dire OK il laisse le BP a 0 je continue a incrémenté la variable.
Mais vu que la variable bascule est de type BIT qui ne peut prendre que 2 valeur 0 ou 1,ben la LED clignote.
Et le ELSE est la pour que si la bascule n'est pas égale a 1 ben la LED doit rester éteinte .
Bonsoir,
je ne vois pas bien comment ton BP vaudra 1 au relâché si tu es en pull down... je pense que tu as des pull-up et quand tu appuies tu as 0 sur l'entrée.
Comme le dit terriblement l'usage du while est sans intérêt, de plus tu bloques tout autre action durant ce temps c'est vraiment pas élégant.
25ms comme anti-rebond c'est peu, trop peu, en général on met plutôt 100ms pour être tranquille.
Egalement il serait plus judicieux d'exploiter les interruptions, par exemple en utilisant INT0, là ça va ton code est simple mais le jour où tu vas écrire des choses plus compliquées ça va pas être très souple.
Le principe est de créer une temporisation avec un timer et dès que tu appuies sur ton BP l'interruption va immédiatement gérer cette requête et appliquer précisément la temporisation BP qui va bien sans bloquer lourdement un traitement en cours par ailleurs dans ton code.
Ta fonction delay_ms(25) te bloque durant 25ms tout autre activité, ce n'est pas très optimal comme emploi, d'autant plus si tu allonges cette durée...
Une autre façon de gérer l'appui BP est de ne considérer que le moment de l'appui, ou du premier 0, qui est lu par le port quelque soit le nombre de rebonds:
>appui BP => variable appui_BP mise à 1 => temporisation de 100ms min durant laquelle aucun autre appui, ou 0, ne pourra être considéré jusqu'à la fin de cette tempo => mise à 0 de la variable appui_BP.
L'action est instantanée sans risque de prise en compte de rebonds intempestifs, l'aspect visuel si une led doit être allumée avec ce BP est bien meilleur car instantané.
Il y a mille façons de gérer l'appui BP selon l'application et ses contraintes.
@+
Salut,
Oui tu a surement raison mais moi j'ai recommencer a apprendre depuis le début donc je ne suis pas encore arrivé a ce stade.La je ré-apprend un peut les bases.Mais je compte bien,si je m'en sent capable,d'apprendre plus.Envoyé par HULK28Egalement il serait plus judicieux d'exploiter les interruptions, par exemple en utilisant INT0, là ça va ton code est simple mais le jour où tu vas écrire des choses plus compliquées ça va pas être très souple.
Oui tu a raison et j'ai remarqué celas lors d'un autre programme ou j'ai des delay de 1000ms pour faire des séquence de clignotement,tant que le pic est occupé a faire le delay j'ai remarqué que l'action sur mon bouton ne se fait pas du tous et que je doit le laissé appuyé.C'est un gros problème qui me gêne et j'espère que je pourrais le corriger quand j'en saurais d'avantage sur la programmation.Envoyé par HULK28Ta fonction delay_ms(25) te bloque durant 25ms tout autre activité, ce n'est pas très optimal comme emploi, d'autant plus si tu allonges cette durée...
Oui mille pardon je me suis trompé je suis bien en pull-up :s.Envoyé par HULK28je ne vois pas bien comment ton BP vaudra 1 au relâché si tu es en pull down... je pense que tu as des pull-up et quand tu appuies tu as 0 sur l'entrée.
En tous cas merci pour ta réponse elle est très enrichissante.