difficulté programme en C
#1
Posté 06 janvier 2012 - 10:57
Je suis en plein dans un projet ou je dois coder un pic 16f84A, et je fais face à un problème :
dans mon programme, je dois faire un calcul et afficher un message, toutes les 0.2 secondes et je ne sais pas du tout comment faire.
Je rencontre aussi un problème à un autre endroit : pour sortir de ma boucle, je dois vérifier un information : une valeur qui dépend d'un capteur (plus précisément un codeur) : on regarde cette valeur sur un intervalle de 2 secondes. Si la valeur n'a pas changé durant les 2 secondes, alors, on sort de la boucle (on affiche un message etc ...)
Merci par avance, et si vous voulez des précisions sur le code, n'hésitez pas.
Les principes gouvernent les gens honnêtes, les lois gouvernent les gens méchants.
#2
Posté 06 janvier 2012 - 11:13
Déjà sur quelle carte travaille tu , une Arduino???
L'affichage de ton message serra visible sur quoi , sur le logiciel Arduino , son serial monitor , ou sur un afficheur LCD?????
Donne-nous plus d'info.
Ha oui , pourrai tu aller faire ta présentation , c'est ici merci.
#3
Posté 07 janvier 2012 - 01:11
Il code sous Flowcode
Et ici, tres peu de personne travail sur des pic.
Alors, bonne chance.
Va voir par LA.
Page Facebook : https://www.facebook...appartelier2.0/
Page Twitter : https://twitter.com/2Appartelier (bateau seulement)
Boutique Robot-Maker : https://www.robot-ma...er-20/produits/
Besoin d'une impression 3D grand format ? Contactez moi !
#4
Posté 07 janvier 2012 - 01:16
édité : Moi j'ai trouver ce si http://fabrice.sincere.pagesperso-orange.fr/cm_electronique/pic_accueil.htm
#5
Posté 07 janvier 2012 - 07:42
Pour pouvoir essayer de répondre à ta question, il faut au moins que l'on sache avec quel langage tu travailles ! ^^
Tu programme ton 16f84a en C, en asm, sous flowcode (comme le pense les autres) ?
EDIT : Je n'ai rien dit, je viens de voir le titre de ton sujet ! Tu travailles donc en C ^^
Personnellement je ne peux pas t'aider (je "programme" en asm et j'ai quelques notions en flowcode par le lycée mais pas plus :/).
Bon courage !
#6
Posté 07 janvier 2012 - 09:06
Les principes gouvernent les gens honnêtes, les lois gouvernent les gens méchants.
#7
Posté 07 janvier 2012 - 09:35
#8
Posté 07 janvier 2012 - 09:54
Les principes gouvernent les gens honnêtes, les lois gouvernent les gens méchants.
#9
Posté 07 janvier 2012 - 04:14
Par contre, ton problème est au niveau du code en lui même ou du principe ?
#10
Posté 07 janvier 2012 - 05:15
J'ai joint le pseudo-code, pour voir concrètement l'idée de mon programme
Et encore merci !
Pseudo-code :
variable 1 -> front_montant \\impulsion envoyé par le codeur
variable 2 -> nbre_impulsion \\nombre d'impulsion totale
variable 3 -> pos_rad \\position du portail en radian lorsqu'il s'ouvre
variable 4 -> pos_deg \\position du portail en degré lorsqu'il s'ouvre
variable 5 -> vitesse \\vitesse angulaire du portail
variable 6 -> BP1 \\Bouton poussoir vitesse et position moment désiré
variable 7 -> vitesse BP1 \\vitesse au moment ou l'on appuie sur le bouton poussoir BP1
variable 8 -> position BP1 \\position au moment ou l'on appuie sur le bouton poussoir BP1
variable 10 -> nbre_impulsion_vitesse \\nombre d'impulsions sur 0.2 sec
variable 11 -> pos_deg1 \\position du portail en radian lorsqu'il se ferme
variable 12 -> pos_rad1 \\position du portail en degré lorsqu'il se ferme
variable 13 -> BP3 \\Bouton poussoir réinitialiser
variable 14 -> BP4 \\Bouton poussoir si le portail part en position fermée
variable 15 -> BP5 \\Bouton poussoir si le portail part en position ouverte
nbre_impulsion -> 0
BP1 -> 0
BP3 -> 0
BP4 -> 0
BP5 -> 0
When front_montant = 1
Then nbre_impulsion -> nbre_impulsion++
If BP4 = 1
Then "Chaques 0.2 sec, FAIRE" :
When front_montant = 1
Then nbre_impulsion -> nbre_impulsion++ \\ ne pas réinitialiser nbre_impulsion chaques 0.2 secondes
Calc pos_rad = nbre_impulsion*(pi/2)/150
Calc pos_deg = nbre_impulsion*90/150
printf ("position degré : %i\nposition radian : %i", pos_deg, pos_rad)
STOPPER de calculer quand pos_deg = 90
Chaques 0.2 sec, FAIRE :
When front_montant = 1
Then nbre_impulsion_vitesse -> nbre_impulsion_vitesse++
vitesse = (nbre_impulsion_vitesse*(pi/2)/150)/0.2
Then printf ("vitesse instantanée : %i\n", vitesse)
Nbre_impulsion reviens à 0 à chaque début de 0.2 sec. \\on calcule chaque 0.2sec le nombre d'impulsion
STOPPER de calculer quand pos_deg = 90
If BP5 = 1
Then nbre_impulsion --> 0
Chaques 0.2 sec, FAIRE :
When front_montant = 1
Then nbre_impulsion -> nbre_impulsion++ \\incrémenter de 1
Calc pos_rad1 = (pi/2)-(nbre_impulsion*(pi/2)/150)
Calc pos_deg1 = 90-(nbre_impulsion*90/150)
printf ("position degré : %i\nposition radian : %i", pos_deg, pos_rad)
STOPPER de calculer quand pos_deg1 = 0
Chaques 0.2 sec, FAIRE :
When front_montant = 1
Then nbre_impulsion_vitesse -> nbre_impulsion_vitesse++ \\incrémenter de 1
vitesse = (nbre_impulsion_vitesse*(pi/2)/150)/0.2
Then printf ("vitesse instantanée : %i\n", vitesse)
Nbre_impulsion reviens à 0 à chaque début de 0.2 sec. \\on calcule chaque 0.2sec le nombre d'impulsion
STOPPER de calculer quand pos_deg1 = 0
When BP1 = 1
Then vitesse_BP1 = vitesse
And position_BP1 = pos_deg
When pos_deg = 90
Or When pos_deg1 = 0
Then "effacer ecran"
And printf ("vitesse au point voulu : %i\nposition au point voulu : %i", vitesse_BP1, position_BP1)
When BP3 = 1
Then "recommencer le programme"
\\Explication : Lorsque l'on démare le programme, on doit préciser si le portail est ouvert (et qu' il se ferme) ou s'il est fermé, et
donc, il s'ouvre. On doit donc appuyer sur BP4 si on part en position fermée, ou sur Bp5 si on part en position ouverte.
Pour avoir la vitesse au point voulu, il ne faut pas arreter le portail, juste appuyer sur le bouton poussoir BP1. A ce moment la, on
enregistre donc la position et la vitesse.
Il faut laisser le portail s'ouvrir ou se fermer completement.
Une fois le portail fermé, ou ouvert (c'est à dire la position angulaire = 90 degré, ou 0 degré) alors, on efface les positions et
vitesses à l'écran et on affiche la position et la vitesse enregistrée au moment ou l'on a appuyé sur BP1
BP3 est un bouton permettant de réinitialiser, recommencer le programme, ou cas ou l'utilisateur se trompe, ou qu'il veuille calculer
plusieur vitesses et positions.
IMPORTANT : - il faut réinitialiser le compteur de nombre d'impulsions pour la vitesse toutes les 0.2 sec, mais jamais celui pour
la position.
- il faut afficher toutes les 0.2 secondes la position en degré, celle en radian, et la vitesse en rad.s
Les principes gouvernent les gens honnêtes, les lois gouvernent les gens méchants.
#11
Posté 07 janvier 2012 - 05:50
Par contre le C est imposé ? Si vous ne parvenez pas à arranger le code, essayer de le faire sur flowcode. Au pire des cas ça vous permettra de savoir si votre raisonnement est juste. (enfin c'est juste une idée, après c'est à vous de voir ^^)
En tous cas bonne chance
#12
Posté 07 janvier 2012 - 06:13
Les principes gouvernent les gens honnêtes, les lois gouvernent les gens méchants.
#13
Posté 07 janvier 2012 - 06:36
Après si tu penses que c'est inutile car trop complexe, n'essaie pas. Ne perds pas ton temps bêtement (le temps accordé aux ppe est très court :/)
#14
Posté 07 janvier 2012 - 06:49
Les principes gouvernent les gens honnêtes, les lois gouvernent les gens méchants.
#15
Posté 07 janvier 2012 - 08:54
#16
Posté 08 janvier 2012 - 10:15
Pour ceux qui ne connaissent pas Flow Code et que voudraient en savoir plus, une doc explicative: http://www.matrixmultimedia.com/datasheets/Notice_FLOWCODE_V4-2.pdf et un petit tuto plutôt bien fait: http://www.briquerie...de_3_144dpi.pdf
Enjoy!
#17
Posté 08 janvier 2012 - 08:37
Valentin
Les principes gouvernent les gens honnêtes, les lois gouvernent les gens méchants.
#18
Posté 08 janvier 2012 - 08:54
Quand tu parles d'insérer du temps, je suppose que tu veux parler de l'instruction "delay" ?
Dans ce cas c'est une instruction de temporisation qui n'a qu'un but : faire perdre des cycles au pic pour effectuer une temporisation.
Si tu veux mesurer toutes les 0.2s tu devras donc mettre un delay de 0.2s. (enfin vu ta question c'est justement ce que tu veux éviter '^^)
Après, pour ton problème tu peux essayer de faire un truc du style :
temporisation de 0.1s (avec un delay), puis on compte et enfin on refait une temporisation de 0.1s.
#19
Posté 10 janvier 2012 - 10:10
Les principes gouvernent les gens honnêtes, les lois gouvernent les gens méchants.
#20
Posté 11 janvier 2012 - 01:49
0 utilisateur(s) li(sen)t ce sujet
0 members, 0 guests, 0 anonymous users