Vai al contenuto
PLC Forum


Orologio A Display - sette segmenti... e vai!!!


aleda5859

Messaggi consigliati

Beh, come dice dlgcom stai saltando le tappe. Vai con calma e studia bene i vari capitoli, provando anche i programmi in pratica. Hai già tirato fuori il timer0, e le varie opzioni in merito.

Per adesso usa i vecchi cicli di ritardo tradizionali. Inoltre non ti imbarcare in programmi più complessi se li devi lasciare a mezzo. Fai qualcosa che tu possa provare in pratica se funziona, se poi sei in difficoltà ti do una mano.

Una curiosità: a parte i microprocessori, a che livello sei come conoscenza dell'elettronica digitale? Intendo dire porte logiche , risoluzione di circuiti combinatori, contatori, memorie, registri, circuiti sequenziali, numerazione binaria, calcolo binario... insomma questa roba qua.

Non è per scoraggiarti, ma cercare di usare un microprocessore senza sapere cosa sia un registro, o una sottrazione binaria, non è facile.

Ciao.

Link al commento
Condividi su altri siti


  • Risposte 157
  • Created
  • Ultima risposta

Top Posters In This Topic

  • aleda5859

    82

  • bit

    38

  • dlgcom

    13

  • Claudio F

    11

Top Posters In This Topic

In effetti le mie conoscenze rimangono a livello hobbystico... è che ho poco tempo per "studiare",con gli esami ecc a scuola quest'anno è un casino.

Il programma non è che l'avevo lasciato a metà..ma prima di andare avanti volevo sapere se stavo sbagliando oppure no...

Cosa intendi con "cicli di ritardo tradizionali?"

Non preoccuparti di scoraggiarmi... la verità è la verità..

Link al commento
Condividi su altri siti

Dunque, vediamo la differenza tra un ciclo di ritardo tradizionale e un ritardo generato da un timer ed eventualmente un'interrupt.

In un ciclo di ritardo tradizionale si fa eseguire al microprocessore una serie di istruzioni assolutamente inutili, ma sufficienti a "far perdere un certo tempo" prima di eseguire una certa operazione.

