AVR GPS приемник на микроконтроллере ATmega8

GPS навигация все более и более проникает в массы, я не стал в этом исключением. Два года назад купил себе GPS модуль Lassen iQ от Trimble и активную антенну для него, хотел поиграться с космическими технологиями, но не вышло.GPS навигация все более и более проникает в массы, я не стал в этом исключением. Два года назад купил себе GPS модуль Lassen iQ от Trimble и активную антенну для него, хотел поиграться с космическими технологиями, но не вышло. На самом модуле был нестандартный и неудобный для соединения разъем с шагом 1,27мм, также питание было 3.3В, а у меня были макетки только для 5В питания. 3.3В было достигнуто путем подключения нескольких диодов, на которых гасилось напряжение.

В общем, мне тогда не удалось выжать никаких данных с модуля и я подумал что он паленый. Недели две назад все-таки достал его из загашника, подключил к логическому анализатору. На дисплее компьютера увидел, что модуль очень даже живой и исправно выдает данные. Обрадовавшись этому, решил сделать простенький GPS приемник на ATmega8 с выводом данных на символьный ЖКИ. Вот так выглядит GPS модуль Lassen iQ:
фото GPS приемника
фото GPS приемника
А так выглядит внешняя активная антенна ANT GPS 66801-00 HFL 8CM для него:
фото антенны GPS приемника
Теперь на пальцах про систему GPS. Система GPS представляет собой сеть спутников околоземной орбите, каждый спутник посылает на землю сигнал о своем местоположении и точном времени отправления сигнала, GPS приемник получает эти сигналы и по задержкам сигналов от спутников определяет свое положение. Для этого ему нужно минимум 3 сигнала с разных спутников. Для точного определения координат и высоты над уровнем моря уже нужно 4 спутника. Далее эти сигналы декодируются в координаты, которые посылаются в формате NMEA (в некоторых приемниках есть еще собственный формат вывода координат) к обрабатывающему микроконтроллеру, который выводит эти данные на дисплей. Учитывая прошлые проблемы с подсоединением GPS модуля и его питанием, решил вытравить для него специальную макетную плату, где будет размещаться сам модуль и стабилизатор LP2980-3.3 на 3.3В с обвязкой. Также для согласования уровней, на входа GPS модуля были подключены к делителям напряжения. Вот так это выглядит по завершению:
фото макетки GPS приемника
Далее макетка была присоединена к микроконтроллеру таким макаром:

Тактироваться микроконтроллер будет от внутреннего RC генератора на 4Мгц. Подтягивающие резисторы R1,R4 – 4,7кОм. R2 – ограничительный на 1кОм, R3 - на 17 Ом. Потенциометр VR1 – на 10кОм. Конденсаторы С7,С4 – электролиты на 200мкФ и 100мкФ соответственно. С4,С6,С9 – керамика на 0,1мкФ, С10 – керамика на 1мкФ, С8 – танталовый на 68мкФ.
Как видно из схемы, GPS приемник мы будем только слушать, никак не настраивая его при включении. Для этого выводы RxA, RxB подключим подтягивающими резисторами к питающему напряжению, чтобы приемник случайно не словил каких наводок и не переконфигурировался. Это важно. Теперь разберемся с форматом NMEA. Наш GPS модуль с заводскими настройками, как гласит родной даташит, на выходе TхB каждую секунду генерирует GGA и VTG сообщение, которое можно принять, настроив UART приемник на скорость 4800бит/с 8 бит данных, без проверок. Про формат GGA и VTG сообщений можно прочитать в спецификации стандарта NMEA. Оговорюсь тем, что в каждом сообщении NMEA предусмотрена контрольная сумма, обычный XOR всех байтов, не включая первый символы “$” и последний перед полем контрольной суммы “*”. Но с проверкой контрольной суммы у меня что-то не сложилось, примерно в каждом третьем пакете она не совпадает, хотя провода короткие и больших токов в схеме не проходит. Может это связано с тем, что уровни несогласованны, микроконтроллеру нужно 5В TTL, а приемник выдает 3.3В TTL. Поэтому в прошивке проверка контрольной суммы предусмотрена, но закомментирована. Как выглядит часть GGA пакета на дисплее моего логического анализатора:

