Программирование МК без ассемблера и готовых приложений

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Аватара пользователя
DX168B
Друг Кота
Сообщения: 4468
Зарегистрирован: Вс янв 24, 2010 19:19:52
Откуда: Главный Улей России (Moscow)
Контактная информация:

Re: Программирование МК без ассемблера и готовых приложений

Сообщение DX168B »

Ну, насчёт написать - я уже понял, что это достаточно просто.
Достать строку и извлечь полезные данные можно и по шаблону,
поделив массив на диапазоны или отпарсить в разные массивы.
Есть варианты. :)
I am DX168B and this is my favourite forum on internet!
Реклама
Аватара пользователя
Мурик
Друг Кота
Сообщения: 3384
Зарегистрирован: Пн окт 11, 2010 19:00:08

Re: Программирование МК без ассемблера и готовых приложений

Сообщение Мурик »

DX168B писал(а):Ну, насчёт написать - я уже понял, что это достаточно просто.
Достать строку и извлечь полезные данные можно и по шаблону,
поделив массив на диапазоны или отпарсить в разные массивы.
Есть варианты. :)
Ну как вариант на PureBasic. :write: :))

Код: Выделить всё

Structure HEX_Data
  CountBytes.b
  Address.u
  Type.b
  Infa.a[16]
  KSumma.a
EndStructure


Procedure HEX_Test(String.s)
  Protected Error = #False
  
  If Mid(String, 1, 1) = ":"
    
    Len = Len(String)
    String = LCase(String)
    For i=2 To Len
      Char.s=Mid(String, i , 1)
      If (Char<"0" Or Char>"9") And (Char<"a" Or Char>"f")
        Error = #True
        Break
      EndIf
    Next i
    
  Else
    Error = #True
  EndIf
  
  ProcedureReturn Error
EndProcedure

Procedure HEX_Parsing(String.s, *Struct.HEX_Data)
  Protected Error = #False, Len
  
  Len = Len(String)
  
  *Struct\CountBytes = Val("$"+Mid(String, 2, 2))
  If *Struct\CountBytes<=16
    If Len = 1+2+4+2+(*Struct\CountBytes*2)+2
      
      *Struct\Address = Val("$"+Mid(String, 4, 4))
      *Struct\Type = Val("$"+Mid(String, 8, 2))
      *Struct\KSumma = Val("$"+Right(String, 2))
      
      If *Struct\Type=0
        
        x=0
        For i = 10 To Len - 2 Step 4
          
          *Struct\Infa[x+1] = Val("$"+Mid(String, i,   2))
          *Struct\Infa[x]   = Val("$"+Mid(String, i+2, 2))
          x + 2
          
        Next i
      
      EndIf
      
    Else
      Error = #True
    EndIf
  Else
    Error = #True
  EndIf
  
  ProcedureReturn Error
EndProcedure

Procedure CheckKSumma(*Struct.HEX_Data)
  Protected Error = #False, Summa.a = 0
  
  Summa - *Struct\CountBytes
  Summa - *Struct\Address & $FF
  Summa - *Struct\Address>>8 & $FF
  Summa - *Struct\Type
  
  For i=0 To *Struct\CountBytes - 1
    Summa - *Struct\Infa[i]
  Next i

  If Summa <> *Struct\KSumma
    Error = #True
  EndIf
  
  ProcedureReturn Error
EndProcedure

