View difference between Paste ID: afcaT6pG and UDjfGrfA
SHOW: | | - or go back to the newest paste.
1
/*
2
 * File: Main.c
3
 * Author:
4
 *
5
 * Created on June 13, 2019, 2:22 PM
6
 */
7
 
8
#define _XTAL_FREQ 32000000
9
 
10
// PIC16F18875 Configuration Bit Settings
11
 
12
// 'C' source line config statements
13
 
14
// CONFIG1
15
#pragma config FEXTOSC = OFF // External Oscillator mode selection bits (EC above 8MHz; PFM set to high power)
16
#pragma config RSTOSC = HFINT32 // Power-up default value for COSC bits (EXTOSC operating per FEXTOSC bits)
17
#pragma config CLKOUTEN = OFF // Clock Out Enable bit (CLKOUT function is disabled; i/o or oscillator function on OSC2)
18
#pragma config CSWEN = ON // Clock Switch Enable bit (Writing to NOSC and NDIV is allowed)
19
#pragma config FCMEN = ON // Fail-Safe Clock Monitor Enable bit (FSCM timer enabled)
20
 
21
// CONFIG2
22
#pragma config MCLRE = ON // Master Clear Enable bit (MCLR pin is Master Clear function)
23
#pragma config PWRTE = OFF // Power-up Timer Enable bit (PWRT disabled)
24
#pragma config LPBOREN = OFF // Low-Power BOR enable bit (ULPBOR disabled)
25
#pragma config BOREN = OFF // Brown-out reset enable bits (Brown-out Reset Enabled, SBOREN bit is ignored)
26
#pragma config BORV = LO // Brown-out Reset Voltage Selection (Brown-out Reset Voltage (VBOR) set to 1.9V on LF, and 2.45V on F Devices)
27
#pragma config ZCD = OFF // Zero-cross detect disable (Zero-cross detect circuit is disabled at POR.)
28
#pragma config PPS1WAY = ON // Peripheral Pin Select one-way control (The PPSLOCK bit can be cleared and set only once in software)
29
#pragma config STVREN = ON // Stack Overflow/Underflow Reset Enable bit (Stack Overflow or Underflow will cause a reset)
30
 
31
// CONFIG3
32
#pragma config WDTCPS = WDTCPS_31// WDT Period Select bits (Divider ratio 1:65536; software control of WDTPS)
33
#pragma config WDTE = OFF // WDT operating mode (WDT enabled regardless of sleep; SWDTEN ignored)
34
#pragma config WDTCWS = WDTCWS_7 // WDT Window Select bits (window always open (100%); software control; keyed access not required)
35
#pragma config WDTCCS = SC // WDT input clock selector (Software Control)
36
 
37
// CONFIG4
38
#pragma config WRT = OFF // UserNVM self-write protection bits (Write protection off)
39
#pragma config SCANE = available // Scanner Enable bit (Scanner module is available for use)
40
#pragma config LVP = OFF // Low Voltage Programming Enable bit (Low Voltage programming enabled. MCLR/Vpp pin function is MCLR.)
41
 
42
// CONFIG5
43
#pragma config CP = OFF // UserNVM Program memory code protection bit (Program Memory code protection disabled)
44
#pragma config CPD = OFF // DataNVM code protection bit (Data EEPROM code protection disabled)
45
 
46
#include <xc.h>
47
 
48
int GPSh1;
49
int GPSh2;
50
int GPSm1;
51
int GPSm2;
52
int GPSs1;
53
int GPSs2;
54
55
volatile int NopWriteVal;
56
57
unsigned getSPBRG(unsigned baudrate, char brg16, char brgh) {
58
    unsigned mult;
59
    if (brg16 == 0 && brgh == 0) mult = 64;
60
    else if (brg16 == 1 && brgh == 1) mult = 4;
61
    else mult = 16;
62
   
63
    // baudrate = fOsc / (mult*(spbrg + 1))
64
    // baudrate * (spbrg + 1) = fOsc / mult
65
    // spbrg + 1 = (fOsc / mult) / baudrate
66
    // spbrg = (fOsc / mult) / baudrate - 1
67
    return (_XTAL_FREQ / mult) / baudrate - 1;
68
}
69
70
char getch(){
71-
        Nop();
71+
72
        CREN = 0;
73
        NopWriteVal = 0;
74
        CREN = 1;
75
    }
