Vai al contenuto
PLC Forum


Contatore In Assembler


ziopolly

Messaggi consigliati

Buongiorno a tutti!

Sono alle prese con un contatore scritto in assembler per un pic 16f84.

Come posso caricare la cifra "0" anzichè "10" dopo un incremento della cifra "9"?

...ebbene sì! ... sono proprio alle prime armi.

Grazie e ciao da ziopolly

Link al commento
Condividi su altri siti


scusa ma ti devi spiegare meglio...

Caricare dove ? su un registro , su un display , quante cifre e' il contatore?

Posta anche il codice , cosi vediamo dove si puo fare la modifica.

Non e' la prima volta che scrivi sul forum , sai che piu' dati dai meglio e'

Link al commento
Condividi su altri siti

Grazie Digicom,

quello che intendo fare è un semplice contatore up/down 0 – 999 che, in funzione dello stato (on/off) di due tasti denominati UP e DOWN, incrementa o decrementa il numero visualizzato su tre display.

A tal fine ho denominato tre byte del file register CountUnità CountDecine e CountCentinaia che contengono le tre cifre che compongono il numero da incrementare/decrementare e visualizzare.

La subroutine che decrementa è scritta, e dovrebbe funzionare. (l’ho testata con MPLAB SIM).

Ora dovrei scrivere la subroutine che incrementa: ovvero quando il tasto UP viene pigiato, deve essere incrementato il valore presente in CounUnità il quale, se vale 9 deve diventare 0 e automaticamente si deve incrementare di una unità il valore del CountDecine.

Spero di essermi spiegato, ma se non lo fossi stato, ti prego fammelo sapere.

Grazie ancora ed arrivederci.

ziopolly

Link al commento
Condividi su altri siti

E' banale.

If (CountUnità == 9)
    {
       CountUnità = 0);
       if (CountDecine == 9)
          {
             CountDecine = 0;
             if (CountCentinaia < 9) CountCentinaia++;
           }
         else CountDecine++;
      }
else CountUnità++;

Controllalo perchè sono distratto e ogni tanto dimentico punti e virgola. Comunque il principio mi sembra chiaro

Link al commento
Condividi su altri siti

Il fatto che ci sia qualcuno che giudica "banale" quello che per me è incomprensibile mi riempe il cuore di gioia!

Grazie, Livio Orsini per la pronta risposta.

Peccato, però che come già ho confessato in precedenza, comprendo (o meglio dovrei dire NON comprendo) solo ed esclusivamente il linguaggio ASSEMBLER e mi piacerebbe. prima di iniziare a scoprirne altri come il C, approfondire le mie conoscenze di detto linguaggio.

Il momento in cui anche per me sarà "banale" scrivere una routine così semplice in ASSEMBLER, potrò probabilmente dedicarmi a nuovi orizzonti più professionali e qualificanti.

Un ultima domanda: come considerate quel tizio che alla domanda dell'ignorante: "COME SI SCRIVE LIBRO IN FRANCESE?" gli risponde "BOOK"?

Per me la risposta è ...banale

ziopolly

Link al commento
Condividi su altri siti

A parte il fatto che in francese libro non si traduce "book" (è inglese) ma "livre", il prigramma in "C" serve solo come descrizione di quelle che bisogna fare. Se non avessi messo quelle quttro righe in "C" avrei dovuto scrivere due pagine che sarebbero state ancor meno comprensibili.

Un minimo sforzo di traduzione vorrai pur farlo :)

Segui le righe e prova a mettere delle istruzioni assembler con i test ed i salti. Poi magari pubblica il codice e vedrò di dargli un'occhiata.

Modificato: da Livio Orsini
Link al commento
Condividi su altri siti

Solo una domanda , se hai gia la routine che incrementa , hai gia quella che decrementa , devi solo fare il controllo quando ogni digito arriva a zero .

Posta la routine che la modifichiamo.

Link al commento
Condividi su altri siti

Grazie ancora digicom:

UpDownStore

call Visual ;Visualizza a turno le cifre presenti nei contatori

btfss STORE ;se=1 (non pigiato), salta un'istruzione

goto Memorizza ;scrivi nella EEPROM

btfss UP ;se=1 (non pigiato), salta un'istruzione

goto Incrementa

btfss DOWN ;se=1 (non pigiato), salta un'istruzione

goto Decrementa

goto UpDownStore

Memorizza ;ancora da scrivere

Incrementa ;NON SO COME SVILUPPARLA

Decrementa

movf CountUnita,W ;Copia il valore di CountUnità in W

btfss STATUS,Z ;se CountUnità =0, salta un'istruzione

goto DecUnita

movlw 9 ;metti il 9 nel CountUnità

movwf CountUnita

movf CountDecine,W ;Copia il valore di CountDecine in W

btfss STATUS,Z ;se CountDecine =0, salta un'istruzione

goto DecDecine

movlw 9 ;metti il 9 nel CountDecine

movwf CountDecine

movf CountCentinaia,W ;Copia il valore di CountCentinaia in W

btfss STATUS,Z ;se CountCentinaia =0, salta un'istruzione

goto DecCentinaia

movlw 9 ;metti il 9 nel CountCentinaia

movwf CountCentinaia

movlw 9 ;metti il 9 nel CountDecine

movwf CountDecine

movlw 9 ;metti il 9 nel CountUnità

movwf CountUnita

goto UpDownStore

DecUnita

decf CountUnita ;decrementa CountUnità

goto UpDownStore

DecDecine

decf CountDecine ;decrementa CountDecine

goto UpDownStore

DecCentinaia

decf CountCentinaia ;decrementa CountCentinaia

goto UpDownStore

Mi raccomando, non mi rispondere in tedesco....

Ciao

ziopolly

Link al commento
Condividi su altri siti

Questa è la parte unità:

   movf CountUnita,W  ;Copia il valore di CountUnità in W
     xrolw 9                ; test se unità = 9
     skpz                    ;se = 0 ==> unità = 9
     goto  inc_unita         ; se <9 incremento unità
                 movwf 0,CountUnita
     movf CountDecine,W;Copia il valore di CountUnità in W
................................................................................... ripeti per decine e centinaia
   ....................................................................................
 inc_unita
     incf CountUnita;incremeta unità
     goto fine
 inc_decine
     incf CountDecine;incremeta decine  
    goto fine       
 inc_cent
     incf CountCentinaia;incremeta decine  
 fine       

Controllare perchè sono distratto :)

Modificato: da Livio Orsini
Link al commento
Condividi su altri siti

Grazie Orsini per avermi risposto adottando il linguaggio che stò iniziando a balbettare.

Nel set di istruzioni del PIC16F84 non ho trovatO SKPZ ma ho risolto nel seguente modo:

incf CountUnita ;incrementa CounUnità

movlw 10 ;carica il valore 10 in W

xorwf CountUnita,W ;OR esclusivo tra CountUnità e W. Se uguali W=0

btfss STATUS,Z ;se W=0, salta un'istruzione

goto UpDownStore ;controlla se sono premuti i pulsanti

clrf CountUnita ;metti o in CountUnità

incf CountDecine

movlw 10

xorwf CountDecine,W

btfss STATUS,Z

goto UpDownStore

clrf CountDecine

incf CountCentinaia

movlw 10

xorwf CountDecine,W

btfss STATUS,Z

goto UpDownStore

clrf CountCentinaia

goto UpDownStore

Il suggerimento o meglio stratagemma da me cercato per risolvere il problema stava proprio nell'istruzione XORWF da me mai usata. Tale istruzione permette proprio di confrontare due valori secondo le regole del OR ESCLUSIVO.

Graze ancora ed arrivedrci alla prossima.

ziopolly

Link al commento
Condividi su altri siti

Hai perfettamente ragione!

Del resto se tutti noi ragionassimo un po' tutto diventerebbe banale... anche questo forum...

ziopolly

Link al commento
Condividi su altri siti

Crea un account o accedi per commentare

Devi essere un utente per poter lasciare un commento

Crea un account

Registrati per un nuovo account nella nostra comunità. è facile!

Registra un nuovo account

Accedi

Hai già un account? Accedi qui.

Accedi ora
×
×
  • Crea nuovo/a...