Se il tempo da "perdere" è poco, nell'ordine di alcuni microsecondi, esiste l'apposita istruzione NOP, istruzione assolutamente ininfluente sullo stato del micro, ma che impiega 1 ciclo macchina per essere eseguita, quindi, per un PIC con clock a 4 Mhz, corrisponde a 1 us. Come sai infatti un ciclo macchina corrisponde a 4 cicli di clock, e le istruzioni, per essere eseguite, richiedono 1 ciclo macchina (2 se l'istruzion eimplica un salto).

Se il tempo di ritardo è maggiore è inutile sprecare memoria per scrivere decine di istruzioni NOP, che tra l'altro non permetterebbero mai di raggiungere comunque ritardi consistenti. Si creano allora dei cicli di conteggio, anche più di uno dentro l'altro, fino a raggiungere il ritardo desiderato. Ovviamente va fatto un calcolo per vedere quanti cicli di conteggio servono, quale valore iniziale di conteggio va impostato, ecc...

La struttura tipica di un ciclo di ritardo è questa:

MOVLW 0x30

MOVWF TEMPO

CIC_RIT:DECFSZ TEMPO,F

GOTO CIC_RIT

se servono più cicli di conteggio insieme la forma diventa questa:

MOVLW 0x20

MOVWF TEMPO2

CIC_RIT2:MOVLW 0x30

MOVWF TEMPO1

CIC_RIT1:DECFSZ TEMPO1,F

GOTO CIC_RIT1

DECFSZ TEMPO2,F

GOTO CIC_RIT2

TEMPO1 e TEMPO2 sono registri generici.

A te provare a calcolare il ritardo introdotto, non è difficile.

Questo metodo ha il vantaggo di essere semplice, ma ha lo svantaggio di tenere occupata la CPU in istruzioni inutili. In tal caso si possono usare i timer interni, che se correttamente impostati, possono richiedere un'interrupt alla fine del conteggio e segnalare quindi che è trascorso un certo tempo da quando il ritardo è stato impostato. Nel frattempo la CPU può continuare a fare altre cose. La capacità di questi timer però è limitata, e spesso è necessario introdurre comunque un contatore di divisione nella subroutine di interrupt, ma questo lo vedremo poi.

Riguardo all'elettronica digitale non so se l'hai studiata a scuola (penso di si, visto che vuoi presentare il progetto come tesi d'esame, hai detto?) e come l'hai studiata (purtroppo ci sono professori che insegnano da cani), però è abbastanza importante per usare bene i micro sapercisi districare. Se non sei sicuro di quello che sai ti consiglio un ripasso.

Ciao.

Link al commento
Condividi su altri siti

sfortunatamente sono in un liceo scientifico.. e abbiamo cominciato appena quest'anno a parlare di corrente e magnetismo.. -_-'

Un ripassone comunque non fà mai male no? <_<:D

Per il ritardo vediamo.. noi inizializziamo tempo uno a 0x30 cioè 48 dec.. ogni ciclo macchina (4 clock..) viene decrementato di uno.. quindi -1 ogni Mhz giusto?

dopo 48 volte arriva a zero ed impiega un ciclo in più per l'istruzione di salto.. quindi in totale dopo 49 cicli ho "vuotato" tempo1 e hosaltato all'istruzione successiva...

lì decremento di uno temp2 (inizializzato a 32 dec..) e riprendo da capo....

in totale quindi per ogni decremento unitario di temp2 impiego 49 cicli macchina...

di decrementi me ne servono 32...

49 * 32 =1568 cicli macchina..che mi impegnano il pic nel ritardo...

quindi... considerato un ciclo = 1Mhz

la frequenza di ritardo sarà di 1.000.000/1568 Hz.. ovvero.. 637.7Hz

Il periodo quindi sarà di 1.5 millesimi di secondo circa... ho indovinato? :ph34r:

Link al commento
Condividi su altri siti

Giorgio Demurtas

ciao aleda,

se il tuo obiettivo è generare un colck di 1Hz dai uno sguardo all n°222 di F.E. , trovi la subroutine già bella pronta.

ciao

giorgio

ps. ho fatto il mio primo circuito semiserio con il pic....l'effetto supercar nello scooter! guardate la foto nel mio sito.

Link al commento
Condividi su altri siti

Qual'è il tuo sito????? ;)B)

mi spiegava bit che conviene partire da zero..e tirare su su le somme...

grazie per la dritta comunque..come sta il tutorial su fare elettronica dei pic?

Link al commento
Condividi su altri siti

Attento aleda5859, il ragionamento è giusto, ma hai tralasciato un piccolo particolare: nel ciclo di conteggio più interno vengono eseguite due istruzioni: quella di decremento DECFSZ, che non implicando nessun salto (a parte quando finisce il conteggio), utilizza un ciclo macchina, e un'istruzione di salto GOTO che chiude il ciclo e che utilizza due cicli macchina. Totale 3 cicli macchina per ogni decremento.

Il conto dell'esempio diventa quindi:

3x48x32=4608 cicli macchina.

Con il clock a 4 Mhz, ricordando che un ciclo macchina utilizza 4 cicli di clock il ritardo vale 4608 us.

Anche il 49 era sbagliato. Infatti se imposti 1 il ciclo non viene eseguito mai, si fa 1 decremento e si esce subito.

Comunque quando suggerivo un ripasso non intendevo i fondamenti dell'elettrotecnica in generale, ma un po' di elettronica digitale, porte logiche e giù di lì.

Non preoccuparti, l'orologio si farà!

Ciao!

Link al commento
Condividi su altri siti

Grazie bit per le delucidazioni anche stavolta ottimali..

Mi chiedevo però..se ogni istruzione di GOTO spendo 2 cicli macchina in più... non devo considerare anche quelli che mi servono per passare da temp2 a temp1? e quindi avere.. 3 x 48 x3 x 32 perchè ogni decremento di temp2 ho un ciclo per l'istruzione decremento e 2 per ritornare a temp1 inizializzato no?

quindi 3 * 48 * 3 * 32 = 13824 cicli..

13824 microsecondi..

mi sbaglio? :ph34r:

Link al commento
Condividi su altri siti

Intanto come primo post saluti al forum appena scoperto :)

Mi accodo subito a questo microscopico ;) thread in quanto anche io sono appassionato di micro, e ho messo un po'di note per principianti sul mio sito (dovrebbe funzionare l'iconcina sotto il messaggio).