76
    while(!RCIF);
77
    return RCREG;
78
}
79
80
void printSerial(char* txt, char ch) {
81
    while(*txt) {
82
        TXREG = *txt;
83
        txt++;
84
        while (!TXIF);
85
    }
86
    TXREG = ch;
87
    while (!TXIF);
88
    TXREG = '\n';
89
    while (!TXIF);
90
}
91
92
void GPStime(){
93
    char x = 0;
94
    x = getch(); if(x != '$') return;
95
    printSerial("Got $", ' ');
96
    x = getch(); printSerial("Got: ", x); if(x != 'G') { printSerial("Quitting", ' '); return; }
97
    x = getch(); printSerial("Got: ", x); if(x != 'P') { printSerial("Quitting", ' '); return; }
98
    x = getch(); printSerial("Got: ", x); if(x != 'G') { printSerial("Quitting", ' '); return; }
99
    x = getch(); printSerial("Got: ", x); if(x != 'L') { printSerial("Quitting", ' '); return; }
100
    x = getch(); printSerial("Got: ", x); if(x != 'L') { printSerial("Quitting", ' '); return; }
101
102
    {
103
        char ch;
104
        LATA0 = 0;
105
        do {
106
            ch = getch();
107
            printSerial("Got: ", ch);
108
        } while (ch != 'E' && ch != 'W');
109
        char comma = getch(); // read a comma
110
        printSerial("Got: ", comma);
111
        GPSh1 = getch() - '0';
112
        printSerial("Got: ", GPSh1 + '0');
113
        GPSh2 = getch() - '0';
114
        printSerial("Got: ", GPSh2 + '0');
115
        GPSm1 = getch() - '0';
116
        printSerial("Got: ", GPSm1 + '0');
117
        GPSm2 = getch() - '0';
118
        printSerial("Got: ", GPSm2 + '0');
119
        GPSs1 = getch() - '0';
120
        printSerial("Got: ", GPSs1 + '0');
121
        GPSs2 = getch() - '0';
122
        printSerial("Got: ", GPSs2 + '0');
123
    }
124
   
125
}
126
127
void main(void)
128
{
129
    TRISA = 0b00000000;
130
    TRISB = 0b00000000;
131
   
132
    // LATA = 1; __delay_ms(1000);
133
 
134
    PORTC = 0;
135
    TRISC = 0b10000000; // all outputs, except RX on RC7
136
    ANSELC = 0b00000000; // disable analog
137
   
138
    RC6PPS = 0x10;
139
   
140
    //init USART
141
    // SPEN RX9 SREN CREN ADDEN FERR OERR RX9D
142
    RCSTA = 0b00110000; // TX9D=0 -->8-bit; SPEN=1, CREN=1, addr-det disabled.
143
    // CSRC TX9 TXEN SYNC SENDB BRGH TRMT TX9D
144
    TXSTA = 0b00100100; // TX9D=0 -->8-bit; BRGH=1; TXEN=1 --> enable, SYNC=0 --> async
145
    //ABDOVF RCIDL NOP SCKP BRG16 NOP WUE ABDEN
146
    BAUDCON = 0b00001000; // SCKP=0 -> not inverted, BRG16=1, WUE=0, ABDEN=0
147
    SPEN = 1;
148
   
149
    // LATA = 2; __delay_ms(1000);
150
 
151
    unsigned brg = getSPBRG(9600, 1, 1);
152
    SPBRGL = brg & 0xFF;
153
    SPBRGH = brg >> 8;
154
   
155
    // LATA = 3; __delay_ms(1000);
156
 
157
    while(1){
158
        GPStime();
159
        TXREG = GPSh1 + '0';
160
        while (!TXIF);
161
        TXREG = GPSh2 + '0';
162
        while (!TXIF);
163
        TXREG = GPSm1 + '0';
164
        while (!TXIF);
165
        TXREG = GPSm2 + '0';
166
        while (!TXIF);
167
        TXREG = GPSs1 + '0';
168
        while (!TXIF);
169
        TXREG = GPSs2 + '0';
170
        while (!TXIF);
171
        TXREG = '\n';
172
        while (!TXIF);
173
    }
174
   
175
    LATA = 7;
176
    return;
177
}