benishor Postat August 19, 2009 Partajează Postat August 19, 2009 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
cirip Postat August 19, 2009 Partajează Postat August 19, 2009 ?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
benishor Postat August 20, 2009 Autor Partajează Postat August 20, 2009 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
Elef Postat August 20, 2009 Partajează Postat August 20, 2009 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
benishor Postat August 24, 2009 Autor Partajează Postat August 24, 2009 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
Postări Recomandate
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 contAutentificare
Ai deja un cont? Autentifică-te aici.
Autentifică-te acum