problème lecture écriture sur 24lc512

buldo

New Member
Bonsoir, j’essaie de réaliser une petite application style datalogger qui mémorise l'heure,minute d'un évènement et la valeur de quelques capteurs, pour ensuite les transférer dans un fichier texte. voici mon code
Code:
symbol seconds = b0 
symbol mins = b1 
symbol hour = b2 
symbol memc = b7 
symbol ldr = b8
symbol memd = b11
symbol mema = b14
symbol memb = b15
symbol varM = b18
symbol meme = b19
symbol adresse = w10
symbol cptmouv = w12
symbol memadres = w13

main:
    let adresse = 0
    let cptmouv = 0

label_129:    
        if pinC.1 = 1 then label_93    
        if pinC.5 = 1 then gosub prc_PC    
        goto label_129
    
label_93:    
        cptmouv = cptmouv  + 1
        gosub prc_MEMOIRE    
        goto label_129
        
;******************************************************************
'**************** sous programme memorise données  ****************
;******************************************************************
prc_MEMOIRE:
    i2cslave %11010000, i2cslow, i2cbyte ; active DS1307 slave address 
    readi2c 0,(seconds,mins,hour)
    pause 10;
    readadc c.2,ldr
    pause 10
    
    i2cslave %10100000, i2cslow, i2cword 'active mémoire
    
    writei2c adresse,(hour,mins) 
    pause 10
    adresse = adresse +1
    
    writei2c adresse,(ldr,cptmouv)
    pause 10
    let adresse = adresse + 1

    return        
;******************************************************************
'**************** transfer vers pc              *******************
;******************************************************************
prc_PC: 'attente du caractère g
    let memadres = 0    
    
    serin b.2, N4800, ("g") 'attente du signal g

'Transmition des titres 
    serout b.5,N4800,("heure",":","minute",",  ","ldr",",","mouv",13,10)
    pause 200
lect_data:
    if memadres >= adresse then fini
    i2cslave %10100000, i2cslow, i2cword    ;memoire
    
    readi2c memadres,(hour,mins)
    pause 10
    bcdtoascii hour,mema,memb
    serout b.5,N4800,(mema,memb)
    pause 10
    bcdtoascii mins,mema,memb
    serout b.5,N4800,(":",mema,memb,",  ")
    pause 10
    memadres = memadres + 1

    readi2c memadres,(ldr,cptmouv)
    pause 10
    bintoascii ldr,mema,memb,memc
    serout b.5,N4800,(mema,memb,memc,",")
    pause 10
    bintoascii cptmouv,mema,memb,memc
    serout b.5,N4800,(mema,memb,memc,13,10)
    pause 10
    memadres = memadres + 1
    goto lect_data

fini:
    serout b.5,N4800,(0)
        return        'Return 
#no_data    'reduce download time
et le fichier texte reçu sur le pc

heure:minute, ldr,mouv
40:39, 057,000 <= 40h39mn !! il était 00h35 !
00:38, 056,000 <= l'heure,minute semblent plausible mais la variable mouv reste à 0 elle aurait du passé à 1
00:37, 055,000 <= je viens d'inventer une machine à remonter le temps et la variable mouv reste à 0 elle aurait du passé à 2
00:35, 053,000 <= seul les variables heure et ldr semblent cohérentes
00:35, 053,000
00:35, 053,000
00:35, 053,000
00:35, 053,000
00:46, 070,000
00:48, 072,000
00:48, 072,000
00:49, 073,000
00:4;, 075,000
00:4;, 075,000
00:49, 073,000

en faite je soupçonne mes erreurs au niveau des conversions vers ascii
bcdtoascii hour,mema,memb
serout b.5,N4800,(mema,memb)
pause 10 <================ est-ce un problème timing ici ou ailleurs ?
bcdtoascii mins,mema,memb <================ ai-je le droit d'utiliser les mêmes variables mema et memb ?
serout b.5,N4800,(":",mema,memb,", ")

