Sari la conținut
ELFORUM - Forumul electronistilor

strings


benishor

Postări Recomandate

Bun? ziua,

 

M? fr?mânt? de ceva timp o întrebare : ce metod? folosi?i pentru a stoca/afi?a stringuri în asm ? Totul a pornit de la încercarea de a crea o rutin? de print care s? îmi trimit? caracter cu caracter al unui string în stil C ( /0 ended ) la LCD, deoarece m? s?turasem s? scriu prea mult ?i doream s? îmi fac codul mai lizibil.

 

Am g?sit urm?toarele solu?ii :

 

1) crearea unui macro de afi?are

 

Print macro StringTable    clrf    strIndex    ; init offset in string to 0    movf    strIndex, W ; load char at offset strIndex     call    StringTable ;      in W    xorlw   0x00        ; check if the currently read    btfsc   STATUS, Z   ;      char is 0 ( end of string )    goto    $+4         ; if end of string, goto end    call    LCDLetter   ; display read char    incf    strIndex, F ; increment string index    goto    $-7         ; go back to fetch and display    endm

de folosit îl folosim în felul urm?tor :

 

cblock  0x20        strIndex    endc        ...    TXT_SALUT    addwf   PCL, F    dt "Salut lume", 0    ....    Main        LCDinit        ...        Print   TXT_SALUT        ...

Dezavantajul în cazul de mai sus o reprezint? faptul c? fiecare instan?? a macroului va fi înlocuit? cu codul corespunz?tor, ceea ce ne m?nânc? din program memory.

 

2) folosirea unei subrutine

 

Print    movf    INDF, W     ;    xorlw   0x00        ;    btfsc   STATUS, Z   ;    goto    $+4         ;    call    LCDLetter   ;    incf    FSR, F      ;    goto    $-6         ;    return

module de folosire este încarcarea adresei în FSR ?i apelarea subrutinei :

 

cblock  0x20        strSalut:11        cnt, strIndex    endc    TXT_SALUT    addwf   PCL, F    dt "Salut lume", 0    ...    ; load string to ram        movlw   D'11'           ;    movwf   cnt             ;    movf    strSalut, FSR   ;    clrw                    ;    movwf   strIndex        ;L1    movf    strIndex, W     ;    call    TXT_SALUT       ;    movwf   INDF            ;    incf    FSR             ;    incf    strIndex, F     ;    decfsz  cnt, F          ;    goto    L1              ;        ...        ; using the previously loaded string        movf    strSalut, FSR   ;    call    Print           ;

Avantajul îl reprezint? faptul c? putem refolosi codul din program memory. Dezavantajul în schimb este c? trebuie s? stoc?m stringul în memoria RAM pentru a putea folosi modul de adresare indirect. Cum con?inutul memoriei RAM este volatil, mai trebuie s? ?i înc?rc?m stringurile în RAM la ini?ializarea programului( fie din EEPROM, fie din program memory ). De asemenea, mai exista un dezavantaj ?i anume faptul c? trebuie s? ?tim dinainte dimensiunea stringurilor pentru a ?ti cât s? aloc?m ( strSalut:11 ).

 

 

3) metoda ciob?neasc? :)

 

 

PrintSalut    movlw   A'S'        ;    call    LCDLetter   ;    movlw   A'a'        ;    call    LCDLetter   ;    movlw   A'l'        ;    call    LCDLetter   ;    movlw   A'u'        ;    call    LCDLetter   ;    movlw   A't'        ;    call    LCDLetter   ;    ...    return

mod de folosire :

 

call    PrintSalut  ;

Avantaje : usor de implementat, nu necesit? memorie RAM, nu necesit? cunoa?terea lungimii stringului. Dezavantaje : dificil de modificat stringurile, consumul memoriei program direct propor?ional cu num?rul de caractere, necesitatea unei subrutine pentru fiecare mesaj.

 

?i ca s? revin cu întrebarea : ce metod? folosi?i în mod uzual ?

 

Mul?umesc pentru aten?ie.

 

p.s. sunt încep?tor în microchip asm îns? am experien?? de programare în alte domenii a?a c? nu v? feri?i de termeni tehnici.

p.p.s : codul este scris din cap a?a c? s-ar putea s? nu se compileze sau s? fi uitat ceva. nu da?i cu pietre

Link spre comentariu
  • Răspunsuri 4
  • Creat
  • Ultimul Răspuns

Top autori în acest subiect

  • benishor

    3

  • cirip

    1

  • Elef

    1

Top autori în acest subiect

