void Setup_USART1XBAPI() { //Declaración de Variables unsigned char USART1Config=0; unsigned int BaudRate=0; TRISCbits.RC6=0; //TX es salida TRISCbits.RC7=1; //RX es entrada //Configuración USART USART1Config=USART_TX_INT_OFF //Interrupcion por Ttransmisión: Off &USART_RX_INT_OFF //Interrupcion por Recepción: Off &USART_ASYNCH_MODE //Modo Asíncrono &USART_EIGHT_BIT //Transmision de 8bits &USART_CONT_RX //Recepción Continua &USART_BRGH_HIGH //Baudios &USART_ADDEN_OFF; //Detección de Dirección OFF BaudRate=51; //Valor que se carga a SPRBH para Definir BaudRate = 9600 Close1USART(); //Cierra USART2 en caso de estar previamente abierto. Open1USART(USART1Config, BaudRate); //Abre USART1 IPR1bits.RC1IP =1; //Receive Interrupt: High Priority PIE1bits.RC1IE=1; //Receive Interrupt: Enabled PIR1bits.RC1IF=0; //Reset de EUSART2 Receive Interrupt Flag }
void main(void) { // Enable UART for serial output display Open1USART(USART_TX_INT_OFF & USART_RX_INT_OFF & USART_EIGHT_BIT & USART_ASYNCH_MODE & USART_ADDEN_OFF, BAUDRG); #ifdef INVERT_UART baud1USART(BAUD_IDLE_TX_PIN_STATE_LOW & BAUD_IDLE_RX_PIN_STATE_LOW & BAUD_AUTO_OFF & BAUD_WAKEUP_OFF & BAUD_16_BIT_RATE & USART_RX_INT_ON); #else baud1USART(BAUD_IDLE_TX_PIN_STATE_HIGH & BAUD_IDLE_RX_PIN_STATE_HIGH & BAUD_AUTO_OFF & BAUD_WAKEUP_OFF & BAUD_16_BIT_RATE & USART_RX_INT_ON); #endif // I/O states will be held until DSCONL.RELEASE = 0, but we must still initialize // to what we want before clearing the RELEASE bit. InitializeIO(); #ifdef USE_32KHZ_CRYSTAL // Enable the Secondary Oscillator for RTCC use. OpenTimer1(TIMER_INT_OFF & T1_SOURCE_PINOSC & T1_PS_1_1 & T1_OSC1EN_ON & T1_SYNC_EXT_OFF, 0); #endif // Did we wake up from Deep Sleep? Or is this the first initial power on? if (WDTCONbits.DS) { // woke up from Deep Sleep DSCONLbits.RELEASE = 0; // release control and data bits for all I/Os wait(); // allow time for INTOSC to stablize before using UART printf("Woke from Deep Sleep via "); if (DSWAKEHbits.DSINT0 != 0) { printf("RB0/INT0\r\n"); } else if (DSWAKELbits.DSMCLR != 0) { printf("MCLR\r\n"); } else if (DSWAKELbits.DSFLT != 0) { printf("DSFLT\n"); } else if (DSWAKELbits.DSWDT != 0) { printf("DSWDT\n"); } else if (DSWAKELbits.DSRTC != 0) { printf("RTCC Alarm\n"); } } else { // first initial power up of the device. // unlock the RTCC registers so that we can write to them EECON2 = 0x55; EECON2 = 0xAA; RTCCFGbits.RTCWREN = 1; // reset RTCC date/time (only on first power on) RTCCFGbits.RTCPTR1 = 1; RTCCFGbits.RTCPTR0 = 1; RTCVALL = 0x09; // reserved | year RTCVALH = 0xFF; RTCVALL = 0x01; // month | day RTCVALH = 0x01; RTCVALL = 0x12; // weekday | hours RTCVALH = 0x01; RTCVALL = 0x00; // minutes | seconds RTCVALH = 0x00; RTCCFGbits.RTCEN = 1; // enable RTCC module RTCCAL = RTCCALIBRATION; wait(); // allow time for INTOSC to stablize before using UART } // Application Tasks DoApplicationTasks(); // Power down into Deep Sleep mode. printf("Powering down into deep sleep, push RB0/INT0 down to wake...\r\n"); Flush1USART(); Close1USART(); RB0ReleasedWait(); // wait for user to release INT0 so we don't get spurious wake up EnterDeepSleepMode: EnableINT0(); EnterDeepSleep(); // Execution should normally never reach here, as Deep Sleep powers up // at the Reset Vector. // // However, there exists a small possibility an INT0 wake up is triggered // before the processor has fully enter Deep Sleep mode. As a result, gaurd // code is required here to handle re-initiating Deep Sleep entry. goto EnterDeepSleepMode; }