//Main void main(void) { initBoard(); backlightOn(); //Configure interrupts //Interrupt on RB1 = SW_E OpenRB1INT(PORTB_CHANGE_INT_ON & FALLING_EDGE_INT & PORTB_PULLUPS_OFF & PORTB_INT_PRIO_HIGH); //Interrupt on RB0 = SW_W OpenRB0INT(PORTB_CHANGE_INT_ON & FALLING_EDGE_INT & PORTB_PULLUPS_OFF & PORTB_INT_PRIO_LOW); //Enable button input => not needed, see dwengoBoard.c->initBoard(); TRISB = 0xFF; //Init motors initializeMotors(); initializeSensors(); while (TRUE) { if(SW_N == 0) { mode = 0; clearLCD(); printStringToLCD("Doing moves brah", 1, 0); leftMotor(700); rightMotor(700); delay_s(4); leftMotor(1000); rightMotor(700); delay_s(4); leftMotor(700); rightMotor(1000); delay_s(4); leftMotor(-700); rightMotor(700); delay_s(4); } else if(mode == 1) { //Light eating } else if(SW_S == 0) { //Start light eating //mode = 1; clearLCD(); printStringToLCD("Going to send string", 0, 0); initializeRS232(); sendData(); } else { //printStringToLCD("Cool story bro", 0, 0); } } }
void External_Init(void) { INTCON = 0x80; OpenRB0INT( FALLING_EDGE_INT & PORTB_PULLUPS_OFF & PORTB_INT_PRIO_HIGH ); OpenRB1INT( FALLING_EDGE_INT & PORTB_PULLUPS_OFF & PORTB_INT_PRIO_HIGH ); INTCONbits.INT0IE = 1; INTCON3bits.INT1IE = 1; INTCONbits.INT0IF =0; INTCON3bits.INT1IF =0; }
void main (void) { /* TIMER 1*/ OpenTimer1( TIMER_INT_ON & T1_16BIT_RW & T1_SOURCE_EXT & T1_PS_1_1 & T1_OSC1EN_ON & T1_SYNC_EXT_OFF );// tem que estar off para correr na placa, mas on para correr no proteus ADCON1 = 0x0E; // Port A: A0 - analog; A1-A7 - digital OpenADC (ADC_FOSC_RC & ADC_RIGHT_JUST & ADC_1ANA_0REF, ADC_CH0 & ADC_INT_OFF); /* BUTTON S3 */ OpenRB0INT ( PORTB_CHANGE_INT_ON & /* enable the RB0/INT0 interrupt */ PORTB_PULLUPS_ON & /* configure the RB0 pin for input */ FALLING_EDGE_INT); /* trigger interrupt upon S3 button depression */ OpenXLCD( FOUR_BIT & LINES_5X7 ); // 4-bit data interface; 2 x 16 characters OpenI2C(MASTER, SLEW_ON);// Initialize I2C module SSPADD = 9; //400kHz Baud clock(9) @16MHz //100kHz Baud clock(39) @16MHz InitializeBuzzer(); init_LVD(); EnableHighInterrupts(); alarmes[0] = 'a'; alarmes[1] = 0; alarmes_prev[0] = 'a'; alarmes_prev[1] = 0; checksumIsRight = verificar_checksum(); if(checksumIsRight == 1){ ler_EEPROM_interna_parametros(); ler_EEPROM_interna_relogio(); ler_EEPROM_interna_relogio_alarme(); // carregar da EEPROM interna o valor do alarme do relogio ler_EEPROM_interna_temp_alarme(); // carregar da EEPROM interna o valor do alarme da temperatura ler_EEPROM_interna_lum_alarme(); // carregar da EEPROM interna o valor do alarme da luminosidade } ler_EEPROM_interna_relogio_seconds(); update_EEPROM_interna_parametros(); update_EEPROM_interna_relogio_alarme(); update_EEPROM_interna_temp_alarme(); update_EEPROM_interna_lum_alarme(); update_EEPROM_interna_relogio_hours(); update_EEPROM_interna_relogio_minutes(); init_EEPROM_externa(); WriteTimer1( 0x8000 ); // load timer: 1 second /////////////////////////////////////////////////////////////////////////////// //*************************** Ciclo Principal *******************************// /////////////////////////////////////////////////////////////////////////////// while (1){ if(modo_sleep == 1 && cursor_pos == 8){ WriteCmdXLCD( DOFF ); // Turn display off } else{ while( BusyXLCD() ); WriteCmdXLCD( DOFF ); // Turn display off while( BusyXLCD() ); WriteCmdXLCD( CURSOR_OFF );// Enable display with no cursor while( BusyXLCD() ); } sd = seconds/10; su = seconds%10; md = minutes/10; mu = minutes%10; hd = hours/10; hu = hours%10; SetDDRamAddr(0x0D); putsXLCD(alarmes); rotina_verificacao_alarmes(); rotina_modo_modificacao(); rotina_sai_modificacao(); avisa_alarmes(); rotina_sensores_PMON(); if(CCP1CON == 0x00 && modo_modificacao == 0){ modo_sleep = 1; Sleep(); } } }
void low_isr(void) { // Réception CAN. if(PIE3bits.RXB0IE && PIR3bits.RXB0IF) { unsigned long id; char num; short cmd; BYTE data[8]; BYTE len; enum CAN_RX_MSG_FLAGS flags; while(CANIsRxReady()) { CANReceiveMessage(&id, data, &len, &flags); } PIR3bits.RXB0IF = 0; led = led ^ 1; num = id & 0x07; cmd = id & 0xFFF8; if(cmd == 320) { // rangerReq id = 352 | (rangers[num].value < rangers[num].threshold) << 4 | num; while(!CANSendMessage(id, (BYTE*)rangers[num].value, 2, CAN_TX_PRIORITY_0 & CAN_TX_STD_FRAME & CAN_TX_NO_RTR_FRAME )) { } } else if(cmd == 328) { // rangerThres rangers[num].threshold = ((unsigned int*) data)[0]; } else if(cmd == 336) { // rangerMute rangers[num].unmuted = 0; } else if(cmd == 344) { // rangerUnmute rangers[num].unmuted = 1; } else { led = led ^ 1; // On annule la commutation précédente de la LED. } } // Génération des pulses sonars et polling des bumpers. if(INTCONbits.TMR0IE && INTCONbits.TMR0IF) // Vingt fois par secondes, non stop. { INTCONbits.TMR0IF = 0; check_button(0, PORTCbits.RC2); check_button(1, PORTCbits.RC3); check_button(2, PORTCbits.RC4); check_button(3, PORTCbits.RC5); // On alterne les triggers pulse, et pas besoin // d'attendre plus car ils restent allumés la moitié du temps (50ms). if(PORTCbits.RC7) { CloseRB1INT(); OpenRB0INT(PORTB_CHANGE_INT_ON & RISING_EDGE_INT & PORTB_PULLUPS_OFF); PORTCbits.RC6 = 1; PORTCbits.RC7 = 0; // Fin du pulse => déclenchement. } else { CloseRB0INT(); OpenRB1INT(PORTB_CHANGE_INT_ON & RISING_EDGE_INT & PORTB_PULLUPS_OFF); PORTCbits.RC6 = 0; PORTCbits.RC7 = 1; // Fin du pulse => déclenchement. } // Début de l'attente des echos. // Lecture de l'ADC pour les sharps et passage à la mesure suivante. //count_sharp_value = (count_sharp_value + 1) %3; //count_sharp_value_tab = count_sharp_value + 3*(cur_sharp - 2); // On se place au bon endroit dans le tableau sharp_value[]. count_sharp_value_tab = count_sharp_value + 3*(cur_sharp - 2); count_sharp_value_change = (count_sharp_value_change + 1) %3; if (count_sharp_value_change == 2) count_sharp_value = (count_sharp_value + 1)%3; count_sharp_value_change = (count_sharp_value_change + 1) %3; sharp_value[count_sharp_value_tab] = LectureAnalogique(); rangers[cur_sharp].value = (sharp_value[3*(cur_sharp - 2)] + sharp_value[1 + 3*(cur_sharp - 2)] + sharp_value[2 + 3*(cur_sharp - 2)])/3; //rangers[cur_sharp].value = LectureAnalogique(); if(rangers[cur_sharp].unmuted) { while(!CANSendMessage(352 | cur_sharp, (BYTE*)&(rangers[cur_sharp].value), 2, CAN_TX_PRIORITY_0 & CAN_TX_STD_FRAME & CAN_TX_NO_RTR_FRAME )) { } led = led ^ 1; } if(++cur_sharp > 4) cur_sharp = 2; // Lancement de la conversion suivante. ADCON0 = 0b00000001 + ((cur_sharp - 2) << 2); // Selectionne le bon AN en lecture analogique //ADCON2 peut être configuré si on le souhaite ADCON0bits.GO_DONE=1; //ADCON0bits.CHS = cur_sharp; // Plus simple que SetChanADC(). //TODO //ConvertADC(); //TODO } }
void init(void) { unsigned char msgdata[ 8 ]; vscp18f_init( TRUE ); // Initialize the uP // PortA // RA0 - SENS - Input // RA1 - - Output // RA2 - - Output // RA3 - - Output // RA4 - - Output // RA5 - - Output // RA6 - OSC TRISA = 0b00000001; PORTA = 0b00000000; // PortB // RB0 - RFID_RX- Input // RB1 - - Output // RB2 - CAN TX - Output // RB3 - CAN RX - input // RB4 - - input // RB5 - - input // RB6 - - input // RB7 - - input TRISB = 0b11111001; PORTB = 0b00000000; // RC0 - - Output // RC1 - Button - Input // RC2 - PWM - Output // RC3 - - Output // RC4 - - Output // RC5 - - Output // RC6 - - Output // RC7 - - Output TRISC = 0b00000010; PORTC = 0b00000000; // TIMERS OpenTimer0(TIMER_INT_OFF & T0_16BIT & T0_SOURCE_INT & T0_PS_1_1 ); OpenTimer1(TIMER_INT_ON & T1_16BIT_RW & T1_SOURCE_INT & T1_PS_1_1 & T1_OSC1EN_OFF ); OpenTimer2(TIMER_INT_OFF & T2_PS_1_1 & T2_POST_1_1 ); // ADC OpenADC(ADC_FOSC_64 & ADC_RIGHT_JUST & ADC_20_TAD , ADC_CH0 & ADC_INT_OFF & ADC_REF_VDD_VREFMINUS /*ADC_VREFPLUS_VDD*/ & ADC_REF_VREFPLUS_VSS /*ADC_VREFMINUS_VSS*/ , 0x0E); // PWM 125 kHz PWM_Calibr(&PWM_f,&PWM_adc); OpenPWM1(PWM_f);// 79 SetDCPWM1((PWM_f*2)-6); // 156 PWM_enable = ON; RCONbits.IPEN = 1; // enable HI and LOW priorities // INT priority IPR1bits.TMR1IP = 0; // Timer1 LOW priority OpenRB0INT( PORTB_CHANGE_INT_ON & RISING_EDGE_INT & PORTB_PULLUPS_OFF ); // Global INT ebable INTCONbits.GIEH = 1; INTCONbits.GIEL = 1; return; }