BaroneRosso.it - Forum Modellismo

BaroneRosso.it - Forum Modellismo (https://www.baronerosso.it/forum/)
-   Circuiti Elettronici (https://www.baronerosso.it/forum/circuiti-elettronici/)
-   -   Aiuto pic16f84 (https://www.baronerosso.it/forum/circuiti-elettronici/15027-aiuto-pic16f84.html)

SoldatoSemplice 17 novembre 05 10:48

Perfetto, grazie a voi il problema interrupt è risolto, quindi grazie, adesso ultima domandina sulla temporizzazione......(se divento troppo palloso non rispondete....)

L'ultimo (spero) cruccio rimastomi è: se io metto un quarzo da 4 Mhz quanto dura il tempo di esecuzione di una singola istruzione?

Secondo i miei calcoli se il quarzo è da 4 Mhz, il PIC esegue 4 milioni di istruzioni al secondo, quindi una sola istruzione dovrebbe durare 1/4Mhz, cioè 250 nanosecondi, non vi sembra un valore un pò troppo basso?

Avrei realizzato questa routine di ritardo secondo me funziona ma un parere di chi ne sa più di me è gradito: eccola...

DELAY MOVLW 254
MOVWF CONTALTO2
RISTCONT MOVLW 254
MOVWF CONTALTO
RITARDO MOVLW 254
MOVWF CONTBASSO
RITARDOBASSO DECFSZ CONTBASSO
GOTO RITARDOBASSO
GOTO RITARDOALTO0
RITARDOALTO0 DECFSZ CONTALTO
GOTO RITARDO
DECFSZ CONTALTO2
GOTO RISTCONT
RETURN

P.S.
Qualcuno mi potrebbe dare un semplice programmino per far lampeggiare un led, senza usare interruttori o periferiche di temporizzazione come i Timer interni..... solo un semplice stupido Lampeggio grazie, ed è vero che con una variabile di solo 8 bit si può ottenere un ritardo massimo di 2 millisecndi?


Scusate e Grazie

MSchiepp 17 novembre 05 11:36

Citazione:

Originally posted by SoldatoSemplice@17 novembre 2005, 10:48
L'ultimo (spero) cruccio rimastomi è: se io metto un quarzo da 4 Mhz quanto dura il tempo di esecuzione di una singola istruzione?

Secondo i miei calcoli...

Non per fare polemica, ma leggere le specifiche non farebbe male... e da lì scopriresti che ogni ciclo di istruzione impiega 4 cicli macchina e quindi a 4 Mhz ogni istruzione viene eseguita in 1 microsecondo (a parte i jump e le call da 2 cicli).

Per la routine di ritardo ti mando un paio di esempi più tardi, ma considera che fare i ritardi con loop di istruzioni non è un buon sistema e i timer interni sono fatti apposta per queste cose... ti consiglio quindi di partire con il piede giusto anche perchè così impari a fare cose che ti torneranno probabilmente utili anche più avanti.

Michele

Claudio_F 17 novembre 05 13:45

Citazione:

Originally posted by SoldatoSemplice@17 novembre 2005, 10:48
Avrei realizzato questa routine di ritardo secondo me funziona ma un parere di chi ne sa più di me è gradito: eccola...
[cut]
è vero che con una variabile di solo 8 bit si può ottenere un ritardo massimo di 2 millisecndi?

La routine funziona e cosi' come e' scritta se non ho sbagliato i conti dura 49,549307 secondi con clock di 4MHz. Il valore del registro W non viene mai alterato, quindi basta impostarlo la prima volta. Non capisco l'utilita' della riga " GOTO RITARDOALTO0".

Con un semplice decremento a 8 bit otteniamo 0,768mS:
Codice:

CLRF CL
 DECFSZ CL,F
 GOTO $-1

Aggiungendo qualche ritardo intermedio allunghiamo un po', ma siamo sempre su quei valori, la seguente routine dura 1,792mS:
Codice:

CLRF CL
NOP
NOP
NOP
NOP
DECFSZ CL,F
GOTO $-5


MSchiepp 17 novembre 05 14:41

1 Allegato/i
In allegato il programma promesso.

Michele

SoldatoSemplice 17 novembre 05 15:08

Grazie mille a tutti e due..... cosa farei io senza BaroneRosso....

SoldatoSemplice 21 novembre 05 11:42

Scusa Michele ma perche nel tuo programma davanti ai nuleri metti il punto?
Cos'è un modo per indicare "codice esadecimale"?

MSchiepp 21 novembre 05 12:11

Rappresentazione numeri
 
No, il punto identifica i numeri decimali come pure D'nn'; quelli esadecimali sono definiti come 0xnn oppure H'nn', i binari B'nnnnnnnn' e quelli ottali O'nn'

Se scrivi solo il numero viene interpretato in funzione del settaggio di default della variabile 'radix'.

Ciao,

Michele

MrCitopacco 22 novembre 05 23:08

comunque fare cicli di ritardo anche più lunghi non è un grosso problema.. con poche istruzioni si fanno più cicli l'uno dentro l'altro e con soli 3 cicli si raggiungono già decine di secondi..

SoldatoSemplice 28 novembre 05 10:55

Domanda per MSchiepp sul programma
 
Ciao Michele, senti scusa ma proprio non riesco a capire per quale motivo nel tuo programma usi i numeri decimali (tipo 0.178), e poi il compilatore come fa a tradurre in esadecimale un numero decimale?
Se il registro TMR0 deve essere impostato a 178 per avere 78 cicli, non dovrebbe essere qualcosa del tipo MOVLW 178 MOVWF TMR0?
Senza ".178"?

Scusa e grazie....

MSchiepp 28 novembre 05 11:41

Citazione:

Originalmente inviato da SoldatoSemplice
... Se il registro TMR0 deve essere impostato a 178 per avere 78 cicli, non dovrebbe essere qualcosa del tipo MOVLW 178 MOVWF TMR0?
Senza ".178"?

In MPASM è possibile specificare la notazione di default per i numeri: se il default è decimale, scrivere .10 o solo 10 non cambia, ma se il default è esadecimale, scrivere semplicemente 10 viene interpretato come 0x10 cioè 16!
Dato che può capitare di assemblare un programma su un sistema settato in modo diverso, per evitare confusioni è consigliabile:
1 - dichiarare sempre il tipo di dato insieme al numero
o
2 - utilizzare nel sorgente la direttiva 'radix' o il comando 'r' nella direttiva 'list' per selezionare il modo desiderato.

Ciao,

Michele


Tutti gli orari sono GMT +2. Adesso sono le 08:54.

Basato su: vBulletin versione 3.8.11
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
E' vietata la riproduzione, anche solo in parte, di contenuti e grafica. Copyright 1998/2019 - K-Bits P.I. 09395831002