Ho notato un po'di dubbi sul calcolo dei ritardi software... riprendo l'esempio di bit:

MOVLW 0x20

MOVWF TEMPO2

Queste due istruzioni vengono eseguite una sola volta, e durano 2uS

CIC_RIT2: MOVLW 0x30

MOVWF TEMPO1

CIC_RIT1: DECFSZ TEMPO1,F

GOTO CIC_RIT1

Questo ciclo interno prevede un'inizializzazione di TEMPO1 fatta con due istruzioni (quindi 2uS) e poi le due istruzioni vere e proprie del ciclo. Il ciclo e' vuoto (contiene solo il decremento e il GOTO) e dura esattamente 47*3+2uS, cioe' 143uS. Infatti per 47 volte si ha il decremento e il GOTO, e l'ultima volta si ha il decremento con skip del GOTO. In totale le 4 istruzioni durano quindi 145uS.

DECFSZ TEMPO2,F

GOTO CIC_RIT2

Questo ciclo esterno dura 31*3+2 uS + 32 volte tutto quello che contiene, cioe' le 4 istruzioni del ciclo interno di 145uS. In totale abbiamo 31*3+2 + 32*145 = 4735uS

Considerando anche le due istruzioni iniziali di caricamento in TEMPO2, l'insieme delle 8 istruzioni dell'esempio richiede esattamente 4737uS per essere eseguito.

ciao Claudio F

Link al commento
Condividi su altri siti

Ineccepibile l'analisi di Claudio. ;)

La mia formula è approssimata, dato che il grosso del ritardo è dato dal numero di ripetizioni del ciclo interno. Di solito, quando si usa più di un ciclo uno dentro l'altro è perchè uno solo non bastava. Il ciclo interno di solito è settato per valori alti, spesso proprio 256d, quindi le istruzioni dei cicli esterni hanno poca influenza. Inoltre difficilmente si ricerca la precisione con questo tipo di ritardi.

Ciao! :D

Link al commento
Condividi su altri siti

Al momento sono a scuola.. cerco di fare un ritardo di circa un secondo.. e stasera ve lo posto ok?

Sperando..di essere il più preciso possibile..

Link al commento
Condividi su altri siti

Intanto vediamo se ho capito bene... :

MOVLW 0x20 } “ queste due istruzioni le scrivo una volta ogni ciclo quindi mi –costeranno- ”

MOVWF TEMPO2 } “2uS e basta”

CIC_RIT2:MOVLW 0x30 | “queste istruzioni verranno ripetute ogni volta che ripartirà il

MOVWF TEMPO1 | “ciclo di ritardo 2.. 2 cicli macchina x ciclo”

CIC_RIT1:DECFSZ TEMPO1,F |“Settato il registro tempo1 a 48 dec ripeterò queste istruzioni

GOTO CIC_RIT1 |“per47volte[(1+2 ) x 47]e la 48esima volta avrò l’istruzione |“decfsz + lo skipp della stessa (2).Alla fine allora per ogni volta

|“che si azzererà il registro tempo uno avro speso[(1+2 ) x 47]+2 | “per queste istruzioni.

DECFSZ TEMPO2,F | “queste due istruzioni decrementeranno il registro tempo2

GOTO CIC_RIT2 | “che avverrà in 32 volte. 31 di queste comprenderanno le due | “istruzioni: 3 cicli. L’ultima volta decfsz+il suo salto (2)

In conclusione : {{2+[(1+2 ) x 47]+2} x 32 + [(31 x 3)+2] }} +2 = 4640 + 95 = 4735

ci sono?

Avrò:

{{2+[( 1+2 ) x Y]+2} x Z + [( V x 3)+2] }} +2 = 1 secondo.

dove :

Y = N° di inizializzazione di TEMPO1 - 1

Z = N° di inizializzazione di TEMPO2

V = N° di inizializzazione di TEMPO2 - 1

quindi... premettendo che non sono un matematico..

{{2+[( 1+2 ) x Y]+2} x Z + [(( Z-1 ) x 3)+2] }} +2 = 1.000.000

[[(3Y+4) * Z ] + (3Z - 1) ] +2 = 1.000.000

3ZY +7Z +1 = 1.000.000

Z(3Y - 7 ) - 999.999 = 0

Z = ( 999.999 ) / (3Y - 7)

