Ciao, sono d'accordo con il tuo ragionamento( e sicuramente è così che funziona il mondo PIC), ma il PIC non stava funzionando secondo la logica da te spiegata, cioè, la service routine esisteva in quanto gestivo l'overflow del timer0.
Il PIC andava in LOOP nella service routine(nemmeno la variabile contenuta nel T0IF veniva incrementato), suppongo non trovando l'istruzione (IF RBIF), perché disabilitando la configurazione RBIF e RBIE del registro INTCON e non modificando null' altro nel codice, il PIC ha ripreso a funzionare.
Per quanto riguarda il codice, ora funziona anche sul PIC, il problema era dovuto al modello del PIC.
Io ho compilato il progetto per il PIC 16f628A e caricandolo nel micro questo non funzionava( ne ho provati due), ma veniva caricato correttamente. Ricompilando il progetto per il PIC16F628 e caricandolo sul PIC 16F628 questo funziona perfettamente.
Sai darmi un'idea del perché? Dovrei provare a cancellare il PIC 16F628A con qualche strumento particolare??
Il firmware, ora, in fase di test, mi sono accorto, misurando con un'oscilloscopio, che i segnali di output variano da 8us ai 18us. mentre a me serve che il segnale generato sia a livello alto per 1,5ms e basso per 18,5 ms.
Ho provato ad usare le funzioni __delay_ms() ma sono abbastanza imprecise.
Secondo me dovrei riposizionare meglio le istruzioni
- Codice: Seleziona tutto
if(FRONTinhibitedPort)
do{
do{
MOTORE1OUTpos=1;
MOTORE2OUTpos=1;
}while(tempo==150);
do{
MOTORE1OUTpos=0;
MOTORE2OUTpos=0;
}while(tempo==1850);
} while(FRONTinhibitedPo
a parte che questo ciclo dentro ciclo dentro un IF non mi piace. Hai altri suggerimenti ??
ti posto il codice completo:
- 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 RA3 // Dal sensore frontale
#define REARinhibitedPort RA2 // Dal sensore dietro
// PORTE DI INGRESSO DEL SEGNALE
#define MOTORE1INpos RB4
#define MOTORE2INpos RB5
// PORTE DI USCITA DEL SEGNALE
#define MOTORE1OUTpos RB0
#define MOTORE2OUTpos RB1
// 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=0b10100001;
// 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;
// imposto il valore di partenza del TMR0
TMR0=206;
while(1){
if (FRONTinhibitedPort || REARinhibitedPort || DXinhibitedPort || SXinhibitedPort ){
//inserire un while che controlla le varie porte
//ottimizzare con il switch case
//i sensori comunicano qualcosa?
if(FRONTinhibitedPort)
do{
// dovrebbe simulare il segnale ppm
do{
MOTORE1OUTpos=1;
MOTORE2OUTpos=1;
}while(tempo==150);
do{
MOTORE1OUTpos=0;
MOTORE2OUTpos=0;
}while(tempo==1850);
} while(FRONTinhibitedPort);
if(REARinhibitedPort)
do{
// dovrebbe simulare il segnale ppm
do{
MOTORE3OUTpos=1;
MOTORE4OUTpos=1;
}while(tempo==150);
// __delay_us(1500);
do{
MOTORE3OUTpos=0;
MOTORE4OUTpos=0;
}while(tempo==1850);
} while(REARinhibitedPort);
}else{
MOTORE1OUTpos=MOTORE1INpos;
MOTORE2OUTpos=MOTORE2INpos;
}
}
}
void interrupt ISR(void){
// per il momento non è usato.forse non serve, bisogna verificare l' overing
if (T0IF) // l' interrupt è stato causato dall' overflow del timer0
{ //l'interrupt è generato ogni 100 microsecondi
/*
T0IF=0;
TMR0=206;
if (impulsoStick==2000)
impulsoStick=1000;
impulsoStick++;
*/
T0IF=0;
TMR0=206;
if (tempo==2000)
tempo=0;
tempo++;
}
// fine interrupt service routine
}