bintoascii ldr,mema,memb,memc
serout b.5,N4800,(mema,memb,memc,",")
pause 10
bintoascii cptmouv,mema,memb,memc
serout b.5,N4800,(mema,memb,memc,13,10)

j'ai testé aussi i2cslave %10100000, i2cslow, i2cword et i2cslave %10100000, i2cfast, i2cword rien ne change.
avez-vous une idée ?
 

BESQUEUT

Senior Member
00:49, 073,000
00:4;, 075,000
00:4;, 075,000
00:49, 073,000
Là c'est sur : il manque des caractères (probablement un "9") ==> problème dans la transmission série...
Probablement aussi pour la première ligne ; c'était probablement :
00:40
00:39
Aucune idée pour la machine à remonter le temps. Résolvons les autres problèmes, on verra ensuite si ça subsiste.
cptmouv est sur 2 octets : est-ce que ça ne pose pas un problème d'écriture, puis de lecture en I2C, d'autant que la fonction writei2c est classée "deprecated" ?
 

BESQUEUT

Senior Member
ai-je le droit d'utiliser les mêmes variables mema et memb ?
oui : c'est une façon habituelle de procéder.
A titre de debug, peut-être pourriez-vous afficher 3 caractères pour les variable en 1 octet et 5 pour celle en 2 octets :
on verrait ainsi un éventuel problème de lecture/écriture dans la mémoire.
Ou alors, toujours à titre de debug, utiliser #variable.
 

buldo

New Member
Merci pour la réponse,
j&#8217;ai remplacé writei2c (deprecated !) par hi2cout et serout par hserout
Code:
symbol seconds = b0 
symbol mins = b1 
symbol hour = b2 
symbol memc = b7 
symbol ldr = b8
symbol memd = b11
symbol mema = b14
symbol memb = b15
symbol varM = b18
symbol meme = b19
symbol adresse = w10
symbol cptmouv = w12
symbol memadres = w13

main:

    let adresse = 0
    let cptmouv = 0
    hsersetup B4800_4, %10

label_129:    
        if pinC.1 = 1 then label_93    
        if pinC.5 = 1 then gosub prc_PC    
    
        goto label_129
    
label_93:    
        cptmouv = cptmouv  + 1
        gosub prc_MEMOIRE    
        
        goto label_129
        

;******************************************************************
'**************** sous programme memorise données  ****************
;******************************************************************
prc_MEMOIRE:
    
    hi2csetup i2cmaster, %11010000, i2cslow, i2cbyte ; active DS1307 slave address 
    
    hi2cin 0,(seconds,mins,hour)
    pause 20;
    readadc c.2,ldr
    pause 20
    
    hi2csetup i2cmaster, %10100000, i2cfast, i2cword 'active memoire
    
    hi2cout adresse,(hour,mins) 
    pause 20
    adresse = adresse +1
    
    hi2cout adresse,(ldr,cptmouv)
    pause 20
    let adresse = adresse + 1

    return        
;******************************************************************
'**************** transfer vers pc              *******************
;******************************************************************
prc_PC: 'attente du caractère g
    let memadres = 0    

'Transmition des titres 
    hserout 0,("#memadres"," ","#hour"," ","#mins"," ","heure",":","minute",",  ","#ldr"," ","#cptmouv"," ","ldr",",","mouv",13,10)
    pause 200
