• Non ci sono risultati.

esecuzione task lettura_ingressi_locali

N/A
N/A
Protected

Academic year: 2021

Condividi "esecuzione task lettura_ingressi_locali"

Copied!
5
0
0

Testo completo

(1)

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() {

(2)

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 {

(3)

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;

}

(4)

// --- 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;

(5)

//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;

}

. . .

Riferimenti

Documenti correlati

Ingresso dall’accesso principale dalle ore 8.00 alle ore 8.10 Uscita dallo stesso accesso alle ore 14.00.. Ingresso e uscita

Si prende un bistabile di tipo D sincronizzato sul livello ma come clock gli si applica un segnale con livello alto di durata molto inferiore al livello basso, ovvero un clock di

On the figure below are drawed the positive level

In generale, l’uscita di un trasduttore “continuo” è un segnale di tipo analogico, per esempio una differenza di potenziale variabile nel tempo.. Il clock scandisce l’operazione

• I due valori logici vengono associati a intervalli di tensione che variano a seconda della tecnologia utilizzata per la costruzione del circuito... segnali analogici –

Segnali analogici : variano in modo continuo nel tempo e possono assumere tutti i valori compresi in un certo

Normalmente i circuiti d’ingresso dei sistemi elettronici di misura presentano un amplificatore (cioè un circuito attivo) per il quale è necessario stabilire e individuare un punto

ate o consociate, possono essere ritenuti responsabili per l'uso improprio delle informazioni contenute nel presente documento.... NOTA: Il sensore CJC è necessario solo