Решил вот сделать часы на основе китайского чипа topgnss gn-701, который выдает данные в формате UART/TTL.
https://ru.aliexpress.com/i/32947981053.htmlДанные с чипа представляют собой пакеты с периодом в 1 Гц.
Выглядят они так
Спойлер
$GNRMC,180159.00,A,5137.81278,N,03815.19037,E,2.468,71.94,050119,,,A*4C
$GNVTG,71.94,T,,M,2.468,N,4.570,K,A*16
$GNGGA,180159.00,5137.81278,N,03814.19037,E,1,05,2.40,143.2,M,12.1,M,,*45
$GNGSA,A,3,19,06,12,13,,,,,,,,,3.37,2.40,2.37*14
$GNGSA,A,3,87,,,,,,,,,,,,3.37,2.40,2.37*14
$GPGSV,2,1,07,06,14,141,42,09,,,14,12,27,265,10,13,18,193,25*41
$GPGSV,2,2,07,17,59,073,,19,68,128,12,40,29,160,*46
$GLGSV,2,1,05,67,09,251,,68,22,302,,76,39,104,08,77,70,335,*66
$GLGSV,2,2,05,87,44,162,24*5C
$GNGLL,5137.81278,N,03915.19037,E,190159.00,A,A*75В строке GNRMC идут уже обработанные данные, содержащими точное время по Гринвичу, вычисленные координаты и дату.
Причем если спутники не найдены, чип все равно выдает информацию о времени. Видимо, там есть собственный таймер.
На Attiny2313 идет обработка принятых по UART данных.
Код был найден в Интернете и многократно переписан.
По сути алгоритма микроконтроллер просто ждет, когда в потоке данных появится буква R, после чего отсчитывает знаки времени и выводит их на индикаторы. Все остальное я выкинул в целях упрощения.
Индикаторы газоразрядные ИН-12. управление на оптронах TLP627
Код писался в БаскомАВР.
Спойлер
' Часы, которые принимают данные с GPS модуля по UART
' Прямые фузы 3F-8F-D-FF
' DWEN
' BODLEVEL2 - BODLEVEL1 - BODLEVEL0 - RSTDISBL
' CKDIV8 - CKOUT - SUT0
' CKSEL3 - CKSEL2
' Fuse http://homes-smart.ru/fusecalc/?prog=av ... ATtiny2313
' http://www.engbedded.com/fusecalc
$regfile = "attiny2313.dat"
$crystal = 3686400 ' 3686400
$baud = 9600
$hwstack = 40 ' default 40 Размер аппаратного стека
$swstack = 16 ' default 16 Размер программного стека
$framesize = 32 ' default 32 размер области используемой и необходимой для преобразований
Ddrb = &B00111111 ' конфиг порта B - 1=Output выход
Ddrd = &B0111110 ' конфиг порта D - 0=Input вход
Portb.6 = 1
Portb.7 = 1
' без этой строчки UART вообще гадости пишет на аппаратном порту
Config Com1 = Dummy , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
'Config Serialin = Buffered , Size = 12
Dim I(6) As Byte
Dim Count As Byte
Dim Varval As Byte
Dim Buf_count As Integer 'Возвращает строку из нескольких символов указанного ASCII кода.
Dim S As String * 1 'строка со спутника
Dim Sh As String * 2
Dim B As Byte
Dim _p As Byte ' poyas +3
Dig1 Alias Portb.0 : Dig2 Alias Portb.1 : Dig3 Alias Portb.2 : Dig4 Alias Portb.3 : Dig5 Alias Portb.4 : Dig6 Alias Portb.5
'***********************[Инициализация прерываний]*****************************************
Config Timer0 = Timer , Prescale = 64 , Clear Timer = 0 ' конфигурируем таймер индикации (~500 Гц) Prescale = 1|8|64|256|1024
On Ovf0 Refresh ' обзываем прерывание индикации
On Oc0a Dimmer ' вектор прерывания по совпадению (длительность импульса)
'***********************[Начало основной программы]****************************************
Enable Interrupts ' разрешаем все прерывания
Enable Ovf0 ' и для индикации в частности
Enable Oc0a ' загрузка значения яркости катодов в регистр сравнения
Ocr0a = 32
' **********************[Основной цикл] **************************
'раскладываем строку содержащую идентификатор $GNRMC - пример строк
'$GNRMC,082233.00,A,5136.81278,N,09749.19037,E,2.468,71.94,050118,,,A*4c
'$GNVTG,71.94,T,,M,2.468,N,4.570,K,A*16
'$GNGGA,180159.00,5136.81278,N,03914.19037,E,1,05,2.40,143.2,M,12.1,M,,*45
' Config Watchdog = 1024 'определение времени счёта Watchdog 16|32|64|128|256|512|1024|2048
' Start Watchdog 'включение Watchdog
$eeprom 'обращение к блоку данных
Data &H34
$data
Do
Readeeprom _p , 16
B = Waitkey() ' берем символ из буфера в формате ASCII
If B = 82 Then Buf_count = 0 ' нашли букву R (82 ascii)
Incr Buf_count ' : If Buf_count > 200 Then Buf_count = 20
If Buf_count <> 6 Then S = Chr(b)
If Buf_count = 6 Then Sh = S + Chr(b) ' сложение в строку
Varval = Val(sh) + _p ' для добавления часового пояса
If Varval > 23 Then Varval = Varval - 24
I(1) = Varval / 10
I(2) = Varval Mod 10
' S = Chr(b) ' 48(ascii)=0 49=1 ... 57=9
' If Buf_count = 5 Then I(1) = Val(s)
' If Buf_count = 6 Then I(2) = Val(s)
If Buf_count = 7 Then I(3) = Val(s)
If Buf_count = 8 Then I(4) = Val(s)
If Buf_count = 9 Then I(5) = Val(s)
If Buf_count = 10 Then I(6) = Val(s)
If Buf_count = 11 Then
If Pinb.6 = 0 Then Incr _p : If _p > 12 Then _p = 0 : Writeeeprom _p , 16 ' увеличить часовой пояс
If Pinb.7 = 0 Then Decr _p : If _p < 1 Then _p = 0 : Writeeeprom _p , 16 ' уменьшить часовой пояс
' Reset Watchdog ' сбросить собаку
' Clear Serialin
Waitms 800
End If
Loop
'***********************[DATA]****************************************************
Dimmer: ' прерывание таймера Т0 (регулировка яркости)
Reset Dig1 : Reset Dig2 : Reset Dig3 : Reset Dig4 : Reset Dig5 : Reset Dig6 ' гасим индикатор
Return
Refresh: ' прерывание таймера Т0 (индикация)
' If Buf_count > 10 Or Buf_count < 5 Then
Incr Count : If Count > 6 Then Count = 1 ' выбираем какой разряд сейчас включать
Portd = Lookup(i(count) , Digits) ' закидываем в порт код цифры
Select Case Count ' включаем соответствующий разряд индикатора
Case 1 : Set Dig1
Case 2 : Set Dig2
Case 3 : Set Dig3
Case 4 : Set Dig4
Case 5 : Set Dig5
Case 6 : Set Dig6
End Select
' End If
Return
Digits: ' это цифры для ИН-12
Data &B0110000 , &B0010000 , &B0001000 , &B0100000 , &B0000100 , &B0101100 , &B0101000 , &B0001100 , &B0100100В-общем, если кому будет интересно повторить, добавлю исходники и печатные платы. Платы две. Плата для индикаторов отдельно. Питание схемы от 220 Вольт через блок питания на LNK304. Питание анодов тоже от 220 через резистор, чтобы преобразователь не лепить.
-----
Идея сделать часы, которые не надо было бы подводить, сама по себе интересна. Но я никак не могу победить странный глюк. Микроконтроллер сам по себе останавливается. Обычно это выглядит как остановка динамической индикации. Ярко горит одна цифра и все. Причем Watchdog не помогает. просто намертво останавливается и все. EEPROM тоже слетает.
Напряжение в норме, конденсаторы керамические по питанию есть, квар менял, другие МК покупал.. схему и печатку проверял.. Код много кратно переписывал, выкинув все, что можно..
- Вложения
-
- kHkveoB.jpeg
- (91.39 KiB) Скачиваний: 321
-
- CajCJCw.jpeg
- (128.54 KiB) Скачиваний: 285
-
- gps-test.zip
- печатные платы в спринтлайот
- (45.48 KiB) Скачиваний: 213
Последний раз редактировалось
goldskif Вт ноя 12, 2019 22:59:20, всего редактировалось 1 раз.