Dando adesso un valore a Y ricordandoci che è N°TEMPO - 1

Y = 1120 (QUINDI tempo1 si dovrebbe inizializzare a 1121.. è possibile?)

Z= ( 999.999) / (3360 + 7)

Z = 999.999 / 3367

Z = 297 qUINDI tempo2

Link al commento
Condividi su altri siti

Cosa sono i NOP? Istruzioni che non fanno niente in pratica?

Avevo pensato ad una cosa del genere...

inizializzo TEMPO1 (Y+1) a 255

inizializzo TEMPO2 (Z+1) a 246

e immettere in ogni ciclo di ritardo 13 NOP

perciò..detto precedentemente :

{{2+[( 13+3 ) x Y]+2} x Z + [( V x (13+3) )+2] }} +2 = 1 secondo.

dove :

Y = N° di inizializzazione di TEMPO1 - 1

Z = N° di inizializzazione di TEMPO2

V = N° di inizializzazione di TEMPO2 - 1

adesso ottengo...

(4+16Y) x Z + 16Z-16 +4

Z (16Y + 20) - 12 = 1Mhz

Z = (1Mhz + 12 ) / (16Y + 20)

ricordando i valori dei registri... a me verrebbe un ciclo di circa 1.000.568

ogni duemila secondi ne perdo uno quindi... che dovrei fare? impostare una correzzione dopo unc erto tot di tempo?

Ringrazio ancora tutti per gli aiuti preziosi che mi date!

Link al commento
Condividi su altri siti

Il calcolo che hai fatto per il ritardo di un secondo è anche troppo preciso. Quando servirà un clock preciso useremo altri metodi.

Cos'è un NOP? Semplicemente una istruzione che non fa nulla, e che dura 1 ciclo macchina. Ma questo potevi anche scoprirlo dai data sheets dei pic. Li hai? Li puoi scaricare dal sito della microchip, ti saranno utili.

Ciao.

Link al commento
Condividi su altri siti

la seconda non richiede nulla di esterno ma facilmente il programma dovra' prevedere una procedura di correzione periodica (del tipo ogni tot conteggi scartarne uno ecc...).

Link al commento
Condividi su altri siti

Wow ragazzi grazie mille ancora per le risposte!

Adesso che abbiamo analizzato questa parte..cosa dite che conviene "provare"?

Per il ciclo effettivo di tempo base dovrò untilizzare il TMR0?

Link al commento
Condividi su altri siti

Rimanendo in tema di provare... li hai provati i programmi che ti ho segnalato? Funzionano? Altrimenti è inutile andare avanti... :rolleyes:

Ciao!

Link al commento
Condividi su altri siti

Dipende dal quarzo che useremo per il pic. Se la qualità è la stessa non cambia la precisione del clock esterno rispetto ai timer interni. Inoltre la correzione può anche essere fatta anche attraverso la calibrazione dell'oscillatore attraverso compensatori capacitivi.
Link al commento
Condividi su altri siti

Il timer0 è un po' rognoso per ottenere temporizzazioni cicliche, ma è possibile. E' sufficiente tenere conto delle istruzioni che passano tra l'arrivo dell'interrupt e il risettaggio del timer0 stesso. Questo tempo va aggiunto al tempo per cui è stato calcolato il valore del timer0. Di conseguenza non potremo mai disabilitare l'interrupt nel programma principale, pena la possibile perdita di sincronismo.

Altrimenti si usa un pic più evoluto come il 16F628, dove sono presenti 3 timer. Il timer2 in particolare può essere impostato con qualunque periodo compreso tra 1 e 256, senza dover risettare nulla in interrupt. Si possono quindi ottenere facilmente clock regolari e precisi.

Ciao!

Link al commento
Condividi su altri siti

grazie mille ancora per le preziosissime informazioni..

ah..avete ragione..intanto provo questi..e poi vi faccio sapere..

grazzzzzzzzzzzzzzzzzzz

Link al commento
Condividi su altri siti

  • 1 month later...
  • 2 weeks later...

ho uplodato le foto del programmatore in costruzione...

Devo essere pronto per gli esami.. azz...

Che ne pensate? Ho avuto qualche problema con la basetta.. (si nota vero?) ma non importa..

Visto come vengono bene le linee di rame? Solo con una lampada!!!!

Bit posso sempre contare sul tuo aiuto vero?

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