Далее это сообщение расшифровывает микроконтроллер и выводит данные на экран. Расшифровать его совсем не сложно, оно представляет собой набор полей, разграниченных запятыми. Поля представлены в ASCII формате, так что заморачиваться с выводом не придется, просто нужно вывести на дисплей нужные поля. Так как на мой дисплей одновременно не помещались все данные, то была подсоединена кнопка к PB0, которая будет определять выводимые данные на дисплей. Теперь рассмотрим собственно код прошивки:

  1. #include <avr/io.h>
  2. #include <avr/interrupt.h>
  3.  
  4. #define RS 2 //RS=PD1
  5. #define E 3 //E=PD3
  6.  
  7. #define TIME 10 //Time constant for LCD delay
  8. //Tick with 4Mhz
  9.  
  10. unsigned char mode=0;
  11.  
  12. unsigned char gga_count=0;
  13. unsigned char vtg_count=0;
  14.  
  15. unsigned char gga_data[90]={};
  16. unsigned char vtg_data[90]={};
  17.  
  18. void pause (unsigned int a)
  19. {
  20. unsigned int i;
  21. for (i=a;i>0;i--);
  22. }
  23.  
  24. void lcd_com (unsigned char lcd)//Write command to LCD
  25. {
  26. unsigned char temp;
  27. temp=(lcd&~(1<<RS))|(1<<E); //RS=0 - it's command
  28. PORTD=temp; //Write higth tetrade, RS, E to portA
  29. asm("nop"); //Settle pause
  30. PORTD=temp&~(1<<E); //Write higth tetrade to LCD
  31. temp=((lcd*16)&~(1<<RS))|(1<<E); //RS=0 - it's command
  32. PORTD=temp; //Write low tetrade, RS, E to portA
  33. asm("nop"); //Settle pause
  34. PORTD=temp&~(1<<E); //Write low tetrade to LCD
  35. pause (10*TIME); //Pause for executing command
  36. }
  37.  
  38. void lcd_dat (unsigned char lcd)//Write data to LCD
  39. {
  40. unsigned char temp;
  41. temp=(lcd|(1<<RS))|(1<<E); //RS=1 - it's data
  42. PORTD=temp; //Write higth tetrade, RS, E to portA
  43. asm("nop"); //Settle pause
  44. PORTD=temp&~(1<<E); //Write higth tetrade to LCD
  45. temp=((lcd*16)|(1<<RS))|(1<<E); //RS=1 - it's data
  46. PORTD=temp; //Write low tetrade, RS, E to portA
  47. asm("nop"); //Settle pause
  48. PORTD=temp&~(1<<E); //Write low tetrade to LCD
  49. pause(TIME); //Pause for loading data
  50. }
  51.  
  52. void lcd_init (void) //Init LCD
  53. {
  54. lcd_com(0x2c); //4-wire data bus, 1-row, 5x8 symbol size
  55. pause(100*TIME);
  56. lcd_com(0x0c); //Show image, cursor show
  57. pause(1000*TIME);
  58. lcd_com(0x01); //Clear screen and set cursor on 0x00 position
  59. pause (100*TIME);
  60. }
  61.  
  62. void uart_init(void)
  63. {
  64. UBRRH = 0x00; //Set 4800 bit per second
  65. UBRRL = 0x33;
  66. UCSRA = 0x00;
  67. UCSRB = (1<<RXCIE)|(1<<RXEN)|(0<<TXEN);
  68. //Receive and transmit enable, interrupt on receive complete enabled
  69. UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);
  70. }
  71.  
  72. unsigned char search_gga_field (unsigned char x)//Search x-th field in GGA packet
  73. {
  74. unsigned char i, c;
  75. c=0;
  76. for (i=0;i<gga_count;i++)
  77. {
  78. if (gga_data[i]==',') c++;
  79. if (c==x) return i+1;
  80. }
  81. return 0;
  82. }
  83.  
  84. //Search x-th field in VTG packet
  85. unsigned char search_vtg_field (unsigned char x)
  86. {
  87. unsigned char i, c;
  88. c=0;
  89. for (i=0;i<vtg_count;i++)
  90. {
  91. if (vtg_data[i]==',') c++;
  92. if (c==x) return i+1;
  93. }
  94. return 0;
  95. }
  96.  
  97. void write_gps_data (unsigned char crc_valid) //Write GPS data on LCD
  98. {
  99. unsigned char i,temp;
  100. if (crc_valid==0) {
  101. //If CRC not confirm
  102. lcd_init ();
  103. lcd_dat('n');
  104. lcd_dat('o');
  105. lcd_dat(' ');
  106. lcd_dat('v');
  107. lcd_dat('a');
  108. lcd_dat('l');
  109. lcd_dat('i');
  110. lcd_dat('d');
  111. return;
  112. }
  113.  
  114. if (gga_data[search_gga_field(6)]=='0')
  115. {//If no GPS signal
  116. lcd_init();
  117. lcd_dat('n'); lcd_dat('o'); lcd_dat(' ');
  118. lcd_dat('s'); lcd_dat('i'); lcd_dat('g');
  119. lcd_dat('n'); lcd_dat('a'); lcd_dat('l');
  120.  
  121. lcd_com(0xc0);
  122. lcd_dat(gga_data[search_gga_field(7)+1]);
  123. lcd_dat(' '); lcd_dat('s'); lcd_dat('a');
  124. lcd_dat('t'); lcd_dat(' '); lcd_dat('a');
  125. lcd_dat('v'); lcd_dat('a'); lcd_dat('i');
  126. lcd_dat('l'); lcd_dat('a'); lcd_dat('b');
  127. lcd_dat('l'); lcd_dat('e');
  128. return;
  129. }
  130. if (mode==0)
  131. {//Write Latitude and Longitude
  132. lcd_init();
  133. lcd_dat('L'); lcd_dat('a'); lcd_dat('t');
  134. lcd_dat(':');
  135. temp=search_gga_field(2);
  136. for (i=temp;i<temp+9;i++)//Write Latitude
  137. {
  138. if ((i-temp)==2) lcd_dat(0xdf);
  139. lcd_dat (gga_data[i]);
  140. }
  141. lcd_dat(0xe7);
  142. lcd_dat (gga_data[search_gga_field(3)]);
  143.  
  144. lcd_com(0xc0);
  145. lcd_dat('L');
  146. lcd_dat('n');
  147. lcd_dat(':');
  148. temp=search_gga_field(4);
  149. for (i=temp;i<temp+10;i++) //Write Longitude
  150. {
  151. if ((i-temp)==3) lcd_dat(0xdf);
  152. lcd_dat (gga_data[i]);
  153. }
  154. lcd_dat (0xe7);
  155. lcd_dat (gga_data[search_gga_field(5)]);
  156. }
  157. if (mode==1) { //Write altitude and speed
  158. lcd_init();
  159. lcd_dat('A'); lcd_dat('l'); lcd_dat('t');
  160. lcd_dat('i'); lcd_dat('t'); lcd_dat('u');
  161. lcd_dat('d'); lcd_dat('e'); lcd_dat(' ');
  162. temp=search_gga_field(9);
  163. while (gga_data[temp]!=',') //Write altitude
  164. {
  165. lcd_dat(gga_data[temp]);
  166. temp++;
  167. }
  168. lcd_dat('m');
  169.  
  170. lcd_com(0xc0);
  171. lcd_dat('S'); lcd_dat('p');
  172. lcd_dat('e'); lcd_dat('e');
  173. lcd_dat('d'); lcd_dat(' ');
  174.  
  175. temp=search_vtg_field(7);
  176. while (vtg_data[temp]!=',') //Write speed
  177. {
  178. lcd_dat(vtg_data[temp]);
  179. temp++;
  180. }
  181. lcd_dat('k'); lcd_dat('m');
  182. lcd_dat('/'); lcd_dat('h');
  183. }
  184. if (mode==2) { //Write UTC time and used satellites
  185. lcd_init();
  186. lcd_dat('U'); lcd_dat('T');
  187. lcd_dat('C'); lcd_dat(' ');
  188.  
  189. temp=search_gga_field(1);
  190. for (i=temp;i<temp+6;i++) //Write UTC
  191. {
  192. if (((i-temp)==2)||((i-temp)==4) ) lcd_dat (':');
  193. lcd_dat(gga_data[i]);
  194. }
  195. lcd_com(0xc0);
  196. lcd_dat('S'); lcd_dat('a'); lcd_dat('t');
  197. lcd_dat('e'); lcd_dat('l'); lcd_dat('l');
  198. lcd_dat('i'); lcd_dat('t'); lcd_dat('e');
  199. lcd_dat('s'); lcd_dat(' ');
  200.  
  201. temp=search_gga_field(7);
  202. lcd_dat(gga_data[temp]); //Write satellites
  203. if (gga_data[temp+1]!=',') lcd_dat(gga_data[temp+1]);
  204. }
  205.  
  206. return;
  207. }
  208.  
  209. unsigned char check_crc (void) //Check CRC16
  210. { /*unsigned char i,gga_crc,vtg_crc;
  211.  
  212.  gga_crc=0x00;
  213.  
  214.  i=1;
  215.  while ((gga_data[i]!='*')&&(i<90))
  216.   {
  217.   gga_crc^=gga_data[i];
  218.   i++;
  219.   }
  220.  i++;
  221.  if (gga_data[i]!=(0x30+(gga_crc>>4))) return 0;
  222.  i++;
  223.  if (gga_data[i]!=(0x30+(gga_crc&0x0f))) return 0;
  224.  
  225.  vtg_crc=0x00;
  226.  
  227.  i=1;
  228.  while ((vtg_data[i]!='*')&&(i<90))
  229.   {
  230.   vtg_crc^=vtg_data[i];
  231.   i++;
  232.   }
  233.  i++;
  234.  if (vtg_data[i]!=(0x30+(vtg_crc>>4))) return 0;
  235.  i++;
  236.  if (vtg_data[i]!=(0x30+(vtg_crc&0x0f))) return 0; */
  237.  
  238. return 1;
  239. }
  240.  
  241. ISR (USART_RXC_vect) //Starts when first byte of NMEA message been received
  242. {
  243. gga_count=0;
  244. gga_data[gga_count]=UDR;//Get first byte to GGA packet
  245. gga_count++;
  246.  
  247. do { //Receive GGA packet
  248.  
  249. while ( !(UCSRA & (1<<RXC)) )
  250. ;
  251. gga_data[gga_count]=UDR;
  252. gga_count++;
  253.  
  254. } while ((gga_data[gga_count-1]!=0x0a)&&(gga_count<90));
  255.  
  256. vtg_count=0; //Receive VTG packet
  257. do {
  258.  
  259. while ( !(UCSRA & (1<<RXC)) )
  260. ;
  261. vtg_data[vtg_count]=UDR;
  262. vtg_count++;
  263.  
  264. } while ((vtg_data[vtg_count-1]!=0x0a)&&(vtg_count<90));
  265.  
  266. write_gps_data(check_crc()); //Write data and check CRC16
  267.  
  268. return;
  269. }
  270.  
  271. int main(void)
  272. {
  273. DDRD=0xfc; //Init PORTD as output
  274.  
  275. DDRB=0x00; //Init PORTB, PB0 as input
  276. PORTB=0x01;
  277.  
  278. pause(5000); //Settle pause
  279. lcd_init(); //Init LCD
  280.  
  281. lcd_dat('n'); lcd_dat('o'); lcd_dat(' ');
  282. lcd_dat('g'); lcd_dat('p'); lcd_dat('s');
  283. lcd_dat(' '); lcd_dat('m'); lcd_dat('o');
  284. lcd_dat('d'); lcd_dat('u'); lcd_dat('l');
  285. lcd_dat('e');
  286.  
  287. uart_init(); //Init UART
  288. sei(); //Interrupt enable
  289. while (1)
  290. if ((PINB&0x01)==0x00) { //If key pressed
  291. while ((PINB&0x01)==0x00) //Wait to unpress
  292. ;
  293. pause(1000); //Pause
  294. mode=(mode+1)%3; //Change mode
  295. }
  296.  
  297. return 1;
  298. }

