Posté le 01/05/2014 21:07
Planète Casio v4.3 © créé par Neuronix et Muelsaco 2004 - 2024 | Il y a 100 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
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 ?
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 :
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.
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 *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...
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_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.
↓ ↓ ↓ ↓ ↓ ↓ ↓
uchar uchar uchar uchar uchar uchar uchar
year(1) 0x00 month day hour mins secs
uchar
year(2)[/color]
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:
Citer : Posté le 05/07/2014 14:54 | #
Eh bien, déclare-le (sans const) comme suit :
data[0] = date_year;
data[1] = date_empty;
// ...
Citer : Posté le 05/07/2014 14:56 | #
C'est plus ca qu'il faut non ?
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...
Citer : Posté le 05/07/2014 15:05 | #
Bien entendu c'était ça -- c'est corrigé.
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.
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
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.
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 ...
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.
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 ?
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.
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:
#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:
#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
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.
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
Citer : Posté le 07/07/2014 10:31 | #
Ok, donc la lecture fonctionne sans problème (sans surprise...).
L'autre commence à m'énerver, alors...
{
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];
}
}
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
Citer : Posté le 07/07/2014 10:44 | #
Je m'étais trompé, j'ai modifié ensuite. Ce n'est pas & mais bien évidemment |.
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