GPS NE06 approche horloge-Base de temps

jojojo

Senior Member
Bonsoir.
Après avoir lu le fil "Fréquence ou vitesse", j'avais commandé un NE06, avec juste l'idée de me familiariser, avec le GPS, en général.

Première constatation, je suis bienvenu au club des "pas de 9600" (coucou, Piem :)). Il me manque donc une trame, aussi. :mad:

Pas grave.

L'idée première, c'est de faire une bête horloge, avec une sortie "base de temps", pour d'autres applis.

Bon, pour afficher l'heure, c'est très simple.

Là où cela va se corser, c'est :

-Exploiter les données de position, pour en retirer un fuseau horaire (et une table simple des villes les plus connues)
-Gérer heure été, heure d'hiver
-Créer un calendrier (j'aimerai bien : N° du jour , HH:MM:SS, avec gestion des bissextiles)

Je sais, on trouve ça tout fait, en chine, à moins de dix roro's. Et alors ?
J'aime faire.

J'en suis là:

Code:
#picaxe 08m2
setfreq m16
Symbol GPS=C.3
Symbol LCD=C.2


    Pause 100
    Serout LCD,T9600_16,(4)'Hide cursor
    Pause 100
    Serout LCD,T9600_16,(12)'CLS
    Pause 100
    Serout LCD,T9600_16,(19)'retroéclairage
    Pause 100

Do


  serin c.3,T4800_16,("$GPRMC,"),b0,b1,b2,b3,b4,b5,b6,b7',#w13,#w12,b8,#w11,#w10,b9,b10,b11,b12

  b0=b0-48:b1=b1-48:b2=b2-48:b3=b3-48:b4=b4-48:b5=b5-48

  b0=10*b0:b0=b0+b1
  b2=10*b2:b2=b2+b3
  b4=10*b4:b4=b4+b5
  Gosub AffUTC    'faudra trouver un
  Gosub AffLocal    'truc pour compacter ça ...

Loop



   

AffUTC:  
   
    If b0<10 Then
        Serout LCD,T9600_16,("0",#b0,":")
    Else
        Serout LCD,T9600_16,(#b0,":")
    End if
    Pause 100
    If b2<10 Then
        Serout LCD,T9600_16,("0",#b2,":")
    Else
        Serout LCD,T9600_16,(#b2,":")
    End if
    Pause 100
    If b4<10 Then
        Serout LCD,T9600_16,("0",#b4)
    Else
        Serout LCD,T9600_16,(#b4)
    End if
    Pause 100
    Serout LCD,T9600_16,("   UTC    ",b7)
    Pause 100
    Serout LCD,T9600_16,(13)
    Pause 100
Return  

AffLocal:
    Gosub Fuseau  
    If b0<10 Then
        Serout LCD,T9600_16,("0",#b0,":")
    Else
        Serout LCD,T9600_16,(#b0,":")
    End if
    Pause 100
    If b2<10 Then
        Serout LCD,T9600_16,("0",#b2,":")
    Else
        Serout LCD,T9600_16,(#b2,":")
    End if
    Pause 100
    If b4<10 Then
        Serout LCD,T9600_16,("0",#b4)
    Else
        Serout LCD,T9600_16,(#b4)
    End if
    Pause 100
    Serout LCD,T9600_16,("   LOCAL")
    Pause 100
    Serout LCD,T9600_16,(1)
    Pause 100
   
Return

Fuseau:
'Ouille !
'Ici, calculer le fuseau, fst données GPS
b0=b0+2' Bon, chuis en France, pour l'instant. Hé hé ...
'Faudra aussi dépatouiller heure été/hiver
Return
On the road again ...

UTC_LOCAL.jpg

News: Ce matin, au bout d'une minute, la led rouge du module clignote, et je suis en mode "A" (au fin fond de mon atelier, bien en sous-sol).
J'ai juste (involontairement) bougé un peu l'antenne.
Bien sensible, ce truc. :)
 
Last edited:

MGU

Senior Member
Bonjour,

Extraire l'heure de la trame RMC, c'est assez facile. Pour le reste, les séparateurs fiables sont les virgules. Il me semble que dans cette discussion sur le GPS NEO06, on enregistrait la trame à la volée en RAM , dans des @bptrinc pour ensuite en extraire les infos utiles.
Y a de quoi s'amuser un petit moment.

Un lien vers cette discussion svp

MM
 

PieM

Senior Member
Bonjour,
Si tu ne ne fais que de l'affichage de l'heure, il y a beaucoup plus simple, en utilisant les valeurs brutes en RAM et un pointeur, comme dans le programme que j'avais donné. En plus tu sauves des variables pour faire autre chose. voir ce post
Ne pas utiliser des variables word pour latitude et longitude, car un 42.0056 va se traduire par 42.56 !
Il n'y a pas de relation heure UTC et fuseau horaire dans de nombreuses partie du monde. Si tu passes de l'ouest de l'Espagne au Portugal, tu changes d'heure sans changer de longitude. De même si tu vas en UK.
Heure d'hiver et heure d'été? ça va être abandonné...
Quant au jour de la semaine, tu as la formule de Gauss....
 
Last edited:

jojojo

Senior Member
Bon ... Je bosse sur le calendrier.

Mais, il reste un truc qui me chiffonne...

Pourquoi la virgule qui suit immédiatement l'unité seconde est-elle prise en compte, dans le Serin ?

Code:
 serin c.3,T4800_16,("$GPRMC,"),b0,b1,b2,b3,b4,b5,b6,b7
  '                               H H   M M   S S  "," A
  '                                                    V
 b6=0 'pourquoi la virgule est prise en compte dans la trame ?
 

MGU

Senior Member
Bon ... Je bosse sur le calendrier.

Mais, il reste un truc qui me chiffonne...

Pourquoi la virgule qui suit immédiatement l'unité seconde est-elle prise en compte, dans le Serin ?

Code:
 serin c.3,T4800_16,("$GPRMC,"),b0,b1,b2,b3,b4,b5,b6,b7
  '                               H H   M M   S S  "," A
  '                                                    V
b6=0 'pourquoi la virgule est prise en compte dans la trame ?
Bonjour,

La virgule est un caractère comme un autre, que tu lis avec b6. Normal non ?

MM
 

jojojo

Senior Member
Ben ...Oui. Conforme à ma signature.

Mais, hop ! Tant que tu es là ;)

Il n'y a pas une de ces fichues trame, qui pourraient nous guider sur la date ? Grrr... :mad:
 

MGU

Senior Member
Ben ...Oui. Conforme à ma signature.

Mais, hop ! Tant que tu es là ;)

Il n'y a pas une de ces fichues trame, qui pourraient nous guider sur la date ? Grrr... :mad:
Ben non, même en cherchant bien...
Pour l'heure et la date, il y a les RTC , genre DS3231. Faut les mettre à l'heure, une fois.
On peut peut être synchroniser avec le PC, je sais pas.

MM
 

MGU

Senior Member
Bon, ben voilà...
L'heure est en UTC

Horloge GPS.jpg

Le code:
Code:
; *******************************
; ***** GPS NEO6M  *****
; *******************************
#Picaxe 08M2
#no_data
symbol baud = T9600_32
symbol UART_in = C.1  ' vers Tx NEO6
symbol LCD = C.0
symbol cpt=b1
setfreq m32
'===================================================================
pause 500
serout LCD,baud,(254,1,254,128,"OK")
pause 500
serout LCD,baud,(254,1,254,1)
do   
    gosub lecture
    gosub heure
    gosub date    
loop

lecture:
   bptr= 30
  serin UART_in, baud, ( "RMC," ),@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc
return

heure:
    bptr=30
    serout LCD,baud,(254,192,@bptrinc,@bptrinc,":",@bptrinc,@bptrinc,":",@bptrinc,@bptrinc)
    return

date:
    bptr=30
    cpt=0
    do
        if @bptrinc="," then        ;recherche date
            inc cpt
        endif
    loop until cpt=7
    inc bptr
    serout LCD,baud,(254,128,@bptrinc,@bptrinc,"/",@bptrinc,@bptrinc,"/20",@bptrinc,@bptrinc)
    return

MM
 

jojojo

Senior Member
J'lai pas fait pareil, mais, ça marche aussi. (On peut faire sans @bptrinc, en rusant, sur la même variable.)

17_octobre_2018.jpg


Comme ça:

Code:
#picaxe 08m2
setfreq m16
Symbol GPS=C.3
Symbol LCD=C.2


    Pause 100
    Serout LCD,T9600_16,(4)'Hide cursor
    Pause 100
    Serout LCD,T9600_16,(12)'CLS
    Pause 100
    Serout LCD,T9600_16,(19)'retroéclairage
    Pause 100

Do

      serin GPS,T4800_16,("$GPRMC,"),b0,b1,b2,b3,b4,b5,b6,b7,b6,b6,b6,b6,b6,b6,b6,b6,b6,b6,b6,b6,b6,b6,b6,b6,b6,b6,b6,b6,b6,b6,b6,b6,b6,b6,b6,b6,b8,b9,b10,b11,b12,b13

 
  b6=0
  b0=b0-48:b1=b1-48:b2=b2-48:b3=b3-48:b4=b4-48:b5=b5-48:b8=b8-48:b9=b9-48:b10=b10-48:b11=b11-48:b12=b12-48:b13=b13-48
  b0=10*b0:b0=b0+b1
  b2=10*b2:b2=b2+b3
  b4=10*b4:b4=b4+b5
  b8=10*b8:b8=b8+b9
  b10=10*b10:b10=b10+b11
  b12=10*b12:b12=b12+b13
 
 
 
  Gosub AffUTC    'faudra trouver un
  Gosub AffLocal    'truc pour compacter ça ...
  Debug
Loop



    

AffUTC:   
    
    If b0<10 Then
        Serout LCD,T9600_16,("0",#b0,":")
    Else
        Serout LCD,T9600_16,(#b0,":")
    End if
    Pause 100
    If b2<10 Then
        Serout LCD,T9600_16,("0",#b2,":")
    Else
        Serout LCD,T9600_16,(#b2,":")
    End if
    Pause 100
    If b4<10 Then
        Serout LCD,T9600_16,("0",#b4)
    Else
        Serout LCD,T9600_16,(#b4)
    End if
    Pause 100
    Serout LCD,T9600_16,("   UTC    ",b7)
    Pause 100
    Serout LCD,T9600_16,(13)
    Pause 100
Return   

AffLocal:
    Gosub Fuseau   
    If b0<10 Then
        Serout LCD,T9600_16,("0",#b0,":")
    Else
        Serout LCD,T9600_16,(#b0,":")
    End if
    Pause 100
    If b2<10 Then
        Serout LCD,T9600_16,("0",#b2,":")
    Else
        Serout LCD,T9600_16,(#b2,":")
    End if
    Pause 100
    If b4<10 Then
        Serout LCD,T9600_16,("0",#b4)
    Else
        Serout LCD,T9600_16,(#b4)
    End if
    Pause 100
    Serout LCD,T9600_16,("   LOCAL")
    Pause 100
    Serout LCD,T9600_16,(13)
    Pause 100
      Select case b10
        Case 1
        Serout LCD, T9600_16,(#b8," JANVIER   20",#b12)
        Case 2
        Serout LCD, T9600_16,(#b8," FEVRIER   20",#b12)
        Case 3
        Serout LCD, T9600_16,(#b8," MARS      20",#b12)
        Case 4
        Serout LCD, T9600_16,(#b8," AVRIL     20",#b12)
        Case 5
        Serout LCD, T9600_16,(#b8," MAI       20",#b12)
        Case 6
        Serout LCD, T9600_16,(#b8," JUIN      20",#b12)
        Case 7
        Serout LCD, T9600_16,(#b8," JUILLET   20",#b12)
        Case 8
        Serout LCD, T9600_16,(#b8," AOUT      20",#b12)
        Case 9
        Serout LCD, T9600_16,(#b8," SEPTEMBRE 20",#b12)
        Case 10
        Serout LCD, T9600_16,(#b8," OCTOBRE   20",#b12)
        Case 11
        Serout LCD, T9600_16,(#b8," NOVEMBRE  20",#b12)
        Case 12
        Serout LCD, T9600_16,(#b8," DECEMBRE  20",#b12)
End Select
    Pause 100
    Serout LCD,T9600_16,(1)
    Pause 100
    
    
Return

Fuseau:
'Ouille !
'Ici, calculer le fuseau, fst données GPS
b0=b0+2' Bon, chuis en France, pour l'instant. Hé hé ...
'Faudra aussi dépatouiller heure été/hiver
Return










#rem

***********************************POUR MEMOIRE**************************************

Trame reçue:
$GPRMC

Recommended minimum specific GPS/Transit data


eg2. $GPRMC,225446,A,4916.45,N,12311.12,W,000.5,054.7,191194,020.3,E*68


225446 Time of fix 22:54:46 UTC
A Navigation receiver warning A = OK, V = warning
4916.45,N Latitude 49 deg. 16.45 min North
12311.12,W Longitude 123 deg. 11.12 min West
000.5 Speed over ground, Knots
054.7 Course Made Good, True
191194 Date of fix 19 November 1994
020.3,E Magnetic variation 20.3 deg East
*68 mandatory checksum


eg3. $GPRMC,220516,A,5133.82,N,00042.24,W,173.8,231.8,130694,004.2,W*70
1 2 3 4 5 6 7 8 9 10 11 12


1 220516 Time Stamp
2 A validity - A-ok, V-invalid
3 5133.82 current Latitude
4 N North/South
5 00042.24 current Longitude
6 W East/West
7 173.8 Speed in knots
8 231.8 True course
9 130694 Date Stamp
10 004.2 Variation
11 W East/West
12 *70 checksum
Fuseaux standards:   
Du 180° au 90° Ouest (négatifs)     -12:00 · -11:00 · -10:00 · -09:30 · -09:00 · -08:00 · -07:00******7 zones
Du 90° Ouest au Méridien     -06:00 · -05:00 · -04:00 · -03:30 · -03:00 · -02:00 · -01:00 ******7 zones
Du Méridien au 90° Est     ±00:00 · +01:00 · +02:00 · +03:00 · +03:30 · +04:00 · +04:30 · +05:00 · +05:30 · +05:45 *****10 zones
Du 90° Est au 180°     +06:00 · +06:30 · +07:00 · +08:00 · +08:45 · +09:00 · +09:30 · +10:00 · +10:30 · +11:00 *****10 zones
Du 180° au 90° Ouest (positifs)     +12:00 · +12:45 · +13:00 · +14:00****4 zones
Fuseaux liés à l'heure d'été     -02:30 · +13:45

#endrem
Voilà, plus qu'un petit (?) calcul de Gauss (merci, Piem), et je rajoute le nom du jour.

Chuis ben content :)
 

jojojo

Senior Member
Au fait, une remarque, et une question.

Bon, j'ai mis dans mon agenda, de repasser corriger le code, dans 82 ans. L'année ne sera plus bonne (Comment ça, "hi hi ! :eek: Mais si, mais si ! :))

Question à PieM: J'ai vu quelque part, que tu trouvais le nombre de sat reçus. Tu peux re-préciser comment ? Cimercoubô.
 
Last edited:

MGU

Senior Member
Pour le calcul du jour de semaine, il y a aussi l'algorithme de Mike Keith (le meilleur selon lui..)

Code:
'***** calcul joursem ****************
  'L'algorithme de Mike Keith numérote de 0 à 6
  'Dim=0, Lun=1,...,Sam=6
  an= 2000+an 
  if mois < 3 then
     varw=an-1
    else varw=an
  end if 
  joursem= 23*mois/9 +jour+4+an
  w10=varw/4
  joursem=joursem+w10
  w10=varw/100
  joursem=joursem-w10
  w10=varw/400
  joursem=joursem+w10
  if mois>= 3 then
    joursem=joursem-2
  endif
  joursem=joursem//7+1 '+1 pour numérotation de 1 à 7 idem DS1307
  varb=joursem  'mémorisation dans une variable type byte
MM
 

jojojo

Senior Member
Merci, Michel.
J'étais juste sur Wiki, en train de lire l'algo.
Je vais (lâchement) me servir de ton code ...
 

PieM

Senior Member
Merci, Michel.
J'étais juste sur Wiki, en train de lire l'algo.
Je vais (lâchement) me servir de ton code ...
Je crois que la formule de Gauss n'était pas applicable avec Picaxe, sauf usine à gaz !
Pour le nombre de satellite, il faut la trame GSV, sachant que tu peux en avoir 4 qui se suivent (détail de 4 satellites par trame)

$GPGSV,2,1,08,01,40,083,46,02,17,308,41,12,07,344,39,14,22,228,45*75

Where:
GSV Satellites in view
2 Number of sentences for full data (ici tu auras 2 trames GSV)
1 sentence 1 of 2
08 Number of satellites in view

01 Satellite PRN number
40 Elevation, degrees
083 Azimuth, degrees
46 SNR - higher is better (signal to noise ratio - intéressant pour savoir si ton antenne est OK...)
for up to 4 satellites per sentence
*75 the checksum data, always begins with *

Tu as la GGA aussi qui te donne le nb de sat. avec la dop (dilution of position) intéressant surtout pour du positionnement.
 
Last edited:

jojojo

Senior Member
Bon, j'ai des misères, avec la date.

Aléatoirement, ça tourne au n'importe quoi.

Puis, ça redevient normal.

Pour les heures minutes secondes, tout est parfait.

Je soupçonne que le soft de la puce prenne le relais, en cas de trame mal reçue (mauvais checksum). Facile, avec un compteur interne, il peut corriger.

Je soupçonne également qu'il ne le fait pas, pour la date.

Michel, as-tu laissé tourner ton proto assez longtemps, pour être sûr, que la date reste stable (c'est très aléatoire, ici) ?

Si je comprenais comment fonctionne le fameux "checksum", présent en fin de trame, je mettrais un test, avant de changer les éléments "date".
(Une histoire de XOR, sans les $ et les * . Pas clair ...). Le mode "A", ou "V"' ne change rien à l'affaire.

Bref, on n'est pas au bout ...
 

MGU

Senior Member
Bon, j'ai des misères, avec la date.

Aléatoirement, ça tourne au n'importe quoi.

Puis, ça redevient normal.

Pour les heures minutes secondes, tout est parfait.

Je soupçonne que le soft de la puce prenne le relais, en cas de trame mal reçue (mauvais checksum). Facile, avec un compteur interne, il peut corriger.

Je soupçonne également qu'il ne le fait pas, pour la date.

Michel, as-tu laissé tourner ton proto assez longtemps, pour être sûr, que la date reste stable (c'est très aléatoire, ici) ?

Si je comprenais comment fonctionne le fameux "checksum", présent en fin de trame, je mettrais un test, avant de changer les éléments "date".
(Une histoire de XOR, sans les $ et les * . Pas clair ...). Le mode "A", ou "V"' ne change rien à l'affaire.

Bref, on n'est pas au bout ...
Bonjour,

Je ne sais pas non plus comment fonctionne ce checksum, mais ça ne devrait pas être très compliqué, PieM le sait sûrement.
Par contre, tu synchronises en comptant les octets, c'est plus scabreux qu'en comptant les virgules. As tu essayé mon code ?
J'ai une date stable (enfin quelques rares pertes de synchro, l'antenne minimaliste est à l'intérieur).
Sans correction, la date est fausse entre 24h loc et 24h UTC, Cette date est identique toute la journée, on peut limiter la mise à jour .
On teste après 0h , sur deux mesures, si c'est la même date, on bloque jusqu' à 0h du jour suivant.

MM
 
Last edited:

PieM

Senior Member
Pas besoin de checksum, il sera bon !
Comme tu le fais remarquer, il faut IMPERATIVEMENT compter les "," séparateurs de champs. Si la vitesse est nulle, donnée précédente de la date, le champ vitesse est vide. Résultat avec la méthode Jojojo, au lieu de lire la date il lit l'année et la variation magnétique...
 

jojojo

Senior Member
Je ne comprends pas.
La commande Serin sépare les données reçues, fonction du séparateur (la virgule), non ?
Donc, toute valeur située entre deux virgules est censée être valide... Non ?
Bon, je vais utiliser votre méthode, mais, je ne comprends pas.

Comment le champ vitesse peut-il être vide ? La longueur de la trame est constante.
J'ai du mal, là ...

@bptrinc mémorise la position, dans la chaine, d'accord. Mais, si la quantité de données transmise est constante(le cas ici), une succession de variable devraient avoir le même effet, si on les compte bien, non ?

Ou alors, pourquoi est-ce que cela fonctionne, pour les HH MM SS et A ou V ?

Et, pourquoi la date de Michel est-elle fausse deux heures par jour ? (24 loc, 24UTC)

Bon, va pour bptrinc, mais ça me gêne de risquer de mourir idiot ... :cry:
 

MGU

Senior Member
Dans serin, la virgule sépare les octets, tu as bien écrit : b0,b1,....
Dans la trame GPS, la virgule sépare les champs, comprenant de 0 à ...plusieurs caractères qui sont des octets.
La longueur d'un champs n'est pas toujours fixe. Ce qui est fixe, c'est le nombre de champs (même vide) donc le nombre de virgules dans la trame.

Quand il est 23heures UTC, il est une heure du matin locale en France, mais ce n'est pas le même jour et manque de pot, on est en avance, ce qui fait qu'il faut tenir compte du nombre de jours dans le mois par anticipation (28,29,30,31 ?). C'est faisable, mais le plus simple est de ne pas regarder la date à ce moment là..

MM
 

PieM

Senior Member
Comment le champ vitesse peut-il être vide ? La longueur de la trame est constante.
Non, c'est faux: le nombre de champs est constant mais un champ peut être vide. sur RMC du Néo6, le champ vitesse et la déclinaison magnétique peuvent l'être. Et ça , c'est fonction du processeur GPS. Comme les trames peuvent être différentes entre RMC Néo et Garmin...
Ou alors, pourquoi est-ce que cela fonctionne, pour les HH MM SS et A ou V
Tout simplement parce que ce sont les premiers champs de la trame. Il ne peut pas y en avoir de vides avant.
 

jojojo

Senior Member
Hello !

Bon, déjà, merci pour vos réponses. La notion de nombre de champs, je pense avoir pigé.

Du coup, j'ai fait ça (Merci, Michel):

Code:
; *******************************
; ***** GPS NEO6M  *****
; *******************************
#picaxe 08m2
#no_data
setfreq m32
Symbol Baud_LCD=T9600_32
Symbol Baud_GPS=T4800_32
Symbol GPS=C.3
Symbol LCD=C.2
symbol CPT=b1
'Symbol VARW=w13
'Symbol JOURSEM=b14




'Init LCD   
Serout LCD,Baud_LCD,(4)'Hide cursor
Pause 100
Serout LCD,Baud_LCD,(12)'CLS
Pause 100
Serout LCD,Baud_LCD,(19)'retroeclairage
Pause 100
    



do   
    gosub lecture
    gosub heure
    gosub date   
loop

lecture:
   bptr= 30
  serin GPS, Baud_GPS, ( "$GPRMC," ),@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc
  '60, donc ...
return

heure:
    bptr=30
    serout LCD,Baud_LCD,(@bptrinc,@bptrinc,":",@bptrinc,@bptrinc,":",@bptrinc,@bptrinc)
    Pause 100
    serout LCD,Baud_LCD,(13)
    Pause 100
Return

date:
    bptr=30
    cpt=0
    do
        if @bptrinc="," then        ;recherche date
            inc cpt
        endif
    loop until cpt=7
    inc bptr
    serout LCD,Baud_LCD,(@bptrinc,@bptrinc,"/",@bptrinc,@bptrinc,"/20",@bptrinc,@bptrinc)
    Pause 100
    serout LCD,Baud_LCD,(1)
    Pause 100
Return
Et ... Ben non.

Toujours la date qui bricole.
Hormis la modif de gestion du LCD, le programme est strictement celui de Michel.


HELPPPPPPPPPPPP!!!!!!!!!!! o_O
 

MGU

Senior Member
HELPPPPPPPPPPPP!!!!!!!!!!! o_O
Voilà, voilà, faut pas crier si fort!....

125824.00,A,4840.46623,N,00232.28861,E,0.178,,191018,,,A*7D

C'est la trame RMC que je reçois, c'est pas tout à fait celle de la doc que j'ai trouvé.
Sans compter la virgule après RMC qui est dans l'identifiant, la date est après la virgule 8 et la dernière est la 11

J'ai pas le temps de chercher pourquoi, mais mon programme fonctionne avec 7 et 10.
Dans ce code, je vérifie que le second caractère après la dernière virgule est "*" pour continuer l'affichage de la date.
La mise à jour est inutile à chaque lecture de l'heure, c'est juste pour expérimenter.

Code:
; *******************************
; ***** GPS NEO6M  *****
; *******************************
#Picaxe 08M2
#no_data
symbol baud = T9600_32
symbol UART_in = C.1  ' vers TXNEO6
symbol LCD = C.0
symbol flag=bit0
symbol cpt=b1
setfreq m32
'===================================================================
pause 500
serout LCD,baud,(254,1,254,1)
do  
    gosub lecture
    gosub heure
    gosub date   
loop

lecture:
   bptr= 30
  serin UART_in, baud, ( "RMC," ),@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc
return

heure:
    bptr=30
    b2=@bptrinc-48
    b3=@bptrinc-48
    b4=b2*10+b3
    b4=b4+2
    if b4>=24 then
        b4=b4-24
        flag=1
    endif
    b2=b4/10
    b3=b4//10
    serout LCD,baud,(254,192,#b2,#b3,":",@bptrinc,@bptrinc,":",@bptrinc,@bptrinc,  " (loc)")
    return

date:
    bptr=30
    cpt=0

    do
        if @bptrinc="," then        ;recherche date
            inc cpt
        endif
    loop until cpt=10    ;10 =dernière virgule de la trame
    bptr=bptr+2
    ;serout LCD,baud,(254,128,#cpt," ",#bptr," ",@bptr)
    if @bptr <> "*" then        ;test validation trame
         return
    endif
    cpt=0                ;on recommence pour la date
    bptr=30
    do
        if @bptrinc="," then        ;recherche date
            inc cpt
        endif
    loop until cpt=7
    inc bptr
    serout LCD,baud,(254,128,@bptrinc,@bptrinc,"/",@bptrinc,@bptrinc,"/20",@bptrinc,@bptrinc)
    return
A suivre....
MM
 

PieM

Senior Member
La trame 125824.00,A,4840.46623,N,00232.28861,E,0.178,,191018,,,A*7D est bien conforme à la trame RMC du NEO6.
Après le E, tu as la vitesse, puis le cap (vide), puis la date, puis la déclinaison (vide), puis son sens (vide), puis le A qui indique que le GPS est en mode autonome, et enfin le CS après le *
Quant au décalage, il faut voir en détail, mais c'est dû je pense à un bptrinc; j'ai déjà rencontré ce problème.
J'ai laissé tourner le mien depuis hier, et je n'ai rencontré aucun problème sur la date. Bizarre...

Quand tu écris bptr = 30
et que tu fais le test if @bptrinc="," , en fait tu teste le contenu de @bptr 30 et non celui de 31.
L'incrémentation se fait après! Ce qui n'est pas conforme à la doc pour ce cas précis.
 
Last edited:

jojojo

Senior Member
Bon, a y est...

Le premier truc a vraiment faire, c'est d'extraire la trame proprement.

Après, on compte, et zou.

(Bon, sauf si, comme d'hab, des trucs m'échappent ...)

Comme ça, ça va:

Code:
; *******************************
; ***** GPS NEO6M  *****
; *******************************
#picaxe 08m2
#no_data
setfreq m32
Symbol Baud_LCD=T9600_32
Symbol Baud_GPS=T4800_32
Symbol GPS=C.3
Symbol LCD=C.2
symbol CPT=b1
Symbol Flag=Bit0
'Symbol VARW=w13
'Symbol JOURSEM=b14




'Init LCD
Serout LCD,Baud_LCD,(4)'Hide cursor
Pause 100
Serout LCD,Baud_LCD,(12)'CLS
Pause 100
Serout LCD,Baud_LCD,(19)'retroeclairage
Pause 100
 

do
    gosub lecture
    gosub heure
    gosub date
loop

lecture:
   bptr= 30
  serin GPS, Baud_GPS, ( "RMC," ),@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc
  'Extraction trame, pour test et comptage
' bptr=30
  'sertxd (@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,''''@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,13)
'Retour ici:    144917,A,5037.8930,N,00311.2010,E,002.6,172.5,191018,000.1,E
'Trame Michel:  125824.00,A,4840.46623,N,00232.28861,E,0.178,,191018,,,A*7D
'La date est donc en 9 pour moi, comme pour Michel
return

heure:
    bptr=30
    b2=@bptrinc-48
    b3=@bptrinc-48
    b4=b2*10+b3
    b4=b4+2
    if b4>=24 then
        b4=b4-24
        flag=1
    endif
    b2=b4/10
    b3=b4//10
    serout LCD,Baud_LCD,(#b2,#b3,":",@bptrinc,@bptrinc,":",@bptrinc,@bptrinc,  " (loc)")
    Pause 100
    serout LCD,Baud_LCD,(13)
    return
date:
bptr=30
cpt=0
Do
    if @bptrinc="," then        ;recherche date
            inc cpt
        endif
loop until cpt=8'la date commence en 9

 
serout LCD,Baud_LCD,(@bptrinc,@bptrinc,"/",@bptrinc,@bptrinc,"/20",@bptrinc,@bptrinc)
    Pause 100
    serout LCD,Baud_LCD,(1)
    Pause 100
return
Ouf ...

PS: Le Flag bit0, j'ai pas pigé ???
Et, pourquoi bptr commence à trente ?
Et, comment, sous PE6, éditer ces zones mémoire ?

Mercizavous.

;)
 
Last edited:

PieM

Senior Member
PS: Le Flag bit0, j'ai pas pigé ???
Et, pourquoi bptr commence à trente ?
Et, comment, sous PE6, éditer ces zones mémoire ?
Tu te reposes jamais ? :(
Le flag: c'étais dans le programme que j'avais fait pour jrtech. Car je mettais la saisie des infos GPS dans une interruption pour ne pas laisser le programme en stand by en attendant la trame. et c'était le flag de réception.
bptr = 30 car ça laisse la place des 28 variables byte sur un M2... pas oublier que b0 c'est @bptr qd ptr est =0, and so on...
sous PE6 il faut que tu affectes ces mémoires a une variable pour pouvoir les utiliser. Tu peux voir l'état dans l'onglet Mémoire à droite.
Tu peux aussi les éditer avec des peek et des poke.
What else dirait machin ?
 

jojojo

Senior Member
Well !

Thanks.

What did i expect ?
Donc, en fait, on démarre à la fin des variables classiques (b0, b27).

sous PE6 il faut que tu affectes ces mémoires a une variable pour pouvoir les utiliser. Tu peux voir l'état dans l'onglet Mémoire à droite.
Tu peux aussi les éditer avec des peek et des poke.


Ca, pas pigé ... Je sais aller dans l'onglet mémoire, mais... Et je peux aller jusqu’où ?(selon les PIC, je suppose ...).
 
Last edited:

PieM

Senior Member
Donc, en fait, on démarre à la fin des variables classiques (b0, b27).
Oui
Ca, pas pigé ... Je sais aller dans l'onglet mémoire, mais... Et je peux aller jusqu’où ?(selon les PIC, je suppose ...).
Sur un M2 (14,18,20) tu vas jusqu'à 511. 255 sur un 08M2
 

MGU

Senior Member
PS: Le Flag bit0, j'ai pas pigé ???

;)
Pour moi, ce flag est un marqueur pour le changement de date, pour synchroniser la date avec le changement d'heure en local. Mais je ne m'en suis pas encore servi. Si flag=1, faut ajouter 1 à la date (mais bon...)

Bon, il n'y a donc pas de décalage, tant mieux. La différence que j'ai vu, c'est des décimales en plus sur certains champs (heure, latitude, longitude par ex)

MM
 

jojojo

Senior Member
Bonjour.

Bon, je pense avoir obtenu ce que je voulais. (Hors fuseau horaire, mais, bon ...).

Code:
; *******************************
; ***** GPS NEO6M  *****
'AVEC LES AIDES BIENVENUES DE PIEM ET MGU
'MERCI
; *******************************
#picaxe 08m2
#no_data
setfreq m32
Symbol Baud_LCD=T9600_32
Symbol Baud_GPS=T4800_32
Symbol Baud_Export=T38400_32
Symbol GPS=C.3
Symbol LCD=C.2
Symbol CPT=b0
Symbol VARW=w13
Symbol JOURSEM=w7
Symbol JOUR=b5
Symbol MOIS=b7
Symbol ANNEE=w5
Symbol HEURE=b3
Symbol MINUTE=b4
Symbol SECONDE=b5
Symbol OldSeconde=b24
Symbol SAT_OK=b25
Symbol Export=C.1
Symbol Top_Seconde=C.4

'Init LCD   
Serout LCD,Baud_LCD,(4)'Hide cursor
Pause 100
Serout LCD,Baud_LCD,(12)'CLS
Pause 100
Serout LCD,Baud_LCD,(19)'retroeclairage
Pause 100
    

do 
   Gosub Lecture
   Gosub CalcHeure
   Gosub CalcDate
   Gosub ExportData
  
loop

Lecture:
   bptr= 30
  serin GPS, Baud_GPS, ( "RMC," ),@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc
 
'Retour trame ici:    144917,A,5037.8930,N,00311.2010,E,002.6,172.5,191018,000.1,E
'Trame Michel:        125824.00,A,4840.46623,N,00232.28861,E,0.178,,191018,,,A*7D
'La date est donc en 9 pour moi, comme pour Michel
return

CalcHeure:
    bptr=30
    b1=@bptrinc-48
    b2=@bptrinc-48
    Heure=b1*10+b2
    HEURE=HEURE+2'Locale)
    b1=@bptrinc-48
    b2=@bptrinc-48
    MINUTE=b1*10+b2
    b1=@bptrinc-48
    b2=@bptrinc-48
    SECONDE=b1*10+b2
    
    'le top seconde en out
    If SECONDE<> OldSeconde Then
        Pulsout Top_Seconde,1    '1.25µS toute les nouvelles secondes. En synchro, pour un autre équipement ?
        OldSeconde=SECONDE
    End if
    
    SAT_OK=@bptrinc 'A ou V
    
    
        
    
    If HEURE<10 Then
        serout LCD,Baud_LCD,("0",#HEURE,":")
    Else
        serout LCD,Baud_LCD,(#HEURE,":")
    End If
    Pause 100
    If MINUTE<10 Then
        serout LCD,Baud_LCD,("0",#MINUTE,":")
    Else
        serout LCD,Baud_LCD,(#MINUTE,":")
    End if
    Pause 100
    If SECONDE<10 Then
        serout LCD,Baud_LCD,("0",#SECONDE,"    ")
    Else
        serout LCD,Baud_LCD,(#SECONDE,"    ")
    End if
    Pause 100
    
    If SAT_OK="A" Then
            serout LCD,Baud_LCD,("Sat:OK")
    Else
            serout LCD,Baud_LCD,("Sat:NO")
    End if
    Pause 100
    serout LCD,Baud_LCD,(13)'à la ligne
    Pause 100
    return
    
CalcDate:
bptr=30
cpt=0
Do
    if @bptrinc="," then        ;recherche date
            inc cpt
        endif
loop until cpt=8'la date commence en 9

JOUR=@bptrinc-48
b6=@bptrinc-48
JOUR=10*JOUR+b6

MOIS=@bptrinc-48
b8=@bptrinc-48
MOIS=10*MOIS+b8

ANNEE=@bptrinc-48
b9=@bptrinc-48
ANNEE=10*ANNEE+b9
ANNEE=ANNEE+2000
'**************************************
'L'algorithme de Mike Keith
'Ici, Dimanche=1, ...Samedi=7
 
    
    if MOIS < 3 then
             VARW=ANNEE-1
            else VARW=ANNEE
    end if   
    JOURSEM= 23*MOIS/9 +JOUR+4+ANNEE
    w10=VARW/4
    JOURSEM=JOURSEM+w10
    w10=VARW/100
    JOURSEM=JOURSEM-w10
    w10=VARW/400
    JOURSEM=JOURSEM+w10
    if MOIS>= 3 then
            JOURSEM=JOURSEM-2
    endif
    JOURSEM=JOURSEM//7+1
'**************************************     

Select Case JOURSEM
    Case 1
       serout LCD,Baud_LCD,("DIMANCHE ",#JOUR,"/",#MOIS,"/",#ANNEE)
       Case 2
       serout LCD,Baud_LCD,("LUNDI ",#JOUR,"/",#MOIS,"/",#ANNEE)
    Case 3
    serout LCD,Baud_LCD,("MARDI ",#JOUR,"/",#MOIS,"/",#ANNEE)
    Case 4
    serout LCD,Baud_LCD,("MERCREDI ",#JOUR,"/",#MOIS,"/",#ANNEE)
    Case 5
    serout LCD,Baud_LCD,("JEUDI ",#JOUR,"/",#MOIS,"/",#ANNEE)
    Case 6
    serout LCD,Baud_LCD,("VENDREDI ",#JOUR,"/",#MOIS,"/",#ANNEE)
    Case 7
    serout LCD,Baud_LCD,("SAMEDI ",#JOUR,"/",#MOIS,"/",#ANNEE)
    End Select
    Pause 100
    serout LCD,Baud_LCD,(1)
    Pause 100 
Return

ExportData:    'Liaison vers ...?
    Serout Export,Baud_Export,(#HEURE,#MINUTE,#SECONDE,#JOURSEM,#JOUR,#MOIS,#ANNEE)
Return
Cela semble bien fonctionner.

Mais ... Toujours pas compilable, sous PE6. Bon, pas grave.

Horloge.jpg
 

PieM

Senior Member
Si tu ne fais que de l'affichage des heures, pourquoi ne pas utiliser directement les valeurs ascii qui sont les @bptr
bptr = 30
serout LCD,Baud_LCD,(@bptrinc,@bptrinc,":",@bptrinc,@bptrinc,":",@bptrinc,@bptrinc)
c'est plus simple, non?
et ton top seconde est inutile: il existe sur le NEO6 broche pps (de base à 1 seconde.) avec 30ns de précision
 

jojojo

Senior Member
Hello.

Oui mais non.
Spécifiquement, j'ai besoin d'exporter des valeurs numériques. Donc, autant les afficher aussi en numérique (pas si grave de devoir ajouter un "0").

Arghhhhh !!!!!! Avais pas vu la broche PPS !!!

Tiens ! Je vais mettre l'oscillo sur PPS et sur mon port de sortie du 08. (comme ça, je vais voir combien de temps bouffe mon vilain code :()
Ferais une photo ...
 

jojojo

Senior Member
Edit:
Bon, ben va falloir attendre qu'il se réveille, là. La led rouge est en convalescence ...
... Ouais ... Souvent, les GPS démarrent "à la manivelle" . Faut pas être pressé.
Visiblement, pendant ce temps de démarrage, la Broche PPS n'est pas active.
Donc, mon TopSeconde est peut-être bien utile quand même ...
 
Last edited:

jojojo

Senior Member
Bon, comme je suis grippé, et ne peux pas faire grand chose d'autre, j'ai modifié un peu l'affichage date,
pour obtenir "MAR 23 OCTO 2018".

Ça fonctionne, mais, je trouve que ma méthode de stockage de variables alpha n'est pas terrible.
Si quelqu'un a une gentille idée ...

Code:
; *******************************
; ***** GPS NEO6M  *****
'AVEC LES AIDES BIENVENUES DE PIEM ET MGU
'MERCI
; *******************************
#picaxe 08m2
#no_data
setfreq m32
Symbol Baud_LCD=T9600_32
Symbol Baud_GPS=T4800_32
Symbol Baud_Export=T38400_32
Symbol GPS=C.3
Symbol LCD=C.2
Symbol CPT=b0
Symbol VARW=w13
Symbol JOURSEM=w7
Symbol JOUR=b5
Symbol MOIS=b7
Symbol ANNEE=w5
Symbol HEURE=b3
Symbol MINUTE=b4
Symbol SECONDE=b5
Symbol OldSeconde=b24
Symbol SAT_OK=b25
Symbol Export=C.1
Symbol Top_Seconde=C.4

'Init LCD   
Serout LCD,Baud_LCD,(4)'Hide cursor
Pause 100
Serout LCD,Baud_LCD,(12)'CLS
Pause 100
Serout LCD,Baud_LCD,(19)'retroeclairage
Pause 100
    

do 
   Gosub Lecture
   Gosub CalcHeure
   Gosub CalcDate
   Gosub ExportData
  
loop

Lecture:
   bptr= 30
  serin GPS, Baud_GPS, ( "RMC," ),@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc
 
'Retour trame ici:    144917,A,5037.8930,N,00311.2010,E,002.6,172.5,191018,000.1,E
'Trame Michel:        125824.00,A,4840.46623,N,00232.28861,E,0.178,,191018,,,A*7D
'La date est donc en 9 pour moi, comme pour Michel
return

CalcHeure:
    bptr=30
    b1=@bptrinc-48
    b2=@bptrinc-48
    Heure=b1*10+b2
    HEURE=HEURE+2'Locale)
    b1=@bptrinc-48
    b2=@bptrinc-48
    MINUTE=b1*10+b2
    b1=@bptrinc-48
    b2=@bptrinc-48
    SECONDE=b1*10+b2
    
    'le top seconde en out
    If SECONDE<> OldSeconde Then
        Pulsout Top_Seconde,1    '1.25µS toute les nouvelles secondes. En synchro, pour un autre équipement ?
        OldSeconde=SECONDE
    End if
    
    SAT_OK=@bptrinc 'A ou V
    
    
        
    
    If HEURE<10 Then
        serout LCD,Baud_LCD,("0",#HEURE,":")
    Else
        serout LCD,Baud_LCD,(#HEURE,":")
    End If
    Pause 100
    If MINUTE<10 Then
        serout LCD,Baud_LCD,("0",#MINUTE,":")
    Else
        serout LCD,Baud_LCD,(#MINUTE,":")
    End if
    Pause 100
    If SECONDE<10 Then
        serout LCD,Baud_LCD,("0",#SECONDE,"    ")
    Else
        serout LCD,Baud_LCD,(#SECONDE,"    ")
    End if
    Pause 100
    
    If SAT_OK="A" Then
            serout LCD,Baud_LCD,("Sat:OK")
    Else
            serout LCD,Baud_LCD,("Sat:NO")
    End if
    Pause 100
    serout LCD,Baud_LCD,(13)'à la ligne
    Pause 100
    return
    
CalcDate:
bptr=30
cpt=0
Do
    if @bptrinc="," then        ;recherche date
            inc cpt
        endif
loop until cpt=8'la date commence en 9

JOUR=@bptrinc-48
b6=@bptrinc-48
JOUR=10*JOUR+b6

MOIS=@bptrinc-48
b8=@bptrinc-48
MOIS=10*MOIS+b8

ANNEE=@bptrinc-48
b9=@bptrinc-48
ANNEE=10*ANNEE+b9
ANNEE=ANNEE+2000
'**************************************
'L'algorithme de Mike Keith
'Ici, Dimanche=1, ...Samedi=7
 
    
    if MOIS < 3 then
             VARW=ANNEE-1
            else VARW=ANNEE
    end if   
    JOURSEM= 23*MOIS/9 +JOUR+4+ANNEE
    w10=VARW/4
    JOURSEM=JOURSEM+w10
    w10=VARW/100
    JOURSEM=JOURSEM-w10
    w10=VARW/400
    JOURSEM=JOURSEM+w10
    if MOIS>= 3 then
            JOURSEM=JOURSEM-2
    endif
    JOURSEM=JOURSEM//7+1
'**************************************     

Select Case JOURSEM
    Case 1
    If Jour<10 Then
       serout LCD,Baud_LCD,("DIM ",#JOUR,"  "):Gosub NomMois:serout LCD,Baud_LCD,(b16,b17,b18,b19," ",#ANNEE)
       Else
       serout LCD,Baud_LCD,("DIM ",#JOUR," "):Gosub NomMois:serout LCD,Baud_LCD,(b16,b17,b18,b19," ",#ANNEE)
       End If
       Case 2
       If Jour<10 Then
       serout LCD,Baud_LCD,("LUN ",#JOUR,"  "):Gosub NomMois:serout LCD,Baud_LCD,(b16,b17,b18,b19," ",#ANNEE)
       Else
       serout LCD,Baud_LCD,("LUN ",#JOUR," "):Gosub NomMois:serout LCD,Baud_LCD,(b16,b17,b18,b19," ",#ANNEE)
       End If
    Case 3
    If Jour<10 Then
       serout LCD,Baud_LCD,("MAR ",#JOUR,"  "):Gosub NomMois:serout LCD,Baud_LCD,(b16,b17,b18,b19," ",#ANNEE)
       Else
       serout LCD,Baud_LCD,("MAR ",#JOUR," "):Gosub NomMois:serout LCD,Baud_LCD,(b16,b17,b18,b19," ",#ANNEE)
       End If
    Case 4
    If Jour<10 Then
       serout LCD,Baud_LCD,("MER ",#JOUR,"  "):Gosub NomMois:serout LCD,Baud_LCD,(b16,b17,b18,b19," ",#ANNEE)
       Else
       serout LCD,Baud_LCD,("MER ",#JOUR," "):Gosub NomMois:serout LCD,Baud_LCD,(b16,b17,b18,b19," ",#ANNEE)
       End If
    Case 5
    If Jour<10 Then
       serout LCD,Baud_LCD,("JEU ",#JOUR,"  "):Gosub NomMois:serout LCD,Baud_LCD,(b16,b17,b18,b19," ",#ANNEE)
       Else
       serout LCD,Baud_LCD,("JEU ",#JOUR," "):Gosub NomMois:serout LCD,Baud_LCD,(b16,b17,b18,b19," ",#ANNEE)
       End If
    Case 6
    If Jour<10 Then
       serout LCD,Baud_LCD,("VEN ",#JOUR,"  "):Gosub NomMois:serout LCD,Baud_LCD,(b16,b17,b18,b19," ",#ANNEE)
       Else
       serout LCD,Baud_LCD,("VEN ",#JOUR," "):Gosub NomMois:serout LCD,Baud_LCD,(b16,b17,b18,b19," ",#ANNEE)
       End If
    Case 7
    If Jour<10 Then
       serout LCD,Baud_LCD,("SAM ",#JOUR,"  "):Gosub NomMois:serout LCD,Baud_LCD,(b16,b17,b18,b19," ",#ANNEE)
       Else
       serout LCD,Baud_LCD,("SAM ",#JOUR," "):Gosub NomMois:serout LCD,Baud_LCD,(b16,b17,b18,b19," ",#ANNEE)
       End If
    End Select
    Pause 100
    serout LCD,Baud_LCD,(1)
    Pause 100 
Return

ExportData:    'Liaison vers ...?
    Serout Export,Baud_Export,(#HEURE,#MINUTE,#SECONDE,#JOURSEM,#JOUR,#MOIS,#ANNEE)
Return

NomMois:'Ici, il doit y avoir un moyen d'utiliser @bptrinc, mais, sauf avec Poke, je ne vois pas comment ...

Select Case Mois
    Case 1
    b16=74:b17=65:b18=78:b19=86
    Case 2
    b16=70:b17=69:b18=86:b19=82
    Case 3
    b16=77:b17=65:b18=82:b19=83
    Case 4
    b16=65:b17=86:b18=82:b19=73
    Case 5
    b16=77:b17=65:b18=73:b19=32
    Case 6
    b16=74:b17=85:b18=73:b19=78
    Case 7
    b16=74:b17=85:b18=73:b19=76
    Case 8
    b16=65:b17=79:b18=85:b19=84
    Case 9
    b16=83:b17=69:b18=80:b19=84
    Case 10
    b16=79:b17=67:b18=84:b19=79
    Case 11
    b16=78:b17=79:b18=86:b19=69
    Case 12
    b16=68:b17=69:b18=67:b19=69
End Select                                                                           

Return
 

PieM

Senior Member
en tête de programme tu crées une table:
table 0 ,("JANVFEVRMARSAVRIMAIJUINJUILAOUTSEPTOCTONOVEDECE")
tu supprimes tes serout après tes gosub NonMois

et ton sprog devient

Code:
NomMois:
index = mois-1 * 4
readtable index, b16,b17,b18,b19
serout LCD,Baud_LCD,(b16,b17,b18,b19," ",#ANNEE)
et si tu fais pareil avec tes joursem tu simplifies beaucoup !
Code:
table 50,("DIMLUNMARMERJEUVENSAM")

index = joursem*3 +47
readtable index, b16,b17,b18

If Jour<10 Then
         serout LCD,Baud_LCD,(b16,b17,b18,#JOUR,"  "):Gosub NomMois
else : serout LCD,Baud_LCD,(b16,b17,b18,#JOUR,"   "):Gosub NomMois
Pause 100
    serout LCD,Baud_LCD,(1)
    Pause 100
Return
 
Last edited:

PieM

Senior Member
Autre chose pour éclaircir et économiser les doigts:

en tête de prog, tu écris :
#define Affiche serout C.2,T9600_32,

et pour envoyer sur le LCD il suffit d'écrire : Affiche ("0",#MINUTE,":")
 
Top