Les membres ayant 30 points peuvent parler sur les canaux annonces, projets et hs du chat.
La shoutbox n'est pas chargée par défaut pour des raisons de performances. Cliquez pour charger.

Forum Casio - Autres questions


Index du Forum » Autres questions » Horloge
Theprog Hors ligne Membre Points: 1447 Défis: 20 Message

Horloge

Posté le 01/05/2014 21:07

Bonjour,
Je sais pas si je suis au bon endroit mais je me demandai comment ce programme pouvait marcher...
Parce qu'il faut que l'add-in tourne toujours quand la calto est éteinte ou que la calto ai quelque chose en Hard qui lui permette de savoir le temps écoulé depuis la dernière extinction ...
Donc voila ça m’intéresse beaucoup et si quelqu'un pouvait m’éclairer sur le sujet


Theprog Hors ligne Membre Points: 1447 Défis: 20 Message

Citer : Posté le 05/07/2014 11:11 | #


OK merci ça commence a être plus clair.
Mais l'exemple qui est donne ne marche pas ou sinon je suis juste un boulet
Et je comprend toujours pas la première case du tableau. Pourquoi l'année est séparée en deux valeurs ?
Lephenixnoir En ligne Administrateur Points: 24145 Défis: 170 Message

Citer : Posté le 05/07/2014 12:03 | #


Tu vois bien qu'on a un tableau de tableaux d'uchar = unsigned char. Donc chaque valeur ne peut prendre qu'on octet ; c'est pourquoi le premier tableau qui correspond à l'année contient deux cases, car comme un octet ne fait que deux caractères hexadécimaux, il faut deux octets pour mettre quatre "chiffres". Ce qui peut sembler bizarre, c'est que c'est de l'hexadécimal décimal -- oui je sais, c'est un oxymore.
En gros, un caractère hexa de 0 à F peut prendre 15 valeurs. Ici, on va volontairement le réduire à 10 valeurs. Pour pouvoir utiliser 10 valeurs différentes, il faut quand même quatre bits (log2(10) = 3.32). Du coup on a une perte d'informations : sur 4 bits on n'utilise pas toutes les combinaisons. Celles qui vont de A à F n'aparaissent jamais.
Néanmoins, on n'utilise pas les combinaisons restantes pour écrire d'autres chiffres. Si tu veux, un octet est réparti comme ça :
[blue]0110[/blue][red]0101[/red]

