Pagina 1 di 1

Ottimizzare codice C

MessaggioInviato: 10 ott 2011, 16:06
da Edge
Ciao a tutti,

Ho scritto un semplicissimo codice in C per un PIC18F1220 che esegue la seguente procedura:

ho 3 pulsanti, due che attivano delle uscite e uno di stop: premo un pulsante e aziono un'uscita. Se premo il secondo pulsante per azionare l'altra uscita NON deve accadere nulla (cioè l'attivazione di una uscita deve inibire l'altra per sicurezza).
Per poter azionare l'altra uscita devo premere un terzo pulsante, quello di STOP, il quale azzera le uscite precedentemente attive e attraverso un lampeggio di un led di circa 10 secondi fa attendere all'utente un certo tempo prima di attivare un'altra uscita. Allego il firmware:

Codice: Seleziona tutto
#define PREMUTO 0

#define ON 1

int pp=0;
int pp1=0;
int cont=0;
int valore=0;
void main()
{
ADCON1=0xFF;
ADCON1=0xFF;
Delay_ms(500);
TRISA=0x0D;
TRISA=0x0D;
PORTA=0;
PORTA=0;
TRISB=0x30;
TRISB=0x30;
PORTB=0;
PORTB=0;

// VARIABILI DI APPOGGIO

pp=0;
pp1=0;


while(1)
{

// PULSANTE AZIONAMENTO USCITA1 ATTIVO BASSO
// INSERISCO FUNZIONE DI ANTIRIMBALZO PRIMA DI ATTIVARE L'USCITA

  if((PORTB.F4==PREMUTO)&&(pp1==0)&&(pp==0))
  {
   Delay_ms(500);
   if((PORTB.F4==PREMUTO)&&(pp1==0)&&(pp==0))
   Delay_ms(500);
   if((PORTB.F4==PREMUTO)&&(pp1==0)&&(pp==0))
   {
   RB7_bit=RB7_bit^ON;
   Delay_ms(1000);
   RB7_bit=0;
   pp=1;
   }
   while(PORTB.F4==PREMUTO){};
   Delay_ms(50);
   }

// PULSANTE AZIONAMENTO USCITA2  ATTIVO BASSO
// INSERISCO FUNZIONE DI ANTIRIMBALZO PRIMA DI ATTIVARE L'USCITA

  if((PORTB.F5==PREMUTO)&&(pp1==0)&&(pp==0))
  {
   Delay_ms(500);
   if((PORTB.F5==PREMUTO)&&(pp1==0)&&(pp==0))
   Delay_ms(500);
   if((PORTB.F5==PREMUTO)&&(pp1==0)&&(pp==0))
   {
   RB6_bit=RB6_bit^ON;
   Delay_ms(1000);
   RB6_bit=0;
   pp1=1;
   }
   while(PORTB.F5==PREMUTO){};
   Delay_ms(50);
   }

// PULSANTE DI STOP ATTIVO ALTO
// INSERISCO FUNZIONE DI ANTIRIMBALZO PRIMA DI ATTIVARE L'USCITA
// IN TAL CASO IL PULSANTE DI STOP VERIFICA SE L'USCITA 1 è ATTIVA
// PRIMA DI AZIONARE L'USCITA 2.

if(PORTA.F0==ON && pp==1)
  {
   Delay_ms(50);
   if(PORTA.F0==ON && pp==1)
   {
   RB7_bit=0;
   do{
   Delay_ms(500);
   PORTA.F1=1;
   valore++;
   Delay_ms(500);
   PORTA.F1=0;
   }while(valore<10);
   valore=0;
   pp=0;
   }
   while(PORTA.F0==ON){};
   Delay_ms(50);
   }

// PULSANTE DI STOP ATTIVO ALTO
// INSERISCO FUNZIONE DI ANTIRIMBALZO PRIMA DI ATTIVARE L'USCITA
// IN TAL CASO IL PULSANTE DI STOP VERIFICA SE L'USCITA 2 è ATTIVA
// PRIMA DI AZIONARE L'USCITA 1.

if(PORTA.F0==ON && pp1==1)
  {
   Delay_ms(50);
   if(PORTA.F0==ON && pp1==1)
   {
   RB6_bit=0;
   do{
   Delay_ms(500);
   PORTA.F1=1;
   valore++;
   Delay_ms(500);
   PORTA.F1=0;
   }while(valore<10);
   valore=0;
   pp1=0;
   }
   while(PORTA.F0==ON){};
   Delay_ms(50);
   }
   

}
}


