Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

Delay software

Raccolta di codici sorgenti

Moderatore: Foto UtentePaolino

0
voti

[1] Delay software

Messaggioda Foto UtenteIanero » 6 gen 2016, 13:04

Ho un PIC16C57 che lavora a 4MHz (quindi una istruzione al microsecondo) e mi viene chiesto di scrivere una subroutine che effettui un delay di 83 microsecondi.
CALL e RETLW usano 4 microsecondi in totale (per queste due il datasheet dice che occorrono due cicli macchina).
Dovrei perdere altri 79 microsecondi con 79 NOP in fila, ma mi sembra un po' fuori luogo.
Avevo pensato di usare TMR0 (dopo averlo azzerato all'interno della subroutine) e fare ciclicamente un test dei bit per vedere quando si arriva, anche se anche i ucr e i GOTO utilizzano a loro volta un ciclo ognuna, quindi c'è alto rischio di sbagliare di qualche microsecondo il delay totale.
Potrei salvare e contare a parte l'uscita di SOC2 fino a 79, ma dovrei ricorrere a un counter esterno e anche questo mi sembra eccessivo.
Non c'è un modo elegante (a parte i 79 NOP) che usi solo qualche riga di codice senza toccare né registri (come TMR0, che magari il programma stava già usando per altri scopi) né addirittura che mi costringa a utilizzare altro hardware?

Grazie in anticipo.
Servo, dai a costui una moneta, perché ha bisogno di trarre guadagno da ciò che impara.
Euclide.
Avatar utente
Foto UtenteIanero
7.309 5 8 13
Master EY
Master EY
 
Messaggi: 3765
Iscritto il: 21 mar 2012, 15:47

3
voti

[2] Re: Delay software

Messaggioda Foto UtenteCandy » 6 gen 2016, 13:11

Realizzare un delay significa tenere ferma tutta l'elaborazione in quel punto, fintanto che il tempo non è trascorso, (bruttissima tecnica che a me non è mai piaciuta). La tecnica utilizzata è un loop. Scritto il loop ne misuri o ne calcoli il numero di cicli di ritardo, che diventerà una sua costante di ritardo, quindi lo fari girare per enne volte, eventualmente aggiungendo successivamente una istruzione di "aggiustamento".
Poi dovrai considerare il linguaggio di programmazione ed il modo di inserirlo nel codice: macro in linea o chiamata a subroutine, che hanno qanche i loro tempi. Per i delay "veloci" è forse meglio una marco in linea.
Avatar utente
Foto UtenteCandy
32,4k 7 10 13
CRU - Account cancellato su Richiesta utente
 
Messaggi: 10132
Iscritto il: 14 giu 2010, 22:54

1
voti

[3] Re: Delay software

Messaggioda Foto Utentesimo85 » 6 gen 2016, 13:20

Userei il timer con interrupt.

Se non puoi usare il timer hardware (TMRx) per farlo via software farei un ciclo in cui incrementare o decrementare un valore. DI questo ciclo si può calcolare abbastanza facilmente il tempo di esecuzione e magari usare l'istruzione NOP per "aggiustare" il ritardo.

Ianero ha scritto:TMR0, che magari il programma stava già usando per altri scopi

Sei tu che decidi chi usa e come il TMR0, non la macchina (che fa solo quello che gli dici tu).

EDIT: preceduto da Mauro non avevo visto ! :-)
Avatar utente
Foto Utentesimo85
30,8k 7 12 13
Disattivato su sua richiesta
 
Messaggi: 9930
Iscritto il: 30 ago 2010, 4:59

0
voti

[4] Re: Delay software

Messaggioda Foto UtenteIanero » 6 gen 2016, 15:43

Sei tu che decidi chi usa e come il TMR0, non la macchina (che fa solo quello che gli dici tu).

Si ma stavolta mi viene chiesto di scrivere solo una subroutine che fa parte di un programma sconosciuto, quindi non posso sapere se al programma serviva già TMR0.

Grazie a entrambi.
Servo, dai a costui una moneta, perché ha bisogno di trarre guadagno da ciò che impara.
Euclide.
Avatar utente
Foto UtenteIanero
7.309 5 8 13
Master EY
Master EY
 
Messaggi: 3765
Iscritto il: 21 mar 2012, 15:47

1
voti

[5] Re: Delay software

Messaggioda Foto Utentesimo85 » 6 gen 2016, 15:46

Ianero ha scritto:mi viene chiesto di scrivere solo una subroutine che fa parte di un programma sconosciuto

Mmm ... allora vai col loop.

