Elektroda.pl
Elektroda.pl
X

Search our partners

Find the latest content on electronic components. Datasheets.com
Elektroda.pl
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

Atmega32 + eeprom = avrdude: ERROR:...

bisz 16 Nov 2010 22:35 1887 6
  • #1
    bisz
    Level 18  
    Witam. Gdy na mikrokontrolerze Atmega32 chcę użyć pamięci eeprom,w sposób taki :

    Code:
    static EEMEM uint8_t zmienna_w_eepromie = 'a';     


    to na etapie programowania mam taki komunikat :

    Code:
    avrdude: ERROR: address 0x810001 out of range at line .... of efi.hex


    co robie źle ?
    Dodam, że programuję składnią :
    Code:
    avrdude -c usbasp -p atmega32 -V -U flash:w:plik.hex


    Czy trzeba użyć przy programowaniu jakichś innych parametrów ?
  • #2
    mirekk36
    Level 42  
    bisz wrote:

    co robie źle ?
    Dodam, że programuję składnią :
    Code:
    avrdude -c usbasp -p atmega32 -V -U flash:w:plik.hex


    Czy trzeba użyć przy programowaniu jakichś innych parametrów ?


    Po pierwsze to taką składnią chyba jak sam widzisz programujesz tylko pamięć FLASH, więc nawet jeśli już umieściłbyś tą zmienną w EEPROM to po uruchomieniu procka i tak byś jej tam nie zobaczył - to chyba oczywiste że musiałbyś wgrać także plik *.eep z zawartością wygenerowaną dla EEPROM

    bisz wrote:
    Witam. Gdy na mikrokontrolerze Atmega32 chcę użyć pamięci eeprom,w sposób taki :

    Code:
    static EEMEM uint8_t zmienna_w_eepromie = 'a';     


    to na etapie programowania mam taki komunikat :

    Code:
    avrdude: ERROR: address 0x810001 out of range at line .... of efi.hex


    A dlaczego miałoby się to nie skompilować ?

    Być może zapchałeś już tymi zmiennymi cały EEPROM albo kto wie co tam zrobiłeś.
  • #3
    bisz
    Level 18  
    To może ja powiem co jak robię.

    Mam taki skrypcik pod linuksem własnoręcznie napisany który kompiluje i programuje.
    Code:

    avr-gcc -msize  -mmcu=atmega32 plik.c -o plik.out
    avr-objcopy -O ihex plik.out plik.hex
    avrdude -c usbasp -p atmega32 -V -U flash:w:plik.hex


    Do tego dorzucam jeszcze polecenia dla epromu:
    Code:

    avr-objcopy -j .eeprom -O ihex plik.out eeprom.hex
    avrdude -c usbasp -p atmega32 -V -U eeprom:w:eeprom.hex


    Teraz faktycznie nie ma tego błędu, ale czy na tym etapie robię coś źle ?
  • #4
    mirekk36
    Level 42  
    Jeśli nie ma błędu i teraz po wgraniu wygenerowanej zawartości eeprom jest tam twoja zmienna to OK ;)

    a czy coś robisz źle w tych wywołaniach (skryptach) linuxowych - to ja już nie podpowiem - nie znam linuxa.
  • #5
    bisz
    Level 18  
    W sumie to nie ma znaczenia czy sa to skrypty linuksowe czy nie, składnia dla winavr jest taka sama. Moje pytanie jest takie bo nie jestem pewien czy dobrze rozumiem filozofie tej pamięci. Czy z poziomu kodu programu, jeżeli stworzę odpowiedni program obsługujący transmisję szeregową, to czy moge wpisywać sobie do pamięci EEPROM dowolne dane, np poprzez terminal , lub jakkolwiek inaczej na podstawie zdarzeń zewnętrznych ?
  • #6
    mirekk36
    Level 42  
    Pamięć EEPROM po to jest żeby w niej zapisywać i z niej odczytywać dowolne swoje dane, które mają być przechowywane podczas wyłączenia zasilania.

    Musisz tylko wziąć pod uwagę, że pamięć EEPROM to nie RAM. Różnice nie polegają tylko na tym, że inaczej się ją obsługuje, że trzyma dane przy wyłączonym procku ale także to, że ma ograniczoną ilość zapisów. Masz to napisane na pierwszej stronie noty PDF. Zatem służy ona raczej do przechowywania jakichś ustawień itp - czyli takich danych, które nie będą zbyt często zapisywane - co chyba zrozumiałe.
  • #7
    bisz
    Level 18  
    Tak zdaje sobie sprawe z ograniczonej ilosci zapisow.
    Już się uporałem. Należało na etapie konwersji na hex dodać parametr -R .eeprom