AIUTO!!Per Comparare il registro A a B e stabilire se è Uguale Maggiore o Minore

Aperto da Santo iw9hlk, 24 Agosto 2011, 18:08:39

Discussione precedente - Discussione successiva

0 Utenti e 1 Visitatore stanno visualizzando questa discussione.

Santo iw9hlk

Ciao A Tutti, sono incappato in una routine dove devo comparare due registri, da questo devo determinare se il primo è maggiore, minore, o uguale del secondo.
Avete qualche consiglio????
Santo
Nulla è per caso


Santo iw9hlk

Sto decrementando il primo registro A di uno, e poi il secondo B,in modo che se il primo va a zero salta l'istruzione, ed entra in un'altra che decrementa l'ultima volta B di uno (così verifico se è uguale ad A) così so se A è maggiore o minore di B. Dimenticavo di dire che quando decremento B controllo ugualmente se arriva a zero e da questo determino se è maggiore o minore di A.
Fare questo comporta un bel po di passaggi, qualcuno conosce un modo più semplice??
Grazie
Santo
Nulla è per caso

Lino

Citazione di: Santo il 24 Agosto 2011, 18:20:12
Sto decrementando il primo registro A di uno, e poi il secondo B,in modo che se il primo va a zero salta l'istruzione, ed entra in un'altra che decrementa l'ultima volta B di uno (così verifico se è uguale ad A) così so se A è maggiore o minore di B. Dimenticavo di dire che quando decremento B controllo ugualmente se arriva a zero e da questo determino se è maggiore o minore di A.
Fare questo comporta un bel po di passaggi, qualcuno conosce un modo più semplice??
Grazie
Santo

Ciao Santo,

molto brevemente e tenendo conto delle istruzioni limitate del pic, , io farei la sottrazione del primo registro dal secondo e controllerei i flag Zero e Carry del registro Status. Dopo la sottrazione, se il flag Z è alto i due registri hanno lo stesso valore; caso contrario, quindi sono diversi, se il C è alto è maggiore il secondo registro, altrimenti è maggiore il primo.

Spero di non aver fatto confusione, e questo è il caso più semplice di confronto tra dati a un byte.

Le cose si complicano leggermente se il confronto è tra dati a più di un byte.

Saluti, Lino



Santo iw9hlk

Diciamo che ho capito, anche se non ho mai utilizzato i flag Zero e Carry del registro Status, ma se il primo numero è più piccolo del secondo e viene fatta la sottrazione, cosa avviene??
Santo
Nulla è per caso

Lino

Citazione di: Santo il 24 Agosto 2011, 20:48:56
Diciamo che ho capito, anche se non ho mai utilizzato i flag Zero e Carry del registro Status, ma se il primo numero è più piccolo del secondo e viene fatta la sottrazione, cosa avviene??
Santo

Se si sottrae un registro che contiene il valore decimale 146 da un secondo che contiene il valore decimale 126 succede che dopo aver sottratto le prime 126 unità, quindi il secondo registro ha assunto il valore 0, ne vengono sottratte le rimanenti 20 unità, per cui andando a ritroso passa da 255 a 236.

Il passaggio per lo zero viene segnalato dal flag Carry che, nel caso della sottrazione con riporto, passa da 1 a 0.

Il flag Zero, anch'esso fa parte del registro Status, passa dallo stato basso a quello alto (1) ogni qual volta il risultato di un'operazione aritmetica, e non solo, dà come risultato 0.

Ecco perchè, come nel tuo caso, sottraendo un registro da un altro, oppure una costante da un registro, puoi determinare, interrogando i flag C e Z, la condizione di = > < tra i due valori.

Spero di essere stato sufficientemente chiaro.

Saluti, Lino


Santo iw9hlk

Nulla è per caso


Santo iw9hlk

Ho provato quella routine che dicevo, e funziona, accende un led se sono uguali, un altro se maggiore e un terzo se minore. Se si vuole confrontare due registri bisogna aggiungere qualche passaggio in più, ma non ritarda gli altri controlli del pic. Ora devo provare quello che mi ha consigliato Lino, vediamo se riesco a capire cosa devo scrivere per interrogare i flag Zero e Carry.
Nulla è per caso

Santo iw9hlk

Ci sono riuscito, ma quando è uguale dice "minore uguale" cioè accende sia il led del minore che quello dell'uguale, ora valuto la soluzione più conveniente per il mio caso.
Santo
Nulla è per caso


Lino

Citazione di: Santo il 25 Agosto 2011, 15:38:09
Ci sono riuscito, ma quando è uguale dice "minore uguale" cioè accende sia il led del minore che quello dell'uguale, ora valuto la soluzione più conveniente per il mio caso.
Santo


Se la sequenza è corretta non dovrebbe darti quel risultato, tranne che si scambino i due termini, penso.

cimabue

 ??? ??? ??? ??? ??? ??? ??? ??? ??? ???
beati voi che vi capite.....  8O :mrgreen:

Lino

Citazione di: cimabue il 25 Agosto 2011, 16:49:05
??? ??? ??? ??? ??? ??? ??? ??? ??? ???
beati voi che vi capite.....  8O :mrgreen:


