problem mit verschiebe operation



  • hallo,

    habe ein problem mit der verschiebe operation:

    unsigned char SPDR = 0x00;
    unsigned int receive_16_bit = 0x00;
    
    *receive_16_bit = (SPDR << 8);
    
    danach ist *receive_16_bit = FF00;
    
    warum? kann doch nicht sein!?
    


  • zur info:

    sizeof(unsigned char) = 1
    sizeof(unsigned int) = 2
    


  • So wie der Code dasteht macht er schon syntaktisch keinen Sinn. Soll receive_16_bit ein Zeiger auf int sein?



  • cpp1 schrieb:

    warum? kann doch nicht sein!?

    kann doch sein. angenommen dein 'receive_16_bit' ist tatsächlich ein pointer und du hast RAM an adresse 0 und darüber, dann waren in SPDR (SPI im 8-bit mode, ne?) alles einsen, die du nach links geshiftet und in den speicher an adresse 0 und 1 geschrieben hast.
    🙂



  • funktion sieht so aus, SPDR ist ein 8 bit register:

    void spi_send_recv(unsigned char byte, unsigned int *receive)
    {
    	/* Chip Select clear */
    	...
    
    	/* send Character */
    	SPDR  = byte;
    	/* wait for completion flag */
            while (!(SPSR & (1<<SPIF)));
     	*receive = (SPDR << 8);
    
    	/* Chip Select set */
    	...
    }
    


  • wird gemacht, da in spi_send_recv normal 2 bytes gesendet werden!

    *receive = (SPDR << 8);
    

    beim 2ten byte mache ich dann:

    *receive = (*receive | SPDR);
    


  • ~fricky schrieb:

    cpp1 schrieb:

    warum? kann doch nicht sein!?

    kann doch sein. angenommen dein 'receive_16_bit' ist tatsächlich ein pointer und du hast RAM an adresse 0 und darüber, dann waren in SPDR (SPI im 8-bit mode, ne?) alles einsen, die du nach links geshiftet und in den speicher an adresse 0 und 1 geschrieben hast.
    🙂

    Öhh, sorry, aber wieso sollen nach

    unsigned char SPDR = 0x00;

    in SPDR alles Einsen sein?



  • das lag daran das der spi gar nicht eingeschalten war;)

    lg



  • Belli schrieb:

    Öhh, sorry, aber wieso sollen nach
    unsigned char SPDR = 0x00;
    in SPDR alles Einsen sein?

    weil SPDR keine normale speicherzelle ist. mit schreibzugriffen kann man was auf den SPI bus ausgeben und mit lesezugriffen kriegt man das, was reingekommen ist. wenn's sich immer so verhält wie eine speicherzelle, dann hat man z.b. 'nen kurzschluss zwischen den datenleitungen.
    🙂


Anmelden zum Antworten