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

Elettrotecnica e non solo (admin)
Un gatto tra gli elettroni (IsidoroKZ)
Esperienza e simulazioni (g.schgor)
Moleskine di un idraulico (RenzoDF)
Il Blog di ElectroYou (webmaster)
Idee microcontrollate (TardoFreak)
PICcoli grandi PICMicro (Paolino)
Il blog elettrico di carloc (carloc)
DirtEYblooog (dirtydeeds)
Di tutto... un po' (jordan20)
AK47 (lillo)
Esperienze elettroniche (marco438)
Telecomunicazioni musicali (clavicordo)
Automazione ed Elettronica (gustavo)
Direttive per la sicurezza (ErnestoCappelletti)
EYnfo dall'Alaska (mir)
Apriamo il quadro! (attilio)
H7-25 (asdf)
Passione Elettrica (massimob)
Elettroni a spasso (guidob)
Bloguerra (guerra)


