Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

Misurare intervallo stato alto pin

Raccolta di codici sorgenti

Moderatore: Foto UtentePaolino

0
voti

[21] Re: Misurare intervallo stato alto pin

Messaggioda Foto UtenteDavide90 » 30 ago 2014, 10:16

Grazie ragazzi, non ho avuto accesso al PC per tutti questi giorni!
Mi avete dato degli ottimi suggerimenti ed ho realizzato qualcosa.
Ho scritto il firmware ma non funziona come dovrebbe, ve lo lascio qui .
Il PIC in questione è un 16f628.

Codice: Seleziona tutto
/*
PIC : PIC16F628
date : 14/08/2014
PIC 2
Versione:1.00

*/

// definisco i fuses del PIC
#define _XTAL_FREQ 4000000
#pragma config FOSC=INTOSCIO
#pragma config CP=0
#pragma config CPD=0
#pragma config PWRTE=0
#pragma config WDTE=0
#pragma config MCLRE=1
#pragma config LVP=0
#pragma config BOREN=0


// importo le librerie
#include<stdio.h>
#include <htc.h>
#include <xc.h>

// definisco le porte di trigger dei 4 sensori ad ultrasuoni
#define SensoreM1Trig RB0
#define SensoreM2Trig RB1
#define SensoreM3Trig RB2
#define SensoreM4Trig RB3
// definisco le porte che indicano che il motore deve fermarsi
#define inhibitedM1 RA0
#define inhibitedM2 RA1
#define inhibitedM3 RA2
#define inhibitedM4 RA3

signed int TS1,TS2,TS3,TS4;// timer sensori ad ultrasuoni


// prototipi delle funzioni
void start();


void main(void){
        start();
}

void start(){
   //registro interrupt
INTCON=0b10101101;
//Imposto il timer0
OPTION_REG = 0b00000000; //imposto il prescaler a 2
// imposto le porte come input o output
TRISA=0b00000000; //Tutte le porte sono output
TRISB=0b11110000;// solo le porte RB7>RB4 sono input( per sfruttare gli interrupt)
// imposto le porte come livello basso
PORTA=0;
PORTB=0;
//Imposto il valore di partenza del TMR0;
TMR0=227;// deve partire da 227
TS1=0;
TS2=0;
TS3=0;
TS4=0;

while(1){
__delay_us(10);
inhibitedM1=0;
inhibitedM2=0;
inhibitedM3=0;
inhibitedM4=0;
__delay_us(10);
SensoreM1Trig=0;
SensoreM2Trig=0;
SensoreM3Trig=0;
SensoreM4Trig=0;
__delay_us(10);
SensoreM1Trig=1;
SensoreM2Trig=1;
SensoreM3Trig=1;
SensoreM4Trig=1;
__delay_us(10);
SensoreM1Trig=0;
SensoreM2Trig=0;
SensoreM3Trig=0;
SensoreM4Trig=0;
}
}


void interrupt ISR(void){
if (RBIF) // L'interrupt è stato causato cambiamento di stato di qualche porta ?
     {
 
         if (PORTBbits.RB7){// ogni volta che RB7 cambia stato
         //Echo Sensore M4

             if (TS4<30)
             {  inhibitedM4=1;
                  TS4=0;

             }else{
                inhibitedM4=0;

             }
         }

   
         if (PORTBbits.RB6){// ogni volta che RB6 cambia stato
       //Echo Sensore M3
           if (TS3<30)
             { inhibitedM3=1;

                  TS3=0;
             }else{
                inhibitedM3=0;
               
             }
         }

         if (PORTBbits.RB5){// ogni volta che RB5 cambia stato
         //Echo Sensore M2
         if (TS2<30)
             {inhibitedM2=1;

                  TS2=0;
             }else{
                inhibitedM2=0;
             }
         }

         if (PORTBbits.RB4){// ogni volta che RB4 cambia stato
      //Echo Sensore M1
         if (TS1<30)
             {  inhibitedM1=1;
                  TS1=0;
             }else{
                inhibitedM1=0;
             }

            RBIF=0;

           }

         }

     if (T0IF) // L'interrupt è stato causato da un overflow del timer0 ?
     {
         //ad ogni interrupt , che avviene ogni 58us(un centimetro) , incremento i contatori
         TS1++;
         TS2++;
         TS3++;
         TS4++;
         // se arrivo alla distanza massima ,di 4 metri, allora resetto i contatori
         if (TS1>400)
             TS1=0;
          if (TS2>400)
             TS2=0;
          if (TS3>400)
             TS3=0;
          if (TS4>400)
             TS4=0;

         TMR0=227;//reimposto il TMR0

         T0IF=0; // Resetto il flag interrupt su timer 0,
       } // fine che interrupt verificatosi su timer0



// fine interrupt service routine

}


Come potete vedere uso dei sensori ad ultrasuoni, voglio scrivere un firmware che eviti ad una automobilina di sbattere contro i muri :) .

Ho dimensionato bene il TIMER0 per avere un interrupt ogni 58us?
Voglio un Overflow interrupt del TIMER0 ogni 58 us perché , dai conti che ho fatto, alla velocità del suono si percorre 1 cm in 58 us.

Per il debug , ho collegato le uscite del PIC ad arduino uno.
esempio:
Mediante la DigitalRead di arduino leggo lo stato del pin RA0 del PIC, che,èer come ho scritto il firmware dovrebbe trovarsi ad alto livello, solo quando TS1<30.

Codice: Seleziona tutto
if (TS1<30)
             {  inhibitedM1=1;
                  TS1=0;
             }else{
                inhibitedM1=0;
             }


Invece rimane sempre a livello 1.
So che mi sono espresso male, quindi qualsiasi dubbio chiedete!!!

Sapete aiutarmi?

Grazie a tutti
Avatar utente
Foto UtenteDavide90
29 6
Frequentatore
Frequentatore
 
Messaggi: 130
Iscritto il: 5 lug 2012, 11:34

0
voti

[22] Re: Misurare intervallo stato alto pin

Messaggioda Foto UtenteWALTERmwp » 31 ago 2014, 1:25

L'impostazione del timer riferita ai 58 microsecondi è corretta il punto è ... ma "esattamente" in quale condizione ti rimane sempre a livello 1 ?
Sei certo di questo tuo riscontro ?
Quanto tempo impiega, il suono, a percorrere un centimetro ?
Per completare l'osservazione tieni presente che probabilmente l'interrupt del timer viene attivato con una frequenza superiore a quella dell'esecuzione di un ciclo del "loop while".
Quasi dimenticavo: sei certo di gestire correttamente i sensori ?

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

Precedente

Torna a Firmware e programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 8 ospiti