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

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)






