Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Nie działający EEPROM w ATmega

kozi25 10 Gru 2008 01:28 2945 6
  • #1 10 Gru 2008 01:28
    kozi25
    Poziom 9  

    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!

    0 6
  • #2 10 Gru 2008 06:23
    mirekk36
    Poziom 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

    0
  • #3 10 Gru 2008 11:09
    kozi25
    Poziom 9  

    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ę.

    0
  • #4 10 Gru 2008 11:40
    Dr.Vee
    VIP Zasłużony dla elektroda

    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

    1
  • #5 10 Gru 2008 13:34
    mirekk36
    Poziom 42  

    kozi25 napisał:

    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 ;)

    0
  • #6 10 Gru 2008 16:17
    kozi25
    Poziom 9  

    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 :)

    0
  • #7 10 Gru 2008 19:00
    mirekk36
    Poziom 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

    0