utilisation du timer d'un picaxe 28X1

ritoonfr

New Member
milles excuses je suis passé par le traducteur

bonjour

Dans mon programme j' aimerai utiliser le timer d'un 28x1
pour faire, un comptage de 24 heures en tâche fond.
Au départ du timer je débute un programme
qui dure entre 5 à 8h
à chaque fin de cycle du timer (24h) je redémarre le programme.
J’ai fait des essais avec settimer t1s_4 et
setintflags. je démarre le timer mais je n'arrive pas à
l'arrêter et reprendre le cycle sans faire un reset
pouvez vous me faire un bout de programme pour que je comprenne mieux
merci d'avance Henri
 

PieM

Senior Member
Bonjour,

Donnez déjà le programme que vous avez fait. C'est plus simple pour comprendre ce qui ne va pas ... :rolleyes:
 

ritoonfr

New Member
Bonjour
pour l'instant je n'ai pas fait de programme, en fait j'ai fait des essais avec la commande settimer. pour faire court comment placé, la commande, settimer en début de programme faire compter le timer et l'arrêter au bout d'un certain nombre de cycles
 

PieM

Senior Member
Bonjour,

Pour reboucler au bout de 24h, sans compteur annexe, il faut que la variable timer soit <= à 65536

donc il faut compter toutes les 2 secondes au plus rapide, car
24h * 3600 /2 = 43200 (< 65536)

Pour compter toutes les 2s le paramètre de settimer est 34286

Une interruption (éventuelle) liée à la variable timer ne survient que si il y a overflow, donc si elle = 65536
Egalement, dans ce cas d'overflow, une autre variable flag (toflag) se met à 1

Il suffira donc de tester ce flag régulièrement.

Pour que le compteur passe à 65536 au bout de 24h, donc de 43200 impulsions d'horloge, il faut commencer le comptage à 65536 - 43200 soit 22336.

En résumé:

initier par settimer count 34286
écrire que timer = 22336

quand toflag = 1 les 24h sont atteintes

mettre toflag à 0 et reboucler.
 

ritoonfr

New Member
pour PieM

j'ai fait ce bout de programme est-il correct ?
pour compter toutes les 2s la fréquence d'horloge et bien de 4mhz

Code:
#picaxe 28X1
setfreq m4
pause 200

serout 7,N2400,(254,1) 'raz LCD

' 24h * 3600 /2 = 43200 (< 65536)
 '65536 - 43200 soit 22336

debut:
serout 7,N2400,(254,192,"Timer=",#b1)
'settimer count 34285 'ne fonctionne pas

settimer 34285 'compter toutes les 2s
'timer = 22336 reel
timer = 65531 'essais
'""""""""""
etape1:

'le programme sera -long que le temps du timer
    
   'for b0 = 1 to 5	
    high 3			
    pause 200	
    low 3		
    pause 200
   'next b0
'""""""""""""""   
  
  if toflag = 1 then
  inc b1 ' voir passage du flag
   pause 200
    toflag = 0   
    goto debut	
    endif
 
 goto etape1
 

PieM

Senior Member
Bonjour,

Si settimer est 34286 et l'horloge est de 4MHz, oui le comptage sera de 2 secondes.

A noter qu'il n'est pas toujours nécessaire d' effectuer du comptage jusqu'à la valeur du timer = 65535
cela est recommandé si on veut utiliser toflag, en particulier avec une interruption, lors de comptage rapide.

Ci joint un petit bout de code qui permet de faire un programmateur assez simplement...


Code:
'=================================
'Timer: comptage 24h par pas de 2s
' 24h * 3600 /2 = 43200 impulsions
'valeur initiale timer: 65536 - 43200 soit 22336 
'=================================

#picaxe 28X1
setfreq m4
settimer 34285 'pour compter toutes les 2s
symbol Compteur = w4
symbol C_seconde = w5 'compteur secondes
symbol C_minute = w6  'compteur minutes
symbol C_heure = w7	'compteur heures

serout 7,N2400,(254,1) 'raz LCD
gosub Initimer 'remise à zéro des compteurs et init de Timer

'===================================
Debut:

do  

	Compteur = timer - 22336
	Compteur = 	Compteur * 2  'compteur en secondes
	C_heure = Compteur /3600
	C_seconde = Compteur //3600
	C_minute = C_seconde /60
	C_seconde = C_seconde //60
	

    
	if toflag = 1 then
		gosub Initimer
	endif
	
	gosub programme
	gosub Affichage
loop 

 '------------------------------
 Initimer:
	 timer = 22336 ' génère un flag (toflag à 1) au bout de 24h
	 toflag = 0 
	C_seconde = 0
	C_minute = 0
	C_heure = 0
 return
 
 '------------------------------
 Affichage: 'Affiche  HH:MM:SS

	 serout 7,N2400,(254,192,#C_heure,":",#C_minute,":",#C_seconde)
	 pause 20
 return
 '------------------------------
 programme: ' met la sortie 3 à 1 à  13h15mn8s
 		     'remet la sortie 3 à 0 à 14h20mn24s
 
	 If C_heure = 13 and C_minute = 15 and C_seconde > 8 then
	 	high 3
	 endif
	 
	 If C_heure = 14 and C_minute = 20 and C_seconde > 24 then
	 	low 3
	 endif
 return
 

portfolio

New Member
Bonsoir à tous
je commence à vouloir utiliser le timer interne du 20x2 pour traiter des interruptions
mais j'ai du mal....
comment détermine-t-on la valeur de settimer pour générer un 'top' toutes les n millisecondes par exemple
Salutations
 

PieM

Senior Member
Bonsoir,

c'est un peu compliqué, c'est vrai : :rolleyes:

il faut considérer qu'il il y a deux compteurs liés : un majeur et un mineur.

le majeur est incrémenté à chaque fois que le mineur atteint 65536.
la base de temps en secondes du compteur mineur se calcule ainsi : 256 /freq picaxe
un picaxe à 4 MHz aura donc pour base de temps 256 /4000000 soit 64 µs
32 µs à 8 MHz, 16 µs à 16 MHz etc ...

si on veut compter une seconde, il faut donc 1000000 µs / 64 soit 15625 impulsion du compteur mineur.
Mais comme le majeur n'est incrémenté que lorsque le mineur atteint 65536, il faut donc compter à partir de 65536 - 15625. soit 49910. Donc settimer = 49910
Par exemple, si on veut une base de comptage de 50 ms avec un picaxe à 8MHz, le settimer sera de :
65536 - 0,050 / (256/ 8.10^6 ) soit 63973.

Le compteur majeur sera donc incrémenté tous les 50 ms. Quand il atteindra lui aussi 65536, il passe en overflow et génère éventuellement une interruption, avec une variable toflag qui passe à un.
Ce compteur majeur peut être initialisé à n'importe quelle valeur par la variable timer.
si on met timer = 65436, l'interruption interviendra au bout de 100 fois 50 ms.
 
Last edited:

PieM

Senior Member
Suite ...

pour simplifier, la formule devient:

settimer : 65536 - ( T * F * 10^6 / 256 )

avec T en secondes et F en MHz .
 

portfolio

New Member
Bonsoir
waouu.. c'est super ce que vous m'expliquez là
je mets tout ça de coté pour le digérer tranquilement

l'objectif est pour l'instant de scruter l'état de 4 détecteurs de courant
(finalement j'ai choisi de faire une petite conversion d/a pour gagner des entrées)
grands remerciements
 

portfolio

New Member
Bonsoir
J'ai dû faire une fausse manip :je croyais avoir envoyé mon post hier
un grand grand merci
j'ai tout mis de coté pour étudier de près
 
Top