В начале приема пакета срабатывает прерывание по принятию байта по UART. Далее байты один за одним упаковываются в массивы gga_data vtg_data содержащих соответственно GGA и VTG пакет. Проверяется контрольная сумма (фейково) и выводиться на дислей. Если поле 6 в пакете GGA равно нулю, то GPS приемник не смог определить координаты и собственно пишем «no signal», если же контрольная сумма не совпадает (фейковая) пишем «no valid». Обработка же нажатия кнопки происходит в теле основной программы. Глобальная переменная mode служит для определения данных, которые будут выводиться на ЖКИ (0 – выводится широта и долгота, 1 – выводится высота и скорость, 2 – выводится точное время UTC и количество видимых приемником спутников). Переменные gga_count и vtg_count служат для определения количества принятых байт в GGA и VTG пакете.
Как работает собранный девайс у меня на подоконнике можно просмотреть на видео:

Скачать исходный код в виде проекта для AVR Studio 4 и разводку печатной платы для Sprint layout 5

А TSIP протоколом пробовали

А TSIP протоколом пробовали работать?

Можна було живити все

Можна було живити все напругою 3.3V використавши мікроконтроллер ATmega8L (2.7V - 5.5V)

Планирую переделать пример

Планирую переделать пример для приема с приемника сообщений типа ZDA,
c последующей обработкой и выдачей времени( в формате ЧЧ-ММ-СС), на семисегментный
индикатор. Для точной индикации времени думаю завести сигнал 1PPS на вход с внешним прерыванием. Посоветуйте, как лучше это все организовать, с чего начать.