Anche se, a dir la verità, mi sembra una richiesta un po' strana.
Si fa prima a dire che non si può usare il timer hardware.
Avatar utente
Foto Utentesimo85
30,8k 7 12 13
Disattivato su sua richiesta
 
Messaggi: 9930
Iscritto il: 30 ago 2010, 4:59

1
voti

[6] Re: Delay software

Messaggioda Foto UtenteIanero » 7 gen 2016, 12:00

Grazie!
Servo, dai a costui una moneta, perché ha bisogno di trarre guadagno da ciò che impara.
Euclide.
Avatar utente
Foto UtenteIanero
7.309 5 8 13
Master EY
Master EY
 
Messaggi: 3765
Iscritto il: 21 mar 2012, 15:47

0
voti

[7] Re: Delay software

Messaggioda Foto UtenteWALTERmwp » 7 gen 2016, 14:40

Ciao Foto UtenteIanero, concordo con l'osservazione di Foto Utentesimo85 in [5].
Così come non puoi sapere se una risorsa è o meno già utilizzata, non puoi nemmeno escludere che un loop precalcolato e predefinito tramite istruzioni non venga a sua volta alterato dall'esecuzione del codice richiamato da altro evento (altro interrupt).

Saluti
W - U.H.F.
Avatar utente
Foto UtenteWALTERmwp
22,2k 4 8 13
G.Master EY
G.Master EY
 
Messaggi: 6443
Iscritto il: 17 lug 2010, 18:42
Località: le 4 del mattino

1
voti

[8] Re: Delay software

Messaggioda Foto UtentePaolino » 7 gen 2016, 14:51

Ianero ha scritto:mi viene chiesto di scrivere solo una subroutine che fa parte di un programma sconosciuto

Mah, personalmente starei mooooooolto attento. Non hai la visibilità del sistema, non conosci le risorse impiegate. Boh. Io mi farei mostrare l'architettura del sistema altrimenti il rischio di cappellare è dietro l'angolo.

Non è come fare una routine in C# che calcola il fattoriale di un numero.

Ciao.

Paolo.
"Houston, Tranquillity Base here. The Eagle has landed." - Neil A.Armstrong

-------------------------------------------------------------

PIC Experience - http://www.picexperience.it
Avatar utente
Foto UtentePaolino
32,0k 8 12 13
G.Master EY
G.Master EY
 
Messaggi: 4184
Iscritto il: 20 gen 2006, 11:42
Località: Vigevano (PV)

0
voti

[9] Re: Delay software

Messaggioda Foto UtenteWALTERmwp » 7 gen 2016, 16:51

O la questione posta a @Ianero è sottesa a discorsi pregressi (fatti dal docente o derivati da altra fonte) e in tal caso si potrebbe dedurre con maggiore certezza, altrimenti, posta così, può essere un po' tutto.
E dubbi, in un verso o in un altro, sono legittimi.
Se del programma sul quale vado ad integrare la funzione non ne so niente, posso anche, presuntuosamente prendermi la libertà di attingere a quanto mette a disposizione il chip; vero è che risulterebbe più cautelativa la rinuncia ad una risorsa.
Altro discorso, forse, per una attesa inferiore ai 100 microsecondi, è mettere in piedi la gestione del timer quando il quarzo esterno è da 4 MHz.

Saluti
W - U.H.F.
Avatar utente
Foto UtenteWALTERmwp
22,2k 4 8 13
G.Master EY
G.Master EY
 
Messaggi: 6443
Iscritto il: 17 lug 2010, 18:42
Località: le 4 del mattino

0
voti

[10] Re: Delay software

Messaggioda Foto Utenteluxinterior » 7 gen 2016, 17:34

Purtroppo non conosco il tuo micro ma se c'è un registro che viene incrementato con un clock certo (anche un timer hw destinato ad altri scopi) potresti leggere il valore del registro, sommare il ritardo, e fare un loop di confronto finché minore di. Va bene se lo scopo è avere almeno 83 microsecondi di ritardo ma se ti serve un ritardo preciso devi per forza appoggiarti a qualche risorsa hw.
Altra idea se non usi una periferica tipo la seriale una spi una i2C configurando il baudrate corretto simuli la trasmissione di un carattere e aspetti l'interrupt di trasmissione completa.
Avatar utente
Foto Utenteluxinterior
2.497 2 4 8
Expert EY
Expert EY
 
Messaggi: 1469
Iscritto il: 6 gen 2016, 17:48

Prossimo

Torna a Firmware e programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 0 ospiti