#include "compiler.h" #include "ecanpoll.h" #include "onewire.h" #include "xeeprom.h" #include #include union { unsigned short Val; struct { unsigned char LSB; /*Last significant byte*/ unsigned char MSB; /*Most significant byte*/ } bytes; } maxtemp; /*Temperatura divisa in due campi*/ void main(void) { BYTE data[2]; //Vettore contenente dati da inviare al nodo RX BYTE dataLen; //Nr di byte da inviare al nodo RX BYTE CONTAG; //Contatore Generico BOOL allarme; //Temperatura rilevata unsigned short comp; //Valore di confronto ADCON1=0x07; //Fase di inizializzazione hardware ADCON0=0x00; CMCON=0x07; TRISA = 0b00000000; TRISB = 0b00101011; TRISC = 0b10000000; TRISD = 0b00001000; TRISE = 0b00000000; PORTC_RC0=0; //LED GIALLO PORTC_RC1=1; //LED VERDE PORTC_RC2=0; //LED ROSSO OpenUSART(USART_TX_INT_OFF&USART_RX_INT_OFF&USART_ASYNCH_MODE&USART_EIGHT_BIT&USART_CONT_RX&USART_BRGH_HIGH, 64); putrsUSART("Avvio NODO CAN \n\r"); putrsUSART("Firmware ver1.0 - Corso CAN-BUS \n\r"); putrsUSART("Autore: Carlo Tauraso \n\r"); putrsUSART("------------------------------------\n\r"); if (OWReset()) { putrsUSART("DS18B20 OK \n\r"); putrsUSART("Inizializza DS18B20...\n\r"); for (CONTAG=1;CONTAG<=3;CONTAG++) //3 Rilievi a vuoto { OWReset(); OWTX(0xCC); OWTX(0x44); while (OWRX1()); //ciclo fino al termine della conversione OWReset(); OWTX(0xCC); //Lettura registri OWTX(0xBE); for (dataLen=1;dataLen<=9;dataLen++) //salta 9 byte data[0]=OWRX(); Delay10KTCYx(5000); //ritardo tra un rilievo e l'altro } } else putrsUSART("DS18B20 NO-OK \n\r"); XEEInit(EE_BAUD(CLOCK_FREQ, 400000)); //Inizializza EEPROM if (XEEBeginRead(EEPROM_CONTROL, 0x00) == XEE_SUCCESS) { putrsUSART("EEPROM OK \n\r"); maxtemp.bytes.MSB=XEERead(); maxtemp.bytes.LSB=XEERead(); XEEEndRead(); putrsUSART("TEMP.MAX OK \n\r"); } else putrsUSART("EEPROM NO-OK \n\r"); ECANInitialize(); putrsUSART("CAN OK \n\r"); putrsUSART("Premere SW0 per ogni invio.\n\r"); PORTC_RC1=0; //Spegnimento LED VERDE while (1) { while (PORTBbits.RB0 == 1); //Attesa pressione SWITCH B0 PORTC_RC2=1; //Accensione LED ROSSO OWReset(); OWTX(0xCC); //Rilievo temperatura OWTX(0x44); while (OWRX1()); //ciclo fino al termine della conversione OWReset(); OWTX(0xCC); //Lettura registri OWTX(0xBE); data[0] = OWRX(); //temperatura LOW BYTE data[1] = OWRX(); //temperatura HIGH BYTE for (dataLen=1;dataLen<=7;dataLen++) //salta i 7 byte rimanenti CONTAG=OWRX(); allarme = FALSE; if (data[1] <= 7) //Temperatura rilevata > 0 { comp = data[1]; comp = comp << 8; comp = comp + data[0]; if (comp > maxtemp.Val) allarme = TRUE; else allarme = FALSE; } if (allarme) while(!ECANSendMessage(0x123, data, 2, ECAN_TX_STD_FRAME)); else while(!ECANSendMessage(0x121, data, 2, ECAN_TX_STD_FRAME)); putrsUSART("TX MSG\n\r"); while (PORTBbits.RB0 == 0); //Attesa rilascio tasto Delay10KTCYx(50000); //ritardo tra un rilievo e l'altro PORTC_RC2=0; //Spegnimento LED ROSSO } }