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

Jak wyzerować pamięć RAM w mikrokontrolerze 8051?

CRAFTKM 14 Gru 2005 19:47 1646 16
REKLAMA
  • #1 2083509
    CRAFTKM
    Poziom 11  
    Posty: 9
    Witam wszystkich na forum.
    Jest mi potrzebny program do takiego mikrokontrolera. ponieważ
    dostałem na zadanie temat do zrealizowania: Wyzerój całą pamięć wewnetrzną RAM mikrokontrolera.
    Byłbym bardzo wdzięczny za pomoc. Z góry dziękuje.
    Pozdrawiam
  • REKLAMA
  • Pomocny post
    #2 2083859
    ZbeeGin
    Poziom 39  
    Posty: 4329
    Pomógł: 605
    Ocena: 463
    Nie lubię pisać gotowców z głowy.

    MOV R0,#128 ;adres górny IRAM
    _petla:
    MOV @R0,#0 ;wpisz zero pod adres wskazany przez R0
    DJNZ R0,_petla ;zmniejsz R0 i jeśli nie będzie zerem to skocz

    END
  • Pomocny post
    #3 2086609
    olekewaagata
    Poziom 25  
    Posty: 638
    Pomógł: 64
    Ocena: 28
    he, he, trochę się pośmieję, oczywiście program dobry, ale ramu jest tylko 128 bajtów to jest od 0 do 127, czyli mov r0,#128 powinno być zamienione na mov r0,#127
  • REKLAMA
  • Pomocny post
    #4 2092867
    jj
    Poziom 19  
    Posty: 145
    Pomógł: 42
    :arrow:ZbeeGin
    Ten kod spowoduje wyzerowanie całej pamięci mikrokontrolera pod warunkiem, że przed jego wykonaniem ustawiony będzie zerowy bank rejestrów. W przypadku ustawienia innego banku powstanie piękna nieskończona pętla.
  • Pomocny post
    #5 2093236
    GienekS
    Poziom 32  
    Posty: 1971
    Pomógł: 139
    Ocena: 15
    Po resecie procka i tak jest wybrany bank 0
  • REKLAMA
  • Pomocny post
    #6 2093342
    jj
    Poziom 19  
    Posty: 145
    Pomógł: 42
    GienekS napisał:
    Po resecie procka i tak jest wybrany bank 0


    Zgadza się. I jeśli zerowanie ma się odbyć po resecie to nie ma problemu. Ale autor tematu nie wspominał, w jakich okolicznościach ma się odbywać zerowanie. Zatem pewności, że wybrany jest bank 0 nie ma, i proponując rozwiązanie należałoby ten fakt uwzględnić.

    pozdrawiam
    Jacek
  • #7 2093413
    CRAFTKM
    Poziom 11  
    Posty: 9
    witam,
    więc , czy mogłby ktoś napisać jak bedzie wygladał program,który wyzerowałby cała pamiec wewnetrzną RAM mikrokomtrolera, bez wzgledu
    na to jaki bedzie ustawiony bank rejestrów przed jego wykonaniem.
    Byłbym bardzo wdzieczny za pomoc. POZDRAWIAM
  • Pomocny post
    #8 2093603
    zumek
    Poziom 39  
    Posty: 3352
    Pomógł: 695
    Ocena: 52
    CRAFTKM napisał:
    witam,
    więc , czy mogłby ktoś napisać jak bedzie wygladał program,który wyzerowałby cała pamiec wewnetrzną RAM mikrokomtrolera, bez wzgledu
    na to jaki bedzie ustawiony bank rejestrów przed jego wykonaniem.
    Byłbym bardzo wdzieczny za pomoc. POZDRAWIAM

    Masz już to napisane :!:
    Ustaw tylko na początku bank rejestrów na 0 np. ANL PSW,#0E7H i to wszystko.Jeśli spodziewałeś sie ~100 lini kodu - wybacz , że Cię zawiedliśmy ;)

    Piotrek
  • Pomocny post
    #9 2094026
    gol
    Poziom 14  
    Posty: 76
    Pomógł: 4
    Ocena: 5
    ZbeeGin napisał:
    Nie lubię pisać gotowców z głowy.

    MOV R0,#128 ;adres górny IRAM
    _petla:
    MOV @R0,#0 ;wpisz zero pod adres wskazany przez R0
    DJNZ R0,_petla ;zmniejsz R0 i jeśli nie będzie zerem to skocz

    END


    END - jest taki rozkaz ? bo wydaje mi sie ze niema
  • REKLAMA
  • Pomocny post
    #10 2094239
    zumek
    Poziom 39  
    Posty: 3352
    Pomógł: 695
    Ocena: 52
    gol napisał:

    ...
    END - jest taki rozkaz ? bo wydaje mi sie ze niema

    EQU,INC,... - takich "rozkazów" też nie ma , a zapewne je stosujesz . To są instrukcje dla kompilatora , a nie dla uC-ka :D

    Piotrek
  • #11 2100718
    CRAFTKM
    Poziom 11  
    Posty: 9
    Witam,
    potrzebuje aby ktoś pomógł mi w zrealizowaniu takiego tematu:
    Przepisz tablicę 20 danych z pamięci RAM do XRAM.
    Byłbym bardzo wdzięczny gdyby ktos mi pomógł i napisał jak miałby
    wyglądać taki program. Z góry dziękuje.
  • #12 2100771
    genetix
    Poziom 24  
    Posty: 669
    Pomógł: 42
    a na czym to ma działać?
  • #13 2101139
    elektryk
    Poziom 42  
    Posty: 11029
    Pomógł: 439
    Ocena: 241
    I czy forum służy do odrabiana prac domowych?
  • #14 2101546
    CRAFTKM
    Poziom 11  
    Posty: 9
    to ma działac na mikrokontrolerze 8051.
  • #15 2103730
    GienekS
    Poziom 32  
    Posty: 1971
    Pomógł: 139
    Ocena: 15
    mov a,#20
    mov r0,a
    mov r1,a
    mov dptr,#0
    LOOP:
    mov a,@r0
    movx @dptr,a
    inc r0
    inc dptr
    djnz r1,LOOP
    KONIEC:
    jmp KONIEC
    coś takiego Święty Mikołaj powiedział że ma działać.:D
  • #16 2107595
    elektrokiler
    Poziom 18  
    Posty: 378
    Pomógł: 13
    Ocena: 9
    Zamiast KONIEC: jmp KONIEC wystarczy SJMP $

    Dodano po 1 [minuty]:

    poza tym to chyba nie jmp tylko ljmp...
  • #17 2108471
    ZbeeGin
    Poziom 39  
    Posty: 4329
    Pomógł: 605
    Ocena: 463
    Cytat:
    poza tym to chyba nie jmp tylko ljmp...


    Nie ma to żadnego znaczenia. Jak napiszesz w kodzie JMP to dobry kompilator zamieni ten rozkaz na odpowiedni dla długości skoku.
    Tutaj akurat wykorzysta SJMP. Wstawienie na sztywno LJMP było by tylko stratą jednego bajtu.

