logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[C] Rozdzielenie liczby HEX

Killerca 10 Maj 2010 16:34 2276 5
REKLAMA
  • #1 8058952
    Killerca
    Poziom 13  
    Witam.Mam problem z rozdzieleniem liczby zapisanej szesnastkowo.
    Chciałbym aby wartość pobrana z tablicy,np. 0xAABBCC została rozpisana do zmiennych jako:
    red=AA;
    green=BB;
    blue=CC;

    W kodzie który jest niżej,tylko wartość w zmiennej red jest prawidłowa,pozostałe nie dają pożądanego przeze mnie efektu.Ten sam program napisałem w Dev-C++ i wszystkie zmienne miały prawidłowe wartości.Gdzie może być błąd?

    
    #include <avr/io.h> 
    #include <util/delay.h> 
    
    void main() 
    { 
    	DDRB |= _BV(DDB3); 
    	DDRB |= _BV(DDB2); 
    	DDRB |= _BV(DDB1); 
    
    	TCCR2 = _BV(WGM20) | _BV(COM21) | _BV(CS20); 
    	TCCR1A = _BV(COM1A1) | _BV(COM1B1) |_BV(WGM10); 
    	TCCR1B = _BV(CS10); 
    
    
    unsigned int paleta[34]={ 0x00ffff,0xff00ff,0xffff00,0x000000,0x80002b,0x001b3b,0x75d41d,0x00bfbf,0x670a00,0x8000ff,0xba74ff,
    								0x0080db,0x008da9,0x9b6a12,0x23ebc3,0xff0000,0xff7474,0x0046f0,0x749af7,0x74ff74,0x35008f,
    								0x0073ff,0xb7c274,0xff312e,0x00eb6c,0xe16f00,0x11d3d3,0x1136ff,0x5200d0,0x00964b,0x009595,
    								0x000970,0x830300,0x522725,0x0f7f7f}; 
    unsigned int red=255,green=255,blue=255,i=0; 
    
    while(1) 
    { 
    
    		i=rand()%34;
    		kolor=paleta[i]; 
    		red=kolor/0x10000; 
    		kolor=kolor-red*0x10000; 
    		green=kolor/0x100; 
    		blue=kolor%0x100; 
    		OCR2=green; OCR1A=blue; OCR1B=red; 
    }
    }
  • REKLAMA
  • REKLAMA
  • Pomocny post
    #3 8059101
    tmf
    VIP Zasłużony dla elektroda
    To nie zadziała. unsigned int na AVR jest 16-bitowe, a ty próbujesz przechowywać w nim 24-bitowe wartości. Musisz to zmienić np. na unsigned long. A pojedyńcze bajty wyłuskasz z tego za pomocą operacji przesunięć bitowych, albo za pomocą unii:
    union RGB
    {
    unsigned long kolor;
    struct kolor
    {
    uint8_8 r;
    uint8_t g;
    uint 8_t b;
    };
    };
  • REKLAMA
  • Pomocny post
    #4 8059133
    Krauser
    Poziom 26  
    W avr-libc unsigned int ma 2 bajty a ty potrzebujesz 4 (unsigned long int). Jeśli chodzi o red, green to mogą być 8-bitowe. Pamiętaj by użyć rzutowania.
    red = (unsigned char) (kolor & 0xff0000) >> 16;
  • REKLAMA
  • #5 8059254
    Killerca
    Poziom 13  
    Już jest OK.Problem był właśnie w deklaracji zmiennej kolor.Pisząc program zaglądam do Synfonii C++ i tam unsigned int jest 32bit a wyszło,że w avr jest inaczej :)
    m.bartczak to co podałeś działa dobrze.
    Dziękuję za wskazanie błędu i przydatne listingi.
    Pozdrawiam
  • #6 8066859
    uuidgen
    Poziom 12  
    #include <stdint.h>

    i używaj typów tam zdefiniowanych:
    int8_t / uint8_t
    int16_t / uint16_t
    int32_t / uint32_t

    oszczędzisz sobie dużo problemów.

    No i do tego kompilacja obowiązkowo z -Wall

    Proszę używać znacznika code!
    Robak
REKLAMA