robonyo Inserito: 19 ottobre 2007 Segnala Share Inserito: 19 ottobre 2007 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 bassoportb.1=1delay_us(10)portb.1=02) 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.SalutiAntonio Link al commento Condividi su altri siti More sharing options...
virgo71 Inserita: 19 ottobre 2007 Segnala Share Inserita: 19 ottobre 2007 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) programma un interrupt esterno sul fronte di un pin del PIC e collegaci il segnale del sensorec) nella routine di interrupt agganciata alla variazione del segnale azzera la variabile contatore e programma l'interrupt in modo che scatti sul fronte oppostod) 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 More sharing options...
robonyo Inserita: 19 ottobre 2007 Autore Segnala Share Inserita: 19 ottobre 2007 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.SalutiAntonioP.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 More sharing options...
virgo71 Inserita: 19 ottobre 2007 Segnala Share Inserita: 19 ottobre 2007 Sono spiacente ma non posso davvero esseti utile.Io utilizzo MPLAB con compilatore C (il C18 per PIC18FXXX).Ciao. Link al commento Condividi su altri siti More sharing options...
steven Inserita: 28 ottobre 2007 Segnala Share Inserita: 28 ottobre 2007 Dai ragazziFacciamo circolare un pò di codice. Più diamo meglio è per tutti.Non so se ti può aiutare ma qua c'è una mia routine che uso persettare un timer del 16F876A, per vedere se la seriale è libera per iltempo 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 More sharing options...
Messaggi consigliati
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 accountAccedi
Hai già un account? Accedi qui.
Accedi ora