AP P E N D I C E C
CO D I C E M I C R O C O N T R O L L O R E
// inizializzazione ciclo lento
task_in_progress = 1;
...
// --- CICLO LENTO ---
while(1) {
if (task_in_progress) {
task_in_progress = 0;
// esecuzione task
lettura_ingressi_locali();
lettura_messaggi();
calcola_nuovo_stato_nodo();
esegui_controllo();
scrivi_uscite_locali();
invia_pacchetto_host();
// fine task }
// attesa di un nuovo tick idle();
}
...
// --- lettura_ingressi_locali ---
void lettura_ingressi_locali() {
static Uchar star_0_A = 0;
static Uchar star_1_A = 0;
Uchar nuovo_star_0;
Uchar sample_in_on_off_A;
//campionamento interruttori
sample_in_on_off_A = PORTA_IN_on_off_A;
//RC che produce il nuovo stato evitando il rimbalzo //meccanico del pulsante
nuovo_star_0 = ( star_0_A & ~star_1_A ) |
( star_0_A & ~sample_in_on_off_A)|
( star_1_A & ~sample_in_on_off_A );
star_1_A = (~star_0_A & ~star_1_A &~sample_in_on_off_A)|
(star_0_A & ~star_1_A & sample_in_on_off_A);
star_0_A = nuovo_star_0;
//l'uscita della rete seq. coincide con star_0 ingressi_on_off = ~star_0_A;
...
// lettura ingressi analogici //11 cicli di ADC clock = 16.5us
sensore_posizione = adc_start_conv(POS);
sensore_precarico = adc_start_conv(PREC);
sensore_pressione = adc_start_conv(PRESS);
corrente = adc_start_conv(CORR);
...
// Lettura Messaggi Stato Veicolo sul canale 2
if ( !(CANEN2 & 0x04 )) // è arrivato qualcosa {
velocita_veicolo = CANMSG;
monitor = CANMSG;
}
CANSTCH = 0; // azzero i flag
CANCONCH |= (MSK_CANCONCH_CONF & CH_RxENA);
// riattivo la ricezione }
// Lettura Comandi LabVIEW sul canale 3
if ( !(CANEN2 & 0x08 )) // è arrivato qualcosa {
CAN_SET_CHANNEL(CHANNEL_3);
if ( CANSTCH & 0x20 ) // guardo se RXOK {
vel_motore_remota = CANMSG;
dir_motore_remota = CANMSG;
}
CANSTCH = 0; // azzero i flag
CANCONCH |= (MSK_CANCONCH_CONF & CH_RxENA);
// riattivo la ricezione }
...
void esegui_controllo() {
dir_motore = dir_motore_remota;
//dir_motore = 0 => dimuisco precarico //dir_motore = 1 => aumento precarico
//condizione di minimo precarico e comando di //dimuire il precarico
if(min_precarico && !dir_motore) vel_motore = 0;
else
//condizione di minimo precarico e comando di // il precarico
if(max_precarico && dir_motore) vel_motore = 0;
//attivazione corretta motore
else vel_motore = vel_motore_remota;
}
// --- aggiorna_stato_uscite ---
void scrivi_uscite_locali() {
DIR_MOTORE(dir_motore);
if(vel_motore) {
CCAP0H = ~(vel_motore-1);
MOTOR_ON;
}
else MOTOR_OFF;
}
...
//Invio messaggio stato motore sul canale 7 CAN_SET_CHANNEL(CHANNEL_7);
if ( !(CANEN2 & ( 1 << CHANNEL_7)) ) {
EA = 0;
CANMSG = corrente;
CANMSG = vel_motore;
CANMSG = dir_motore;
EA = 1;// invio messaggio CAN_IT_DISABLE;
// disabilitazione generale delle
//interruzioni provenienti dal CAN control.
CANIDT1 = (32*ID_STATO_DRIVER) / 256;
CANIDT2 = (32*ID_STATO_DRIVER) % 256;
// solo i 3 bit msb del registro CANSTCH = 0x00;
CANCONCH = 0;
CANCONCH = CONF_DLC_3 | CH_TxENA;
CAN_IT_ENABLE;
//Invio Messaggoi Sensori Sospensione sul canale 8 CAN_SET_CHANNEL(CHANNEL_8);
if ( !(CANEN2 & ( 1 << CHANNEL_8)) ) {
EA = 0;
CANMSG = sensore_posizione;
CANMSG = sensore_precarico;
CANMSG = sensore_pressione;
CANMSG = ingressi_on_off;
EA = 1; // invio messaggio CAN_IT_DISABLE;
// disabilitazione generale delle
//interruzioni provenienti dal CAN control.
CANIDT1 = (32*ID_SENS_SOSP) / 256;
CANIDT2 = (32*ID_SENS_SOSP) % 256;
// solo i 3 bit msb del registro CANSTCH = 0x00;
CANCONCH = 0;
CANCONCH = CONF_DLC_4 | CH_TxENA;
CAN_IT_ENABLE;
}
. . .