Я бы сперва просто

Я бы сперва просто организовал индикацию на семисегментниках. После бы прицепил туда чтение пакета GGA (в нем тоже есть точное время) и вывода времени на дисплей. Далее бы сделал работу по такой схеме:

Включается девайс. Выбирается часовой пояс (можно запоминать в EEPROM'е), нажимается кнопка "синхронизация". Девайс ловит пакет GGA и синхронизирует время. Далее для отсчета времени юзается PPS подключенный к внешнему прерыванию. (Если каждую секунду ловить GGA и при этом использовать динамическую индикацию - могут возникнуть мерцания или проблемы с приемом пакетов от GPS приемника).

В приемнике есть выход

В приемнике есть выход 1PPS.
Подскажите как правильно подключить его к ПК?
По даташиту не понял(с английским плохо).

1 pulse per second, каждую

1 pulse per second, каждую секунду на этом выводе прямоугольный импульс длительностью 80 мкс с высокой точностью, можно заюзать для точных часов. К компьютеру смысла его подключать не вижу, из-за того, что обращение софта к железу идет через драйвера - теряется точность временных задержек, и отслеживать такого рода импульсы становиться сложно.

Никогда таким не занимался.

Никогда таким не занимался. Хочется собрать GPS-трекер на такой микросхеме u-blox.com/en/lea-6t.html. Кроме того, что реализовано у вас, нужна запись трека на карту SD. Не подскажите, какие для этого нужны компоненты (микроконтроллёр, дисплей, устройство для чтения карт памяти и т. д.)? Как спаять, собрать корпус?

С нахрапу такое сделать не

С нахрапу такое сделать не выйдет, если есть интерес к освоению микроконтроллера - попробуй помигать светодиодами для начала: Бегущие огни на ATtiny2313, первая программа для микроконтроллера

Извини чувак, но разработке

Извини чувак, но разработке цифровых устройств учатся годами. Для этого необходимо иметь знания в обширной области. Просто так слепить в кучу модули можно, а вот заставить их работать так, как тебе это нужно - проблема. Если с электроникой не очень давно знаком, мой совет забудь пока про GPS, запись на карту памяти координат и тд. тп. А лучше еще раз подумай что проще, купить готовое устройство или выучить и разобраться во всем что понадобится при разработке.

расскАжите, что и в каком

расскАжите, что и в каком объеме надо изучить?

Список:

Теорию электроцепей - надо знать, хотя бы на 4-ку,
Теорию передачи информации - на 4-ку хватит,
Информатику - на 4-ку хватит,
Программирование на языке Си для микроконтроллеров - минимум на 3-ку,
Теоретические основы радиотехники - на 4-ку,
Пока вроди бы все.

скажите а будете ли карту

скажите а будете ли карту прикручивать? Ну конечно не для ЖКИ индикатора а например для цветного LCD от сименса s65 к примеру? Было бы очень круто!

Карту прикрутить хочу, но

Карту прикрутить хочу, но наверно на ЖК дисплее wg12864. Он большой, удобно будет пользоваться. Также хочется сделать так, чтобы трек рисовало, добавить возможность расстановки Waypoint'ов. И все это хранить на внешней SD карте, благо с ней и системой FAT уже разобрался. Правда для такого нужно будет использовать контроллер помощнее, какую-нибудь мегу64 или ATmega128. Можно попробовать и карты добавить, но ЧБ + их надо будет как-то привязывать. Для чего нужно будет софт для привязки писать. В принципе сложного здесь нет ничего, просто много работы :). Надеюсь что у меня хоть на что-то хватит, из того, что я перечислил :)

а каким лог. анализатором

а каким лог. анализатором пользуетесь?

В качестве анализатора

В качестве анализатора использую LOGIC-U PRO. Прибором в целом очень доволен, хорошее соотношение цена/качество. Очень упростил мне жизнь в некоторых моментах.

Как прошиты фьюзы? назначение

Как прошиты фьюзы?
назначение кнопок А1 и А2?

Фьюзы для PonyProg 2000

Фьюзы для PonyProg 2000
фьюзы GPS приемника

Картинку с фьюзами вечером

Картинку с фьюзами вечером сделаю. Важно использовать источник тактирования 4Мгц.

Про кнопки.
А2. Читаем внимательно текст: "Так как на мой дисплей одновременно не помещались все данные, то была подсоединена кнопка к PB0, которая будет определять выводимые данные на дисплей." т.е. переключает между координатами\высотой-скоростью\временем-спутниками.

А назначения кнопки А1 можно посмотреть на принципиальной схеме. Там все выводы подписаны.

А что показывает LCD, когда

А что показывает LCD, когда gps модуль не подключен или неисправен?

Было бы неплохо когда на LCD

Было бы неплохо когда на LCD надпись No signal, еще отображалось количество
доступных спутников, например: <1 SAT avaible>

Достаточно дописать:if

Достаточно дописать:

  1. if (gga_data[search_gga_field(6)]=='0')
  2. { //If no GPS signal
  3. lcd_init(); lcd_dat('n'); lcd_dat('o'); lcd_dat(' '); lcd_dat('s'); lcd_dat('i');
  4. lcd_dat('g'); lcd_dat('n'); lcd_dat('a'); lcd_dat('l');
  5.  
  6. lcd_com(0xc0);
  7. lcd_dat(gga_data[search_gga_field(6)]);
  8. lcd_dat(' '); lcd_dat('s'); lcd_dat('a'); lcd_dat('t'); lcd_dat(' '); lcd_dat('a');
  9. lcd_dat('v'); lcd_dat('a'); lcd_dat('i'); lcd_dat('l'); lcd_dat('a'); lcd_dat('b');
  10. lcd_dat('l'); lcd_dat('e');
  11. return;
  12. }

Код в статье поправил, спасибо

У меня не работает. Постоянно

У меня не работает.
Постоянно 0 sat avaible.
Потом находит 3 спутника и показывает данные.

В чем проблема? :) что

