communication picaxe8m2+ds1307+afficheur lcd axe133

letireur89

New Member
bonjour

je voudrais memoriser l'heure a un instant t

j'ai commense a realiser un circuit avec un picaxe 8m2+ds1307+lcd axe133
voir schema si dessous
schema 8m2etds1307.JPG

j'ai commence le programme suivant pour deja afficher les secondes sur l'afficheur lcd :

Code:
symbol jour=b0
symbol annee=b1
symbol mois=b2
symbol date=b4
symbol heures=b5
symbol minutes=b6
symbol secondes=b6
symbol control=b7

let jour    	= $02
let annee  		= $15
let mois   		= $04
let date    	= $25 
let heures    	= $08
let minutes   	= $55
let secondes 	= $00	
let control 	= $10     ; activer sortie SQWout à 1Hz

i2cslave %11010000,i2cslow, i2cbyte

pause 250

hi2cout 0,(secondes)
hi2cout 1,(minutes)
hi2cout 2,(heures)
hi2cout 3,(jour)
hi2cout 4,(date)
hi2cout 5,(mois)
hi2cout 6,(annee)
hi2cout 7,(control)
		
main:	

	pause 30000
	
	hi2cin 0,(b8) ; lire les secondes
	
      SEROUT c.0,N2400,(254,192,"b8=",b8) 'affiche valeur b8
	
goto main

j'ai bien b8= qui s'affiche sur l'afficheur avec un code ascii

pouvez vous m'aider ? :confused:
 
Last edited:

letireur89

New Member
j 'ai effectue un autre programme est cela fonctionne:
il faut encore que je regarde,ce qu il va se passer a 23:59:59 ?
Code:
SYMBOL character1    = B2
	SYMBOL character2    = B3  
	SYMBOL character3    = B4  
	SYMBOL character4    = B5  
	SYMBOL character5    = B6  
	SYMBOL character6    = B7
	SYMBOL hours         = B8
        SYMBOL mins          = B9
	SYMBOL secs          = B10
	SYMBOL day           = B11 
	SYMBOL date          = B12
	SYMBOL month         = B13
	SYMBOL year          = B14
	SYMBOL PM_AM         = B15 
	SYMBOL character7    = B16
	SYMBOL character8    = B17
	SYMBOL character9    = B18
	SYMBOL character10    = B19
	SYMBOL character11    = B20
	SYMBOL character12    = B21
	SYMBOL character13    = B22
	SYMBOL character14    = B23
	
	
	let secs=$00:let mins=$15:let hours=$16:let day=$06:let date=$25:let month=$04:let year=$15
	
	
	
	
Program:            
   HI2Csetup I2Cmaster, %11010000, I2Cslow, I2Cbyte      ' mettre a 100kbps 
       HI2Cout $0, (secs,mins ,hours,day,date,month,year) ' ecrire secs,mins,hours,...etc  dans DS1307 

       
Main: 
     	 HI2Csetup I2Cmaster, %11010000, I2Cslow, I2Cbyte        
	 HI2Cin $0,  (secs,mins,hours,day,date,month,year) ' lire sec,mins,hours....du DS1307
	 


   BcdTOASCII hours,character1,character2 'lecture bit hours et transformer le code bcd en 2 caracteres (character1,character2)
   BcdTOASCII mins ,character3,character4
   BcdTOASCII secs ,character5,character6
   BcdTOASCII year ,character7,character8
   BcdTOASCII date ,character9,character10
   BcdTOASCII month ,character13,character14
   
   

SEROUT c.0,N2400,(254,128,"    ",character1,character2,":",character3,character4,":",character5,character6,"    ") 'afficher jour/mois/annee sur la ligne2
serout c.0,n2400,(254,192,"    ",character9,character10,"/",character13,character14,"/",character7,character8,"    ")'afficher heures:minutes:secodes sur la ligne1

pause 1000 'attendre 1 seconde
 goto main
 
Last edited:

dje8269

Senior Member
Bonsoir,

J'ai regardé ton code, je suis pas un expert , mais je peux éventuellement faire une remarques ou deux.

Je vois que tu as initialisé ta liaison avant et dans le main . Ceci ne sert à rien, car tu n'as pas besoin de changer le maître. Tu peux virer le deuxième hi2csetup.

