Vai Indietro   PcTuner Forum > Sezione Hardware > Programmazione PIC
Arcade Registrazione Blogs Regolamento Feedback FAQ Lista Utenti Calendario Segna come Letti

Ultimi 5 blog pubblicati su PcTuner Blog
Data Titolo

Rispondi
 
Strumenti Discussione Modalità Visualizzazione
Vecchio 17-06-2006, 02.54.23   #1
Registered User
 

Iscritto da: 18-10-2003
Messaggi: 22
Feedback: (0)
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
fastdius Non in Linea   Rispondi Citando
Vecchio 17-06-2006, 09.10.00   #2
Super Moderator
 
L'avatar di  FluidGuitar
 

Iscritto da: 04-01-2001
Locazione: Torino
Messaggi: 4,023
Feedback: (0)
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!
FluidGuitar Non in Linea   Rispondi Citando
Vecchio 17-06-2006, 09.47.15   #3
Registered User
 

Iscritto da: 18-10-2003
Messaggi: 22
Feedback: (0)
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!
fastdius Non in Linea   Rispondi Citando
Vecchio 18-06-2006, 10.21.17   #4
Registered User
 
L'avatar di  Camillo
 

Iscritto da: 31-01-2006
Locazione: Genova
Messaggi: 967
Feedback: (0)
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
Camillo Non in Linea   Rispondi Citando
Vecchio 18-06-2006, 11.09.04   #5
Registered User
 

Iscritto da: 18-10-2003
Messaggi: 22
Feedback: (0)
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
fastdius Non in Linea   Rispondi Citando
Vecchio 18-06-2006, 14.23.45   #6
Registered User
 
L'avatar di  Camillo
 

Iscritto da: 31-01-2006
Locazione: Genova
Messaggi: 967
Feedback: (0)
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
Camillo Non in Linea   Rispondi Citando
Vecchio 18-06-2006, 16.54.18   #7
Registered User
 

Iscritto da: 18-10-2003
Messaggi: 22
Feedback: (0)
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!
fastdius Non in Linea   Rispondi Citando
Vecchio 18-06-2006, 17.08.23   #8
Super Moderator
 
L'avatar di  FluidGuitar
 

Iscritto da: 04-01-2001
Locazione: Torino
Messaggi: 4,023
Feedback: (0)
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!
FluidGuitar Non in Linea   Rispondi Citando
Vecchio 18-06-2006, 17.13.03   #9
Registered User
 

Iscritto da: 18-10-2003
Messaggi: 22
Feedback: (0)
Ma questo cavolo di -19 a che serve???
fastdius Non in Linea   Rispondi Citando
Vecchio 18-06-2006, 18.22.36   #10
Super Moderator
 
L'avatar di  FluidGuitar
 

Iscritto da: 04-01-2001
Locazione: Torino
Messaggi: 4,023
Feedback: (0)
Quote:
Originariamente inviato da fastdius
Ma questo cavolo di -19 a che serve???
E' un offset.
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!
FluidGuitar Non in Linea   Rispondi Citando
Vecchio 18-06-2006, 18.29.17   #11
Registered User
 

Iscritto da: 18-10-2003
Messaggi: 22
Feedback: (0)
Scusa, ma ancora non capisco! Potresti spiegarmi in maniera un pò più semplice il tutto?
Come posso fare per evitare di inserire questo offset?

Grazie!
fastdius Non in Linea   Rispondi Citando
Vecchio 18-06-2006, 18.53.42   #12
Super Moderator
 
L'avatar di  FluidGuitar
 

Iscritto da: 04-01-2001
Locazione: Torino
Messaggi: 4,023
Feedback: (0)
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!
FluidGuitar Non in Linea   Rispondi Citando
Vecchio 18-06-2006, 18.59.53   #13
Registered User
 

Iscritto da: 18-10-2003
Messaggi: 22
Feedback: (0)
mplab non lo so usare.
cmq non è che non capisco un cavolo di niente!