В чем проблема? :) что не сразу находит спутники? :)

Спутники находит не

Спутники находит не сразу.
Насколько я понимаю, должно быть так:
Нет спутников - No signal 0 SAT avaible
Нашли 1 спутник - надпись No signal 1 SAT avaible
Нашли 2 спутник - надпись No signal 2 SAT avaible
Нашли 3 спутника - отображаются координаты.

У меня постоянно висит No signal 0 SAT avaible
вне зависимости сколько спутников(наличие спутников вижу по
проге Trimble GPS Monitor), а потом сразу отображаются координаты.

А где скачали прогу? Ведь

А где скачали прогу? Ведь нужно ещё подкупить USB переходник? ascerdfg@yandex.ru

я ошибся в поле, выводил

я ошибся в полем, выводил состояние сигнала, вместо количества спутников. Нужно вот так:

  1. if (gga_data[search_gga_field(6)]=='0') { //If no GPS signal
  2. lcd_init(); lcd_dat('n'); lcd_dat('o'); d_dat(' ');
  3. lcd_dat('s'); lcd_dat('i'); lcd_dat('g');
  4. lcd_dat('n'); lcd_dat('a'); lcd_dat('l');
  5. lcd_com(0xc0);
  6. lcd_dat(gga_data[search_gga_field(7)+1]);
  7. lcd_dat(' '); lcd_dat('s'); lcd_dat('a');
  8. lcd_dat('t'); lcd_dat(' '); lcd_dat('a');
  9. lcd_dat('v'); lcd_dat('a'); lcd_dat('i');
  10. lcd_dat('l'); lcd_dat('a'); lcd_dat('b');
  11. lcd_dat('l'); lcd_dat('e');
  12. return;
  13. }

