Timer1 a configurer 16F887

Bonjour,

Je debute dans le monde des microcontroleurs ,j'ai reussi a mettre en place le timer1 mais je n'arrive pas a trouver les bonnes valeurs Ce projet est un chrono precis au 1/100 de secondes J'utilise MikroC comme compilateur Si quelqu'un pourrait arranger sa

formatting link

Merci d'avance

Reply to
bigboss59400
Loading thread data ...

Le Sun, 11 Apr 2010 07:18:18 -0700, bigboss59400 a écrit :

je crois qu'il y a un problème de couper/coller : adresse invalide

Reply to
moi-meme

Ah en effet DSL ,je viens de regler sa

formatting link

Reply to
bigboss59400

"bigboss59400" a écrit

================= La précision ne dépendra que du quartz , en choisissant un modèle de type "IOXO- xx " d'une fréquence maximum possible pour le µC la précision sera correcte. La meilleur précision étant assurée par un boîtier quartz thermostaté .

Reply to
maioré

maximum

tat=E9 .

Oui,sa je le sais pour le quartz moi je parlais des valeurs a definir dans mon code source car je n'arrive pas a trouver les bonnes

Si toi ou quelqu'un pouvez corrige sa

Cordialement

Reply to
bigboss59400

Oui,sa je le sais pour le quartz moi je parlais des valeurs a definir dans mon code source car je n'arrive pas a trouver les bonnes ============= Valeur ? As-tu déjà déjà commencé à écrire le programme , et dans quel langage ?

Reply to
maioré

On Apr 11, 8:20=A0pm, bigboss59400

Syntax error

Reply to
Jean-Christophe

On Apr 11, 4:42=A0pm, "maior=E9"

tat=E9 .

Avec une bonne paire de chaussettes.

Reply to
Jean-Christophe

J'ai compris la precision vient que du quartz mais moi mon probleme c'est que je n'arrive pas a configurer le timer1 pour qu'il fasse des interruptions toutes les 1/100 secondes

Mon programme tourne mais il n'a surement pas les bonnes valeurs car sur mon LCD je vois les 1/10 de secondes defiles comme des secondes

Il doit y avoir 5 valeurs en tout a changer(voir commentaire de mon programme)accesible ici

formatting link

Merci d'avance

Reply to
bigboss59400

un tres bon programme gratuit pour connaitre le valeurs des timers des pics...

formatting link

attention, il y a un bug il faut mettre la date de l'ordi en 2009 sinon il dit "version expirée" ... et il n'y en a pas de nouvelle !

--
-
Jean-Yves
Reply to
jeanyves

On Apr 12, 9:11 am, bigboss59400

Je n'ai pas la doc du 16F887 sous la main, mais ce serait plus enrichissant pour toi de comprendre ce qui se passe et de faire toi-meme la correction. A commencer par ces trucs louches dans main()

sec++; if ( sec =3D=3D 59 ) sec=3D0;

Donc apr=E9s 58 tu passes =E0 z=E9ro ? Faudrait pas plutot comparer =E0 60 ? if ( ++sec >=3D 60 ) sec=3D0; ( meme remarque pour les minutes )

Quand au timer, tu sais que son horloge est d=E9riv=E9e de l'horloge du PIC, suivie de diviseurs. [osc] ->- [pr=E9diviseur] ->- [diviseur] ->- [timer]

Tu dois donc (1) Connaitre la fr=E9quence du quartz. (2) Connaitre la valeur du pr=E9diviseur. (3) Param=E9trer le diviseur du timer. De facon =E0 r=E9armer la valeur du timer pour qu'il tombe par exemple toutes les millisecondes. Et c'est dans la routine d'interruption void interrupt() que tu incr=E9mentes les variables, pas dans le main()

Voici un exemple de code 18F2455 d'interruption pour une horloge =E0 10 ms avec un quartz =E0 16 Mhz : on a Fosc =3D 48 Mhz et 12 Mips

// DATA : TIMER #1 - Assume speed =3D 12 Mips ----------

#define TIMERDIVV 0b00110000 // divise par 8 #define TIMER1_STARTVALUE 50536 // =3D 65536-15000 : every 10 ms