Podsumowanie tematu

✨ Dyskusja dotyczy sposobu wyzerowania całej wewnętrznej pamięci RAM mikrokontrolera 8051. Zaproponowano program w asemblerze, który iteracyjnie wpisuje zero do kolejnych adresów pamięci od 127 do 0, z wykorzystaniem rejestru R0 i instrukcji DJNZ. Zwrócono uwagę, że adres początkowy powinien być 127, a nie 128, ponieważ RAM ma 128 bajtów adresowanych od 0 do 127. Podkreślono, że kod działa poprawnie tylko przy ustawionym banku rejestrów 0, gdyż w przeciwnym wypadku może powstać nieskończona pętla. Zaproponowano na początku programu wymuszenie wyboru banku 0 przez odpowiednią modyfikację rejestru PSW (np. ANL PSW,#0E7H). Wskazano, że po resecie mikrokontrolera bank 0 jest domyślnie wybrany. Dyskusja poruszyła także kwestie instrukcji asemblerowych, które są rozkazami dla kompilatora, a nie dla samego mikrokontrolera (np. END, EQU, INC). W dalszej części pojawiło się pytanie o przepisanie tablicy 20 danych z RAM do XRAM, wraz z przykładowym kodem kopiującym dane za pomocą rejestrów R0, R1 i DPTR oraz instrukcji MOVX. Omówiono także różnice między instrukcjami JMP, SJMP i LJMP w kontekście długości skoku i optymalizacji kodu.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA