Pointeur&mapping&bit language c
Répondre à la discussion
Affichage des résultats 1 à 8 sur 8

Pointeur&mapping&bit language c



  1. #1
    galou32

    Pointeur&mapping&bit language c


    ------

    Bonjour,

    j'ai du mal à comprendre cette partie de code (qui fonctionne), plus précisément la ligne :

    ByteData[i] = (Command[0] & (0x01 << i)) && 1;

    on est d'accord que command est un pointeur qui pointe sur une adresse dont la valeur contient 8 bit ?
    donc command[0] contient la valeur du 1er bit de gauche?
    mais du coup mapper ne fonctionnerai pas?

    en fait pour que ça marche il faudrait que command[0] soit égal à l'octet complet par ex à 10011001 et dans ce cas " 0x01 << i " mapperait chaque bit en partant de la droite ver la gauche non?

    le programme complet :

    https://github.com/UsefulElectronics...e/Src/TM1637.c

    Merci pour vos explications

    Code:
    void tm1637_TxCommand(uint8_t *Command)
    {					                        //Handles high level (bit by bit) transmission opération
    	uint8_t ByteData[8] = {0};
    
    	for(uint8_t i = 0; i < PACKET_SIZE; i++)
    	{
    
    		ByteData[i] = (Command[0] & (0x01 << i)) && 1;
    
    								//Convert from byte to bit per array element
    	}
    
    	tm1637_StartPacket();				      //Send start packet bit
    	tm1637_DataOut(ByteData);				//Send one byte
    	tm1637_CLKlow();					//Send one CLK for acknowledgment
    	tm1637_CLKhigh();
    	tm1637_ACKcheck();					//wait for acknowledgment.
    	if((Command[0] & 0xC0) != (0xC0))			//Check if the received packet is not an address.
    	
    		tm1637_EndPacket();
    	}
    
    }

    -----

  2. #2
    pm42

    Re : Pointeur&mapping&bit language c

    command est un pointeur sur un uint8 donc un mot de 8 bits. command[0] qui pourrait aussi s'écrire *command est donc bien un mot de 8 bits.

    La boucle sert justement à extraire chaque bit et à le mettre dans ByteData.

  3. #3
    CM63

    Re : Pointeur&mapping&bit language c

    Citation Envoyé par galou32 Voir le message
    ...command[0] contient la valeur du 1er bit de gauche?
    Non, Command[0] est la valeur qu'il y a à l'adresse Command, Command[0] c'est pareil que *Command, Command[1] c'est pareil que *(Command+1), etc.

    Donc ce sont des "mots" (ici des données de type uint8_t) et non des bits.
    Quoi? Quelque chose que je ne connais pas et qui me fait l'affront d'exister?!

  4. #4
    galou32

    Re : Pointeur&mapping&bit language c

    Merci à vous pour ces reponses precises.

  5. A voir en vidéo sur Futura
  6. #5
    galou32

    Re : Pointeur&mapping&bit language c

    Bonjour,

    j'suis désolé de vous déranger encore, mais je ne trouve pas d'exemple de ce type expliqué sur le net.

    la fonction ci dessous ressemble beaucoup à la précédente

    l'auteur test bien des bits et non le mot entier ?

    ce que je ne comprend pas :
    lorsque j=0 , pour moi, on teste le premier bit de gauche? soit le MSB ?
    jusqu'au dernier bit de droite LSB

    tm1637_TxBuffer[j] fonctionne bien comme un tableau?
    Merci

    Code:
    void tm1637_DataOut(uint8_t *tm1637_TxBuffer)							//Low level data transfer function
    {
    
    	for(int8_t j = 0; j < PACKET_SIZE; j++)								//Send least significant bit first
    	{
    		tm1637_CLKlow();
    		if(tm1637_TxBuffer[j] == GPIO_PIN_SET)							//Check logic level
    		{
    			tm1637_SDOhigh();
    
    		}
    		else
    		{
    			tm1637_SDOlow();
    
    		}
    		tm1637_CLKhigh();
    	} 
    }

  7. #6
    pm42

    Re : Pointeur&mapping&bit language c

    Citation Envoyé par galou32 Voir le message
    l'auteur test bien des bits et non le mot entier ?
    Non, il teste le mot entier.
    Après, il se peut que comme ce qu'on construisait dans la fonction précédente, chaque mot ne contienne en fait qu'un bit.

    Citation Envoyé par galou32 Voir le message
    lorsque j=0 , pour moi, on teste le premier bit de gauche? soit le MSB ?
    Non, on teste le mot de 8 bits en position 0 dans le tableau.

    Citation Envoyé par galou32 Voir le message
    tm1637_TxBuffer[j] fonctionne bien comme un tableau?
    Oui.

  8. #7
    umfred

    Re : Pointeur&mapping&bit language c

    en général, au niveau d'un octet, le bit0 est le bit de poids faible (à droite), l'indice indique aussi la valeur 2^bit (bit0 => 2^0=1; bit4 => 2^4=16=0b00010000)

    (et "least significant bit" (LSB) dans le commentaire l'indique d'ailleurs bien)

  9. #8
    galou32

    Re : Pointeur&mapping&bit language c

    Merci encore

Discussions similaires

  1. [Autre] comment faire d'un pointeur satellite un pointeur tnt
    Par invite59c7cef0 dans le forum Électronique
    Réponses: 4
    Dernier message: 19/02/2018, 18h00
  2. Compilation Language C en Language Hex pour PIC16F877
    Par invitecc13ad94 dans le forum Électronique
    Réponses: 8
    Dernier message: 19/09/2011, 18h43
  3. [Biochimie] Mapping et Bal 31
    Par invitefeecbae9 dans le forum Biologie
    Réponses: 4
    Dernier message: 27/07/2010, 15h34
  4. [Biologie Moléculaire] S1 mapping
    Par invite3b0d094d dans le forum Biologie
    Réponses: 1
    Dernier message: 16/12/2007, 20h12
  5. Mapping unit
    Par invited15d4180 dans le forum Biologie
    Réponses: 17
    Dernier message: 29/04/2006, 12h22