Код подправил. Должно работать.

Если GPS модуль изначально не

Если GPS модуль изначально не подключен к микроконтроллеру, то на дисплее ничего не покажется. Это недоработка, код подправил так, что если GPS модуль не подключен - то будет писать "no gps module".

Если GPS модуль выдает какую-то белиберду (контрольная сумма не совпадает), то пишется "no valid". Правда я заккоментировал проверку контрольной суммы, то у меня каждый 3-й пакет забраковывался.

Если же от модуля был принят пакет GGA, но позиция не определена - пишет "no signal"

Я так понимаю, проблема в том, чтобы понять без осциллографа и логического анализатора, работает ли вообще GPS модуль, а если работает - то как. Это проще всего сделать при помощи шнурка с ST232 (MAX232) или FT232, если нет COM порта. Просто подключаем модуль напрямую к конвертеру, включаем на комп программу Terminal 1.9b и любуемся.
отладка GPS приемника
Как сделать конвертеры описано здесь:
http://avrlab.com/node/136
http://avrlab.com/node/138

за каким конвертер для СОМ?

за каким конвертер для СОМ?

На выходе приемника ТТЛ

На выходе приемника ТТЛ логика, на выходе COM порта RS232 логика.
Максимальное напряжение в ТТЛ логике - 5Вольт, в RS232 - 12Вольт. Конвертер нужен как минимум что бы не сжечь GPS приемник.

