Администрация форума не несёт ответственности за достоверность информации и оставляет за собой право редактировать или в особых случаях даже удалять посты без предупреждения. Спасибо за понимание.

Программирование ATMEL в BASCOM.

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » Часы с GPS по UART


Часы с GPS по UART

Сообщений 31 страница 47 из 47

31

Waitkey() подразумевает ожидание символа в буфере. Если бы его не было, остальная часть кода и не работала бы. Хотя с Инкей() та же фигня.
Нет, глюк где-то в массиве кроется.
А как вообще отследить причину зависания?

Код:
   Do
      B = Waitkey()                                         ' берем символ из буфера в формате ASCII

        If B = 36 Or B = 46 Then                            ' $=36 ascii  начало строки
            Z = 0
            Buf_count = 0
'            Reset Watchdog
         End If

        If B = 82 Then Z = 1                                'нашли букву R (82 ascii)

           If Z = 1 Then Incr Buf_count

           If Buf_count = 5 Or Buf_count > 6 Then S = Chr(b)
           If Buf_count = 6 Then Sh = S + Chr(b)

              Varval = Val(sh) + 3                          ' для добавления часового пояса
           If Varval > 23 Then Varval = Varval - 24

              I(1) = Varval / 10
              I(2) = Varval Mod 10

           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)

   Loop

0

32

goldskif написал(а):

Waitkey() подразумевает ожидание символа в буфере. Если бы его не было, остальная часть кода и не работала бы. Хотя с Инкей() та же фигня.

Inputbin пробовали ?
Или - мимо пролетело ? ;)

0

33

Nord написал(а):

Inputbin пробовали ?
Или - мимо пролетело ?

Не пробовал. А что это даст? Символы принимаются без проблем.
Куском кода If Buf_count = 5 Or Buf_count > 6 Then S = Chr(b)
я вообще вырезал из строки кусок, где только время, то есть цифры.. Маловероятно, что где-то поймался какой-то код или мусор..

0

34

goldskif написал(а):

Не пробовал. А что это даст?

Чтоб увидеть, что это даст - надо попробовать или почитать тут https://avrhelp.mcselec.com/
Ничего не даст только "ничегонепробование"... ;)

0

35

goldskif написал(а):

А что это даст?

Вопрос в способе приема.
Inputkey и Waitkey работают с ASCII кодами, Inputbin - просто с байтами.
Принципиально (побитно) разницы нет, но тем не менее...

Я уже сказал ранее, что это дало в моем случае...
Например, при отправке 0 принималось 48, 13, 10...
В разной последовательности. Можно было "словить", например - 10, 13, 10, 48, 13...
Были пропуски команд.

После замены на Inputbin все встало на свои места, четко и железно.
Причем, отправляется все, как ранее - Print, код передатчика не переписывался.

0

36

Inputbin не помог. Глюк, как оказалось, что при переполнении переменной Buf_count МК просто останавливается.. Прописал ей вместо Byte - Integer или Word, тогда появилась надежда, что до переполнения она раньше сброситься в 0.
Ну или для Byte
вписал принудительное обнуление от переполнения
Incr Buf_count : If Buf_count > 100 Then Buf_count = 20   
Вообще странно. При переполнении переменной Byte до 255, она должна обнулятся. А вместо этого микроконтроллер просто тупо останавливается.. Причем не просто останавливался, но еще И ЕЕПРОМ умудрялся обнулять..

Отредактировано goldskif (2019-01-17 12:27:11)

0

37

goldskif написал(а):

Вообще странно. При переполнении переменной Byte до 255, она должна обнулятся. А вместо этого микроконтроллер просто тупо останавливается.. Причем не просто останавливался, но еще И ЕЕПРОМ умудрялся обнулять..

Первый раз такое слышу. Такого просто не может быть. Ищите ещё глюки, они есть точно.

0

38

goldskif написал(а):

Inputbin не помог. Глюк, как оказалось, что при переполнении переменной Buf_count МК просто останавливается..

Да ну... Что-то тут не так... Чудес не бывает... ;)
sva-don правильно говорит - "ищите женщину"... ;)

0

39

увы глюк все равно проявляется (((( хоть и позже.

Код:
  Do
    B = Waitkey()                                           ' берем символ из буфера в формате ASCII
     If B = 82 Then Buf_count = 0                           ' нашли букву R (82 ascii)
     Incr Buf_count
          S = B - 48                                        '   48(ascii)=0 49=1 ... 57=9
'          S = Buf_count - 1
      If Buf_count = 5 Then I(1) = S
      If Buf_count = 6 Then I(2) = S
      If Buf_count = 7 Then I(3) = S
      If Buf_count = 8 Then I(4) = S
      If Buf_count = 9 Then I(5) = S
      If Buf_count = 10 Then I(6) = S

   Loop

В-общем, глюк в записи в массив.
Когда в массив I() записываю для эксперимента, например Buf_count, то микроконтроллер работает.
Если записываю полученные из буфера данные B, то часы показываются, но через некоторое время все равно МК останавливается. Что за хрень???

0

40

goldskif написал(а):

Что за хрень???

Попробуйте все-таки (опять навязываю ;) ) прием по прерыванию Исследование USART пост 5.
Там тоже конфигурируемый буфер, только String.
Несмотря на это устойчиво работает со всеми символами от 0 до 255.

0

41

А не пробовали собирать принятое в единую переменную типа String длиной 67 и накапливать в нее принятое по UART.
По окончании приема вырезайте и строки нужные участки оператором MID.

0

42

много шума из ничего, здесь http://bascom.at.ua/publ/1-1-0-3 посмотрите прием и разбор строки

0

43

Нет никаких гарантий, что этот код работает стабильно.
Я кстати говоря тоже изрядно помучился с этой проблемой (приёма данных с ЖПС), какие только алгоритмы не пробовал. Пока игрушка у меня в руках, всё работает как часы, а потом, когда отдаю в руки другого человека, то перестает работать или работает/нет.
Проблему так и не удалось выяснить, возможно она кроется в работе от РС (возможно температура влияет на МК), а т.к. потоки данных очень не малые (практически нонстопом), то ошибка накапливается.

0

44

Nord написал(а):

А не пробовали собирать принятое в единую переменную типа String длиной 67 и накапливать в нее принятое по UART.
По окончании приема вырезайте и строки нужные участки оператором MID.

Я с этого начинал. Шаблон такой в инете нашел. Все равно хаотично вылетает в зависание. Но по мере ковыряния избавлялся от лишнего и делал более короткий код. Сейчас вообще просто в потоке данных ловлю букву R и отсчитываю от нее знаки с 5 по 10.
Пока что все уперлось в то обстоятельство, что полученные данные при записи в массив вызывают остановку МК. Так что проблема явно не в получении данных, а позже..

0

45

goldskif написал(а):

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

Тогда только пошаговая отладка...
Способов реализации достаточно - от пошагового выполнения в симуляторе до отслеживания состояния выводом сообщений... ;)

0

46

А в протеусе глюков не выявляется.. Только в железе

0

47

goldskif написал(а):

А в протеусе глюков не выявляется.. Только в железе

Я вот сейчас воюю (пока еще нервов хватает) с эмулятором 1-Wire Slave...
В Протеусе концы с концами сводятся, а "в железе" - все сыпется... ;)
Если "притягиваю" в "железе" - в Протеусе не идет...
Где глюк ? ;)

Отсюда вывод - в Протеусе делаем "концепт", а в "железе" - реалии...

0


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » Часы с GPS по UART