Memcpy erreur de compilation uint64_t

Bonjour

je voudrais copier en mémoire un byte de 48 bits que je nomme paquet dans un byte nommé trame. avec une variable uint64_t je comprends aue ce n'est pas possible.
Merci pour votre aide.

en compilant mon code j'obtiens cette erreur:

Arduino : 1.8.13 (Windows 10), Carte : "DOIT ESP32 DEVKIT V1, 80MHz, 115200, N
C:\UsersPWMN_essai_v1.ino: In function 'void SpeedAndDir(byte, byte, byte, bool)':
PWMN_essai_v1:126:34: error: invalid conversion from 'uint64_t {aka long long unsigned int}' to 'void*' [-fpermissive]

 memcpy(trame,paquet,sizeof paquet)

                 from sketch\PWMN_essai_v1.ino.cpp:1:

Arduino15\packages\esp32\hardware\esp32\1.0.6/tools/sdk/include/newlib/string.h:23:15: note:   initializing argument 1 of 'void* memcpy(void*, const void*, size_t)'
 _PTR   _EXFUN(memcpy,(_PTR __restrict, const _PTR __restrict, size_t));
 #define _EXFUN(name, proto)  name proto
PWMN_essai_v1:126:34: error: invalid conversion from 'uint64_t {aka long long unsigned int}' to 'const void*' [-fpermissive]

 memcpy(trame,paquet,sizeof paquet);

C:.....AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.6/tools/sdk/include/newlib/string.h:23:15: note:   initializing argument 2 of 'void* memcpy(void*, const void*, size_t)'

 _PTR   _EXFUN(memcpy,(_PTR __restrict, const _PTR __restrict, size_t));
 #define _EXFUN(name, proto)  name proto
exit status 1
invalid conversion from 'uint64_t {aka long long unsigned int}' to 'void*' [-fpermissive]

#include "driver/ledc.h"

uint64_t paquet;//=0b... 48 bits
uint64_t trame;//0b.. 48bits;
uint64_t masque;
uint64_t dccBit;
bool alter =1;
bool previous=0;


#define CRAN_0 0
#define CRAN_1 1
#define CRAN_2 2
#define CRAN_IDLE 5

byte dccSpeed;
byte addr;
byte adresse;
byte vitesse;
byte cksum;
uint64_t paquet_start=0b111111111111111111110;  // 20 bits + bit start
byte startBit=0;
byte stopBit=1;
int msg; // 1 = marche;0 arret

const int dcc_pin = 19;  // Sortie du signal DCC
const int pwn_pin = 18;  // Sortie du signal DCC envoi courant

// setting PWM properties
#define dcc_sig_1_freq 8621 //  = 115,99 microS 
#define dcc_sig_0_freq 5000 // 200µs 5000 Hz donne 200 microS
const int dcc_pin_channel = 0; // on ouvre un canal qu on reliera à une sortie PWMN
const int dcc_sig_resolution = 1; // correspond à une résolution de 1 bit => 2^1bit =2 pas discrets0 et 100%. 
const int dcc_sig_duty = 1; // correspond à une résolution de 1 bit => 2^1bit =2 pats discrets 0 et 100%. 
uint32_t dcc_sig_freq = dcc_sig_1_freq; // on part de la fréquence du bit 1 toutes les trames commencent par une série de 20 bits a 1



void dcc_sig_isr() {

dccBit=!!(trame&masque);  // les bits différents de 0 valent 1
masque>>=1; // le masque permet de parcourir les bits
if (dccBit==previous) {  // si le bit parcouru est == 0 alors il faut envoyer une interruption, alter qui valait 1 au début se transforme en 0
alter=!alter;
Serial.print(alter);
alter?dcc_sig_freq =dcc_sig_1_freq:dcc_sig_freq =dcc_sig_0_freq;
}
Serial.println();

ledc_set_freq(LEDC_HIGH_SPEED_MODE, LEDC_TIMER_0, dcc_sig_freq); // new -or not - period value
 //speed_mode: Select the LEDC channel group with specified speed mode. Note that not all targets support high speed mode.
//timer_num: LEDC timer index (0-3), select from ledc_timer_t
//freq_hz: Set the LEDC frequency

}

void setup() {
  Serial.begin(115200);
uint64_t paquet =0; // on initialise la trame
uint64_t NewPacket=0; // on utilise une trmne reformatée plus simple pour limiter les interruptions et aider l'esp32

 // configuration du canal pwm 0 avec une fréquence et la résolution
  ledcSetup(dcc_pin_channel, dcc_sig_freq, dcc_sig_resolution); // on set up le canal avec une résolution de 1 bit cad 50%
  ledcAttachPin(dcc_pin, dcc_pin_channel); /// et ensuite on l attache au PIN19
  ledcWrite(dcc_pin_channel, dcc_sig_duty);
  // programme l'interruption à la fin de la période
// je n'ai pas trouvé de manière élégante pour le faire avec le timer, alors je me suis rabattu pragmatiquement sur une interruption provoquée ... par le basculement de la pin
  attachInterrupt(dcc_pin, dcc_sig_isr, RISING); // l'interruption "dcc_sig_isr" provoquée à la fin de chaque période (voire au début de la suivante) =>moi non plus
  pinMode(pwn_pin, OUTPUT); 
}




