Vai al contenuto
PLC Forum


leggere durata stato high pin pic


robonyo

Messaggi consigliati

Salve a Tutti,

innanzitutto complimenti per la ricchezza di contenuti dei vari forum.

Detto questo, vengo subito al dunque.

Il mio problema è riuscire a calcolare il tempo in cui un pin del pic permane al livello logico 1 (anche senza utilizzo di interrupt).

Premetto che utilizzo il mikrobasic, ma andrebbe bene anche un esempio in asm.

A titolo informativo questo mi serve per leggere la distanza rilevata da un sensore ultrasuoni (SRF05) che funziona nel seguente modo:

1) si invia un segnale di trigger (di min 10uS):

e questo lo faccio ponendo un pin alto poi ritardo di 10 uS poi lo setto basso

portb.1=1

delay_us(10)

portb.1=0

2) e qui nasce il problema: il sensore restituisce in uscita un livello alto di durata proporzionale alla distanza rilevata.

Non so come calcolare la durata di questo livello alto.

Confido in Voi per poter risolvere questo problema che veramente da giorni mi dta assillando.

Grazie anticipatamente.

Saluti

Antonio

Link al commento
Condividi su altri siti


Ciao, non so che tipo di PIC stai utilizzando però un idea potrebbe essere questa:

a) definisci una variabile contatore che venga incrementata in interrupt con un qualsiasi timer con Tic abbastanza basso (dipendente dal periodo del segnale che vuoi misurare)

cool.gif programma un interrupt esterno sul fronte di un pin del PIC e collegaci il segnale del sensore

c) nella routine di interrupt agganciata alla variazione del segnale azzera la variabile contatore e programma l'interrupt in modo che scatti sul fronte opposto

d) al successivo interrupt (qundo il segnale del sensore è tornato al livello normale) riprogramma l'interrupt sul fronte opposto e leggi il valore della variabile contatore.

Spero di essere stato chiaro.

Ciao.

Link al commento
Condividi su altri siti

Ciao e grazie della risposta.

Il pic da utilizzare è il 18F452 ma posso utilizzare anche 1l 16F877A.

Sei stato molto chiaro, e già avevo realizzato qualcosa del genere (senza l'utilizzo di interrupt) con le istruzioni while e if ma il risultato non è quello che volevo, magari perchè il tempo dello stato alto da misurare va da 100uS a 25mS e considerando i tempi dei cicli macchina....

Supponevo anch'io che la soluzione era da ricercare negli interrupt en timer interno ma non so proprio come gestirli ho letto e riletto il manuale del mikrobasic ma non si parla di settaggi per far partire con un evento il timer interno e bloccarlo in seguito ad un'altro.

Anzi ad essere sincero non ho capito come inizializzarlo a 0, farlo partire con un evento(passaggio da 0 a 1) per poi bloccarlo con un altro evento (passaggio da 1 a 0) ed infine leddere il valore del timer.

Per quanto riguarda timer interno ed interrupt sono bianco come lo sfondo su cui scrivo..

Ti sarei infinitamente grato se potessi postarmi uno stralcio di codice.

Saluti

Antonio

P.S.: utilizzo mikrobasic ed un XTal di 20 MHz. Se per te è più comdo mi basterebbe anche un esempio in assembly che poi me lo studio.

Link al commento
Condividi su altri siti

  • 2 weeks later...

Dai ragazzi

Facciamo circolare un pò di codice. Più diamo meglio è per tutti.

Non so se ti può aiutare ma qua c'è una mia routine che uso per

settare un timer del 16F876A, per vedere se la seriale è libera per il

tempo di 4 byte a 19200 baud.

RX_flag

clrwdt ; puliamo il WatchDog mentre aspettiamo

movlw d'225'

movwf TMR0

bcf INTCON, T0IF ; resetta il flag del Timer0

go_bank1 ; banco giusto ?

bcf OPTION_REG, PSA ; assegna il prescaler al Timer0

bsf OPTION_REG, PS0 ; e mettilo a 1:128 avvia Timer0

bcf OPTION_REG, PS1 ; setta il Timer0 a (255-225)=30 * 64 (prescaler)=1920

bsf OPTION_REG, PS2 ; 921.600 Cicli / 1920 * 40 bit(4 byte) = 19200 baud

bcf OPTION_REG, T0CS ; abbiamo creato un timer che dura 4 byte a 19200 baud

go_bank0

btfsc PIR1, RCIF ; Controlla se e' arrivato del flusso

goto RX_flag ; se arriva qualcosa resetta il flag e ricomincia

;clrwdt ; puliamo il WatchDog mentre aspettiamo

btfss INTCON, T0IF ; se il flag del Timer0 e' 1 e non si riceve niente

goto $ - 4 ; possiamo mettersi in attesa di un messaggio.

clrf TMR0

bsf my_flags, wait_ok ; setta bit0 del registro privato

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