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

[ATmega16][asm] problem z definicją łańcucha znaków

finch 18 Lut 2009 22:48 2088 4
REKLAMA
  • #1 6171241
    finch
    Poziom 20  
    Witam

    Bawie się akurat wyświetlaczem LCD 2x16 i doszedłem do etapu gdzie chce wysyłać łańcuch znaków za pomocą procedury.
    deklaracja łańcucha:

    
    .INCLUDE "M16DEF.INC"
    .dseg
    .org 0x0060
    txt: .db "string", 0xFF
    .cseg
    .org 0x000
    

    oczywiście wyświetlacz inicjalizuje się poprawnie, interfejs jest 4-bitowy opóźnienia mam zrealizowane też ok-sprawdzone.
    procedura którą wysyłam łańcuch:
    
    sstring:
    push AKU
    push R17
    ldi ZH, high(txt)
    ldi ZL, low(txt)
    
    .equ koniec = 0xff
     omt:
     lpm AKU,Z+
     
     cpi AKU,koniec
     breq koniec_pprog
     
     rcall dana
     rjmp omt
    
    
     koniec_pprog:
    pop R17
    pop AKU
    ret
    

    w tej konfiguracji program nie działa. Dodam że jeżeli zamieszczę deklaracje w sekcji .cseg:


    
    .INCLUDE "M16DEF.INC"
    ;.dseg
    ;.org 0x0060
    ;txt: .db "string", 0xFF
    .cseg
    .org 0x000
    txt: .db "string", 0xFF
    


    wszystko działa ok znaki są wysyłane, jeżeli zamienię do konfiguracji jak wyżej wyświetlacz pokazuje mi jakieś krzaki i w ogóle "cuda wianki"

    Nie mam pojęcia dlaczego nie widzi deklaracji z zakresu <0x060 przejrzałem już książkę ale niczego na ten temat się tam nie doczytałem a chciałbym wiedzieć ponieważ szkoda mi zaśmiecać segmentu .cseg jakimiś "śmieciami" jak .dseg jest pusty.
  • REKLAMA
  • #2 6174305
    zumek
    Poziom 39  
    finch napisał:
    ... ponieważ szkoda mi zaśmiecać segmentu .cseg jakimiś "śmieciami" jak .dseg jest pusty.

    Jeżeli zamierzasz programować w asemblerze, to wiedza dotycząca segmentów pamięci i różnic miedzy nimi, jest niezbędna tak, jak nam ludziom powietrze :-P
    Aby w segmencie danych(.dseg) znalazły się jakiekolwiek dane, to mikrokontroler musi je tam najpierw zapisać i innej możliwości nie ma.
  • REKLAMA
  • #3 6191276
    finch
    Poziom 20  
    zumek, dzięki za odpowiedź ale nie rozumiem co masz dokładnie na myśli,
    .dseg
    .org 0x0060
    txt: .db "string", 0xFF 

    ja myślałem że to jest miejsce w którym zapisuje dane do segmentu .dseg

    Zajrzałem jeszcze raz do książki poświęconej megom (J.Baranowski AVR ATmega w praktyce) i nie widzę tam żeby jakoś inaczej było to deklarowane teraz to już sam nie wiem o co chodzi z definicją.
  • REKLAMA
  • #4 6192536
    zumek
    Poziom 39  
    finch napisał:
    ...ja myślałem że to jest miejsce w którym zapisuje dane do segmentu .dseg

    W segmencie .dseg , można tylko zarezerwować przestrzeń i nic ponad to.
    .cseg - pamięć programu(w Twoim przypadku pamięć typu flash)
    .eseg - pamięć eeprom
    .dseg - pamięć (S)RAM
    A teraz zastanów się:
    a)do których segmentów pamięci można zapisać dane w procesie programowania uC :?:
    b)w których segmentach pamięci, dane pozostaną nawet po zaniku zasilania :?:
  • #5 6193519
    finch
    Poziom 20  
    Cholera fakt, ja źle to zrozumiałem, dnae zapisuje się tylko do .cseg, i .eseg i tylko w nich pozostają po zaniku zasilania.

    Czyli:
    a) najpierw rezerwujemy obszar pamięci:
    .dseg
    .org 0x0060
    txt: .byte5

    b) potem należałoby zapisać tam sobie jakieś dane np:
    
    kopiuj:
    ldi ZH, high(txt)
    ldi ZL, low(txt)
    st Z+, AKU
    ret
    

    c) potem już tylko czytać z obszaru gidze zapisałem sobie te dane(tylko do zaniku zasilania):
    
    czytaj_sram:
    ldi ZH, high(txt)
    ldi ZL,low(txt)
    ld AKU, Z+
    ret
    


    dobrze rozumuje?
REKLAMA