/// Select Cran = 14,28 ou 128
/// Select Speed = 0......128
/// Select Direction 1 Avant, 2 Arriere, 0 Arret


// fonction de calcul 3 octets
void SpeedAndDir( byte addr=0b11111111, byte SelectCran=0b00000000, byte SelectSpeed=0b00000000, bool SelectDirection=0) // vecteur de direction et de vitesse 
{
  byte type;
  byte ext;
  byte data;
  byte cksum=0;
  uint64_t paquet=0;


      switch(SelectCran) {

          case 0:   ////DCC_PACKET_TYPE_STEP_14
              dccSpeed=map(SelectSpeed,0,128,0,14);
              if (dccSpeed) dccSpeed++; // pas de cran 1
              data=(SelectDirection?0x60:0x40)|dccSpeed;
              cksum=addr^data;
              break;

              
          case 1: ///DCC_PACKET_TYPE_STEP_28

              dccSpeed=map(SelectSpeed,0,128,0,28);
              if (dccSpeed) dccSpeed+=3; // pas de cran 1,2,3
              ext=(((dccSpeed&0x01)<<5)|dccSpeed)>>1;   /// 
              data=(SelectDirection?0x60:0x40)|ext;
              cksum=addr^data;
              break;
              
          case 2:  //DCC_PACKET_TYPE_STEP_128;
               dccSpeed=map(SelectSpeed,0,128,0,126);
              if (dccSpeed) dccSpeed++; // pas de cran 1
              data=(SelectDirection?0x60:0x40)|dccSpeed;
              cksum=addr^data;
              break;

           case 5:  //IDLE;
               data=0b00000000;
              cksum=addr^data;
              break;              
      }

paquet=(paquet_start << 27) |(addr<<19)|(startBit<<18)|(data<<10)|(startBit<<9)|(cksum<<1)|(stopBit<<0);


memcpy(trame,paquet,sizeof paquet);

}





void loop() {
SpeedAndDir(3, CRAN_1,50,0);

if (Serial.available() )
msg = Serial.parseInt();  // Lit le message reçu et l'affiche sur le moniteur
(msg)?digitalWrite(pwn_pin,HIGH):digitalWrite(pwn_pin,LOW);


delay(500);


}


  
  

ça n'existe pas... un byte c'est 8 bits. (un octet)

expliquez plus clairement ce que vous voulez faire car ceci

je voudrais copier en mémoire un byte de 48 bits que je nomme paquet dans un byte nommé trame. avec une variable uint64_t je comprends aue ce n'est pas possible.

n'est pas super clair

Faut pas avoir l'esprit aussi compliqué.
Si on en croit ton code

  • la variable trame est un uint64_t
  • la variable paquet est un uint64_t

Si tu veux copier paquet dans trame, il suffit de faire

trame = paquet;

Je me suis mal exprimé. Pardon.
Le uint64_t est une série de 48 bits que je souhaite lire dans une fonction d'interruption. Cette série est fabriquée avec la fonction SpeedAndDir.
Intuitivement pour récupérer la variable paquet dans la fonction d'interruption je pensais passe par ma fonction memcpy pour la garder en mémoire.

Tu es sûr de ce que tu fais.
Tu redéfinis 3 fois la variable paquet à différents endroits dans ton code, c'est vraiment ça que tu veux faire.

dcc_sig_isr() et une fonction appelée par une interruption. Toutes les variables utilisées dans cette fonction et qui sont utilisées par ailleurs dans le code doivent être définies comme étant volatile.

Cette écriture est étrange et assez difficile à interpréter

alter?dcc_sig_freq =dcc_sig_1_freq:dcc_sig_freq =dcc_sig_0_freq;

Je trouve cette écriture plus claire (mais ça c'est affaire de goût)

dcc_sig_freq = alter ? dcc_sig_1_freq : dcc_sig_0_freq;

Tel que c'est écrit le if veut dire: Si dccSpeed est non nul, alors ajouter 1. est-ce bien ce que vous voulez ?

Oui c est ça

Ce n'est pas très logique de faire ça après le map. Mais si c'est voulu....

Merci fdufnews. J'ai revu un peu tout ça et merci pour la phrase effectivement plus claire que tu suggères. C'est mieux. J'ai une question sur les interruptions. Tel que c'est codée, le code dans la fonction dcc_sig_isr est bien cadencée en fonction des bits qui déterminent la longueur du signal pwn?
Bit 0 => longueur 200micros à 50% High et 50% low par exemple?
Quand tu dis la fonction dcc_sig_isr est appelée par une interruption, dans ma conception l'interruption est provoquée lorsque les bits changent: par exemple, un bit0 devient un bit1. Est ce correct?
Merci cela me permet de bien comprendre les interruptions qui sont des sujets nouveaux pour moi. Bonne journée.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.