Сделал вот такую

Сделал вот такую плату

gps модуль
Переходник на gps модуль
gps приемник
gps приемник в сборе

Мне кажется, что удобно делать библиотеки для работы с периферией, и не только обработка gps, но и uart, и вывод на lcd(1-wire, i2c, adc и другое).
Намного понятней структура да и переносимость кода лучше.

Замена GPS-модуля

Можно ли заменить используемый GPS навигатор на другой GPS-приемник EB-240 TD высокочувствительный GPS-модуль со встроенной антенной и резервной батареей. Ток потребления 30 мА. Прием навигационных данных по UART TTL на скорости 9600 бит/сек. Так как цена (по крайней мере на Украине) намного дешевле, а обладает лучшими характеристиками по приему, и принимает больше спутников,а так же имеет встроеную антенну. Протоколы: NMEA 0183, все сторки которые используються в программе поддерживает.

Если приемник выдает по uart

Если приемник выдает по uart NMEA пакеты GGA и VTG, то заменить можно с минимальной корректировкой программы. Встроенные антены вроде как капризны, т.е. хуже выносных ловят. А зачем там батарейка? Хранить кэш данных для горячего старта?

Данные пакеты он выдает, на

Данные пакеты он выдает, на счет встроеной антенны, хочеться компактности, и использовать данное устройство собираюсь на открытой местности на высотах от 0 до 3000м, где в основном даже при большой облачности все GPS модули которые использовались в полне коректно определяли координаты. Ну батарейка так батарейка, ни чего ужастного не вижу в ней. Думаю, что проблемы могу возникнуть при соглосовании скоростей работы, в программировании я не особо селен, разве, что смогу залить прошивку и чуть чуть ее подкоректировать. Заметил, что в контролере задана скорость приема данный на скорости 4800, как можно поменять ее на 9600(стандартная у EB-240TD, протокол версии 3,1). И частота обновления даных в вашем навигаторе 1Гц, в замене 5Гц, учитывались эти данные?

Нене, я не против встроенных