Il codice così come scritto funziona benino ma come potete vedere non è scritto bene (il software è ancora il mio punto debole). A volte mi capita che premendo uno dei due pulsanti che azionano le uscite, non succeda nulla, ma devo comunque premere lo stop per poter azionare la seconda uscita. E' come se a volte le variabili di "appoggio" pp e pp1 si attivassero anche se in verità non vedo l'uscita attivata. Questo però mi capita ogni tanto (non deve succedere però!!!) quando premendo uno dei due pulsanti che mi attivano le uscite non vedo nulla in uscita ma in verità devo premere lo STOP per poter attivare l'altra uscita (significa quindi che "pp" o "pp1" sono in qualche modo a 1 ).
Come posso ottimizzare il codice per rendere il codice un po' più robusto? Sarebbe meglio al posto degli "IF" sfruttare lo "Switch-case"?

Saluti

Edge

Re: Ottimizzare codice C

MessaggioInviato: 10 ott 2011, 23:04
da AjKDAP
Premetto che non ho letto tutto il tuo codice, ma l'ho passato molto velocemente.

Se hai scritto te il programma ed ora non capisci perché si comporta in modo strano, significa che non hai considerato tutte le possibili variabili in gioco. Una prova di correttezza del programma di sicuro lo dimostrerebbe.

In questi casi io ti consiglierei di prendere fidocadj e di creare un bel schema a blocchi delle funzioni che vorresti avere dal tuo microcontrollore.

Una volta che avrai chiaro tutte le possibili azioni che deve fare il programma potrai ad iniziare a scrivere il codice.

Scrivendolo "di botta" aggiungendo via via le varie funzionalità rischi di dimenticartene qualcuna e di avere comportamenti imprevisti :D

Penso che molti altri utenti sarebbero desiderosi di vedere un bel schema a blocchi :mrgreen: no?

Re: Ottimizzare codice C

MessaggioInviato: 10 ott 2011, 23:36
da TardoFreak
Più che uno schema a blocchi mi basterebbe vedere un sorgente con le tabulazioni rispettate. :roll:

Re: Ottimizzare codice C

MessaggioInviato: 11 ott 2011, 11:20
da Edge
Più che uno schema a blocchi mi basterebbe vedere un sorgente con le tabulazioni rispettate


Si, hai ragione. E' un mio difetto da elettrotecnico che però si sta impegnando anche in ambito della programmazione :roll:

Volevo allegare il file del diagramma di flusso ma come faccio?

Re: Ottimizzare codice C

MessaggioInviato: 11 ott 2011, 11:31
da Paolino
Disegnalo con FIDOCADJ, è il modo più semplice per poter fare le modifiche ;-)

Ciao.

Paolo.

Re: Ottimizzare codice C

MessaggioInviato: 29 ott 2011, 22:41
da angelorosso
non sarebbe più corretto mantenere gli ingressi alti con delle resistenze di pull-up e sfruttare i pulsanti per portarli a massa quando necessario?

Re: Ottimizzare codice C

MessaggioInviato: 29 ott 2011, 23:00
da TardoFreak
Lo era una volta quando si usavano i TTL per una serie di ottimi motivi. Oggi non ha più molto senso se non quello di utilizzare il potenziale di riferimento come collegamento comune per gli ingressi.