Les 4 bits bas (en rouge) peuvent prendre 16 valeurs différentes en hexa, mais en binaire décimal on n'en utilise que 10 (de 0 à 9). De même, les 4 bits haut ne peuvent prendre que 10 valeurs différentes. Du coup ça limite le nombre de combinaisons, de 256 à 100.
En fait, tout est une histoire de vitesse de lecture. La calculatrice ne sait lire que le binaire. Or si on a un même nombre en binaire et en décimal, il est impossible d'isoler un groupe de bits qui corresponde à un chiffre décimal. Le binaire hexadécimal permet de résoudre cela. Au prix d'une perte de mémoire, il permet d'accéder très facilement au chiffres décimaux indépendamment et augmente considérablement la vitesse d'exécution lors du traitement de données décimales. Cette base est principalement employée dans les RTC et les systèmes horaires.
Mon graphe (24 Mars): (gint#27 ; (Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; ...) || (shoutbox v5 ; v5)
Theprog Hors ligne Membre Points: 1447 Défis: 20 Message

Citer : Posté le 05/07/2014 12:50 | #


alala ce RTC c'est compliqué
Donc je te montre le massacre que j'ai fait.
unsigned char set1, set2, set3, set4, set5, set6, set7, set8;
unsigned char *data[7]={NULL,NULL,NULL,NULL,NULL,NULL,NULL};

set1 = 0x20, set2 = 0x09, set3 = 0, set4 = 0x07, set5 = 0x04, set6 = 0x12, set7 = 0, set8 = 0;
data[0] = &set1, data[1] = &set3, data[2] = &set4, data[3] = &set5, data[4] = &set6, data[5] = &set7, data[6] = &set8;
RTC_SetDateTime(data);

Ca ne marche bien sur pas mais c'est pour que tu cible un peu mieux mon problème. Je comprends pas trop ce dont la fonction a besoin et comment il faut faire pour l'envoyer...
Lephenixnoir En ligne Administrateur Points: 24145 Défis: 170 Message

Citer : Posté le 05/07/2014 14:13 | #


T'es pas trop loin. Mais tu ne te poses pas assez la question de la mémoire, et puis tu mélanges les types. Voilà ce que je te propose :
const uchar date_year[2] = { 0x20, 0x09 };
const uchar date_empty[1] = { 0x00 };
const uchar date_month[1]= { 0x07 };
const uchar date_day[1] = { 0x04 };
const uchar date_hour[1] = { 0x12 };
const uchar date_mins[1] = { 0x00 };
const uchar date_secs[1] = { 0x00 };
const uchar *data[7] = { date_year, date_empty, date_month, date_day, date_hour, date_mins, date_secs };
RTC_SetDateTime(data);


Un petit schéma pour expliquer la structure des données.
[color=black;font-size:12px]uchar **data [uchar *][uchar *][uchar *][uchar *][uchar *][uchar *][uchar *]
                 ↓        ↓        ↓        ↓        ↓        ↓        ↓    
               uchar    uchar    uchar    uchar    uchar    uchar    uchar
              year(1)   0x00     month     day     hour     mins     secs

               uchar
              year(2)[/color]

Mon graphe (24 Mars): (gint#27 ; (Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; ...) || (shoutbox v5 ; v5)
Theprog Hors ligne Membre Points: 1447 Défis: 20 Message

Citer : Posté le 05/07/2014 14:52 | #


Oui en fait c'est un tableau de pointeurs sur des tableaux qui sont en fait des pointeurs comme tout les tableaux donc un tableau de pointeur sur des pointeurs :idea:
Mais le compilo n'accepte pas ta formulation, il me renvoi un "C2130 (E) Initializer should be constant" au niveau de cette ligne:
const uchar *data[7] = { date_year, date_empty, date_month, date_day, date_hour, date_mins, date_secs };

Lephenixnoir En ligne Administrateur Points: 24145 Défis: 170 Message

Citer : Posté le 05/07/2014 14:54 | #


Eh bien, déclare-le (sans const) comme suit :
uchar *data[7];
data[0] = date_year;
data[1] = date_empty;
// ...

Mon graphe (24 Mars): (gint#27 ; (Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; ...) || (shoutbox v5 ; v5)
Theprog Hors ligne Membre Points: 1447 Défis: 20 Message

Citer : Posté le 05/07/2014 14:56 | #


C'est plus ca qu'il faut non ?
uchar *data[7];
data[0] = date_year;
data[1] = date_empty;
// ...


Ajouté le 05/07/2014 à 14:59 :
En fait en soit c'est stupide vu qu'on peut modifier la date mais on peut pas la récupérer. Le syscall permet juste de récupérer l'heure...
Lephenixnoir En ligne Administrateur Points: 24145 Défis: 170 Message

Citer : Posté le 05/07/2014 15:05 | #


Bien entendu c'était ça -- c'est corrigé.
Theprog a écrit :
En fait en soit c'est stupide vu qu'on peut modifier la date mais on peut pas la récupérer. Le syscall permet juste de récupérer l'heure...

Il doit y avoir d'autres syscalls.
Mon graphe (24 Mars): (gint#27 ; (Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; ...) || (shoutbox v5 ; v5)
Theprog Hors ligne Membre Points: 1447 Défis: 20 Message

Citer : Posté le 05/07/2014 15:08 | #



C'est dans la doc ?
Parce que je vois rien qui pourrais faire les deux. C'est trop dur pour moi l'anglais

Lephenixnoir En ligne Administrateur Points: 24145 Défis: 170 Message

Citer : Posté le 05/07/2014 15:46 | #


Non, j'ai regardé dans la doc en ligne de SimLo, et il n'y a rien.
Ça doit être dans la RAM... c'est peu probable, mais on peut peut-être créer cette fonction.
Mon graphe (24 Mars): (gint#27 ; (Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; ...) || (shoutbox v5 ; v5)
Theprog Hors ligne Membre Points: 1447 Défis: 20 Message

Citer : Posté le 05/07/2014 15:48 | #


Pour voir mon anglais parfait et mes questions qui ne veulent rien dire, http://casiopeia.net/forum/viewtopic.php?f=11&t=1666&p=14028#p14028.
Helder s'y connait
J’attends qu'il me réponde avant de creer ma fonction qui ne marchera pas

Ajouté le 06/07/2014 à 10:27 :
Je vous avouerai que je n'ai pas tout compris a la réponse de SimLo ...
Lephenixnoir En ligne Administrateur Points: 24145 Défis: 170 Message

Citer : Posté le 06/07/2014 10:29 | #


Il te dit qu'il faut aller chercher ces données directement dans les registres correspondant, et y joint le code nécessaire.
Ce code dépend du proco, donc il joint aussi le morceau de code pour en détecter la version.
Mon graphe (24 Mars): (gint#27 ; (Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; ...) || (shoutbox v5 ; v5)
Theprog Hors ligne Membre Points: 1447 Défis: 20 Message

Citer : Posté le 06/07/2014 10:32 | #


Ok donc c'est juste deux fonctions, la première renvoyant les données dans un tableau et se servant de la seconde pour voir quel est l'OS pour savoir si ça peut récupérer la date...
Et si c'est pas le bon OS (lequel d’ailleurs je comprend pas les modèles anglais) ca fait quoi ?
Lephenixnoir En ligne Administrateur Points: 24145 Défis: 170 Message

Citer : Posté le 06/07/2014 20:34 | #


"Si c'est pas le bon OS ?"
La seconde fonction le détecte justement. Mais si tu lances le code du mauvais OS, tu es certain de n'avoir non seulement aucun résultat, mais à 80% de générer System ERROR et/ou reboot.

Pour les modèles anglais... regarde le topic de Ziqumu (toujours sur Casiopeia) qui devait s'intituler "Best way to detect mpu ?" -- ou quelque chose comme cela --, SimLo lui avait proposé cette même fonction en donnant des détails, et avait listé les correspondances des noms de modèles.
Mon graphe (24 Mars): (gint#27 ; (Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; ...) || (shoutbox v5 ; v5)
Theprog Hors ligne Membre Points: 1447 Défis: 20 Message

Citer : Posté le 07/07/2014 09:56 | #


bon j'ai a peut près compris, merci
En plus ça marche. Voila le code de lecture de l'heure et de la date avec les deux fonctions/méthodes:
Le code
Cliquer pour enrouler
#include "fxlib.h"
#include <stdio.h>
#include <stdlib.h>

// STRUCTURE
typedef struct{
    unsigned char  R128CNT;
    unsigned char  gap1;
    unsigned char  RSECCNT;
    unsigned char  gap2;
    unsigned char  RMINCNT;
    unsigned char  gap3;
    unsigned char  RHOURCNT;
    unsigned char  gap4;
    unsigned char  RWEEKCNT;
    unsigned char  gap5;
    unsigned char  RDAYCNT;
    unsigned char  gap6;
    unsigned char  RMONCNT;
    unsigned char  gap7;
    unsigned short RYEARCNT;
} TRTC;

// PROTO FONCTIONS
int GetMPU();
void RTC_GetDateTime(unsigned char *time);
void RTC_GetTime(unsigned int *hours, unsigned int *mins, unsigned int *secs, unsigned int *msecs);

int AddIn_main(int isAppli, unsigned short OptionNum)
{
    unsigned int key;
    unsigned int hours, mins, secs, msecs;
    char buffer[60];
    
    unsigned char time[8];
    
    Bdisp_AllClr_DDVRAM();
    PrintXY(1,1,(unsigned char*)"Time right now:",0);
    
    RTC_GetTime(&hours, &mins, &secs, &msecs);
    sprintf(buffer, "%xh %xm %xs %d", hours, mins, secs, GetMPU());
    PrintXY(1,12,buffer,0);
    
    RTC_GetDateTime(time);
    sprintf(buffer, "%x/%x/%x%x  %x:%x:%x", time[3], time[2], time[0], time[1], time[4], time[5], time[6]);
    PrintXY(1,22,buffer,0);
    
    Bdisp_PutDisp_DD();

    while(1){
        GetKey(&key);
    }
    return 1;
}

void RTC_GetDateTime(unsigned char *time)
{
    volatile TRTC*pRTC;

    switch(GetMPU()){
        case 3 :
        case 4 :
            pRTC = (TRTC*)0xA413FEC0;
            break;
        case 2 :
        case 1 :
        case 5 : // mpu7705 ?
            pRTC = (TRTC*)0xFFFFFEC0;
            break;
        default :
            pRTC = 0;
            break;
    }
    
    if ( pRTC ){
        time[0] = (*pRTC).RYEARCNT >> 8;
        time[1] = (*pRTC).RYEARCNT & 0x00FF;
        time[2] = (*pRTC).RMONCNT;
        time[3] = (*pRTC).RDAYCNT;
        time[4] = (*pRTC).RHOURCNT;
        time[5] = (*pRTC).RMINCNT;
        time[6] = (*pRTC).RSECCNT;
        time[7] = 0;
    } else memset( time, 0, sizeof( time ) );
}

int GetMPU()
{
    int mpu;
    unsigned char s[30];
    unsigned int key;
    unsigned char savevalue;
    mpu = 0;
    savevalue = *(unsigned short*)0xA4000114;
    *(unsigned short*)0xA4000114 = 0xFFFF;
    switch ( *(unsigned short*)0xA4000114 ){
        case 0x0FFF :
            mpu = 1;
            break;
            
        case 0x00FF :
            mpu = 2;
            break;
            
        default :
            switch ( *(unsigned int*)0xFF000030 & 0xFFFFFF00 ){
                case 0x10300B00 :
                    switch ( *(unsigned int*)0xFF000044 & 0xFFFFFFF0 ){
                        case 0x00002C00 :
                            mpu = 3;
                            break;
                        
                        case 0x00002200 :
                            mpu = 4;    // just for reference
                            break;
            };
            break;
        };
        break;
    };        
    *(unsigned short*)0xA4000114 = savevalue;
    
    return mpu;
}

#pragma section _BR_Size
unsigned long BR_Size;
#pragma section
#pragma section _TOP
int InitializeSystem(int isAppli, unsigned short OptionNum){return INIT_ADDIN_APPLICATION(isAppli, OptionNum);}
#pragma section

Le problème du coup, parce qu'il en faut bien un encore , viens de la modification:
Le code
Cliquer pour enrouler
#include "fxlib.h"
#include <stdio.h>
#include <stdlib.h>

// STRUCTURE
typedef struct{
    unsigned char  R128CNT;
    unsigned char  gap1;
    unsigned char  RSECCNT;
    unsigned char  gap2;
    unsigned char  RMINCNT;
    unsigned char  gap3;
    unsigned char  RHOURCNT;
    unsigned char  gap4;
    unsigned char  RWEEKCNT;
    unsigned char  gap5;
    unsigned char  RDAYCNT;
    unsigned char  gap6;
    unsigned char  RMONCNT;
    unsigned char  gap7;
    unsigned short RYEARCNT;
} TRTC;

// PROTO FONCTIONS
int GetMPU();
void RTC_GetDateTime(unsigned char *time);
void RTC_GetTime(unsigned int *hours, unsigned int *mins, unsigned int *secs, unsigned int *msecs);
void RTC_SetDateTime(unsigned char **data);

int AddIn_main(int isAppli, unsigned short OptionNum)
{
    unsigned int key;
    unsigned int hours, mins, secs, msecs;
    char buffer[60];
    
    unsigned char time[8];
    
    const unsigned char date_year[2] = { 0x20, 0x09 };
    const unsigned char date_empty[1] = { 0x00 };
    const unsigned char date_month[1]= { 0x07 };
    const unsigned char date_day[1] = { 0x04 };
    const unsigned char date_hour[1] = { 0x12 };
    const unsigned char date_mins[1] = { 0x00 };
    const unsigned char date_secs[1] = { 0x00 };
    unsigned char *data[7];
    data[0]= date_year;
    data[1]= date_empty;
    data[2]= date_month;
    data[3]= date_day;
    data[4]= date_hour;
    data[5]= date_mins;
    data[6]= date_secs;
    
    Bdisp_AllClr_DDVRAM();
    RTC_SetDateTime(data);
    
    PrintXY(1,1,(unsigned char*)"Time right now:",0);
    
    RTC_GetTime(&hours, &mins, &secs, &msecs);
    sprintf(buffer, "%xh %xm %xs %d", hours, mins, secs, GetMPU());
    PrintXY(1,12,buffer,0);
    
    RTC_GetDateTime(time);
    sprintf(buffer, "%x/%x/%x%x  %x:%x:%x", time[3], time[2], time[0], time[1], time[4], time[5], time[6]);
    PrintXY(1,22,buffer,0);
    
    Bdisp_PutDisp_DD();

    while(1){
        GetKey(&key);
    }

    return 1;
}

void RTC_GetDateTime(unsigned char *time)
{
    volatile TRTC*pRTC;

    switch(GetMPU()){
        case 3 :
        case 4 :
            pRTC = (TRTC*)0xA413FEC0;
            break;
        case 2 :
        case 1 :
        case 5 : // mpu7705 ?
            pRTC = (TRTC*)0xFFFFFEC0;
            break;
        default :
            pRTC = 0;
            break;
    }
    
    if ( pRTC ){
        time[0] = (*pRTC).RYEARCNT >> 8;
        time[1] = (*pRTC).RYEARCNT & 0x00FF;
        time[2] = (*pRTC).RMONCNT;
        time[3] = (*pRTC).RDAYCNT;
        time[4] = (*pRTC).RHOURCNT;
        time[5] = (*pRTC).RMINCNT;
        time[6] = (*pRTC).RSECCNT;
        time[7] = 0;
    } else memset( time, 0, sizeof( time ) );
}

int GetMPU()
{
    int mpu;
    unsigned char s[30];
    unsigned int key;
    unsigned char savevalue;
    mpu = 0;
    savevalue = *(unsigned short*)0xA4000114;
    *(unsigned short*)0xA4000114 = 0xFFFF;
    switch ( *(unsigned short*)0xA4000114 ){
        case 0x0FFF :
            mpu = 1;
            break;
            
        case 0x00FF :
            mpu = 2;
            break;
            
        default :
            switch ( *(unsigned int*)0xFF000030 & 0xFFFFFF00 ){
                case 0x10300B00 :
                    switch ( *(unsigned int*)0xFF000044 & 0xFFFFFFF0 ){
                        case 0x00002C00 :
                            mpu = 3;
                            break;
                        
                        case 0x00002200 :
                            mpu = 4;    // just for reference
                            break;
            };
            break;
        };
        break;
    };        
    *(unsigned short*)0xA4000114 = savevalue;
    
    return mpu;
}

#pragma section _BR_Size
unsigned long BR_Size;
#pragma section
#pragma section _TOP
int InitializeSystem(int isAppli, unsigned short OptionNum){return INIT_ADDIN_APPLICATION(isAppli, OptionNum);}
#pragma section

Ceci me donne des choses assez folkloriques... J'ai des trucs du style "5f" secondes. Je suppose que c'est a cause de l'hexa mais je comprend pas trop qu'est ce qui pourrais faire des ratés
Lephenixnoir En ligne Administrateur Points: 24145 Défis: 170 Message

Citer : Posté le 07/07/2014 10:02 | #


Tu pourrais me dire précisement ce que tu as changé (on y gagnerait...) ?
Et 5F secondes, c'est impossible, car on est en binaire décimal -- enfin, disons qu'il y a bien une erreur.

Mon graphe (24 Mars): (gint#27 ; (Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; ...) || (shoutbox v5 ; v5)
Theprog Hors ligne Membre Points: 1447 Défis: 20 Message

Citer : Posté le 07/07/2014 10:19 | # | Fichier joint


de la modification de l'heure ( la fonction RTC_SetDateTime() ). Je t'ai fait une capture... Comme quoi tout est possible avec l'informatique
Lephenixnoir En ligne Administrateur Points: 24145 Défis: 170 Message

Citer : Posté le 07/07/2014 10:31 | #


Ok, donc la lecture fonctionne sans problème (sans surprise...).
L'autre commence à m'énerver, alors...
void RTC_SetDateTime(unsigned char *time)
{
    volatile TRTC*pRTC;

    switch(GetMPU()){
        case 3 :
        case 4 :
            pRTC = (TRTC*)0xA413FEC0;
            break;
        case 2 :
        case 1 :
        case 5 : // mpu7705 ?
            pRTC = (TRTC*)0xFFFFFEC0;
            break;
        default :
            pRTC = 0;
            break;
    }
    
    if ( pRTC )
    {
        (*pRTC).RYEARCNT = time[0]<<8 | time[1];
        (*pRTC).RMONCNT = time[2];
        (*pRTC).RDAYCNT = time[3];
        (*pRTC).RHOURCNT = time[4];
        (*pRTC).RMINCNT = time[5];
        (*pRTC).RSECCNT = time[6];
    }
}

Mon graphe (24 Mars): (gint#27 ; (Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; ...) || (shoutbox v5 ; v5)
Theprog Hors ligne Membre Points: 1447 Défis: 20 Message

Citer : Posté le 07/07/2014 10:43 | #


Ça marche bien ces fonctions :kiss:
Et c'est plus simple a utiliser que les syscall pour les paramètres. Par contre je pense que tu as fait une erreur au niveau de la modification de la date, ça marche as, ça me mets a l'an 0
Lephenixnoir En ligne Administrateur Points: 24145 Défis: 170 Message

Citer : Posté le 07/07/2014 10:44 | #


Je m'étais trompé, j'ai modifié ensuite. Ce n'est pas & mais bien évidemment |.
Mon graphe (24 Mars): (gint#27 ; (Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; ...) || (shoutbox v5 ; v5)
Theprog Hors ligne Membre Points: 1447 Défis: 20 Message

Citer : Posté le 07/07/2014 18:30 | #


J'ai du mal a faire un fonction qui renvoie un int depuis du BCD...
En fait, je comprend pas comment isoler les 4 bits

LienAjouter une imageAjouter une vidéoAjouter un lien vers un profilAjouter du codeCiterAjouter un spoiler(texte affichable/masquable par un clic)Ajouter une barre de progressionItaliqueGrasSoulignéAfficher du texte barréCentréJustifiéPlus petitPlus grandPlus de smileys !
Cliquez pour épingler Cliquez pour détacher Cliquez pour fermer
Alignement de l'image: Redimensionnement de l'image (en pixel):
Afficher la liste des membres
:bow: :cool: :good: :love: ^^
:omg: :fusil: :aie: :argh: :mdr:
:boulet2: :thx: :champ: :whistle: :bounce:
valider
 :)  ;)  :D  :p
 :lol:  8)  :(  :@
 0_0  :oops:  :grr:  :E
 :O  :sry:  :mmm:  :waza:
 :'(  :here:  ^^  >:)

Σ π θ ± α β γ δ Δ σ λ
Veuillez donner la réponse en chiffre
Vous devez activer le Javascript dans votre navigateur pour pouvoir valider ce formulaire.

Si vous n'avez pas volontairement désactivé cette fonctionnalité de votre navigateur, il s'agit probablement d'un bug : contactez l'équipe de Planète Casio.

Planète Casio v4.3 © créé par Neuronix et Muelsaco 2004 - 2024 | Il y a 94 connectés | Nous contacter | Qui sommes-nous ? | Licences et remerciements

Planète Casio est un site communautaire non affilié à Casio. Toute reproduction de Planète Casio, même partielle, est interdite.
Les programmes et autres publications présentes sur Planète Casio restent la propriété de leurs auteurs et peuvent être soumis à des licences ou copyrights.
CASIO est une marque déposée par CASIO Computer Co., Ltd