Procedure HexToBin(HEX_File.s, BIN_File.s)
  Protected Error = #False
  Protected Hex.HEX_Data
  
  ; Память для BIN формата данных
  *mem = AllocateMemory(65536)
  MaxSize.u
  If *mem
    
    FillMemory(*mem, 65536, 0, #PB_Byte)
    
    If ReadFile(0, HEX_File)
      
      Line = 1
      While Eof(0) = 0
        String.s = ReadString(0)
        String=Trim(String)
        If String<>""
          
          If HEX_Test(String) = #True
            Error = #True
            MessageRequester("", "Недопустимый символ в строке "+Str(Line))
            Break
          EndIf
          
          FillMemory(@Hex, SizeOf(Hex), 0, #PB_Byte)
          
          If HEX_Parsing(String, @Hex) = #True
            Error = #True
            MessageRequester("", "Обнаружена ошибка в строке "+Str(Line))
            Break
          EndIf
          
          If CheckKSumma(@HEX) = #True
            Error = #True
            MessageRequester("", "Ошибка в контрольной сумме в строке "+Str(Line))
            Break
          EndIf
          
          If Hex\Type = 0
            CopyMemory(@Hex\Infa, *mem+Hex\Address, Hex\CountBytes)
            
            If MaxSize < Hex\Address + Hex\CountBytes
              MaxSize = Hex\Address + Hex\CountBytes
            EndIf
          EndIf
          
        EndIf
        
        Line + 1
      Wend
      CloseFile(0)
      
      If Error = #False And MaxSize > 0
        If CreateFile(2, BIN_File)
          WriteData(2, *mem, MaxSize)
          CloseFile(2)
          MessageRequester("", "BIN файл создан.")
        Else
          MessageRequester("", "Ошибка создания BIN файла.")
        EndIf
      EndIf
      
    Else
      MessageRequester("", "Ошибка открытия HEX файла")
    EndIf
    
    FreeMemory(*mem) 
  Else
    MessageRequester("", "Ошибка выделения памяти")
  EndIf
  
EndProcedure

HEX.s=OpenFileRequester("","","HEX-файлы (*.hex)|*.hex|Все файлы (*.*)|*.*",0)
If HEX<>""
  BIN.s=SaveFileRequester("","","BIN-файлы (*.bin)|*.bin|Все файлы (*.*)|*.*",0)
  If BIN<>""
    If GetExtensionPart(BIN)="" : BIN+".bin" : EndIf
    HexToBin(HEX, BIN)
  EndIf
EndIf
Проверил, вроде работает - конвертирует из HEX в BIN.
Скомпилированная прога во вложении.
Вложения
HEX_to_BIN.rar
(7.41 КБ) 139 скачиваний
Последний раз редактировалось Мурик Пн май 02, 2011 15:58:45, всего редактировалось 1 раз.
Реклама
Аватара пользователя
coredumped
Опытный кот
Сообщения: 838
Зарегистрирован: Вт апр 12, 2011 18:38:19
Откуда: с Земли

Re: Программирование МК без ассемблера и готовых приложений

Сообщение coredumped »

Вот, чесслово, я до сих пор не понял, чего хочет топикстартер :?
Все будет только лучше, в крайнем случае - хуже.
Аватара пользователя
Jack_A
Друг Кота
Сообщения: 6318
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

Re: Программирование МК без ассемблера и готовых приложений

Сообщение Jack_A »

coredumped писал(а):Вот, чесслово, я до сих пор не понял, чего хочет топикстартер :?
"А он отвечает : ах, если б я знал это сам!" (С) Б.Окуджава
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
Danko
Сверлит текстолит когтями
Сообщения: 1287
Зарегистрирован: Пн окт 13, 2008 11:45:54
Откуда: РФ, Крым, г.Бахчисарай
Контактная информация:

Re: Программирование МК без ассемблера и готовых приложений

Сообщение Danko »

kras, я больше трех лет пишу вчистую для МК и до сих пор не знаю как байты попадают из компилятора в МК. :))

Но с того времени как я прочел Ваше первое сообщение я написал одну программу под Винду (в Пурике), одну программу для тини45 (AVR Studio + WinAVR) и несколько функций для своих часов на мега168 (CVAVR).

А какие успехи у Вас за то время как Вы решили найти сочувствующих на данном форуме? Да именно сочувствующих ведь как видно помощь Вам не нужна.

Везучий Вы человек у Вас на компе есть COM-порт. Я тут на офис на днях комп брал так кроме восьми USB нифега. Я даже боюсь представить себе если бы Вы собирали программатор под USB.
Первое, что привлекает в программировании, объяснить просто: ты говоришь компьютеру что то сделать, и он это делает. Безошибочно. Всегда. Без возражений.
---------------------
Линус Торвальдс. "Just for fun. Рассказ нечаянного революционера"
Реклама
kras
Опытный кот
Сообщения: 782
Зарегистрирован: Вт апр 26, 2011 18:37:06

Re: Программирование МК без ассемблера и готовых приложений

Сообщение kras »

