|
|||||||
| Arcade | Registrazione | Blogs | Regolamento | Feedback | FAQ | Lista Utenti | Calendario | Segna come Letti |
| Ultimi 5 blog pubblicati su PcTuner Blog | ||
|
||
![]() |
|
|
Strumenti Discussione | Modalità Visualizzazione |
|
|
#1 |
|
Registered User
|
info su istruzione assembler: "dt"
Salve a tutti! Vorrei chiedervi una cosa:
su un listato per 16f84 trovato in rete ci sono delle istruzioni MOVLW seguite da uno spazio e poi da -6! Cosa significa quel -6?? Grazie a tutti! ciao |
|
|
|
|
|
#2 |
|
Super Moderator
|
Ciao fastdius,
__________________quell'istruzione non fa altro che inserire nel registro W il valore -6. Dal momento che i numeri negativi sono gestiti in complemento a 2 ti ritroverai in W il valore 1111 1010 o se preferisci FA in esadecimale ![]() ![]() ![]() ![]() Tu non sai niente, Jon Snow! |
|
|
|
|
|
#3 |
|
Registered User
|
Ciao! Grazie per la risposta, ma mi sono spiegato male.
In pratica, il listato gestisce un lcd. Ci sono varie stringhe che contengono le frasi che si possono visualizzare sul display tipo: testi addwf PCL,f testo1 dt "Prova1",0 testo2 dt "Prova2",0 testo3 dt "Prova3",0 ...e così via! Poi per richiamare una frase viene scritto: movlw testo2 -6 call viewtesto viewtesto sarebbe la subroutine che legge i vari carettari della frase e quando trova uno zero si ferma! a cosa serve il -6 dopo movlw testo2? Cosas viene caricato in W? Ho notato anche che in un programmino fatto da me prendendo spunto da quello trovato in rete, se scrivo il -6, le frasi non sono intere. Ho dovuto mettere -15. Solo che aggiungendo delle istruzioni prima delle stringhe con le frasi, il -15 non va più bene, e devo scrivere -16, -17... in funzione delle instruzioni aggiunte! Mi potete aiutare a capire? Grazie! |
|
|
|
|
|
#4 |
|
Registered User
|
L'informazione che ci hai dato è incompleta.
__________________Manca la parte relativa alla routine viewtesto, ricordati anche delle eventuali subroutine di questo. Dovresti ripostare il tutto includendolo nei TAG CODE usando il simbolo # che c'è qui sopra.
Camillo
Il VeroProgrammatore può contare fino a 1024 con le dita delle mani. Grazie a .mau. Le donne e i gatti fanno quello che vogliono, gli uomini e i cani dovrebbero rilassarsi e abituarsi all'idea. R.A.Heinlein |
|
|
|
|
|
#5 |
|
Registered User
|
Ragazzi, scusate! Cmq ora vi faccio vedere il programma fatto da me! Ho preso spunti dal sorgente originale. Il mio programma funziona! Alla label start ho dovuto mettere:
movlw testo1 -19 movlw testo2 -19 nel programma originale al posto del -19 c'era -6. Il mio programma con -6 non funziona! In pratia se uso -6 visualizza solo una parte della seconda frase. Aiutatemi a capire, grazie! Codice:
PROCESSOR 16F84 RADIX DEC INCLUDE "p16F84.INC" ERRORLEVEL -302 __CONFIG 3FF1H LCD_RS equ 0 LCD_E equ 1 ORG 0CH msdelaycounter RES 2 ORG 00H start bsf STATUS,RP0 movlw 00011100B movwf TRISA movlw 00000000B movwf TRISB bcf STATUS,RP0 clrf msdelaycounter+0 clrf msdelaycounter+1 movlw 30 call msdelay call lcdinit movlw testo1 -19 call viewtesto movlw 193 call send_command movlw testo2 -19 call viewtesto goto infiniteloop testi_lcd addwf PCL,F testo1 dt "Hitachi LCD 2x16",0 testo2 dt "Testo di prova",0 msdelay movwf msdelaycounter+1 clrf msdelaycounter+0 msdelayloop nop decfsz msdelaycounter+0,f goto msdelayloop nop decfsz msdelaycounter+1,f goto msdelayloop return send_command movwf PORTB bcf PORTA,LCD_RS bsf PORTA,LCD_E movlw 2 call msdelay bcf PORTA,LCD_E return send_data movwf PORTB bsf PORTA,LCD_RS bsf PORTA,LCD_E movlw 2 call msdelay bcf PORTA,LCD_E return lcdinit movlw 56 call send_command movlw 6 call send_command movlw 2 call send_command movlw 1 call send_command movlw 12 call send_command return viewtesto movwf FSR viewtestoloop movf FSR,w incf FSR,f call testi_lcd iorlw 0 btfsc STATUS,Z return call send_data goto viewtestoloop infiniteloop goto infiniteloop END |
|
|
|
|
|
#6 |
|
Registered User
|
Nell'immediato avrei voluto sparare un pistolotto a chi scrive sti numeri -6 o -19 che sia, ma poi mi sono detto "ma no, non se lo meritano", (il pistolotto intendo).
__________________Ti voglio dare un'imbeccata: se tu mettessi un bel nop tra le etichette start: e testi_lcd: scopriresti che il tuo -19 dovrebbe diventare -20. Ora io ti chiedo: che cosa ci metti al posto di 19 per fare in modo che ti funzioni sempre con qualunque istruzione aggiunta tra le 2 etichette suddette?
Camillo
Il VeroProgrammatore può contare fino a 1024 con le dita delle mani. Grazie a .mau. Le donne e i gatti fanno quello che vogliono, gli uomini e i cani dovrebbero rilassarsi e abituarsi all'idea. R.A.Heinlein |
|
|
|
|
|
#7 |
|
Registered User
|
Il fatto che il -19 dipende dal numero di istruzioni che precedono, lo avevo notato! Visto che non sono un esperto di programmazione, non riesco a capire a che cavolo serve quel -19 nè cosa potrei mettere al suo posto per far funzionare il programma con qualsiasi numero di istruzioni tra start e testi_lcd.
A dire il vero non mi spiego neanche cosa faccia l'istruzione: MOVLW testo1 - 19. Cosa carica nel registro W? testo1? Poi gli sottrae 19? ...e quale sarebbe il valore di testo1 visto che è una stringa di caratteri? Visto che hai già capito tutto e che sei moooooolto più esperto di me, potresti aiutarmi a capire? Grazie 1000!! Ciao! |
|
|
|
|
|
#8 |
|
Super Moderator
|
Attenzione! Testo1 NON è una stringa di caratteri.
__________________E' un'etichetta simbolica che rappresenta una locazione di memoria. Quindi il suo valore è un numero che corrisponde alla locazione di memoria in cui si trova l'opcode immediatamente successivo a dove è piazzata. Se provi a guardare su MPlab la finestra "program memory" troverai anche il valore di Testo1. ![]() ![]() ![]() Tu non sai niente, Jon Snow! |
|
|
|
|
|
#10 | |
|
Super Moderator
|
Quote:
Siccome l'accesso alla tabella in cui sono contenuti i valori da mandare al LCD è realizzato utilizzando come valore di offset quello contenuto nel registro FSR, è necessario calcolarselo in modo che il sistema funzioni sia con testo1 che con testo2, che si trovano però in due posizioni diverse. Se si aggiunge un'istruzione che fa scalettare testo1 e testo2, allora bisogna recuperare questo scarto aumentando l'offset. Onestamente mi sembra un sistema un po' contorto.... soprattutto perchè mi sembra che si sia cercato di realizzare un sistema, per così dire, parametrico (cioè che si adatti da solo anche modificando la stringa inviata al display e la posizione delle routine testo1 e testo2) mancando completamente quest'obiettivo. Infatti se allunghi le stringhe o sposti testo1 e testo2 devi ritoccare ogni volta il valore dell'offset. ![]() ![]() ![]() Tu non sai niente, Jon Snow! |
|
|
|
|
|
|
#12 |
|
Super Moderator
|
Ma non c'è molto da spiegare... basta che simuli il programma passo passo su MPLab e ti rendi conto di cosa fa.
__________________Se non hai presente il flusso del programma, qualsiasi mia spiegazione ti sembrerà oscura! Sai usare il simulatore di MPLab? ![]() ![]() ![]() Tu non sai niente, Jon Snow! |
|
|
|
|
|
#14 | |
|
Super Moderator
|
Quote:
E non ho neanche detto che non capisci niente! Quindi il tono offeso mi sembra fuori luogo. L'offset è semplicemente una traslazione: prendi un indirizzo di memoria e gli sommi una costante. Ma per capire, nel codice che hai postato, a cosa serve l'unica cosa che devi fare è simularlo. Puoi farlo con carta e penna o usare mplab, scegli tu. Ti renderai conto dei valori che assumono i registri PCL e FSR e i valori che hanno le etichette testo1 e testo2. E capirai da dove salta fuori il 19! Ma non puoi pretendere che ti faccia un debug passo passo sul forum!!! ![]() ![]() ![]() Tu non sai niente, Jon Snow! |
|
|
|
|
|
|
#15 | |||
|
Registered User
|
Quote:
E' la maniera con cui è stato presentato, senza commenti e con quel -6 che lo fa sembrare farraginoso. Per chi ha la bontà di leggermi: insisto ed insisterò sempre sulla necessità di mettere commenti a profusione e poi di utilizzare il più possibile delle costanti invece dei numeri. Se al posto di -6 che poi è diventato -19 il primo estensore avesse messo -testi_lcd il tutto sarebbe stato, non più chiaro, ma eseguibile e senza strani errori. Scritto così l'offset è automatico. Acci ho svelato l'arcano! Ma l'ho fatto per spiegare a fastdius che chi risponde non è che sia sadico per cui non da' le risposte pur sapendole ma lo fa per far ragionare e l'unica maniera è quella di picchiarcisi, con la pappa pronta non si impara. Se non hai o non vuoi usare MPLAB fallo con carta e matita, come ti è stato consigliato, io che queste cose le mastico da quando tu andavi all'asilo l'ho fatto a memoria. Ora caro fastdius delle informazioni che ti ho fornito fanne quello che credi: se al posto del tuo -19 ci metti -testi_lcd e ti accontenti la cosa ti funzionerà anche con altre stringhe ecc. ma rimarrai ignorante come prima ed io avrò fatto, comunque, una buona azione. Se propro non riesci ad andarci sopra fammelo sapere che analizzeremo il codice passo-passo. A proposito stai attento con le stringhe che non vadano oltre le prime 256 locazioni di programma altrimenti il progran-counter si ripiega e scoppiano le m.... Quote:
Quote:
Vedrai che in molti casi la sua simulazione ti verrà molto utile ed istruttiva.
Camillo
Il VeroProgrammatore può contare fino a 1024 con le dita delle mani. Grazie a .mau. Le donne e i gatti fanno quello che vogliono, gli uomini e i cani dovrebbero rilassarsi e abituarsi all'idea. R.A.Heinlein |
|||
|
|
|
|
|
#16 |
|
Super Moderator
|
Probabilmente hai ragione tu... ho usato un "mi sembra" perchè non mi sono soffermato più di tanto a ragionarci su.
__________________Però ho la sensazione che sfruttando l'indirect addressing si possa produrre qualcosa di più elegante... Ci penserò ![]() ![]() ![]() ![]() Tu non sai niente, Jon Snow! |
|
|
|
|
|
#17 |
|
Registered User
|
Carissimi amici! Grazie per le risposte. Ho usato mplab ed ho notato che con l'istruzione movlw testo1-19 l'accumulatore w viene caricato con zero, mentre con movlw testo2 -19 l'accumulatore w viene caricato con 17. Infatti se al posto di testo1 -19 scrivo zero e al posto di testo2 -12 scrivo 17, tutto funziona come prima!
In questo modo le etichette testo1 e testo2 non servono più, giusto? Ora io mi chiedo, a cosa serviva inserire testo1 -19 e testo2 -19? Solo per non variare nulla nel programma nel caso in cui la stringa di testo veniva modificata? O sono fuori pista?? Spero di capire il prima possibile! Ciao! |
|
|
|
|
|
#18 | |
|
Registered User
|
Quote:
Le etichette servono; eccome! ed anche tutte quelle che vorrai mettere in futuro (es. testo3 o testo15 ecc.). Leggiti per bene il mio post precedente.
Camillo
Il VeroProgrammatore può contare fino a 1024 con le dita delle mani. Grazie a .mau. Le donne e i gatti fanno quello che vogliono, gli uomini e i cani dovrebbero rilassarsi e abituarsi all'idea. R.A.Heinlein |
|
|
|
|
|
|
#19 |
|
Registered User
|
Ho modificato il programma così:
Codice:
PROCESSOR 16F84 RADIX DEC INCLUDE "p16F84.INC" ERRORLEVEL -302 __CONFIG 3FF1H LCD_RS equ 0 LCD_E equ 1 ORG 0CH msdelaycounter RES 2 ORG 00H start bsf STATUS,RP0 movlw 00011100B movwf TRISA movlw 00000000B movwf TRISB bcf STATUS,RP0 clrf msdelaycounter+0 clrf msdelaycounter+1 movlw 10 call msdelay call lcdinit movlw 17 call viewtesto movlw 192 call send_command movlw 32 call viewtesto goto infiniteloop testi_lcd addwf PCL,F dt "Hitachi LCD 2x16",0 dt "Testo di prova",0 dt "Testo numero tre",0 msdelay movwf msdelaycounter+1 clrf msdelaycounter+0 msdelayloop nop decfsz msdelaycounter+0,f goto msdelayloop nop decfsz msdelaycounter+1,f goto msdelayloop return send_command movwf PORTB bcf PORTA,LCD_RS bsf PORTA,LCD_E movlw 2 call msdelay bcf PORTA,LCD_E return send_data movwf PORTB bsf PORTA,LCD_RS bsf PORTA,LCD_E movlw 2 call msdelay bcf PORTA,LCD_E return lcdinit movlw 56 call send_command movlw 6 call send_command movlw 2 call send_command movlw 1 call send_command movlw 12 call send_command return viewtesto movwf FSR viewtestoloop movf FSR,w incf FSR,f call testi_lcd iorlw 0 btfsc STATUS,Z return call send_data goto viewtestoloop infiniteloop goto infiniteloop END L'unico problema potrebbe presentarsi se cambio il numero di caratteri di una stringa: in questo caso, se non si correggono i valori che si caricano in W prima di richiamare la subroutine viewtesto, le frasi visualizzate sul display non sono corrette! Sbaglio qualcosa? Cmq per quanto riguarda l'offset, il -19, il -testi_lcd o come cavolo vogliamo chiamarlo, ancora non riesco a capire bene! Se per voi non è troppo difficile da spiegare passo-passo, sarei contentissimo di provare a capire il funzionamento. Spero mi aiutate. A presto, ciao! |
|
|
|
|
|
#20 | |
|
Registered User
|
Quote:
O sono io che mi spiego proprio male o sei tu che sei tonto? Le etichette BISOGNA METTERLE. E poi cosa sono quei numeri: cosa significa "movlw 17", ti fa proprio schifo scrivere Codice:
.....
movlw testo2-testi_lcd ; Carico il vettore del testo.
call viewtesto
....
I calcoli bisogna farli fare all'assemblatore e non con il pallottoniere.
Camillo
Il VeroProgrammatore può contare fino a 1024 con le dita delle mani. Grazie a .mau. Le donne e i gatti fanno quello che vogliono, gli uomini e i cani dovrebbero rilassarsi e abituarsi all'idea. R.A.Heinlein |
|
|
|
|
![]() |
Per le vostre immagini su questo forum potete usare PcTunerUp! Iscriviti gratuitamente alla nostra newsletter. |
| Utenti attualmente attivi che stanno leggendo questa discussione: 1 (0 utenti e 1 visitatori) | |
| Strumenti Discussione | |
| Modalità Visualizzazione | |
|
|