Non ti far impressionare, è più facile di quello che immagini  :up:

Saluti, Lino

Santo iw9hlk

Ho scritto questo :

        MOVF     NumH,0
       SUBLW    b'00000010'
       BTFSS    STATUS,C
       goto   H7maggiore
       goto   H7minore

Hpari
      bsf      led0
      return

H7maggiore
      bsf      led1
      BTFSS    STATUS,Z
               return
               goto        Hpari
      return

H7minore
      bsf      led2
      BTFSS    STATUS,Z
               return
               goto          Hpari
      return



o forse conviene verificare prima Z??
Nulla è per caso


eddi

Citazione di: Santo il 25 Agosto 2011, 22:03:20
Ho scritto questo :

        MOVF     NumH,0
       SUBLW    b'00000010'
       BTFSS    STATUS,C
       goto   H7maggiore
       goto   H7minore

Hpari
      bsf      led0
      return

H7maggiore
      bsf      led1
      BTFSS    STATUS,Z
               return
               goto        Hpari
      return

H7minore
      bsf      led2
      BTFSS    STATUS,Z
               return
               goto          Hpari
      return



o forse conviene verificare prima Z??




Allora, ho dato un'occhiata veloce, mi sembra che nella subroutine H7maggiore e H7minore non puoi uscirtene con l'istruzione return,
non si utilizza quando termini le subrutine chiamate con l'struzione  Call? mentre invece te stai usando goto. giusto?

Lino

Citazione di: eddi il 25 Agosto 2011, 23:38:56
Citazione di: Santo il 25 Agosto 2011, 22:03:20
Ho scritto questo :

        MOVF     NumH,0
       SUBLW    b'00000010'
       BTFSS    STATUS,C
       goto   H7maggiore
       goto   H7minore

Hpari
      bsf      led0
      return

H7maggiore
      bsf      led1
      BTFSS    STATUS,Z
               return
               goto        Hpari
      return

H7minore
      bsf      led2
      BTFSS    STATUS,Z
               return
               goto          Hpari
      return



o forse conviene verificare prima Z??




Allora, ho dato un'occhiata veloce, mi sembra che nella subroutine H7maggiore e H7minore non puoi uscirtene con l'istruzione return,
non si utilizza quando termini le subrutine chiamate con l'struzione  Call? mentre invece te stai usando goto. giusto?


Confermo quanto correttamente riscontrato da eddi, inoltre mi sembra che come è scritto vada in h7minore anche quando i registri contengono lo stesso valore.

Io interrogherei prima il Z e solo in caso di diseguaglianza (Z=0) controllerei il C.

Saluti, Lino

oscar 3

Ragà, non ci ho capito na mazza, ma mi affascina. Al momento no perchè sono preso dal ripasso di elettronica e non voglio creare confusione, ma immagino che il mio prossimo studio sarà dedicato a questo argomento. Oggi non riesco neppure ad immaginare come si fa materialmente a programmare una PIC, etc... ma è un mondo che ripeto, mi affascina!!!
Le mie radio: Kenwood TS930 - Kenwood TS2000 - Midland 13-877 - Tokai PW 5024 - Midland 13-895 - CTE Alan 88 S - Galaxy Saturn - Midland 8001 S - President Lincoln...fino ad ora!



Skype: IT9DBC

Lino

Citazione di: oscar 3 il 26 Agosto 2011, 01:04:57
Ragà, non ci ho capito na mazza, ma mi affascina. Al momento no perchè sono preso dal ripasso di elettronica e non voglio creare confusione, ma immagino che il mio prossimo studio sarà dedicato a questo argomento. Oggi non riesco neppure ad immaginare come si fa materialmente a programmare una PIC, etc... ma è un mondo che ripeto, mi affascina!!!

Buona giornata.

Se il problema fosse il tempo disponibile sono d'accordo con te, diversamente io direi di non preoccuparti in quanto sono due settori comunicanti ma distinti l'un dall'altro.

Saluti, Lino

Lino

Citazione di: Santo il 25 Agosto 2011, 22:03:20
Ho scritto questo :

        MOVF     NumH,0
       SUBLW    b'00000010'
       BTFSS    STATUS,C
       goto   H7maggiore
       goto   H7minore

Hpari
      bsf      led0
      return

H7maggiore
      bsf      led1
      BTFSS    STATUS,Z
               return
               goto        Hpari
      return

H7minore
      bsf      led2
      BTFSS    STATUS,Z
               return
               goto          Hpari
      return



o forse conviene verificare prima Z??


Potresti provare in quest'altro modo:

                     movf        NumH,0
                     sublw       b'00000010'
                     btfsc        STATUS,Z
                     goto         Hpari
                     btfsc        STATUS,C
                     goto         H7maggiore
                     goto         H7minore

Hpari              bcf           led1
                     bcf          led2
                     bsf          led0
                     return

H7maggiore      bcf          led0
                     bcf          led2   
                     bsf           led1
                     return

H7minore         bcf          led0
                     bcf          led1
                     bsf          led2
                     return   

         