?i ca s? revin cu întrebarea : ce metod? folosi?i în mod uzual ?

Eu le folosesc pe toate. Daca vreau ceva repede, o dau pe aia ciobaneasca, fara jena. Chiar si aia cu macro se accepta, daca juma de FLASH e gol. Daca devine stransa treaba si daca am timp, atunci le perii si le fac mai elegant.
Link spre comentariu

Am descoperit o metod? elegant? de a afi?a stringuri in func?ie de o valoare. S-ar putea preabine s? fi reinventat roata.

 

cblock  0x20            gateState        endcMain        ...Loop        ...        call    PrintGate        ...        goto    LoopPrintGate        movf    gateState, W        addwf   PCL, F        goto    PrintGate1s        goto    PrintGate500ms        goto    PrintGate100ms        goto    PrintGate10ms        PrintGate1s        movlw   A'1'        call    LCDletr        movlw   A's'        call    LCDletr        return        PrintGate500ms        ...        returnPrintGate100ms        ...        returnPrintGate10ms        ...        return

Aparent banal îns? placut modul în care este pus? în valoare stiva. Mie personal mi-a fost de mare ajutor solu?ia.

 

?i pentru a nu deschide alt topic ...

 

Frustrat de faptul c? nu mi-au mers dou? versiuni de frecven?metre luate de pe net, m-am hot?rât s? îmi creez unul de la cap la coad? cu toate feature-urile pe care le doresc. Mi-am setat milestone-uri ?i am luat fiecare pas pe rând :

 

- realizarea unui programator

- înv??area instruc?iunilor microchip asm ?i a arhitecturii device-ului pe care îl folosesc ( PIC16F84A )

- ini?ializarea unui lcd

- input handling

- conversie din binar în bcd

- menu pentru configurare

- citire / scriere configurare din/în eeprom

 

Ata?at este ce-am reu?it s? realizez pân? în momentul de fa??.

 

Ce-a mai r?mas de f?cut este partea de m?sur? în sine, îns? nu prea ?tiu de unde s? o apuc. M-am g?ndit la folosirea întreruperilor pentru a incrementa un counter de 32b dar precizia ar l?sa de dorit din cauza ciclilor irosi?i în ISR handler. Conceptual cum se poate realiza o m?surare decent? cu autoscalare ?

Link spre comentariu

Daca am putine caractere de afisat pe LCD(3-5) atunci prefer metoda ciobaneasca.Daca stringurile sunt ceva mai lungi da' pana in 20 de caractere atunci folosesc ceva in genul macro-ului prezantat la metoda 1.Asta pentru partea de text a meniurilor sau ecranelor pe care le fac.Daca am valori numerice de tiparit atunci asta o voi face ulterior cu alte rutine.A ca o precizare lcd-urile folosite au fost 4x20 si 2x16 caractere.

Link spre comentariu

Pân? la urm? am adoptat solu?ia de num?rare a impulsurilor abordat? de DL4YHF. Am cur??at loop-ul de m?sur? ?i am adaptat afi?area la LCD. Singurul lucru care m? nemul?ume?te este rezolu?ia care scade direct propor?ional cu frecven?a ( din cauza cre?terii prescalerului . de exemplu, în intervalul 15Mhz - 30Mhz este de 128Hz ). Consider c? este totu?i ok pentru un pic16f84 condus de un cristal de 4Mhz. Proiectul a fost unul interesant pentru înv??area modului de lucru cu uC. Ce am înv??at "the hard way" a fost faptul c? inputurile trebuiesc duse la ground în lipsa semnalului ( folosesc 1 logic pentru stare de button pressed ), altfel se selecteaz? op?iuni aleator ?i c? debouncing-ul chiar nu e un moft.Pe viitor îmi doresc s? trec pe pic16f628 ?i s? încerc programarea unui counter cu rezolu?ie de 1Hz m?car pân? pe la 30Mhz ).

Link spre comentariu

Creează un cont sau autentifică-te pentru a adăuga comentariu

Trebuie să fi un membru pentru a putea lăsa un comentariu.

Creează un cont

Înregistrează-te pentru un nou cont în comunitatea nostră. Este simplu!

Înregistrează un nou cont

Autentificare

Ai deja un cont? Autentifică-te aici.

Autentifică-te acum



×
×
  • Creează nouă...

Informații Importante

Am plasat cookie-uri pe dispozitivul tău pentru a îmbunătății navigarea pe acest site. Poți modifica setările cookie, altfel considerăm că ești de acord să continui.Termeni de Utilizare si Ghidări