Простите, что не отвечаю, у меня не каникулы. Не могу за вами угнаться, сейчас курсовую допишу немного еще, и буду пробовать:) Все-таки, МК у меня сейчас как хобби, пока только занимался чтением постов, ссылок. Но сокращения ответов не хотел бы, хотя я, возможно, уже разберусь.
На практике можно не успеть сделать того, что можно хорошо обосновать в теории. Но без практики теория может отдаляться от нее, и когда они встретятся снова - не узнает даже неприкосновенное шампанское профессора в лаборатории. Моя практика: robofeya.ru
Реклама
kras
Опытный кот
Сообщения: 782
Зарегистрирован: Вт апр 26, 2011 18:37:06

Re: Программирование МК без ассемблера и готовых приложений

Сообщение kras »

abc, я так понял?
1683
301F
0085
0186
1283
0186
00010110 10000011
00110000 00011111
00000000 10000101
00000001 10000100
00010010 10000011
00000001 10000110
00110000 01010101
00000000 10000110

Далее, пока разрешим компилятору создать hex файл. Получим:
:020000040000FA
:1000000083161F30850086018312860155308600D5
:040010000034003484
:02400E00F23F7F
:00000001FF
Все верно? То есть, последняя строка не нужна вообще?
Теперь меняю данные в полученном коде, типа парсю вручную). Не понял насчет "слово". Я не помню где слово не 16 бит, надо еще почитать, поэтому пока понимаю так, что в рассматриваемых словах 16 бит, а не 14. Слово, тогда, это FF3F, а я уже меняю порядок в частях слова. Но я читал, что процессор зеркально воспринимает слово целиком, а МК нет, согласно этому надо отразить биты в каждом слове зеркально. Или память мне изменяет? Я уже не помню. Но в моем случае получается FCFF. А как считать контрольную сумму?:) Да и с количеством байт записи что-то не ладное. Во второй строке не 10 байтов. И не 12, если связывать это с кодом от abc. И что за первая строчка?

83161F308500860183128601 Вот это знакомая вещь, но почему только она?
Последний раз редактировалось kras Пн май 02, 2011 15:31:56, всего редактировалось 14 раз.
На практике можно не успеть сделать того, что можно хорошо обосновать в теории. Но без практики теория может отдаляться от нее, и когда они встретятся снова - не узнает даже неприкосновенное шампанское профессора в лаборатории. Моя практика: robofeya.ru
Аватара пользователя
abc
Друг Кота
Сообщения: 3687
Зарегистрирован: Чт мар 20, 2008 01:06:40
Откуда: Севастополь

Re: Программирование МК без ассемблера и готовых приложений

Сообщение abc »

abc, я так понял?
Правильно.
То есть, последняя строка не нужна вообще?
Не знаю. Я за весь свой "программерский" опыт ни разу не заморачивался проверкой hex-кода.
Последний раз редактировалось abc Пн май 02, 2011 14:51:15, всего редактировалось 1 раз.
Аватара пользователя
md5sum
Вымогатель припоя
Сообщения: 672
Зарегистрирован: Вт окт 27, 2009 22:39:19
Откуда: Москва

Re: Программирование МК без ассемблера и готовых приложений

Сообщение md5sum »

Прочитайте уже хотя-бы http://ru.wikipedia.org/wiki/Intel_HEX
Отпадут вопросы по формату файла.
А если еще и с английским немного дружите, то вот подробное описание формата: http://pages.interlog.com/~speff/usefulinfo/Hexfrmt.pdf
— Не говорите мне что делать и я не скажу куда Вам идти...
kras
Опытный кот
Сообщения: 782
Зарегистрирован: Вт апр 26, 2011 18:37:06

Re: Программирование МК без ассемблера и готовых приложений

Сообщение kras »

Да я читал первую ссыль, сорри за контрольный вопрос:) Немного отредактировал предыдущий пост, просьба ответить.
Мурик, а что дает ", #MB_OK"? Не знаю PureBasic, поэтому просто когда убрал эти буквы, все заработало, вроде.
На практике можно не успеть сделать того, что можно хорошо обосновать в теории. Но без практики теория может отдаляться от нее, и когда они встретятся снова - не узнает даже неприкосновенное шампанское профессора в лаборатории. Моя практика: robofeya.ru
Аватара пользователя
Мурик
Друг Кота
Сообщения: 3384
Зарегистрирован: Пн окт 11, 2010 19:00:08

Re: Программирование МК без ассемблера и готовых приложений

Сообщение Мурик »

