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

ATmega16 - odczyt z pamięci EEPROM

golas17 24 Lut 2009 00:48 3385 7
  • #1 6195948
    golas17
    Poziom 16  
    Witam,
    Mam jakiś dziwny problem z odczytem z wewnętrznej pamięci EEPROM z ATmega16. Korzystam z funkcji zdefiniowanych w avr/eeprom.h. Zmienne które chciałem zapisać do EEPROM zapisałem w osobnym pliku nagłówkowym i "includowałem" ten plik do pliku głównego. Niestety nie mogę odczytać tych zmiennych. Wychodzą jakieś bzdury. Np. jedna ze zmiennych to temp_zadana=25, ale odczytywane jest jako 255... Natomiast zadeklarowałem sobie również zmienne w pliku głównym programu no i z tym już nie ma żadnego problemu. Program odczytuje je poprawnie.

    Czy mogłem źle dołączyć plik nagłówkowy?? Dodam, że podobnie dodałem plik zawierający tablice stałych zapisywanych do pamięci flash i wszystko działa.
    Czy może problem tkwi w szczegółach jak zwykle??...

    Proszę o podpowiedzi
  • #3 6196351
    kaktus_c++
    Poziom 18  
    Zamieść fragmenty Twojego kodu.
    Może podczas zapisu rzutujesz int na unsigned char.
  • #4 6197597
    golas17
    Poziom 16  
    Oto plik ze zmiennymi z których chce korzystać w programie głównym:

    
    #ifndef H_ZMIENNE_EEPROM_H
    #define H_ZMIENNE_EEPROM_H
    
    uint8_t smieci1						__attribute__((section(".eeprom"))) = 0;
    uint8_t temp_zadana                 __attribute__((section(".eeprom"))) = 28;
    
    uint8_t temp_zalaczenia_pompy       __attribute__((section(".eeprom"))) = 24;
    uint8_t temp_wylaczenia_pompy       __attribute__((section(".eeprom"))) = 23;
    
    uint8_t czas_przedmuchu             __attribute__((section(".eeprom"))) = 5;
    uint8_t okres_przedmuchu            __attribute__((section(".eeprom"))) = 20;
    uint8_t czas_rozbiegu               __attribute__((section(".eeprom"))) = 3;
    uint8_t moc_dmuchawy_procesu        __attribute__((section(".eeprom"))) = 75;
    uint8_t moc_dmuchawy_rozbiegu       __attribute__((section(".eeprom"))) = 30;
    uint8_t min_moc_dmuchawy            __attribute__((section(".eeprom"))) = 30;
    uint8_t max_moc_dmuchawy            __attribute__((section(".eeprom"))) = 100;
    
    uint8_t temp_wylaczenia_regulatora  __attribute__((section(".eeprom"))) = 20;
    uint8_t smieci2						__attribute__((section(".eeprom"))) = 0;
    
    #endif
    


    No i taki próbny programik:
    
    	while(1)
        {
    		
    		if( current_temp < eeprom_read_byte (&temp_zadana) )
    		{
                            set_power_dmuchawa(60);
    		}	
    		if( current_temp >= eeprom_read_byte (&temp_zadana) )
    		{
    			set_power_dmuchawa(60);	
    		}
        } /* while */ 


    Kiedy na wyświetlaczu LCD wyświetlam sobie wartość temp_zadana, to pokazuje mi się "255".
    Natomiast dla próby zadeklarowałem i zainicjowałem jedną zmienną eeprom w tym samym pliku co program główny no i wtedy można ją przy użyciu powyższego sposobu spokojnie porównywać ze zmienną current_temp.

    Dodano po 2 [minuty]:

    A definicje tych zmienny o nazwach "smieci1" oraz "smieci2" zamieściłem dlatego, że gdzieś wyczytałem, że ATmegi mają jakiś problem z zapamiętaniem zmiennej umieszczonej w pierwszej komórce pamięci eeprom. Definicje śmieci umieszczone są na początku i na końcu ponieważ nie wiem w jaki sposób kompilator zapisuje zmienne do pamięci eeprom - od początku czy od końca pliku

    Dodano po 17 [minuty]:

    Hmm.... A teraz pytanie które mnie skompromituje do końca...
    Czy za każdym razem kiedy zmienię coś w programie, to muszę oprócz zaprogramowania pamięci flash zaprogramować również ponownie pamięć eeprom?
    Myślałem, że to niezależna obszary... A jednak kiedy wgram nowy program do ATmegi, to wszystkie bity w pamięci eeprom są ustawiane na jedynki i stąd chyba te wskazania na wyświetlaczu "255"....
    Czy tak właśnie jest?
  • #6 6197870
    golas17
    Poziom 16  
    Czyli dopiero kiedy wpiszę 0 do tego fuse bitu to będę mógł zapomnieć o każdorazowym programowaniu eepromu po wyczyszczeniu ATmegi, tak? Bo domyślnie jest tam wpisane 1 i pamięć jest niezabezpieczona przez "chip erase". A czy kiedy będę chciał zmienić zawartość pamięci eeprom, to wtedy wystarczy wpisać do EESAVE ponownie wartość 1, zapisać nową zawartość i znowu ustawić 0 ?

    Tak w ogóle to dziękuje Freddie
  • #8 6198102
    golas17
    Poziom 16  
    Dziękuję :)
REKLAMA