// clock : [ 10MILLISECOND : SECOND : MINUTE : HOUR ] enum { TiMS=3D0, TiSS, TiMM, TiHH, TiSIZE }; // indexes unsigned char Tclock[TiSIZE]; // clock

// CODE : SET/RESET TIMER #1 -----------------

void fTimer1(unsigned char how) { // disable timer TMR1IE =3D 0; // interrupt disabled TMR1ON =3D 0; // timer off TMR1IF =3D 0; // interrupt flag off if(!how) return; // done // init timer T1CON =3D 0b10000000 | TIMERDIVV; // 16-bit : internal_clock(Fosc/

4) : prescale // enable TMR1 =3D TIMER1_STARTVALUE; // restart here TMR1ON =3D 1; // timer on TMR1IE =3D 1; // interrupt enabled TMR1IP =3D 1; // interrupt priority HIGH }

// CODE : INTERRUPT - TIMER #1 -----------------------

void interrupt ISR_High(void) // high priority { if( TMR1IF ) // Timer #1 interrupt flag { TMR1IF =3D 0; // ACK // clock if( ++Tclock[TiMS] >=3D 100 ) // one second { Tclock[TiMS] =3D 0; Tflag |=3D TFLAG_SYNC; if( ++Tclock[TiSS] >=3D 60 ) // second { Tclock[TiSS] =3D 0; if( ++Tclock[TiMM] >=3D 60 ) // minute { Tclock[TiMM] =3D 0; if( ++Tclock[TiHH] >=3D 24 ) // hour { Tclock[TiHH] =3D 0; } } } } TMR1 =3D TIMER1_STARTVALUE; // restart here } // timer #1 interrupt

// done ISR }

Reply to
Jean-Christophe

"bigboss59400" a écrit dans le message de news: snipped-for-privacy@w42g2000yqm.googlegroups.com...

================= Le timer 1 ne convient pas trop pour générer une interruption si courte car même à 20 Mhz le temps entre deux interruptions (prescaler 1) est de

65536*0.002=13.107 ms Par exemple pour incrémenter chaque seconde il faudrait 1/0.013 = 76 interruptions Ps possible donc pour une interruption de 1/100 s (76/100 ! ).....

D'autre part l'affichage d'un LCD est trop lent pour afficher les dixièmes de seconde

Reply to
maioré

"bigboss59400" a écrit dans le message de news: snipped-for-privacy@v20g2000yqv.googlegroups.com...

formatting link

bonsoir quelques remarques:, d'ordre general, ne connaissant pas ton pic ne faut il pas declarer la variable cnt en volatile ?

le if (cnt = 55536) est une affectation, il faut mettre ==, et il vaut mieux mettre if (cnt >= 55536)

ensuite il faut comparer sec a 60, idem pour minute

Reply to
jlp

Bonsoir,

En fait dans ce genre de cas, j'écris directement une valeur de départ dans le timer (au lieu de zero), ça coûte pas grand chose de plus et ça permet d'être précis au cycle près !

-- cLx

Reply to
cLx

Le 11/04/2010, bigboss59400 a supposé :

formatting link

Bjr,

Alors, on en a assez de abc (satm....) ?

avec le timer 1 il faut le réinitialiser à chaque utilisation !

Il n'est pas très fiable.

Le mieux est d'adjoindre un pcf8583 avec un quarts en i2c

sinon se debrouiller avcec cela :

formatting link

et un quartz de 11.0592 mhz ca aide bien (voir sélectronic)

Cordialement

Reply to
SansNom

Un timer pas tr=E8s fiable ? Voil=E0 qui excite ma curiosit=E9...

--

-Stan

Reply to
Stan

En complétant ma dernière phrase par "de ce fait" c'est plus complet.

Comme il faut le ré-initialiser à chaque fois, et que l'on n'est pas très maître de ce qui se passe entre "chaque", la précision n'est de ce fait pas très fiable.

Reply to
SansNom

On May 6, 10:47 am, SansNom

Pour etre fiable et pr=E9cis, le timer va d=E9clencher une interruption de haute priorit=E9 afin d'=E9viter que le programme soit interrompu lors de la r=E9initialisation. Dans ton exemple, il me semble que ce n'est pas la fiabilit=E9 du timer qui soit en cause.

Reply to
Jean-Christophe

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.