Ti propongo un codice che ho provato sul simulatore funziona bene , sul circuito(breadboard) funziona abbastanza male,cioè , mentre sul simulatore mi basta attivare le porte di un sensore ed ottengo tempi precisi( come da codice) sulla breadboard, se collego FRONTinhibitedPort a +5volt non ottengo un' onda precisa, bensì forme d' onda che assomigliano ad un disturbo, se invece tengo il filo in mano, ottengo una forma d' onda precisa, come i tempi da me impostati, solo invertita, cioè, 1,5 ms OFF e 18,5 ON..

ecco il codice :
- Codice: Seleziona tutto
// 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>
#include <PIC.h>
#define FRONTinhibitedPort RA0 // Dal sensore frontale
#define REARinhibitedPort RA1 // Dal sensore dietro
// PORTE DI INGRESSO DEL SEGNALE
#define MOTORE1INpos RB4
#define MOTORE2INpos RB5
#define MOTORE3INpos RB6
#define MOTORE4INpos RB7
// PORTE DI USCITA DEL SEGNALE
#define MOTORE1OUTpos RB0
#define MOTORE2OUTpos RB1
#define MOTORE3OUTpos RB2
#define MOTORE4OUTpos RB3
// prototipi delle funzioni
void start();
// variabili globali
unsigned int tempo=0;
void main(void){
start();// chiamo la funzione di inizializzazione
}
void start(){
// imposto le porte come input o output
INTCON=0b10100100;
// Configuro le porte A come uscite
CMCON=0x07;
OPTION_REG=0b00000000; //Prescaler =1/2
TRISA=0b00001111; //Tutte le porte sono input
TRISB=0b11110000;// solo le porte RB7>RB4 sono input( per sfruttare gli interrupt)
// imposto le porte come livello basso
PORTA=0;
PORTB=0;
T0IF=0;
RBIF=0;
// imposto il valore di partenza del TMR0
TMR0=206;
while(1){
if (FRONTinhibitedPort || REARinhibitedPort ){
if (FRONTinhibitedPort){
while(tempo<150){
MOTORE1OUTpos=1;
MOTORE2OUTpos=1;
}
while(tempo>150 && tempo<1850){
MOTORE1OUTpos=0;
MOTORE2OUTpos=0;
}
}
//inserire un while che controlla le varie porte
//ottimizzare con il switch case
//i sensori comunicano qualcosa?
}else{
MOTORE1OUTpos=MOTORE1INpos;
MOTORE2OUTpos=MOTORE2INpos;
tempo=0;
}
}
}
void interrupt ISR(void){
if (RBIF){
RBIF=0;
}
if (T0IF) // l' interrupt è stato causato dall' overflow del timer0
{ //l'interrupt è generato ogni 100 microsecondi
T0IF=0;
TMR0=206;
if (tempo>2000)
tempo=0;
tempo++;
}
// fine interrupt service routine
}
tu quali altre soluzioni proponi? di usare gli interrupt della porta B?

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)


