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

AVR GCC - ostrzeżenia przy przypisaniach do PORTA i eeprom_read_word

zizu82 27 Lut 2006 16:54 1793 5
REKLAMA
  • #1 2354191
    zizu82
    Poziom 10  
    Posty: 59
    Oto fragmenty kodu (ATtiny26):
    
    #define LED_7 0x02 //zielona
    #define LED_6 0x01 //zielona
    #define LED_5 0x04 //zielona
    #define LED_4 0x08 //zielona
    #define LED_3 0x10 //zolta
    #define LED_2 0x20 //czerwona
    #define LED_1 0x80 //czerwona
    #define LED_0 0x40 //czerwona
    ...
    PORTA = ~(LED_0 | LED_1 | LED_2 | LED_3);
    ...
    PORTA = ~(LED_1 | LED_2 | LED_3);
    ...
    PORTA = ~(LED_2 | LED_3);
    ....
    ....
    

    i kompilacja wykazuje cos takiego:

    tester.c:245: warning: large integer implicitly truncated to unsigned type
    tester.c:249: warning: large integer implicitly truncated to unsigned type

    !!!! 2 warningi do tylko dwoch pierwszych przypisan do portu A. trzeci jest ok. O co tu chodzi?

    przy okazji:
    mam jeszcze cos takiego
    
    uint16_t g_odniesienie; //wartosc kalibracyjna przy 10V
    g_odniesienie = eeprom_read_word(0x01);
    

    i pojawia sie warning
    tester.c:106: warning: passing arg 1 of `eeprom_read_word' makes pointer from integer without a cast

    thx for help
  • REKLAMA
  • #2 2354717
    romario4
    Poziom 16  
    Posty: 138
    Pomógł: 17
    Ocena: 3
    Witam.
    Jeśli chodzi o to:
    
    uint16_t g_odniesienie; //wartosc kalibracyjna przy 10V 
    g_odniesienie = eeprom_read_word(0x01);
    

    to spróbuj coś takiego
    
    #include<avr/eeprom.h>
    ...
    uint8_t pusty EEMEM = 0; //jeśli nie chcesz wykorzystać komórki o adresie 0x00
    uint16_t ee_odniesienie EEMEM=0x23; //możesz przypisać dowolną wartość
    
    uint16_t g_odniesienie = eeprom_read_word(&ee_odniesienie);
    
  • REKLAMA
  • #3 2354733
    Smoczy
    Poziom 20  
    Posty: 436
    Pomógł: 26
    Ocena: 67
    zapisał bym tak:


    #define LED_7 0x7 //zielona
    #define LED_6 0x6 //zielona
    #define LED_5 0x5 //zielona
    #define LED_4 0x4 //zielona
    #define LED_3 0x3 //zolta
    #define LED_2 0x2 //czerwona
    #define LED_1 0x1 //czerwona
    #define LED_0 0x0 //czerwona
    ...
    PORTA = ~(_BV(LED_0) | _BV(LED_1) | _BV(LED_2) | _BV(LED_3));
    ...
    PORTA = ~(_BV(LED_1) | _BV(LED_2) | _BV(LED_3));
    ...
    PORTA = ~(_BV(LED_2) | _BV(LED_3));
    ....
    ....



    ostrzeżenia powinny zniknąć. Natomiast drugiego ostrzeżenia adres zapisz w postaci uint16 czyli wpisz np.0x0001. I sprawdź czy będzie działało.
  • REKLAMA
  • #4 2355315
    zizu82
    Poziom 10  
    Posty: 59
    zalecenia obu kolegow nic nie daly niestety
    Jesli chodzi o to:
    
    #include<avr/eeprom.h>
    ...
    uint8_t pusty EEMEM = 0; //jeśli nie chcesz wykorzystać komórki o adresie 0x00
    uint16_t ee_odniesienie EEMEM=0x23; //możesz przypisać dowolną wartość
    
    uint16_t g_odniesienie = eeprom_read_word(&ee_odniesienie); 
    

    to program sie wykrzacza mimo zalaczenia odpowiedniej biblioteki (2 bledy)
    z kolei propozycje kolegi Smoczego nic nie zmieniaja :]
    mimo wszystko dziekuje za chec pomocy
  • REKLAMA
  • Pomocny post
    #5 2355433
    Robot_
    Poziom 18  
    Posty: 277
    Pomógł: 22
    zizu82 napisał:

    przy okazji:
    mam jeszcze cos takiego
    
    uint16_t g_odniesienie; //wartosc kalibracyjna przy 10V
    g_odniesienie = eeprom_read_word(0x01);
    

    i pojawia sie warning
    tester.c:106: warning: passing arg 1 of `eeprom_read_word' makes pointer from integer without a cast

    thx for help

    Kompilator wskazuje Ci ze utworzyl wskaznik.

    Spróbuj takiego czegoś powinno pomóc
    
    uint16_t g_odniesienie; //wartosc kalibracyjna przy 10V
    g_odniesienie = eeprom_read_word( (uint8_t *) 0x01);
    
  • #6 2355910
    zizu82
    Poziom 10  
    Posty: 59
    dzieki! dziala
    tylko powinno byc (uint16_t *) a nie (uint8_t *) bo zapisuje 2 bajty
REKLAMA