...è solo il fatto dell'offset che non mi è chiaro.
cmq se non vuoi, non fa niente: aspetterò che mi risponda qualcun'altro!
ciao
fastdius Non in Linea   Rispondi Citando
Vecchio 18-06-2006, 19.33.28   #14
Super Moderator
 
L'avatar di  FluidGuitar
 

Iscritto da: 04-01-2001
Locazione: Torino
Messaggi: 4,023
Feedback: (0)
Quote:
Originariamente inviato da fastdius
mplab non lo so usare.
cmq non è che non capisco un cavolo di niente!

...è solo il fatto dell'offset che non mi è chiaro.
cmq se non vuoi, non fa niente: aspetterò che mi risponda qualcun'altro!
ciao
Se non avessi avuto voglia di risponderti non lo avrei fatto fin dal principio.
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!
FluidGuitar Non in Linea   Rispondi Citando
Vecchio 19-06-2006, 13.33.05   #15
Registered User
 
L'avatar di  Camillo
 

Iscritto da: 31-01-2006
Locazione: Genova
Messaggi: 967
Feedback: (0)
Quote:
Originariamente inviato da FluidGuitar
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.
Non sono daccordo con te; probabilmente è il sistema migliore per trattare le stringhe coi PIC da 14bit (con quelli da 16 ci sono altri metodi).
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:
Originariamente inviato da fastdius
Come posso fare per evitare di inserire questo offset?
Non lo puoi evitare deve esserci per forza.
Quote:
Originariamente inviato da fastdius
mplab non lo so usare.
Se hai intenzione di proseguire ad usare i PIC scaricatelo dalla rete (dovrebbe essere gratuito) ed usalo.
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
Camillo Non in Linea   Rispondi Citando
Vecchio 19-06-2006, 14.03.14   #16
Super Moderator
 
L'avatar di  FluidGuitar
 

Iscritto da: 04-01-2001
Locazione: Torino
Messaggi: 4,023
Feedback: (0)
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!
FluidGuitar Non in Linea   Rispondi Citando
Vecchio 19-06-2006, 15.35.44   #17
Registered User
 

Iscritto da: 18-10-2003
Messaggi: 22
Feedback: (0)
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!
fastdius Non in Linea   Rispondi Citando
Vecchio 19-06-2006, 16.09.04   #18
Registered User
 
L'avatar di  Camillo
 

Iscritto da: 31-01-2006
Locazione: Genova
Messaggi: 967
Feedback: (0)
Quote:
Originariamente inviato da fastdius
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!
Sei completamente fuori pista.
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
Camillo Non in Linea   Rispondi Citando
Vecchio 19-06-2006, 18.21.29   #19
Registered User
 

Iscritto da: 18-10-2003
Messaggi: 22
Feedback: (0)
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
...funziona perfettamente: Mi mostra la seconda e la terza stringa.
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!
fastdius Non in Linea   Rispondi Citando
Vecchio 19-06-2006, 23.33.17   #20
Registered User
 
L'avatar di  Camillo
 

Iscritto da: 31-01-2006
Locazione: Genova
Messaggi: 967
Feedback: (0)
Quote:
Originariamente inviato da Camillo
Sei completamente fuori pista.
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.
Ma allora non ci siamo capiti.
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
....
Così non dovrai più preoccuparti della lunghezza del testo.
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
Camillo Non in Linea   Rispondi Citando
Rispondi 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

Regole di scrittura
non Puoi inserire messaggi
non Puoi rispondere ai messaggi
non Puoi inviare allegati
non Puoi modificare i tuoi messaggi

codice vB è Attivo
Smilies è Attivo
[IMG] il codice è Attivo
Il codice HTML è Disattivato
Trackbacks are Disattivato
Pingbacks are Disattivato
Refbacks are Disattivato
Vai al Forum


Tutti gli Orari sono GMT +1. Attualmente sono le 08.50.57.


Powered by vBulletin Versione 3.6.12
Copyright ©2000 - 2009, Jelsoft Enterprises Ltd.
Search Engine Friendly URLs by vBSEO 3.2.0