Нене, я не против встроенных антенн, они просто имеют свою нишу применения. А с батарейкой наоборот прикольно, что меньше времени требуется для горячего старта.
Для смены скорости uart стоит поменять строку 70. Для скорости 9600 она имеет вид UBRRL = 0x19; Для определения значения этого регистра надо открыть даташит на мегу8, страницу 156, там описаны стандартные значения для разных частот тактирования микроконтроллера.
Насчет частоты обновления в 5Гц, думаю что прокатит, если не прокатит - то можно поднять частоту микроконтроллера до 16Мгц, или принимать пакеты через один.
Вообще ты (можно та ты?) пробуй, если чего не получается - пиши на форуме, поможем.

Угу, один раз сделал

Угу, один раз сделал библиотеку, а потом только используеш. Ощутил это на примере работы с системой FAT и SD картой памяти. Очень понравилось, но нужно писать универсальный код, что занимает больше времени, для простых устройств бывает лень писать библиотеки. Например функции работы с LCD и UART я просто копи-пастю.

PS: модуль GPS работает??

Модуль работает в связке с МК

Модуль работает в связке с МК напрямую, и с ПК через MAX3232.
Планирую преобрести внешнюю антенну и окультурить в корпус.

Вот что у меня

Вот что у меня получилось.
Корпус gps приемника спереди
Корпус gps приемника сзади
Внутренности приемника
Модуль gps с антенной
Провода внутри приемника

Девайс собран на макетке и находится в стадии тестирования.

Кнопку Reset не ставил, но, наверно, поставлю - иногда зависет.
Хотя сброс МК при зависании нужно бы организовать программно(watchdog или как-то по-другому).

Добавил светодиод сигнала 1PPS.
Добавил MAX3232 для организации связи с ПК.
Использую родную прогу Trimble Monitor.
Добавил разъем для наружной антенны.

В планах
- добавить батарейку
- вывести сигнал 1PPS на разъем Com-порта и на отдельный разъем(можно раздать сигнал потребителям или организовать stratum-сервер).
- сделать стандарт частоты типа этого
Сверхточный генератор на основе GPS приемника (часть 1)
Сверхточный генератор на основе GPS приемника (часть 2)
- сделать автономный резервный источник питания.
- декодировать TSIP-протокол.
- и много чего другого.

Ваши планы тоже поддерживаю и буду тестировать.
Вот только приобрету внешнюю антенну и графический экран.

Удачи.

Разработка

Разработка понравилась.
Стандарт частоты - довольно интересная штука, но мне кажется это больше поизвращаться :)
А зачем TSIP декодировать? Хочется поуправлять GPS модулем??

А чего девайс зависает? Может проблема с приемом данных от GPS модуля? (сам с такой столкнулся, когда размер пакета использовался для определения конца данных)

Киев привет!Юры Гната ул., 8

Киев привет!Юры Гната ул., 8 ))

Серега, спалили контору!!!

Серега, спалили контору!!! :-)

Честно говоря, когда заливал

Честно говоря, когда заливал видео, думал что наверняка кто-то да пойдет копаться в гуглмапе, чтобы адрес вычислить :) я не ошибся :)

есть TIM-LC-0-000 можно ли на

есть TIM-LC-0-000 можно ли на нем такой девайс собрать?

Если он умеет по NMEA слать

Если он умеет по NMEA слать GGA и VTG пакеты, то можно.

UDP: гляну, NMEA он слать может. Так что можно точно. Правда может придеться слегка изменить программу. В общем - пиши как будешь собирать или как траблы появятся :)

Спасибо. Начинаю

Спасибо. Начинаю писать.сообщу результаты :) или траблы

Уже есть результаты, что

Уже есть результаты, что показать, рассказать?<

Как сделать что в программе

Как сделать что в программе обрабатывалось только GGA и VTG пакеты, потому что мой GPS дает больше пакетов и получается хаос

Можно настроить сам приемник,

Можно настроить сам приемник, чтобы он выдавал только GGA и VTG пакеты.
А можно принимать все в один буфер, искать там метку "GGA", "VTG" и соответственно вычленять пакеты, исходя из количества данных в пакете (отделены переменными).

а где подпрограмма gga_data?

а где подпрограмма gga_data?

Кварцевый резонатор

Кварцевый резонатор Мк обязательно брать 4 МГц?