A mon avis de temps en temps tu as peut être des secondes qui sautent non, ou une seconde qui dure 2 secondes?

Si Oui, je pense que c'est normal, car tu fais une pause de 1 seconde , en fait tout dépend de ta fréquence de travail.
Moi, j'aurais enlever la pause, et j'aurais mis à jour seulement les chiffres qui doivent changer à chaque boucle.

Après 245959, Je peux pas te dire , car je n'ai jamais travaillé avec ce module. Mais il y a fort à parier que cela repart à 0:0:0, en signalant par un flag le dépassement, sinon on reste bloqué sur une journée, voir la DE à mon avis.

Il est également préférable , de mettre ton main dans une boucle plutôt que d'utiliser un goto, qui peut être source d'erreur par la suite.

Bonne bidouille
 
Last edited:

letireur89

New Member
voici les ameliorations que j'ai pu apporter dans le programme :
j'ai tenu compte des remarques de dje8269
Code:
  SYMBOL character1    = B2
	SYMBOL character2    = B3  
	SYMBOL character3    = B4  
	SYMBOL character4    = B5  
	SYMBOL character5    = B6  
	SYMBOL character6    = B7
	SYMBOL hours         = B8
        SYMBOL mins          = B9
	SYMBOL secs          = B10
	SYMBOL day           = B11 
	SYMBOL date          = B12
	SYMBOL month         = B13
	SYMBOL year          = B14
	
	SYMBOL character7    = B16
	SYMBOL character8    = B17
	SYMBOL character9    = B18
	SYMBOL character10    = B19
	SYMBOL character11    = B20
	SYMBOL character12    = B21
	SYMBOL character13    = B22
	SYMBOL character14    = B23
	SYMBOL character15    = B24
	SYMBOL character16    = B25
		
	
	let secs=$00:let mins=$58:let hours=$23:let day=$06:let date=$25:let month=$04:let year=$15
	
	
	
	
Program:            
   HI2Csetup I2Cmaster, %11010000, I2Cslow, I2Cbyte      ' mettre a 100kbps 
       HI2Cout $0, (secs,mins ,hours,day,date,month,year) ' ecrire secs,mins,hours,...etc  dans DS1307 

   
Main: 
     	     
	 HI2Cin $0,  (secs,mins,hours,day,date,month,year) ' lire sec,mins,hours....du DS1307
	 


   BcdTOASCII hours,character1,character2 'lecture bit hours et transformer le code bcd en 2 caracteres (character1,character2)
   BcdTOASCII mins ,character3,character4
   BcdTOASCII secs ,character5,character6
   BcdTOASCII year ,character7,character8
   BcdTOASCII date ,character9,character10
   BcdTOASCII month ,character13,character14
   BcdTOASCII day ,character15,character16
   
     

SEROUT c.0,N2400,(254,128,"    ",character1,character2,":",character3,character4,":",character5,character6,"    ") 'afficher jour/mois/annee sur la ligne2

gosub joursemaine


goto main
 
 
 joursemaine:
 
                if day=$01 then lun
                if day=$02 then mar
                if day=$03 then mer
                if day=$04 then jeu
                if day=$05 then ven
                if day=$06 then sam
                if day=$07 then dim
 
 return
 
 
 
 lun:serout c.0,n2400,(254,192,"lun   ",character9,character10,"/",character13,character14,"/",character7,character8,"  ")'afficher lun  heures:minutes:secondes sur la ligne1
return
 mar:serout c.0,n2400,(254,192,"mar   ",character9,character10,"/",character13,character14,"/",character7,character8,"  ")'afficher mar heures:minutes:secondes sur la ligne1
return
 mer:serout c.0,n2400,(254,192,"mer   ",character9,character10,"/",character13,character14,"/",character7,character8,"  ")
return
 jeu:serout c.0,n2400,(254,192,"jeu   ",character9,character10,"/",character13,character14,"/",character7,character8,"  ")
return
 ven:serout c.0,n2400,(254,192,"ven   ",character9,character10,"/",character13,character14,"/",character7,character8,"  ")
return
 sam:serout c.0,n2400,(254,192,"sam   ",character9,character10,"/",character13,character14,"/",character7,character8,"  ")
