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

[Attiny13] Dlaczego kod EEPROM na Attiny13 nie działa, a na Atmega32 działa poprawnie?

grykar 25 Lip 2012 23:51 2571 11
  • #1 11144136
    grykar
    Poziom 11  
    Witam,

    nie wiem, dlaczego poniższy kod nie działa na procesorze attiny13. Kompiluje się bez błędów w AVR Studio. Jest to część większej aplikacji, która działa poprawnie (dla uproszczenia wyciąłem resztę kodu). Kiedy dodam obsługę EEPROM, aplikacja przestaje działać.

    Test przeprowadzam następująco:

    1. Komentuję blok ODCZYT.
    2. Kompilacja kodu (brak warningów i błędów).
    3. Programuję attiny13.
    4. Wyłącz/włącz zasilanie.
    5. Odkomentowuję blok ODCZYT.
    6. Komentuję blok ZAPIS.
    7. Kompilacja kodu (brak warningów i błędów).
    8. Programuję attiny.
    9. Wyłącz/włącz zasilanie.

    ...I dioda nie świeci, a powinna.
    Co ciekawe - kod działa poprawnie na atmega32. Kiedy debuguję kod w AVR Studio, dane zapisywane są do EEPROM i odczytywane.

    Czy ktoś ma pomysł, co może być nie tak?

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #2 11144495
    LordBlick
    VIP Zasłużony dla elektroda
    grykar napisał:
    Czy ktoś ma pomysł co może być nie tak ?
    Nie jestem za mocny w C, ale chyba nie masz pętli głównej...
    Poza tym pokaż konfiguracje fusów, powróżymy... ;)
  • #4 11145036
    Tomasz Gumny
    Poziom 28  
    0000. Jak jest podłączona LED?
    0001. Czy sprawdzałeś zapalanie i gaszenie, np.: LED_ON; while(1);
    0010. Co zwraca main (int)?
    0011. Czy main wykonuje się w niekończonej pętli lub gdzieś zatrzymuje?
    0100. Czy sprawdzałeś, do którego miejsca dochodzi program, np. za pomocą (0001.)
    0101. Czy masz zadeklarowany poprawny typ procesora?
  • #5 11145079
    LordBlick
    VIP Zasłużony dla elektroda
    EESAVE jest niezaprogramowany i z tego wynika kasowanie EEPROM-u przy programowaniu.
    P.S. Podany zapis fusów jest zamieszany - powinny być 0xFF7A, albo podane który bajt jest który (Low/High). ;)
  • #6 11145092
    grykar
    Poziom 11  
    Cytat:
    0000. Jak jest podłączona LED?

    nie rozumiem do końca pytania. Dioda podłączona do PB0
    Cytat:
    0001. Czy sprawdzałeś zapalanie i gaszenie, np.: LED_ON; while(1);

    tak działa bez problemu
    Cytat:
    0010. Co zwraca main (int)?

    to muszę sprawdzić, ale szczerze mówiąc nie wiem jak
    Cytat:
    0011. Czy main wykonuje się w niekończonej pętli lub gdzieś zatrzymuje?

    w załączonym kodzie nie ma pętli głównej. W aplikacji jest, ale tak jak pisałem usunąłem wszystko, żeby nie zaciemniać tematu
    Cytat:
    0100. Czy sprawdzałeś, do którego miejsca dochodzi program, np. za pomocą (0001.)

    dochodzi do końca, nie zawiesza się na żadnej lini załączonego kodu
    test robiłem w debuger'ze jak i test z diodą

    Dodano po 8 [minuty]:

    LordBlick,

    wydaje mi się, że gdyby EESAVE był ustawiony (1) to pamięc byłaby kasowana przy programowaniu, ale mogę być w błędzie

    teraz nie jest ustawiony, ale jak wrócę do domu to zmienię fusy
    z Low 0x7A High 0x0FF
    na
    Low 0x3A High FF

    zrobię test
  • #7 11145141
    Tomasz Gumny
    Poziom 28  
    Czy sprawdziłeś wartość zmiennej "pomiar", np. wstawiając ją do warunku w ostatniej linii?
    Czy odczytałeś EEPROM programatorem? Czy była tam jakaś "8"?
  • Pomocny post
    #8 11145143
    LordBlick
    VIP Zasłużony dla elektroda
    grykar napisał:
    wydaje mi się, że gdyby EESAVE był ustawiony (1) to pamięc byłaby kasowana przy programowaniu, ale mogę być w błędzie
    Zajrzyj do noty - ustawienie EESAVE polega na wyzerowaniu.
    Cytat:
    Fuse Bit : EESAVE | Bit No: 6 | Description : Preserve EEPROM memory through Chip Erase | Default Value: 1 (unprogrammed) (memory not preserved)

    :arrow: Tomasz Gumny Jak zajrzysz do pliku lss, to i tak znajdziesz na końcu niekończącą się opowieść(__stop_program)... ;)
  • #9 11145193
    Tomasz Gumny
    Poziom 28  
    Nie używam AVRGCC, a w ICCAVR muszę jawnie zamykać pętlę.
  • #10 11147610
    grykar
    Poziom 11  
    problem rozwiązany - EESAVE był źle ustawiony

    poprawiłem fusy na Low 0x3A High FF i śmiga

    dziękuję wszystkim za pomoc

    tak przy okazji
    pętla główna w funkcji main nie jest obowiązkowa
    wydaje mi się, że jej brak jedynie uniemożliwia korzystanie z przerwań. Program się kończy i procesor finiszuje w jakimś dziwnym stanie
  • #11 11147701
    LordBlick
    VIP Zasłużony dla elektroda
    grykar napisał:
    pętla główna w funkcji main nie jest obowiązkowa
    wydaje mi się, że jej brak jedynie uniemożliwia korzystanie z przerwań.
    Masz rację, jest wyłączenie przerwań przed __stop_program.
REKLAMA