Hello.
I have a small code for GPS, which works correctly, however, I've noticed the following:
IF GPS is physically disconnected from the input, or I disable the "serin 2" line, main loop crashes after the first execution and MCU restarts from the beginning. This happens also on other physical boards, so it is not issue of this particular MCU. Other power supplies, other ways of output, like LCD screen instead of serout were tried, as well as hardware serial inputs and outputs - no changes. I also tried same code on 16F1939, 18F45K22 - same result.
Any ideas?Code:;----[16F886 Hardware Configuration]-------------------------------------------- #CONFIG cfg1 = _INTRC_OSC_NOCLKOUT ; INTOSCIO oscillator: I/O function on RA6/OSC2/CLKOUT pin, I/O function on RA7/OSC1/CLKIN cfg1&= _WDT_ON ; WDT enabled cfg1&= _PWRTE_OFF ; PWRT disabled cfg1&= _MCLRE_OFF ; RE3/MCLR pin function is digital input, MCLR internally tied to VDD cfg1&= _CP_OFF ; Program memory code protection is disabled cfg1&= _CPD_OFF ; Data memory code protection is disabled cfg1&= _BOR_OFF ; BOR disabled cfg1&= _IESO_ON ; Internal/External Switchover mode is enabled cfg1&= _FCMEN_ON ; Fail-Safe Clock Monitor is enabled cfg1&= _LVP_OFF ; RB3 pin has digital I/O, HV on MCLR must be used for programming cfg1&= _DEBUG_OFF ; In-Circuit Debugger disabled, RB6/ICSPCLK and RB7/ICSPDAT are general purpose I/O pins __CONFIG _CONFIG1, cfg1 cfg2 = _BOR40V ; Brown-out Reset set to 4.0V cfg2&= _WRT_OFF ; Write protection off __CONFIG _CONFIG2, cfg2 #ENDCONFIG TRISA=%00000001 'SET A TO OUTPUT 1=input TRISC=%00001000 'set C3 for gps TRISB=%00011000 'set PortB to output ANSELH=%00000000 ' ADC OFF B ANSEL=%000000000 'configure PortA as digital except first 2 ADCON1=%10000000 'adc justify OSCCON=%01110101 'SET FREQUENCY TO 8MHZ WPUB=%00000000 'turn off Pullups CM1CON0=0 'DISABLE COMPARATORS CM2CON0=0 'SAME HERE 'CCP1CON=%01000000 ' configure pwm 'PSTRCON=%00010110 'disable C pwm DEFINE OSC 8 DEFINE ADC_BITS 12 DEFINE ADC_CLOCK 5 DEFINE ADC_SAMPLEUS 5 gps_data VAR BYTE[80] ' Buffer to store GPS data gps_char VAR BYTE ' Character received from GPS time_data VAR BYTE[6] ' Array to store the extracted time i VAR BYTE ' Loop variable start_found VAR BIT ' Flag to indicate start of time data ' Define the serial pins GPS_RX var PORTC.7 ' RX pin for GPS (Adjust according to your setup) GPS_TX var PORTC.5 ' TX pin for GPS (Adjust according to your setup) ' Initialize variables start_found = 0 i = 0 serout2 portc.5,84, ["Start ok", 10, 13] toggle portc.3 'test led pause 100 mainx: ' Wait for data from GPS serin2 GPS_RX,85,[gps_char] 'If I remove this line or disconnect the GPS, MCU will crash! ' Store data in buffer gps_data[i] = gps_char i = i + 1 ' Check if we have a complete line of data IF gps_char = 10 THEN ' Look for the $GPRMC sentence IF (gps_data[1] = "G") AND (gps_data[2] = "P") AND (gps_data[3] = "R") AND (gps_data[4] = "M") AND (gps_data[5] = "C") THEN ' Extract time from the sentence start_found = 1 FOR i = 7 TO 12 time_data[i-7] = gps_data[i] NEXT i ENDIF ' Reset buffer i = 0 ENDIF ' Display time data IF start_found = 1 THEN serout2 portc.5,84, ["Time: ", time_data[0], time_data[1], ":", time_data[2], time_data[3], ":", time_data[4], time_data[5], 13, 10] start_found = 0 ENDIF GOTO mainx high portc.3 'check if code comes to here stop





Bookmarks