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.

Nie działający EEPROM w ATmega

kozi25 10 Dec 2008 01:28 3098 6
  • #1
    kozi25
    Level 10  
    Witam

    Sporo jest pytań na temat EEPROMU, ale nie udało mi się znaleźć odpowiedzi, więc przedstawię swój problem.

    Wykonałem zegar szachowy na ukł. ATmega 8. Wszystko działa poprawnie oprócz zapisu i odczytu pamięci EEPROM. Procedura zapisu nie modyfikuje pamięci, procedura odczytu daje zawsze "0", bez względu na rzeczywistą zawartość. Zapis i odczyt przez programator przebiegają prawidłowo.
    To samo na trzech układach ATmega 8, jednym '88 i jednym '32. Program pisałem w ASM w AVR Studio 4.13. Programuję samoróbką pod COM'a z PonyProg 2.07a.

    Zasilanie z baterii przez stabilizator 7805 (daje równe 5V), BOD włączony, reset podciągnięty, środowisko raczej wolne od zakłóceń EM. Taktowanie wewnętrznym rezonatorem na częstotliwości fabrycznej. Próbowałem zapisu pod różnymi adresami bo czytałem, że z początkowymi bywają problemy.

    Nie mogłem dojść przyczyny, więc maksymalnie uprościłem program:

    Code:

    //PROGRAM ZAPISUJĄCY KOMÓRKĘ EEPROMU

    .INCLUDE "m32def.inc"



    .ESEG
    .ORG   0x100
    Komorka:   .DB 0

    .CSEG 
    .ORG   0 
    rjmp   Reset
    .ORG   0x30

    Reset:               
    ldi R16, 5                      ; wartość do wpisania
    ldi R17, low(0x100)
    ldi R18, high(0x100)

    skok:
    sbic EECR, EEWE            ; sprawdzenie gotowości EEPROMu
    rjmp skok

    out EEDR, R16               ; wpisanie wartości do bufora
    out EEARL, R17
    out EEARH, R18
    sbi EECR, 1<<EEMWE     ; włączenie zezwolenia i zapis
    sbi EECR, 1<<EEWE

    ldi R16, 1<<0                 ; test działania mikrokontrolera
    out DDRA, R16
    out PORTA, R16

    Petla:
    nop
    rjmp Petla


    i po odczycie EEPROMu programatorem jest to samo, co było przed uruchomieniem powyższego programu :(

    Przewertowałem notę aplikacyjną, mądrą książkę, forum i nic.... pomocy!
    [28-30.06.2022, targi] PowerUP EXPO 2022 - zasilanie w elektronice. Zarejestruj się za darmo
  • #2
    mirekk36
    Level 42  
    Witam,

    może się mylę ale wydaje mi się, że teoretycznie wszystko zrobiłeś zgodnie z notą aplikacyjną PDF tylko w jednym miejscu coś pomieszałeś:

    Code:
    sbi EECR, 1<<EEMWE
    
    sbi EECR, 1<<EEWE


    a przecież w nocie masz:

    Code:
    sbi EECR, EEMWE
    
    sbi EECR, EEWE


    przy poleceniu sbi podajemy jako drugi parametr numer bitu a nie tak jak w C maskę tego bitu bo w obydwu powyższych przypadkach te same polecenia próbują ustawiać inne bity , zobacz sobie dokładnie jak działa np to:

    Code:
    bit = 3
    

    sbi rejestr, 1<<bit


    (1<<bit) spowoduje przesunięcie jedynki na miejsce bitu 3, co w efekcie da nam 00001000 czyli 8

    spowoduje że zadziała to jak:

    sbi rejestr, 8 - czyli ustaw na 1 bit nr 8 w rejstrze

    a całkiem inaczej będzie gdy napiszemy:

    bit = 3

    sbi rejstr, bit - czyli ustaw bit nr 3 w rejestrze

    .... chyba więc w tym masz problem
  • #3
    kozi25
    Level 10  
    Dzięki wielkie mirekk36. Tyle nerwów przez nieznajomość składni :( . Wydawało mi się, że kopiowałem kod z PDF'a.
    A swoją drogą to trochę brak konsekwencji ze strony Atmela, sbr i cbr adresuje się przecież przez maskę.
  • #4
    Dr.Vee
    VIP Meritorious for electroda.pl
    sbr i cbr pozwalają na ustawianie/zerowanie wielu bitów, stąd maska, a nie numer bitu.
    Zwróć uwagę, że sbr i cbr są odpowiednio tłumaczone na ori i andi ze stałymi - instrukcje mają takie same opkody i argumenty.

    Wszystko jasne? ;)

    Pozdrawiam,
    Dr.Vee
  • #5
    mirekk36
    Level 42  
    kozi25 wrote:

    A swoją drogą to trochę brak konsekwencji ze strony Atmela, sbr i cbr adresuje się przecież przez maskę.


    no ja też może nie przyznałbym racji, że to niekonsekwencja Atmela ;) ale .... też z powodu tego, że gdy pisałem programy w asemblerze to często przez te drobne niuansiki było sporo grzebaniny w kodzie, testowania, poprawiania, czytania dokumentacji itp itp - dokładnie tak jak ty powyżej, to jednak rozejrzałem się za językami wyższego poziomu i przynam, że obecnie coraz bardziej odpowiada mi C, który kiedyś był dla mnie mało przejrzysty a teraz ??? .... teraz to poezja - no i dzięki temu (1<<bit) i tym podobnym zapisom bardzo fajnie się pisze programy a asembler jako wstawki - tak więc polecam C ;)
  • #6
    kozi25
    Level 10  
    W sumie racja, skoro operuje na jednym bicie nie trzeba maski. Jeśli chodzi o C to mam zamiar zacząć się uczyć, na studiach trochę pisałem w C++ pod windowsa i podobało mi się. Czy programy w C są dużo wolniejsze/większe od asemblerowych?

    A mój zegar szachowy śmiga jak szalony :)
  • #7
    mirekk36
    Level 42  
    Ja uważam, że nie ma to jak zacząć poznawać dowolną rodzinę procków za jaką się zabieramy właśnie od asemblera. Warto go nawet bardzo dobrze poznać bo później gdy trzeba zrobić jakieś krytycznie-czasowo ważne wstawki to wiadomo - asm ;)

    Natomiast w większości projektów jak sam zobaczysz nie jest aż tak istotne to jaka jest objętość kodu wynikowego. Na dodatek dobrze napisany program w C wcale dużo nie zajmuje - ale to już temat na całkiem inną dyskusję.

    Ja miałem o tyle dobre porównanie co do objętości, że po asemblerze nauczyłem się Bascoma (on niestety sporo pożerał pamięci - ale też w większości projektów nie jest to aż tak istotne, bo co za problem wziąć procka o nieco większej pamięci - różnica cenowa? - prawie żadna. Bascom bardzo mi się podoba i gdy na prawdę na "szybciora" muszę coś zrobić to jeszcze do niego sięgam. Jednak w miarę poznawania cały czas języka C powoli okazuje się, że to w nim będę chyba docelowo pisał. Objętość kodu duuuużo mniejsza od Bascoma (szczególnie gdy się napisze własne biblioteki do obsługi takich peryferiów jak LCD, RS232, I2C itp .... )

    .... przedtem gdy zaczynałem cokolwiek w Bascomie, to minimalny procek jaki brałem to ATmega8, teraz gdy piszę w C - spokojnie do małych projektów wystarcza ATtiny2313 tak jak wtedy gdy pisałem w asemblerze.

    .... przy okazji jak zrobiłeś coś fajnego - skoro piszesz o zegarze szachowym to może wystaw do w dziale DYI ;)

    pozdrówka