kras писал(а):Далее, пока разрешим компилятору создать hex файл. Получим:
:020000040000FA
:1000000083161F30850086018312860155308600D5
:040010000034003484
:02400E00F23F7F
:00000001FF
В контроллер нужно писать не все подряд, а только строки, имеющие тип 00.
И еще нужно учитывать адрес.
Если эта строка; :1000000083161F30850086018312860155308600D5
должна быть записана по адресу 0, то эта; :02400E00F23F7F
по адресу 400EH.
kras писал(а):Теперь меняю данные в полученном коде, типа парсю вручную). Не понял насчет "слово".
Мда, не совсем коррекно назвал это.
Имел в виду два символа, обозначающие байт.
kras писал(а):А как считать контрольную сумму?
Нужно от одно байтной переменной отнять все что левее контрольной суммы.
Вот оно в коде:

Код: Выделить всё

Procedure CheckKSumma(*Struct.HEX_Data)
  Protected Error = #False, Summa.a = 0
  
  Summa - *Struct\CountBytes
  Summa - *Struct\Address & $FF
  Summa - *Struct\Address>>8 & $FF
  Summa - *Struct\Type
  
  For i=0 To *Struct\CountBytes - 1
    Summa - *Struct\Infa[i]
  Next i

  If Summa <> *Struct\KSumma
    Error = #True
  EndIf
  
  ProcedureReturn Error
EndProcedure
kras писал(а):Но в моем случае получается FCFF
Как получило это?
В любом случае, такое преобразование не нужно.
kras писал(а):Во второй строке не 10 байтов. И не 12
В ней 16 байт данных.
10 в шестнадцатеричной системе счисления это 16 в десятичной!

PS.
Лучше используйте конвертер из HEX в BIN, который я выше выложил. Там все это учтено и данные почти готовы к записи к МК.
Аватара пользователя
Мурик
Друг Кота
Сообщения: 3384
Зарегистрирован: Пн окт 11, 2010 19:00:08

Re: Программирование МК без ассемблера и готовых приложений

Сообщение Мурик »

kras писал(а): Мурик, а что дает ", #MB_OK"? Не знаю PureBasic, поэтому просто когда убрал эти буквы, все заработало, вроде.
Это для того чтобы в диалоговом окне была кнопка OK.
#MB_OK - это WinAPI константа.
Вы похоже что скачали демо версию PureBasic, одно из ограничений которой, в ней по умолчанию не объявлено все что связанно с API.
В полной версии этих ограничений нет.

Отредактировал пост - убрал из кода эту константу.
kras
Опытный кот
Сообщения: 782
Зарегистрирован: Вт апр 26, 2011 18:37:06

Re: Программирование МК без ассемблера и готовых приложений

Сообщение kras »

Тогда не понял до конца. В бин файле 2 строчки:
16 83 30 1f 00 85 01 86 12 83 01 86 30 55 00 86
19 05 28 06 30 c7 00 86 28 08 34 00 34 00 00 00

Прямо их и подавать на программируемую ногу в двоичном коде? И ничего завершающего или никакого начала и никаких адресов? Что значит "19 05 28 06 30 c7 00 86 28 08"? Как задать адрес-то? О промежуточном коде, вроде, написано, но я не могу понять, о чем там речь. Что в итоге надо подать на ногу мк, включая предварительное стирание информации?
На практике можно не успеть сделать того, что можно хорошо обосновать в теории. Но без практики теория может отдаляться от нее, и когда они встретятся снова - не узнает даже неприкосновенное шампанское профессора в лаборатории. Моя практика: robofeya.ru
Аватара пользователя
coredumped
Опытный кот
Сообщения: 838
Зарегистрирован: Вт апр 12, 2011 18:38:19
Откуда: с Земли

Re: Программирование МК без ассемблера и готовых приложений

Сообщение coredumped »

kras писал(а):Тогда не понял до конца. В бин файле 2 строчки:
Я ПИКами не занимаюсь, но почитав ветку подумал, не уж-то Микрочип держит в тайне протоколы программирования? Оказалось - нет :) 15 секунд мне ротребовалось, чтоб найти этот документ http://ww1.microchip.com/downloads/en/d ... 41227D.pdf - искал в гугле по словам "microchip memory programming". Вы тут уже недели 2 мозг всем @бете, вместо того, чтобы взять и почитать. Там все написано просто и понятно, как для дебилов. RTFM! RTFM! RTFM!
Все будет только лучше, в крайнем случае - хуже.
kras
Опытный кот
Сообщения: 782
Зарегистрирован: Вт апр 26, 2011 18:37:06

