salut
j'un mini projet un microcontroleur qui command atravers bus IIC un afficheur LCD j'ai 2 problemes
1 comment programmer en c apres un appuie prolonger de 3 secondes sur BP on a une action quelconque ,
merci d'avance
-----
salut
j'un mini projet un microcontroleur qui command atravers bus IIC un afficheur LCD j'ai 2 problemes
1 comment programmer en c apres un appuie prolonger de 3 secondes sur BP on a une action quelconque ,
merci d'avance
Bonjour,
déjà il faudrait reformuler ta question car là personnellement je ne comprend rien.
Bonjour,
tu as 2 méthodes possible (à ma connaissance)
==>la premiere qui est très peu utilisé et tu vas comprendre pourquoi est le "delay_cyles (durée)" ceci est une tempo ayant pour argument durée qui correspond au nbres de cycles d'horloge nécessaire pour atteindre le temps que tu désires (si ton micro est cadencé à 1Mhz un cycle d'horloge est donc 1/1MHz) donc pour 3s il te reste plus qu'à faire le calcul (je ne tiens pas compte du type de l'argument (int, long...))
le probleme avec cette méthode est (tiens toi bien) que ton micro est bloqué pendant TROIS secondes sur cette instruction, donc pendant ces 3 secondes tu ne peux rien faire d'autre
==> la 2eme methode qui est très très très employée, est une temporisation via une interruption timer ou un évènement périodique externe (exemple:le secteur).
je vais parler uniquement de la methode dite IT TIMER.
généralement ton micro possede une voir plusieurs interruption timer,
celle ci est appelé "indéfiniment"(après l'avoir configurer correctement) à un temps défini par tes soins, admettons que tu donnes un temps de 20ms, donc toutes les 20ms ton" interruption timer "va etre appelé, alors maintenant si tu mettais une variable TEMPO dans cette interruption est celle ci s'incrementerai de 1 à chaque fois que l'interruption est appelé... t'as compris le truc
l'avantage de cette méthode est que tu ne restes pas bloqué sur une instruction contrairement à la 1ere solution
Bonjour a tous
Je suis tombé ici par hasard, et comme quoi le hasard fais bien les chose, car je suis intéressé par cette remarque pertinente.
Pourrai tu compléter les info que tu donné ici, cette idée de tempo via les interruptions ma l'air complexe mais fort intéressant.
Bonne journée a tous
Salut,
La temporisation par interruption de timer est très utilisée, elle permet d´avoir une base de temps précise et soit de faire autre chose en attendant la fin du delais ou de mettre l´µC en mode basse conso.
La plupart des microcontroleurs intègrent des Timers, ce sont des compteurs qui s´incrémentent à chaque front d´horloge (donc à la fréquence de l´horloge utilisée pour "commander" le Timer).
Tu définis donc la valeur du timer pour laquelle tu veux qu´il fasse la demande d´une interruption, tu le remets à zéro et tu le lance...
Au bout du temps x (valeur du timer/fréquence horloge) il envoi une requête d´interruption au CPU.
Ce qui te permets par exemple d´incrémenter un compteur de secondes, minutes et/ou heure (et pourquoi pas jour, mois, années) à chaque interruption du timer.
Les timers sont aussi très utilisés pour créer des bases de temps pour du PWM.
Ça n´a rien de complexe, il suffit de configurer ton timer comme tu les souhaites et de traiter la routine de traitement d´IT comme tu le souhaites.
salut à tous,
Je dois faire une tempo de 3s pour un programme en C en utilisant le timer 1 d'un µC à base de 8051, le pb c'est que je ne comprends pas bien comment faire une tempo avec un timer, est la description des paramètres composants un timer, les interruptions...
Pour faire simple je dois introduire une tempo de 3s dans une boucle if:
Si (carte_sous_puis==1){
//tempo de 3s
si (etat_moteur==0)
envoi_puis_moteur=0;
else
envoi_puis_moteur=1;
}
Bonjour,
lil-vince à expliqué le principe, si vous savez ce qu'est un timer sur un µC type 8051 il ne doit pas subsister de problème.
Quand votre timer déborde il génère une interruption qui vous permet d'incrémenter ou d'activer une variable (par exemple tempo_3s), selon un nombre précis de débordements qui vous permettra d'obtenir la ou les tempos désirées.
Exemple de création de variables temps:
On considère ici que le timer est réglé pour déborder à 10ms
A+Code:void tempo (void) { Clock.Flag10ms = 0; // On efface le flag créé par le // débordement du timer ("overflow") // en interruption Clock.Compteur10ms++; if(Clock.Compteur10ms == 10) { Clock.Compteur10ms = 0; Clock.Flag100ms = 1; // tempo 100ms Clock.Compteur100ms++; } if(Clock.Compteur100ms == 10) { Clock.Compteur100ms = 0; Clock.Flag1s = 1; // tempo 1s Clock.Compteur1s++; } if(Clock.Compteur1s == 60) { Clock.Compteur1s = 0; Clock.Flag1min = 1; // tempo 1mn Clock.Compteur1min++; } if(Clock.Compteur1min == 60) { Clock.Compteur1min = 0; Clock.Flag1h = 1; //tempo 1h } }
bonjour,
Le timer est paramétré pour 4ms, il faut que je multipli par 750 pour obtenir 3s.
Je n'ai plus les valeurs en tête, elle sont inscrites dans TL1 et TH1.
Je ne comprends pas bien votre code, qu'est ce :
Clock.Flag10ms ?
Clock.Compteur10ms ?
Clock.Flag100ms ?
Clock.Compteur100ms ?
C'est fait longtemps que je n'ai pas utilisé de timer, et ce n'étais pas avec un 8051. Le microcontrôleur ici utilisé est un ds89c450.
merci.
Ce ne sont que des exemples de variables temps que l'on peut créer pour déclencher des évènements ou des actions calibrés ailleurs dans le programme.
Il n'est pas rare d'avoir besoin de plusieurs tempos comme la seconde ou la minute, tout dépend de ce qu'on doit faire.
Le principe est le même avec tout les µC, un timer qui donne la cadence et ensuite on créé des variables de temps qui seront déclenchées ou incrémentées en interruption sur le débordement du timer.
A+
HULK28, pourquoi tu incrementes pas directement ta variable lors de l'interruption au lieu de passer par un flag et l'incrementer en tache de fond?
jpense qu'il y aurait moins de risque
Imagine que tu lises les heures et minutes, et que ton IT tombe entre le moment où tu lis l'heure et le moment où tu lis les minutes...
Si le main risque de durer plus d'un cycle de timer, au lieu d'utiliser un flag, tu utilise un compteur sur un octet (ou un mot de ta machine).
Autrement, il y a moyen de faire dans la boucle main un :
disable interrupt
traitement des tempos
enable interrupt,
mais alors, s'il y a d'autres traitements temps réel, ils risquent de prendre du retard, ce qui peut être très grave.