lect_data:
    if memadres >= adresse then fini
    hi2csetup i2cmaster, %10100000, i2cfast, i2cword    ;memoire
    
    hi2cin memadres,(hour,mins)
    pause 20
    hserout 0,(#memadres," ",#hour," ",#mins," ")
    bcdtoascii hour,mema,memb
    hserout 0,(mema,memb)
    pause 20
    bcdtoascii mins,mema,memb
    hserout 0,(":",mema,memb,",  ")
    pause 20
    memadres = memadres + 1

    hi2cin memadres,(ldr,cptmouv)
    pause 20
    hserout 0,(#ldr," ",#cptmouv," ")
    bintoascii ldr,mema,memb,memc
    hserout 0,(mema,memb,memc,",")
    pause 20
    bintoascii cptmouv,mema,memb,memc
    hserout 0,(mema,memb,memc,13,10)
    pause 20
    memadres = memadres + 1
    goto lect_data

fini:
    hserout 0,(0)
    return        
        

#no_data    'reduce download time
le fichier reçu :
#memadres #hour #mins heure:minute, #ldr #cptmouv ldr,mouv <====== 2 appuis sur le capteur
0 19 233 13:>9, 233 19 233,019 <= heure et ldr sont ok minutes et mouv faux
2 19 233 13:>9, 233 2 233,002 <= heure et ldr et MOUV sont ok minutes faux !!!
#memadres #hour #mins heure:minute, #ldr #cptmouv ldr,mouv <= 2 ème transfert sans éteindre le prototype
0 19 233 13:>9, 233 19 233,019 <= heure et ldr sont ok minutes et mouv faux
2 19 233 13:>9, 233 19 233,019 <= heure et ldr sont ok minutes et mouv faux et en plus cette ligne n'est pas la même qu'au dessus, mouv à perdu sa valeur
4 19 150 13:96, 150 3 150,003 < mais mouv prend-il la bonne valeur sur la dernière ligne ?
#memadres #hour #mins heure:minute, #ldr #cptmouv ldr,mouv <= 3 ème transfert sans éteindre le prototype
0 19 233 13:>9, 233 19 233,019
2 19 233 13:>9, 233 19 233,019
4 19 150 13:96, 150 19 150,019
6 19 130 13:82, 130 4 130,004 < mais mouv prend-il la bonne valeur sur la dernière ligne ? ben oui !!!!!!!!
 
Last edited by a moderator:

buldo

New Member
j'ai ajouté un afficheur lcd/i2c et il affiche bien l'heure avec ce code
Code:
;************************************************************************************************************************        
prc_LIREDATE:
        
        
        hi2csetup i2cmaster, %11010000, i2cslow, i2cbyte ; active DS1307 slave address 
        pause 50
        hi2cin 0,(seconds,mins,hour) ; lecture date en BCD
        pause 50
        hi2csetup i2cmaster, $c6, i2cslow, i2cbyte ; '&#8216;  LCD
        pause 50 ' wait for display to initialise
        hi2cout 0,(254,128,255) 
        
; lit/ecrit heure sur LCD
        bcdtoascii hour,mema,memb
        writei2c 0,(mema,memb,":",255)
        bcdtoascii mins,mema,memb
        writei2c 0,(mema,memb,":",255)
        bcdtoascii seconds,mema,memb
        writei2c 0,(mema,memb,255)

        return        'Return 
;*******************************************************************************************************
je pensais à une panne du ds1307 mais non ...
le soucis est bien sur la lecture/ecriture en mémoire ou sur le transfert vers le pc
 
Last edited by a moderator:

buldo

New Member
#memadres #hour #mins heure:minute, #ldr #cptmouv ldr,mouv
0 20 35 14:23, 168 1 142,
4 20 35 14:23, 168 2 142,
8 20 35 14:23, 167 3 142,
12 20 35 14:23, 167 4 142,
16 20 35 14:23, 166 5 142,
20 20 35 14:23, 167 6 142,
24 20 36 14:24, 233 7 142,
28 20 36 14:24, 233 8 142,

mais c'est beau !!! il fallait incrémenter l'adresse de 2 lors de la sauvegarde.

hi2csetup i2cmaster, %10100000, i2cfast, i2cword 'active memoire avec adresse en word !!!

hi2cout adresse,(hour,mins) <= j'écris bien un "word"
pause 20
adresse = adresse +2 <= donc la prochaine adresse se situe bien à l'adresse + 2 ....

hi2cout adresse,(ldr,cptmouv)
pause 20
let adresse = adresse + 2
 
Top