• 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

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

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

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

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