Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

Ottimizzare codice C

Tipologie, strumenti di sviluppo, hardware e progetti

Moderatore: Foto UtentePaolino

0
voti

[1] Ottimizzare codice C

Messaggioda Foto UtenteEdge » 10 ott 2011, 16:06

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
Avatar utente
Foto UtenteEdge
60 1 3
New entry
New entry
 
Messaggi: 98
Iscritto il: 3 ago 2010, 17:22
Località: Ro Ferrarese (Ferrara)

2
voti

[2] Re: Ottimizzare codice C

Messaggioda Foto UtenteAjKDAP » 10 ott 2011, 23:04

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?
Avatar utente
Foto UtenteAjKDAP
1.255 2 6 9
Expert EY
Expert EY
 
Messaggi: 796
Iscritto il: 17 mag 2006, 0:13
Località: nella coda dei pronti

0
voti

[3] Re: Ottimizzare codice C

Messaggioda Foto UtenteTardoFreak » 10 ott 2011, 23:36

Più che uno schema a blocchi mi basterebbe vedere un sorgente con le tabulazioni rispettate. :roll:
"La follia sta nel fare sempre la stessa cosa aspettandosi risultati diversi".
"Parla soltanto quando sei sicuro che quello che dirai è più bello del silenzio".
Rispondere è cortesia, ma lasciare l'ultima parola ai cretini è arte.
Avatar utente
Foto UtenteTardoFreak
73,9k 8 12 13
-EY Legend-
-EY Legend-
 
Messaggi: 15754
Iscritto il: 16 dic 2009, 11:10
Località: Torino - 3° pianeta del Sistema Solare

0
voti

[4] Re: Ottimizzare codice C

Messaggioda Foto UtenteEdge » 11 ott 2011, 11:20

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?
Avatar utente
Foto UtenteEdge
60 1 3
New entry
New entry
 
Messaggi: 98
Iscritto il: 3 ago 2010, 17:22
Località: Ro Ferrarese (Ferrara)

0
voti

[5] Re: Ottimizzare codice C

Messaggioda Foto UtentePaolino » 11 ott 2011, 11:31

Disegnalo con FIDOCADJ, è il modo più semplice per poter fare le modifiche ;-)

Ciao.

Paolo.
"Houston, Tranquillity Base here. The Eagle has landed." - Neil A.Armstrong

-------------------------------------------------------------

PIC Experience - http://www.picexperience.it
Avatar utente
Foto UtentePaolino
32,6k 8 12 13
G.Master EY
G.Master EY
 
Messaggi: 4226
Iscritto il: 20 gen 2006, 11:42
Località: Vigevano (PV)

0
voti

[6] Re: Ottimizzare codice C

Messaggioda Foto Utenteangelorosso » 29 ott 2011, 22:41

non sarebbe più corretto mantenere gli ingressi alti con delle resistenze di pull-up e sfruttare i pulsanti per portarli a massa quando necessario?
Avatar utente
Foto Utenteangelorosso
40 3
New entry
New entry
 
Messaggi: 61
Iscritto il: 17 lug 2011, 22:36

0
voti

[7] Re: Ottimizzare codice C

Messaggioda Foto UtenteTardoFreak » 29 ott 2011, 23:00

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.
"La follia sta nel fare sempre la stessa cosa aspettandosi risultati diversi".
"Parla soltanto quando sei sicuro che quello che dirai è più bello del silenzio".
Rispondere è cortesia, ma lasciare l'ultima parola ai cretini è arte.
Avatar utente
Foto UtenteTardoFreak
73,9k 8 12 13
-EY Legend-
-EY Legend-
 
Messaggi: 15754
Iscritto il: 16 dic 2009, 11:10
Località: Torino - 3° pianeta del Sistema Solare


Torna a Realizzazioni, interfacciamento e nozioni generali.

Chi c’è in linea

Visitano il forum: Nessuno e 8 ospiti