Répondre à la discussion
Affichage des résultats 1 à 5 sur 5

Arduino, et le C...



  1. #1
    Toffy38

    Arduino, et le C...


    ------

    bonjour, la communauté,

    pourquoi ça ne marche pas, comment faire ?

    byte dat3= SpiRam1.read_byte(adresse);
    adresse++;
    byte dat2= SpiRam1.read_byte(adresse);
    adresse++;
    byte dat1= SpiRam1.read_byte(adresse);
    adresse++;
    byte dat0= SpiRam1.read_byte(adresse);
    uint32_t resultat = (dat3<<24) + (dat2<<16) + (dat1<<8) + dat0;
    return resultat;

    message du compilateur : "warning: left shift count >= width of type"

    en assembleur, ça ne me poserait aucun probleme...

    -----

  2. Publicité
  3. #2
    Jack
    Modérateur

    Re : Arduino, et le C...

    byte dat3
    (dat3<<24)
    A mon avis le compilateur tique lorsqu'on lui demande de décaler un octet 24 fois à gauche.

    Le message d'erreur est d'ailleurs assez explicite.

    en assembleur, ça ne me poserait aucun probleme...
    En C non plus, vu qu'il ne s'agit que d'un warning.
    Que ce soit en C ou en assembleur, le résultat sera irrémédiablement le même: 0

    A+

  4. #3
    Toffy38

    Re : Arduino, et le C...

    bonjour,
    en fait ça n'est pas un warning mais bien une erreur qui bloque la compilation.
    ce que je veux faire dans ce code, c'est affecter les valeurs des byte dat3..0 respectivement au 4 bytes de la variable resultat (32bits).
    pourtant cette ecriture fonctionne pour 16bits:
    uint16_t resultat = (dat1<<8) + dat0;
    donc comment faire ?
    merci.

  5. #4
    Jack
    Modérateur

    Re : Arduino, et le C...

    EN C pur, il faudrait caster les variables dat1, dat2 et dat3. Je ne sais pas si on peut faire ça avec le langage pour arduino.
    Le problème vient du fait que le compilateur évalue le membre droit de l'expession ( (dat3<<24) + (dat2<<16) + (dat1<<8) + dat0) avant de l'affecter au membre gauche (résultat). L'expression est donc calculée dans un format 8 bits puisque constituée uniquement de variables 8 bits.

    Il te reste la solution de déclarer dat1, dat2 et dat3 comme des entiers de 32 bits, uint32_t d'après ton code.

  6. #5
    satinas

    Re : Arduino, et le C...

    uint32_t resultat = ((uint32_t)dat3<<24) + ((uint32_t)dat2<<16) + ((uint16_t)dat1<<8) + dat0

  7. A voir en vidéo sur Futura

Discussions similaires

  1. Arduino anti rebond avec arduino
    Par sari12 dans le forum Électronique
    Réponses: 13
    Dernier message: 23/10/2014, 17h04
  2. PWM et Arduino
    Par Dr_H2O2 dans le forum Électronique
    Réponses: 6
    Dernier message: 29/04/2014, 14h34
  3. Communication arduino-arduino avec module Xbee
    Par TPESI22012 dans le forum Électronique
    Réponses: 2
    Dernier message: 23/12/2013, 17h24
  4. Arduino CNC
    Par margoullat dans le forum Électronique
    Réponses: 6
    Dernier message: 22/12/2013, 08h55
  5. Arduino
    Par Digitall dans le forum Électronique
    Réponses: 8
    Dernier message: 17/03/2010, 11h49