return
 dim:serout c.0,n2400,(254,192,"dim   ",character9,character10,"/",character13,character14,"/",character7,character8,"  ")
return
donc suivant les photos suivantes on peut voir qu'a samedi 25/04/15 a 23:59:59 l'horloge passe a dimanche 26/4/15 a 00:00:00 :p

afficheur235959.jpg

afficheur000001.jpg
 
Last edited:

dje8269

Senior Member
Coucou letireur89 ,

je vous propose de poster votre code entre deux balises , ainsi pour nous se sera plus facile de le lire .

[ CODE] votre programme a coller ici [/CODE!] . enlever l'espace pour que ca fonctionne dans le premier code .

Je vous propose dans un premier temps de réduire les mot character , par "char", bien plus lisible et rapide a ecrire , oui faut savoir se menager en programmation ; c'est aux µC de travailler pas a nous lol .

Votre étiquette "program:" ne sert a rien , il me semble .

vous avez toujours une boucle proncipale formée par un goto . ceci est mauvais, même si ca fonctionne . evitez a tout prix d'utiliser des goto sources de trés nombreuses erreurs dans les programmes ; preferez les gosub .

Il vous faire une boucle ; comme ceci ;

Code:
do

ici votre programme principal

loop
Vous faites un test de condition qui vous envoie faire une sub, qui exécute un ordre, pourquoi ne pas faire l'ordre , tout de suite après le test de condition ? votre gosub lun , mar etc ... sont de trop .

En épluchant un peu la doc , vous remarquez qu'il y a une fonction qui permet de simplifier le choix du jour , avec la fonction select case . elle pourrait s'averer trés utile ici .

de plus, même si un µC fais ce qu'on lui dit, j'ai l'habitude ( peut etre mauvaise , si un expert peu me dire c'est c'est bon ou pas) , de vouloir mettre a jour les infos seulement quand c'est necessaire ;
dans votre programme, a chaque boucle vous convertissez tous et affichez tous , vous perdez un temps fou . car en faite il faudrait seulement changer les secondes, toutes les secondes ; et quand on arrive a 60, alors la on met a jour les minutes , et quand les minutes arrive a 60 alors seulement a ce moment on met a jour l'heure ;

je sais pas si j'ai été très clair ;

En fait tout dépends de ce que vous comptez faire après ca ! car la votre programme travaille énormément pour rien . si d'autre fonction son prevu, alors il faudrat revoir la logique ;

Je me propose a essayer de faire un programme avec explication si ca vous tente ! ;
 

PieM

Senior Member
vouloir mettre a jour les infos seulement quand c'est necessaire ;
dans votre programme, a chaque boucle vous convertissez tous et affichez tous , vous perdez un temps fou . car en faite il faudrait seulement changer les secondes, toutes les secondes ; et quand on arrive a 60, alors la on met a jour les minutes , et quand les minutes arrive a 60 alors seulement a ce moment on met a jour l'heure
Entre les tests et les mémorisations, c'est encore plus de temps passé et d'occupation mémoire !
Hors fonctions sommeil, un µC travaille dès qu'on le met sous tension, même si on lui demande rien...

Voir le programme MGU...
 

letireur89

New Member
Coucou letireur89 ,

je vous propose de poster votre code entre deux balises , ainsi pour nous se sera plus facile de le lire .

[ CODE] votre programme a coller ici [/CODE!] . enlever l'espace pour que ca fonctionne dans le premier code .
bonjour dje8269
consernant le programme entre code cela est fait,effectivement plus claire :p

si tu desires apporte des modifications dans le programme je suis preneur, sur avec la boucle do loop dont je ne maitrise pas ,apprendre cela m'interesse !

consernant le programme je me suis amuse a vouloir editer sur un afficheur lcd la date et jour et l'heure vraiment sans trop reflechir !

le but sera d'afficher le jour la date et l'heure lorsqu'une impulsion sera donnee par mon alarme,ce qui me permettra d avoir une tracabilite de l'evenement
la remise a zero se fera par un bouton poussoir

comment faire pour avoir plusieurs jours dates et heures de memorisees si il y a plusieurs declenchements ?
sinon je n'aurai que le dernier effectue ! :(
 
Top