o: ActiveSupport::Cache::Entry :@compressedF: @value"£"œ
Designs/GPSRL01B/SW/gpsrl.c
1
/**** GPS skrysohledac ****/
2
#define ID "$Id: gps.c 984 2008-01-06 23:41:31Z kakl $"
3

  
4
#include "gpsrl.h"
5

  
6
#include <math.h>
7
#include <stdlib.h>
8
#include <stdlibm.h>
9

  
10
#define  LCD_RS         PIN_B1      // LCD control
11
#define  LCD_E          PIN_B2      // LCD enable
12
#define  LCD_DATA_LSB   PIN_B4      // LSB data bit LCD
13
#include "MYLCD.C"
14

  
15
// NMEA
16
#define  TIME           6           // For NMEA parsing
17
#define  TIME_LEN       10
18
#define  LATDEG         19
19
#define  LATMIN         21
20
#define  LONDEG         32
21
#define  LONMIN         34
22
#define  DEG_LEN        2
23
#define  MIN_LEN        7
24
#define  AZIMUTH        46
25
#define  NMEA_LINESIZE  60
26

  
27
#define  MAXGC          4
28
struct geocache
29
{
30
   float lat;
31
   float lon;
32
   char  name[8];
33
};
34

  
35
struct geocache const gc[MAXGC] =
36
{
37
  {49*60+15.5740,14*60+42.3310,"DOMA"},  // Testovaci souradnice: cisticka
38
  {48*60+57.966,14*60+28.655,"GC16JMH"},
39
  {48*60+57.837,14*60+28.599,"GC16F8Y"},
40
  {49*60+9.542,14*60+56.417,"GC-----"}
41
};
42

  
43
float lat,lon;    // Latitude, Longitude, Azimuth
44
int16 az;
45
int8 gcnum;       // Selection of the GC point
46

  
47
//$GPRMC,105815.503,V,4915.5877,N,01442.3896,E,0.0,0.00,060108,,,N*44
48
inline void read_NMEA()       // NMEA parsing
49
{
50
      auto char line[NMEA_LINESIZE];
51
      auto char item[16];
52
      auto char *ptr;
53
//      auto char *line;
54
      auto int8  n;
55
      auto char  c;
56

  
57
//      line=malloc(NMEA_LINESIZE);        // Space for one line
58
//      if (line==NULL) {printf(lcd_putc,"Error"); sleep();};
59
      line[NMEA_LINESIZE-1]=0;
60

  
61
      while(fgetc(NMEA)!='$');            // Waiting for start character
62
      for(n=0;n<(NMEA_LINESIZE-1);n++)    // Read line up to checksum
63
      {
64
         c=fgetc(NMEA);
65
         if(c=='*')
66
         {
67
            line[n]=0;
68
            break;
69
         };
70
         line[n]=c;
71
      };
72

  
73
    lcd_gotoxy(12,4);
74
      printf(lcd_putc,"%c %06.0g ",line[17],strtod(&line[TIME],&ptr));
75

  
76
    lcd_gotoxy(1,3);
77
      strncpy(item,&line[LATDEG],DEG_LEN+MIN_LEN); item[DEG_LEN+MIN_LEN]=0;
78
      printf(lcd_putc,"%s*",item);
79
      strncpy(item,&line[LONDEG],DEG_LEN+MIN_LEN); item[DEG_LEN+MIN_LEN]=0;
80
      printf(lcd_putc,"%s*",item);
81

  
82
//      lcd_gotoxy(1,2);
83
      lat=strtod(&line[LATMIN],&ptr);
84
      line[LATMIN]=0;
85
      lat+=60*strtod(&line[LATDEG],&ptr);
86
      lon=strtod(&line[LONMIN],&ptr);
87
      line[LONMIN]=0;
88
      lon+=60*strtod(&line[LONDEG],&ptr);
89
      strtod(&line[AZIMUTH],&ptr);
90
      az=strtoul(ptr+1,&ptr,10);
91
//     printf(lcd_putc,"%.3g*%.3g*%03Lu",lat,lon,az);
92
//     free(line);
93
}
94

  
95
void main()
96
{
97

  
98
   setup_adc_ports(NO_ANALOGS);
99
   setup_adc(ADC_OFF);
100
   setup_spi(FALSE);
101
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
102
   setup_timer_1(T1_DISABLED);
103
   setup_timer_2(T2_DISABLED,0,1);
104
   setup_comparator(NC_NC_NC_NC);
105
   setup_vref(VREF_LOW|-2);
106
   lcd_init();
107

  
108
   gcnum++;                            // Next GC
109
   if (gcnum>(MAXGC-1)) gcnum=0;
110

  
111
   delay_ms(200);
112
 lcd_gotoxy(1,2);
113
   printf(lcd_putc,"%s",gc[gcnum].name);  // Print GC name
114

  
115
   while(TRUE)
116
   {
117
      read_NMEA();   // Read one NMEA line and parse
118

  
119
      lon=(gc[gcnum].lon-lon)*1214;     // Kakona's projection :)
120
      lat=(gc[gcnum].lat-lat)*1854;
121

  
122
    lcd_gotoxy(1,4);
123
      printf(lcd_putc,"%.0gm ",sqrt((lon*lon) + (lat*lat))); // Distance
124
    lcd_gotoxy(1,1);
125
      if (lon==0) lon=0.001;           // Divided by zero cure
126
      lon=3-(6/PI*atan2(lat,lon));     // Bearing
127
      if (lon<0) lon+=12;              // overflow cure
128
      if (lon>12) lon-=12;
129
      printf(lcd_putc,"BE%2.0gh*",lon);
130
      lat=12.0/360*az;                 // Azimuth of the movement
131
      lon=lon-lat;                     // Heading
132
      if (lon<0) lon+=12;              // overflow cure
133
      if (lon>12) lon-=12;
134
      printf(lcd_putc,"HE%2.0gh*AZ%2.0gh*",lon,lat);
135
   }
136
}
137

  
Designs/GPSRL01B/SW/MYLCD.C
1
// LCD modul pro ovladani dvouradkoveho LCD modulu se standardnim Hitachi radicem
2
// (c)miho 2002
3
//
4
// Historie:
5
//
6
// 0.0   Uvodni verze se snadnou definici portu LCD displeje
7
//
8
//
9
// Funkce:
10
//
11
//   lcd_init()            inicializuje LCD displej a porty, nutno volat jako prvni
12
//
13
//   lcd_putc(c)           zapis snaku do lcd displeje, zpracovava nasledujici ridici znaky
14
//                         \f = \x0C   - nova stranka - smazani displeje
15
//                         \n = \x0A   - odradkovani (prechod na druhou radku)
16
//                         \b = \x08   - backspace - posunuti kurzoru o 1 pozici zpet
17
//                         \r = \x0D   - goto home to position 1,1
18
//                         \0  .. \7   - definovatelne znaky v pozicich 0 az 7 v CGRAM
19
//                         \20 .. \27  - alternativne zapsane znaky (oktalove) v pozicich 0 az 7 CGRAM
20
//                         Pozor na to, ze funkce printf konci tisk pokud narazi na \0 (konec retezce)
21
//
22
//   lcd_gotoxy(x,y)       presune kurzor na uvedenou adresu
23
//                         nekontroluje parametry
24
//
25
//   lcd_cursor_on         zapne kurzor
26
//   lcd_cursor_off        vypne kurzor
27
//
28
//   lcd_define_char(Index, Def)       Makro, ktere definuje znaky od pozice Index obsahem definicniho
29
//                                     retezce Def. Kazdych 8 znaku retezce Def definuje dalsi znak v CGRAM.
30
//                                     Kapacita CGRAM je celkem 8 znaku s indexem 0 az 7.
31
//                                     Na konci se provede lcd_gotoxy(1,1).
32
//                                     Na konci teto knihovny je priklad pouziti definovanych znaku
33
//
34
// Definice portu:
35
//
36
// #DEFINE LCD_RS          PIN_B2      // rizeni registru LCD displeje
37
// #DEFINE LCD_E           PIN_B1      // enable LCD displeje
38
// #DEFINE LCD_DATA_LSB    PIN_C2      // pripojeni LSB bitu datoveho portu LCD displeje (celkem 4 bity vzestupne za sebou)
39

  
40

  
41

  
42

  
43
// Privatni sekce, cist jen v pripade, ze neco nefunguje
44

  
45

  
46

  
47

  
48
// Generovane defince portu pro ucely teto knihovny aby kod generoval spravne IO operace a soucasne
49
// bylo mozne jednoduse deklarovat pripojene piny LCD displeje pri pouziti teto knihovny. Problem spociva
50
// v tom, ze se musi spravne ridit smery portu a soucasne datovy port zabira jen 4 bity ze zadaneho portu
51
//
52
#DEFINE LCD_SHIFT (LCD_DATA_LSB&7)                 // pocet bitu posuvu dataoveho kanalu v datovem portu
53
#DEFINE LCD_PORT  (LCD_DATA_LSB>>3)                // adresa LCD datoveho portu
54
#DEFINE LCD_TRIS  (LCD_PORT+0x80)                  // adresa prislusneho TRIS registru
55
#DEFINE LCD_MASK  (0xF<<LCD_SHIFT)                 // maska platnych bitu
56
//
57
#IF LCD_SHIFT>4                                    // kontrola mezi
58
#ERROR LCD data port LSB bit not in range 0..4
59
#ENDIF
60

  
61

  
62
// Definice konstant pro LCD display
63
//
64
#define LCD_CURSOR_ON_  0x0E     // kurzor jako blikajici radka pod znakem
65
#define LCD_CURSOR_OFF_ 0x0C     // zadny kurzor
66
#define LCD_LINE_2      0x40     // adresa 1. znaku 2. radky
67

  
68

  
69
// Definice rezimu LCD displeje
70
//
71
BYTE const LCD_INIT_STRING[4] =
72
{
73
   0x28,                         // intrfejs 4 bity, 2 radky, font 5x7
74
   LCD_CURSOR_OFF_,              // display on, kurzor off,
75
   0x01,                         // clear displeje
76
   0x06                          // inkrement pozice kurzoru (posun kurzoru doprava)
77
};
78

  
79

  
80
// Odesle nibble do displeje (posle data a klikne signalem e)
81
//
82
void lcd_send_nibble( BYTE n )
83
{
84
   *LCD_PORT = (*LCD_PORT & ~LCD_MASK) | ((n << LCD_SHIFT) & LCD_MASK);      // nastav datove bity portu a ostatni zachovej
85
   output_bit(LCD_E,1);       // vzestupna hrana
86
   delay_us(100);               // pockej alespon 450ns od e nebo alespon 195ns od dat
87
   output_bit(LCD_E,0);       // sestupna hrana (minimalni perioda e je 1us)
88
}
89

  
90

  
91
// Odesle bajt do registru LCD
92
//
93
// Pokud je Adr=0 .. instrukcni registr
94
// Pokud je Adr=1 .. datovy registr
95
//
96
void lcd_send_byte( BOOLEAN Adr, BYTE n )
97
{
98
   output_bit(LCD_RS,Adr);    // vyber registr
99
   swap(n);
100
   lcd_send_nibble(n);        // posli horni pulku bajtu
101
   swap(n);
102
   lcd_send_nibble(n);        // posli spodni pulku bajtu
103
   delay_us(200);              // minimalni doba na provedeni prikazu
104
}
105

  
106

  
107
// Provede inicializaci LCD displeje, smaze obsah a nastavi mod displeje
108
//
109
// Tato procedura se musi volat pred pouzitim ostatnich lcd_ procedur
110
//
111
void lcd_init()
112
{
113

  
114
   int i;                              // pocitadlo cyklu
115

  
116
   delay_ms(20);                       // spozdeni pro provedeni startu displeje po zapnuti napajeni
117

  
118
   *LCD_TRIS = *LCD_TRIS & ~LCD_MASK;  // nuluj odpovidajici bity tris registru datoveho portu LCD
119

  
120
   output_bit(LCD_RS,0);               // nastav jako vystup a nastav klidovy stav
121
   output_bit(LCD_E,0);               // nastav jako vystup a nastav klidovy stav
122

  
123
   for (i=0; i<3; i++)                 // nastav lcd do rezimu 8 bitu sbernice
124
   {
125
      delay_ms(2);                     // muze byt rozdelany prenos dat (2x 4 bity) nebo pomaly povel
126
      lcd_send_nibble(3);              // rezim 8 bitu
127
   }
128

  
129
   delay_us(40);                       // cas na zpracovani
130
   lcd_send_nibble(2);                 // nastav rezim 4 bitu (plati od nasledujiciho prenosu)
131
   delay_us(40);                       // cas na zpracovani
132

  
133
   for (i=0;i<3;i++)                   // proved inicializaci (nastaveni modu, smazani apod)
134
   {
135
      lcd_send_byte(0,LCD_INIT_STRING[i]);
136
      delay_ms(2);
137
   }
138
}
139

  
140

  
141
// Proved presun kurzoru
142
//
143
// Pozice 1.1 je domu
144
//
145
#separate
146
void lcd_gotoxy( BYTE x, BYTE y)
147
{
148

  
149
   BYTE Adr;
150

  
151
   switch(y)
152
   {
153
      case 1: Adr=0; break;
154
      case 2: Adr=0x40; break;
155
      case 3: Adr=0x14; break;
156
      case 4: Adr=0x54; break;
157
   }
158
   Adr+=x-1;
159

  
160
   lcd_send_byte(0,0x80|Adr);
161
}
162

  
163

  
164
// Zapis znaku na displej, zpracovani ridicich znaku
165
//
166
#separate
167
void lcd_putc( char c)
168
{
169

  
170
   switch (c)
171
   {
172
      case '\f'   : lcd_send_byte(0,1);            // smaz displej
173
                    delay_ms(2);
174
                                            break;
175
      case '\n'   : lcd_gotoxy(1,2);        break; // presun se na 1. znak 2. radky
176
      case '\r'   : lcd_gotoxy(1,1);        break; // presun home
177
      case '\b'   : lcd_send_byte(0,0x10);  break; // posun kurzor o 1 zpet
178
      default     : if (c<0x20) c&=0x7;            // preklopeni definovatelnych znaku na rozsah 0 az 0x1F
179
                    lcd_send_byte(1,c);     break; // zapis znak
180
   }
181
}
182

  
183

  
184
// Zapni kurzor
185
//
186
void lcd_cursor_on()
187
{
188
   lcd_send_byte(0,LCD_CURSOR_ON_);
189
}
190

  
191

  
192
// Vypni kurzor
193
//
194
void lcd_cursor_off()
195
{
196
   lcd_send_byte(0,LCD_CURSOR_OFF_);
197
}
198

  
199

  
200
// Definice vlastnich fontu
201
//
202
// Vlastnich definic muze byt jen 8 do pozic 0 az 7 pameti CGRAM radice lcd displeje
203
// Pro snadne definovani jsou pripraveny nasledujici definice a na konci souboru je uveden
204
// priklad pouziti definovanych znaku.
205

  
206

  
207
// Pomocna procedura pro posilani ridicich dat do radice displeje
208
//
209
void lcd_putc2(int Data)
210
{
211
   lcd_send_byte(1,Data);
212
}
213

  
214

  
215
// Pomocne definice pro programovani obsahu CGRAM
216
//
217
#DEFINE lcd_define_start(Code)      lcd_send_byte(0,0x40+(Code<<3)); delay_ms(2)
218
#DEFINE lcd_define_def(String)      printf(lcd_putc2,String);
219
#DEFINE lcd_define_end()            lcd_send_byte(0,3); delay_ms(2)
220

  
221

  
222
// Vlastni vykonne makro pro definovani fontu do pozice Index CGRAM s definicnim retezcem Def
223
//
224
#DEFINE lcd_define_char(Index, Def) lcd_define_start(Index); lcd_define_def(Def); lcd_define_end();
225

  
226

  
227
// Pripravene definice fontu vybranych znaku
228
// V tabulce nesmi byt 00 (konec retezce v printf()), misto toho davame 80
229
//
230
#DEFINE LCD_CHAR_BAT100 "\x0E\x1F\x1F\x1F\x1F\x1F\x1F\x1F"      /* symbol plne baterie       */
231
#DEFINE LCD_CHAR_BAT50  "\x0E\x1F\x11\x11\x13\x17\x1F\x1F"      /* symbol polovicni baterie  */
232
#DEFINE LCD_CHAR_BAT0   "\x0E\x1F\x11\x11\x11\x11\x11\x1F"      /* symbol vybite baterie     */
233
#DEFINE LCD_CHAR_LUA    "\x04\x0E\x11\x11\x1F\x11\x11\x80"      /* A s carkou                */
234
#DEFINE LCD_CHAR_LLA    "\x01\x02\x0E\x01\x1F\x11\x0F\x80"      /* a s carkou                */
235
#DEFINE LCD_CHAR_HUC    "\x0A\x0E\x11\x10\x10\x11\x0E\x80"      /* C s hackem                */
236
#DEFINE LCD_CHAR_HLC    "\x0A\x04\x0E\x10\x10\x11\x0E\x80"      /* c s hackem                */
237
#DEFINE LCD_CHAR_HUD    "\x0A\x1C\x12\x11\x11\x12\x1C\x80"      /* D s hackem                */
238
#DEFINE LCD_CHAR_HLD    "\x05\x03\x0D\x13\x11\x11\x0F\x80"      /* d s hackem                */
239
#DEFINE LCD_CHAR_LUE    "\x04\x1F\x10\x10\x1E\x10\x1F\x80"      /* E s carkou                */
240
#DEFINE LCD_CHAR_LLE    "\x01\x02\x0E\x11\x1F\x10\x0E\x80"      /* e s carkou                */
241
#DEFINE LCD_CHAR_HUE    "\x0A\x1F\x10\x1E\x10\x10\x1F\x80"      /* E s hackem                */
242
#DEFINE LCD_CHAR_HLE    "\x0A\x04\x0E\x11\x1F\x10\x0E\x80"      /* e s hackem                */
243
#DEFINE LCD_CHAR_LUI    "\x04\x0E\x04\x04\x04\x04\x0E\x80"      /* I s carkou                */
244
#DEFINE LCD_CHAR_LLI    "\x02\x04\x80\x0C\x04\x04\x0E\x80"      /* i s carkou                */
245
#DEFINE LCD_CHAR_HUN    "\x0A\x15\x11\x19\x15\x13\x11\x80"      /* N s hackem                */
246
#DEFINE LCD_CHAR_HLN    "\x0A\x04\x16\x19\x11\x11\x11\x80"      /* n s hackem                */
247
#DEFINE LCD_CHAR_LUO    "\x04\x0E\x11\x11\x11\x11\x0E\x80"      /* O s carkou                */
248
#DEFINE LCD_CHAR_LLO    "\x02\x04\x0E\x11\x11\x11\x0E\x80"      /* o s carkou                */
249
#DEFINE LCD_CHAR_HUR    "\x0A\x1E\x11\x1E\x14\x12\x11\x80"      /* R s hackem                */
250
#DEFINE LCD_CHAR_HLR    "\x0A\x04\x16\x19\x10\x10\x10\x80"      /* r s hackem                */
251
#DEFINE LCD_CHAR_HUS    "\x0A\x0F\x10\x0E\x01\x01\x1E\x80"      /* S s hackem                */
252
#DEFINE LCD_CHAR_HLS    "\x0A\x04\x0E\x10\x0E\x01\x1E\x80"      /* s s hackem                */
253
#DEFINE LCD_CHAR_HUT    "\x0A\x1F\x04\x04\x04\x04\x04\x80"      /* T s hackem                */
254
#DEFINE LCD_CHAR_HLT    "\x0A\x0C\x1C\x08\x08\x09\x06\x80"      /* t s hackem                */
255
#DEFINE LCD_CHAR_LUU    "\x02\x15\x11\x11\x11\x11\x0E\x80"      /* U s carkou                */
256
#DEFINE LCD_CHAR_LLU    "\x02\x04\x11\x11\x11\x13\x0D\x80"      /* u s carkou                */
257
#DEFINE LCD_CHAR_CUU    "\x06\x17\x11\x11\x11\x11\x0E\x80"      /* U s krouzkem              */
258
#DEFINE LCD_CHAR_CLU    "\x06\x06\x11\x11\x11\x11\x0E\x80"      /* u s krouzkem              */
259
#DEFINE LCD_CHAR_LUY    "\x02\x15\x11\x0A\x04\x04\x04\x80"      /* Y s carkou                */
260
#DEFINE LCD_CHAR_LLY    "\x02\x04\x11\x11\x0F\x01\x0E\x80"      /* y s carkou                */
261
#DEFINE LCD_CHAR_HUZ    "\x0A\x1F\x01\x02\x04\x08\x1F\x80"      /* Z s hackem                */
262
#DEFINE LCD_CHAR_HLZ    "\x0A\x04\x1F\x02\x04\x08\x1F\x80"      /* z s hackem                */
263

  
264

  
265
// Priklad pouziti definovanych znaku
266
//
267
//
268
//void lcd_sample()
269
//{
270
//   lcd_define_char(0,LCD_CHAR_BAT50);                 // Priklad definice znaku baterie do pozice 0
271
//   lcd_define_char(2,LCD_CHAR_HLE LCD_CHAR_LUI);      // Priklad definice znaku e s hackem a I s carkou od pozice 2
272
//                                                      // vsimnete si, ze neni carka mezi retezci s definici (oba retezce definuji
273
//                                                      // jediny definicni retezec)
274
//   printf(lcd_putc,"\fZnaky:\20\22\23");              // priklad vypisu znaku z pozice 0, 2 a 3
275
//   delay_ms(1000);
276
//   lcd_define_char(0,LCD_CHAR_BAT0);                  // Predefinovani tvaru znaku v pozici 0
277
//   delay_ms(1000);
278
//}
Designs/GPSRL01B/SW/gpsrl.h
1
#include <16F876A.h>
2
#device *=8
3
#device adc=8
4

  
5
#FUSES NOWDT                 	//No Watch Dog Timer
6
#FUSES XT                    	//Osc (= 4mhz)
7
#FUSES NOPUT                 	//No Power Up Timer
8
#FUSES NOPROTECT             	//Code not protected from reading
9
#FUSES NODEBUG               	//No Debug mode for ICD
10
#FUSES NOBROWNOUT            	//No brownout reset
11
#FUSES NOLVP                 	//No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
12
#FUSES NOCPD                 	//No EE protection
13
#FUSES NOWRT                 	//Program memory not write protected
14

  
15
#use delay(clock=4000000)
16
#use rs232(stream=NMEA,baud=4800,parity=N,rcv=PIN_C6,bits=8)
17
#use rs232(stream=PC,baud=9600,parity=N,rcv=PIN_C7,bits=8)
:@created_atf1440842868.160002=y:@expires_in0