istruzione XORLW

Ciao ragazzi

Domanda banale ma non troppo:

Come posso fare un confronto dati in linguaggio assembly per PIC16F873?

Mi spiego meglio...

il PIC riceve una tensione su RA0 impostato come ingresso analogico e, in base a questo valore, fornire dei livelli sulle altre uscite (da RA1 a RA7) che vanno a pilotare un diplay.

avevo pensato a qualcosa di questo tipo

- conversione A/D (e fin qui il programma gira)

- confronto tra il contenuto del registro ADRESL e dei numeri fissi.

quest'ultimo passaggio non mi è molto immediato; avevo pensato di traferire il valore di ADRESL nell'accumulatore e, tramite una serie di:

XORLW D'numero' BTFSS STATUS,Z

controllare quando Z va a 1 ..

Perdonate eventuali eccessi di fantasia ma.... qualcuno ha idee migliori?

Thanks in advance!

Reply to
BFGoodrich
Loading thread data ...

"BFGoodrich" ha scritto nel messaggio news:g4ficj$159j$ snipped-for-privacy@newsreader2.mclink.it...

Ognuno si può sbizzarrire come vuole, ma anche io utilizzo lo xorlw.

Roberto P.

Reply to
Roberto P.

BFGoodrich ha scritto:

Magari puoi ottimizzare: dividi per due (shift right), esegui il confronto e salti alla successiva istruzione di conseguenza; se già non lo hai fatto, è una buona pratica; poi non mi sovvengono delle grandi alternative. ciao Angelo

Reply to
marcoangelo.r

Scusa... qual'è l'utilità di dividere per due?

Reply to
BFGoodrich

BFGoodrich ha scritto:

Dividi per due, confronti e decidi se maggiore re o minore; dividi di nuovo per 2 eccetera... riduci il numero di confronti. ciao Angelo

Reply to
marcoangelo.r

"BFGoodrich" ha scritto nel messaggio news:g4ficj$159j$ snipped-for-privacy@newsreader2.mclink.it...

Scusami, nel mio post precedente avevo pensato che tu dovessi discriminare solo fra pochi valori. Se devi invece fare una cosa differente per ogni possibile valore 0..255, allora ti consiglio di implementare una tabella che ti ritorna i valori da passare a RA1..RA7. Usi un pò di rom, ma hai tempi fissi di esecuzione e non appesantisci mai il ciclo principale.

Roberto P.

Reply to
Roberto P.

E' proprio quello che voglio fare, ma immagino che l'unica soluzione sia quella di fare 256 volte un confronto... o c'è un metodo più veloce?

Reply to
BFGoodrich

"BFGoodrich" ha scritto nel messaggio news:g4g1p8$19v5$ snipped-for-privacy@newsreader2.mclink.it...

Qualcosa tipo questo:

MOVF VALUE,W ;carichi il valore della conversione in W CALL Table1 ;'chiami' la tabella

..fai quello chedi fare col il valore di ritorno..

Table1 ADDWF PCL ;somma W al program counter, quindi punti a tutti i valori della tabella RETLW 0 ;per W=0 ritorna zero RETLW 1 ;per W=1 ritorna uno RETLW 2 RETLW 3 ... RETLW 255 ;fine tabella, per W=255 ritorna 255

In questo modo, per ogni valore hai sempre un tempo di esecuzione fisso dato dalla call + retlw. Unico vincolo è che la tabella non sia 'a cavallo' fra 2 pagine di memoria e considerare bene i bit di settaggio dei banchi.

Roberto P.

Reply to
Roberto P.

"Roberto P." ha scritto nel messaggio news:g4g3p1$5n2$ snipped-for-privacy@tdi.cu.mi.it...

Non ci avevo pensato! Grazie mille!

Reply to
BFGoodrich

BFGoodrich ha scritto:

Ottima soluzione, però velocità a scapito dell'occupazione di memoria. Devi proprio usare tutti i 256 valori? Non ti basta stare in un range di valori intorno al risultato? sarebbe molto più facile l'implementazione... Ricorda poi che se non hai un minimo di finestra, l'ad ti darà sempre risultati "ballerini"; o forse tronchi e usi gli

8 bit per avere una finestra? ciao Angelo
Reply to
marcoangelo.r

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.