N.B.: ho ritenuto che a questa routine ci arrivi con una Call e quindi ci ho messo il Return; nel caso l'accensione dei led led1 e led2 fosse invertita sostituisci l'istruzione di controllo di C; ho previsto lo spegnimento dei led perchè non so se avviene da qualche altra parte del listato.

Saluti, Lino

Santo iw9hlk

Pensi benissimo, ci arriva da una chiamata, si nel listato c'è un pulsante che resetta tutte le uscite e registri. Ora provo quello che hai scritto, vediamo come và!! Intanto grazie per l'aiuto!!  :mrgreen:

Nulla è per caso


Santo iw9hlk

Citazione di: oscar 3 il 26 Agosto 2011, 01:04:57
Ragà, non ci ho capito na mazza, ma mi affascina. Al momento no perchè sono preso dal ripasso di elettronica e non voglio creare confusione, ma immagino che il mio prossimo studio sarà dedicato a questo argomento. Oggi non riesco neppure ad immaginare come si fa materialmente a programmare una PIC, etc... ma è un mondo che ripeto, mi affascina!!!


E' una bella esperienza usare i pic, ci vuole tempo, pazienza, e molta logica altrimenti non funziona nulla!!
Quando puoi prova!!!

Santo
Nulla è per caso

eddi

Ciao a tutti, sono un  paio di anni che non ho piu' programmato questo tipo di microcontrollore, ma e' molto interessante riprendere con queste istruzioni. dunque, return serve per uscire da una chiamata call, in questo caso pero' il flusso del programma tornerebbe all'istruzione successiva al comando call.
Io farei cosi:
inizio                    movf        NumH,0
                     sublw       b'00000010'
                     btfsc        STATUS,Z
                     goto         Hpari
                     btfsc        STATUS,C
                     goto         H7maggiore
                     goto         H7minore

Hpari              bcf           led1
                     bcf          led2
                     bsf          led0
                     goto esci

H7maggiore      bcf          led0
                     bcf          led2   
                     bsf           led1
                     goto esci

H7minore         bcf          led0
                     bcf          led1
                     bsf          led2
                     goto esci

Esci      .......   

dove con l'etichetta Esci si intende il resto del programma che vuoi fare, almeno cosi una volta eseguito il calcolo te ne esci e prosegui.
Io studiai i pic negli anni 90, da autodidatta, fotocopiando il corso che allora pubblico' Elettronica In, comprai il programmatore MPLAB e.... iniziai a far lampeggiare led ecc.
Poi sono venuti programmi decisamente piu' complicati, questo in Assembler e un po' di C negli anni successivi. Ottimo connubio tra programmazione e elettronica.
Ciao a tutti.
Eddi

Citazione di: Lino il 26 Agosto 2011, 07:03:48
Citazione di: Santo il 25 Agosto 2011, 22:03:20
Ho scritto questo :

        MOVF     NumH,0
       SUBLW    b'00000010'
       BTFSS    STATUS,C
       goto   H7maggiore
       goto   H7minore

Hpari
      bsf      led0
      return

H7maggiore
      bsf      led1
      BTFSS    STATUS,Z
               return
               goto        Hpari
      return

H7minore
      bsf      led2
      BTFSS    STATUS,Z
               return
               goto          Hpari
      return



o forse conviene verificare prima Z??


Potresti provare in quest'altro modo:

                     movf        NumH,0
                     sublw       b'00000010'
                     btfsc        STATUS,Z
                     goto         Hpari
                     btfsc        STATUS,C
                     goto         H7maggiore
                     goto         H7minore

Hpari              bcf           led1
                     bcf          led2
                     bsf          led0
                     return

H7maggiore      bcf          led0
                     bcf          led2   
                     bsf           led1
                     return

H7minore         bcf          led0
                     bcf          led1
                     bsf          led2
                     return   

         
N.B.: ho ritenuto che a questa routine ci arrivi con una Call e quindi ci ho messo il Return; nel caso l'accensione dei led led1 e led2 fosse invertita sostituisci l'istruzione di controllo di C; ho previsto lo spegnimento dei led perchè non so se avviene da qualche altra parte del listato.

Saluti, Lino

Santo iw9hlk

Salve a tutti, ho provato quello di Lino, funziona, ora devo sistemare alcune cose per far controllare più registri.
I pic sono interessanti, ma per sfruttarli al meglio devi conoscere tutte le funzioni e come utilizzarle, la prossima cosa che devo fare e scrivere e leggere su EEPROM dati, già ho trovato alcuni consigli, ma come sempre si devono provare per capirli e prendere dimestichezza!!!
Nulla è per caso

Lino

Citazione di: Santo il 26 Agosto 2011, 21:54:23
Salve a tutti, ho provato quello di Lino, funziona, ora devo sistemare alcune cose per far controllare più registri.
I pic sono interessanti, ma per sfruttarli al meglio devi conoscere tutte le funzioni e come utilizzarle, la prossima cosa che devo fare e scrivere e leggere su EEPROM dati, già ho trovato alcuni consigli, ma come sempre si devono provare per capirli e prendere dimestichezza!!!

:up: