Vai al contenuto
PLC Forum


Conteggio E Riporto


ziopolly

Messaggi consigliati

Il fumo che mi esce dalle orecchie dovrebbe dimostrare che per lo meno ho provato, riprovato e straprovato... ma non ce la faccio!

Il problema è semplice (per chi conosce le basi di programmazione):

progetto: CONTATORE ALLA ROVESCIA 999-0

micro: PIC 16F84

linguaggio: ASSEMBLER

LOOP

call SEC ;SEC = conta un secondo mentre multiplexa i display

decf CountUnita ;Decremento Unità

btfss STATUS,Z ;Se CountUnita ha raggiunto lo 0, salta un'istruzione

goto LOOP

call SEC ;conta ancora un secondo mentre multiplexa con Unita = 0

movlw 9 ;quando ritorna carica il nove nel CountUnita

movwf CountUnita

decf CountDecine ;Quindi decrementa Decine perchè Unita passa da 0 a 9

btfss STATUS,Z ;Se CountDecine ha raggiunto lo 0, salta un'istruzione

goto LOOP

????

Se CountDecine = 0 (es. 909) che devo fare per far sì che continui ancora 9 volte il decremento delle unità e successivamente decrementi sia le decine che le centinaia?

Probabilmente, mi sfugge qualche stratagemma, o possiedo un Q.I. sotto la norma.

Grazie a tutti

ziopolly

Modificato: da ziopolly
Link al commento
Condividi su altri siti


decf CountDecine ;Quindi decrementa Decine perchè Unita passa da 0 a 9

btfss STATUS,Z ;Se CountDecine ha raggiunto lo 0, salta un'istruzione

goto LOOP

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

Grazie Livio, ma devi sapere che come non sono in grado di sviluppare una semplice subrutine in assembler, così non comprendo un "h" di qualsiasi altro linguaggio compreso il C.

Ciò nonostante mi pare molto strano che per una semplice operazione di riporto si debba scrivere un mega programma.

Se riesco a trovare un'istruzione che controlli lo stato di un contatore del file register (se è = a 0) e che mi faccia saltare o meno un'istruzione (tipo btfsc - btfss), forse ho risolto il problema...!?

Grazie ancora

Ciao a tutti da

ziopolly

Link al commento
Condividi su altri siti

ziopolly, purtroppo la programmazione è una disciplina rigorosa. Ci sono solo due modi per fare le cose: il modo corretto e quello sbagliato. Se le cose le fai correttamente tutto funziona correttamente, altrimenti non funziona per niente.

Nel tuo caso particolare devi tenere in considerazione che sei in deconteggio, e gli algoritmi inversi sono sempre più complessi di quelli diretti.

Devi verificare se le unità sono = 0, poi se le decine sono = 0 ed infine se le centinaia sono = 0; queste tre operazioni vanno eseguite in sequenza, saltandole solo quando al precedente risulta essere diversa da 0;

Guarda che tra il C che ti ho scritto e l'assembler per questo algoritmo non c'è poi molta differenza.

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...