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

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

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

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


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » Сбой контроллера при запуске.


Сбой контроллера при запуске.

Сообщений 1 страница 12 из 12

1

Вот такая фигня приключилась.
Собрал плату на котором находится модуль IoT BC-95 и ATMega644A.
По идее по СОМ1 процессор общается с модулем, а по СОМ2 с внешней программой.
Вроде всё работает, но очень часто при подаче питания плата перезапускается 2 раза. Т.е дал питание, процессор опросил модуль и должен уснуть, но он опять перезапускается, а потом засыпает.
Обмен по обоим портам буферизован. Собака выключена. Что бы это значило?
Вот кусочек кода.

Код:
Config Com1 = 9600 , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
Config Com2 = 9600 , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
Config SERIALIN = BUFFERED , size = 50
Config SERIALIN1 = BUFFERED , size = 50

$include "initGSM.bas"                                     'Инициализация модуля

Main:

   FlagStr = Ischarwaiting(#1)
   If FlagStr = 1 Then
      Waitms 100
      StrRS = ""
     While _RS_HEAD_PTR1 <> _RS_TAIL_PTR1                   'Проверка кольцевого буфера
         Rs = Inkey(#1)
         If Asc(Rs) > 32 Then                                                 'Удаляем лишние символы
            StrRS = StrRS + Rs                                                'Собираем строку
         End If
      Wend
      If StrRs = "Manuf" Then Print#1 , Manuf
      If StrRs = "Model" Then Print#1 , Model
      If StrRs = "Vers" Then Print#1 , Vers
      CLEAR SERIALIN1                                                         'Чистим буфер
      GoTo Main
   End if

'Засыпаем

   CONFIG POWERMODE = IDLE                                 
   GoTo Main
   STOP

0

2

Смотрели осциллографом что с питанием в этот момент?

Зачем в коде Goto если тоже самое можно сделать циклом Do-Loop и командой Continue?

0

3

Проверьте фюзы, может прошито запускаться по определенному напряжению (BODLEVEL).

0

4

У меня так-же происходит с баскомом. Если, например, питать изделие от USB (arduino nano v3.0) от компьютера, то происходит следующее: программа запускается и даже что-то успевает вывести на дисплей, потом перезапускается и работает. А если питать от USB от зарядника сотового телефона или питать внешним напряжением - перезапуска НЕТ!  Думаю, что что-то баском делает с USB-COM соединением.

0

5

-NMi- написал(а):

Думаю, что что-то баском делает с USB-COM соединением.

Т. е. даже когда он не запущен все равно что-то делает с USB-COM соединением? :D
На самом деле, это не баском, а винда инициализирует МС USB-COM, один из выводов которой связан с выводом сброса МК. :)

0

6

Здесь попахивает перегрузкой USB по току, при питании от компа там всего лишь 500мА.

0

7

Пётр написал(а):

Т. е. даже когда он не запущен все равно что-то делает с USB-COM соединением? :D

:D  поржал то-же  :rofl:
Дык чАвоЖ тАгды нв дурдуине то нет такого???  :crazyfun:

0

8

Пётр написал(а):

Смотрели осциллографом что с питанием в этот момент?

Зачем в коде Goto если тоже самое можно сделать циклом Do-Loop и командой Continue?

Да там питания на целый самолёт хватит.  :crazyfun:
А вот на счёт Do Loop не соглашусь. Я привёл кусочек кода, а так там выше этого куска есть ещё куча кода. Смысл в том, что контроллер всегда спит, но как только происходит прерывание, то он просыпается и начинает последовательно просматривать все флаги прерываний. Если нашёл, то выполняет свой кусок. Но, в этот момент может прийти следующее прерывание и для его отслеживания в каждом кусочке кода стоит GoTo main. Т.е. если прерывание обработалось, то смотрим нет ли еще чего и если нет то снова засыпаем, а если есть, то обрабатываем его и снова проверяем на наличие других.

0

9

А теперь расскажу вам сказку. :canthearyou:
Причину перезапуска контроллера нашёл и устранил. Странно, что он при включении начинал работать, выполнял всю положенную ему цепочку и снова перезапускался.
Отработав второй раз всё приходило в норму и дальше он работал как часы. Это было странно. Питания хоть залейся, значит дело было в коде. Начал рыть и по моему откопал жемчужное зерно. :crazyfun:
Вот ещё кусочек кода и таких кусочков там штук 10

Код:
   Call DebugPrint( "AT - Выполним синхронизацию")
   Print "AT"                                               
   FlagSec = 0                                              'Сбросим флаги и запустим таймер
   FlagError = 0                                            'Таймер у меня в роли Timeout
   Start Timer0
   Do                                                           'Начнём колбасить
      If FlagSec > 70 Then                              'Через 10 секунд проверяем что получилось
         ................................
         ................................
         ................................
         FagError=1      
         Exit Do                                               'Вот этой строки у меня не было. Вместо неё стояло GoTo MkSleep. Т.е. без выхода из Do сразу кидались на диван. 
      End If
      FlagStr = Ischarwaiting()
      If FlagStr = 1 Then
         ................................
         ................................
         FagError=0   
         CLEAR SERIALIN
         Exit Do
      End If
   Loop
   If FlagError = 1 Then GoTo MkSleep           'Вот в конце и появился переход на сон

Вот такие были грабли. Теперь всё пашет как надо.

0

10

sva-don написал(а):

Вот такие были грабли.

Связанные с Goto. Этот оператор нужно использовать только если без него не получается обойтись.

sva-don написал(а):

А вот на счёт Do Loop не соглашусь.

Почему?
Аналог кода из первого сообщения без Goto.

Код:
Config Com1 = 9600 , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
Config Com2 = 9600 , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
Config SERIALIN = BUFFERED , size = 50
Config SERIALIN1 = BUFFERED , size = 50

$include "initGSM.bas"                                     'Инициализация модуля

Do                                                           ' **** Main:

   FlagStr = Ischarwaiting(#1)
   If FlagStr = 1 Then
      Waitms 100
      StrRS = ""
     While _RS_HEAD_PTR1 <> _RS_TAIL_PTR1                   'Проверка кольцевого буфера
         Rs = Inkey(#1)
         If Asc(Rs) > 32 Then                                                 'Удаляем лишние символы
            StrRS = StrRS + Rs                                                'Собираем строку
         End If
      Wend
      If StrRs = "Manuf" Then Print#1 , Manuf
      If StrRs = "Model" Then Print#1 , Model
      If StrRs = "Vers" Then Print#1 , Vers
      CLEAR SERIALIN1                                                         'Чистим буфер
      Continue                                              ' **** GoTo Main
   End if



   CONFIG POWERMODE = IDLE                                  ' Засыпаем 
Loop                                                        ' **** GoTo Main
STOP

0

11

Пётр написал(а):

Continue                                              '**** GoTo Main

Что то я не врублюсь. В хелпе нет такой конструкции?

0

12

sva-don написал(а):

В хелпе нет такой конструкции?

https://avrhelp.mcselec.com/continue.htm
Кстати еще есть redo https://avrhelp.mcselec.com/redo.htm

0


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » Сбой контроллера при запуске.