Re: Программирование МК без ассемблера и готовых приложений

Сообщение kras »

Ну для кого-то там все понятно написано, а я не могу там понять пока что про это. Кстати, может есть какая-то литература про то, как компилятор MPASM конвертирует код asm в hex?
На практике можно не успеть сделать того, что можно хорошо обосновать в теории. Но без практики теория может отдаляться от нее, и когда они встретятся снова - не узнает даже неприкосновенное шампанское профессора в лаборатории. Моя практика: robofeya.ru
murzila
Мучитель микросхем
Сообщения: 436
Зарегистрирован: Сб апр 10, 2010 16:46:26

Re: Программирование МК без ассемблера и готовых приложений

Сообщение murzila »

coredumped писал(а):взять и почитать.
У же уже писал, что одни разбираются и делают, а другие выносят всем мозг...
kras
Опытный кот
Сообщения: 782
Зарегистрирован: Вт апр 26, 2011 18:37:06

Re: Программирование МК без ассемблера и готовых приложений

Сообщение kras »

На философию тоже не надо переходить
На практике можно не успеть сделать того, что можно хорошо обосновать в теории. Но без практики теория может отдаляться от нее, и когда они встретятся снова - не узнает даже неприкосновенное шампанское профессора в лаборатории. Моя практика: robofeya.ru
Аватара пользователя
coredumped
Опытный кот
Сообщения: 838
Зарегистрирован: Вт апр 12, 2011 18:38:19
Откуда: с Земли

Re: Программирование МК без ассемблера и готовых приложений

Сообщение coredumped »

kras писал(а):Ну для кого-то там все понятно написано, а я не могу там понять пока что про это. Кстати, может есть какая-то литература про то, как компилятор MPASM конвертирует код asm в hex?
В google набираем: "Как работает компилятор" - находится масса статей, читаем-изучаем. Знания, так просто, в голове не появятся. И философия тут ни при чем.
В 2-х словах. Компиляторы с ассемблера 2-х проходные. На первом проходе происходит текстовый анализ и замена макросов на ассемблерные инструкции, подстановка констанат. На втором, файл компилируется в объектный код - это практически готовая программа в машинном коде (бинарный файл), только без установленных адресов перехода. Далее за работу берется линкер - он довершает работу - высчитывает проставляет адреса переходов и переменных - на выходе полностью готовая программа. Для МК, следующим этапом, вступает загрузчик - программа, которая конвертирует бинарный файл в hex. Вот и все. Хотите знать больше - проект GCC - все программы в исходниках, можно разобраться полностью и досконально. Там же форумы по теме. Не надо быть лентяем, и еще раз - читать, читать и читать.
Все будет только лучше, в крайнем случае - хуже.
Аватара пользователя
DX168B
Друг Кота
Сообщения: 4468
Зарегистрирован: Вс янв 24, 2010 19:19:52
Откуда: Главный Улей России (Moscow)
Контактная информация:

Re: Программирование МК без ассемблера и готовых приложений

Сообщение DX168B »

GCC помоему является стандартом. Один и тот-же код можно откомпилить и для ПК и для AVR.
За что я и люблю языки высокого уровня, например Cи. Главное - наличие нужного компилятора и платформы. :)
Например написал мигалку на LPT порт для DOS, чисто эксперимента ради.
После лёгкого редактирования кода откомпилил тоже самое в AVR.
В обоих случаях были разновидности компилятора GCC.
I am DX168B and this is my favourite forum on internet!
kras
Опытный кот
Сообщения: 782
Зарегистрирован: Вт апр 26, 2011 18:37:06

Re: Программирование МК без ассемблера и готовых приложений

Сообщение kras »

Спасибо, что подсказали литературу.
Последний раз редактировалось kras Ср май 04, 2011 08:30:47, всего редактировалось 1 раз.
На практике можно не успеть сделать того, что можно хорошо обосновать в теории. Но без практики теория может отдаляться от нее, и когда они встретятся снова - не узнает даже неприкосновенное шампанское профессора в лаборатории. Моя практика: robofeya.ru
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»