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

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

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

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


Вы здесь » Программирование ATMEL в BASCOM. » О программе BASCOM AVR/8051 » Как разбить программу на блоки и как их связать


Как разбить программу на блоки и как их связать

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

1

Есть идея сделать блоки для отдельных программ. Для этого решил попробовать написать программу-мигалку.

Это код основной программы:
'****************************************

$Regfile="m328pdef.dat"$Crystal=16000000$baud = 9600$hwstack=40$swstack=16$framesize=32
'***************
dim lighton as  Bit
dim lightoff as  Bit
lighton = 1
lightoff=0
config  PORTB.4 = output
blinky alias portb.4

$include "blinkyled.bas"
do
gosub blinkyled
wait 1
loop

end

Это код подпрограммы (В отдельном файле):

blinkyled:
blinky = lighton
wait 1
blinky = lightoff
return

Подскажите пожалуйста: как делать такого толка подпрограммы в отдельных файлах с сылками, чтобы они не орали ошибками?

0

2

Ну ды-к режете всё на "include" и всё.
А потом их вставляете в нужные места.
В файлах которые "обрубки" (для include), ставите "nocompile".

Отредактировано RDW (2017-11-22 15:28:11)

0

3

RDW, спасибо, про нокомпайл забыл - попробую с ним.

Отредактировано Hedgehog (2017-11-24 11:01:50)

0

4

Так она работает:

'****************************************
'Ïàðàìåòðû óñòðîéñòâà

$Regfile="m328pdef.dat"
$Crystal=16000000
$baud = 9600
$hwstack=40
$swstack=16
$framesize=32

'***************

dim lighton as  Bit
dim lightoff as  Bit
lighton = 1
lightoff=0
config  PORTB.4 = output
blinky alias portb.4

'$include "blinkyled.bas"
do
gosub blinkyled
waitms 500

loop

blinkyled:
blinky = lighton
waitms 500
blinky = lightoff
return

end

Вот так (Когда в отдельном файле blinkyled.bas лежит только саб):

'****************************************
'Ïàðàìåòðû óñòðîéñòâà

$Regfile="m328pdef.dat"
$Crystal=16000000
$baud = 9600
$hwstack=40
$swstack=16
$framesize=32

'***************

dim lighton as  Bit
dim lightoff as  Bit
lighton = 1
lightoff=0
config  PORTB.4 = output
blinky alias portb.4

$include "blinkyled.bas"
do
gosub blinkyled
waitms 500

loop

end

blinkyled.bas:

$nocompile

blinkyled:
blinky = lighton
waitms 500
blinky = lightoff
return

не хочет

0

5

Идеология "$include" заключается в том, что это просто кусок, который выносится в файл. Если удаляем из общего кода кусок (переносим его в отдельный файл), то на месте где он был, просто вставляется "$include".
Если надо вынести в отдельный файл объявление переменных, то на их месте должен сразу стоять $include ссылающийся на файл с объявлениями.
Так же не следует в $include выносить основное тело, т.е. "end" от основного тела и включать другие $include в $include.

0

6

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

и включать другие $include в $include

Почему?

0

7

А смысл?

0

8

В некоторых случаях смысл есть.

0

9

Я не совсем понимаю:

Я говорю программе :"$lib" ("Вот тебе кусок кода, если я после скомандую обратиться к нему целиком или к какой-то его части - ты про него знаешь и выполнишь, что я сказал")

есть у меня мысль, что, сказав ей $include, я говорю ей то же самое.

Почему она ворчит?)

Если поставить $include в цикл,будет ли программа каждый раз его заново включать и будет ли она есть на это память?

Так в Протее тоже вылетает...

'****************************************
'Ïàðàìåòðû óñòðîéñòâà

$Regfile="m328pdef.dat"
$Crystal=16000000
$baud = 9600
$hwstack=40
$swstack=16
$framesize=32

'***************

dim lighton as  Bit
dim lightoff as  Bit
lighton = 1
lightoff=0
config  PORTB.4 = output
blinky alias portb.4

do
$include "blinkyled.bas"
gosub blinkyled
waitms 500

loop

end

Отредактировано Hedgehog (2017-11-27 23:59:26)

0

10

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

Если поставить $include в цикл,будет ли программа каждый раз его заново включать и будет ли она есть на это память?

Подключение библиотек (или внешнего блока программы) выполняется один раз.
Желательно (для лучшей читаемости кода) в части объявления переменных и первичных настроек.

Вы же вот это в цикл не ставите ? ;)
$Crystal=16000000
$baud = 9600
$hwstack=40
$swstack=16
$framesize=32

0

11

Proteus и Дуина оба орут, куба бы я не вставлял $include.

0

12

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

Proteus и Дуина оба орут, куба бы я не вставлял $include.

Навскидку - должно работать...
Когда копался с ТМ1637 - там все построено на этом...

Почитайте тут https://avrhelp.mcselec.com/ повнимательнее... ;)

Кстати, если речь идет только о "моргашке" из #4, то там даже Gosub не нужен... ;)
Или это для эксперимента по данному вопросу ?

Отредактировано Nord (2017-11-28 11:59:23)

0

13

Nord
Это для эксперимента, я хочу вынести части программы по отдельным файлам.

0

14

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

Это для эксперимента, я хочу вынести части программы по отдельным файлам.

Попробуйте не Gosub, а Call обращаться...

0

15

ошибка

dim lighton as  Bit
dim lightoff as  Bit
lighton = 1
lightoff=0
config  PORTB.4 = output
blinky alias portb.4

$include "blinkyled.bas"

declare sub blinkyled
do
call blinkyled
'gosub blinkyled
waitms 500

loop

end

Отредактировано Hedgehog (2017-11-28 12:04:10)

0

16

Масло масляное... ;)

Выполнили подключение...
$include "blinkyled.bas"

Вызвали...
call blinkyled

Только это зачем в теле программы делать ?
declare sub blinkyled

Это должно быть в blinkyled.bas

И еще - обзовите подпрограмму и файл по-разному, есть вероятность, что и в этом спотыкач...

0

17

Declare sub - потому что он орал, что его не было)

0

18

ошибка

dim lighton as  Bit
dim lightoff as  Bit
lighton = 1
lightoff=0
config  PORTB.4 = output
blinky alias portb.4

$include "blinkyled.bas"

declare sub blinkyleddy

do
call blinkyleddy
'gosub blinkyled
waitms 500

loop

end

0

19

Посмотрите исходники программ, которые разделены на несколько файлов. К примеру Библиотека для DHT22

0

20

И будет ошибка...

Объявили Sub - а где она ?

declare sub blinkyleddy

Откуда Bascom должен понять, что она - в подключаемом файле ?

Вызываете несуществующую Sub...

call blinkyleddy

Одного её объявления - мало, она должна существовать в реалии !

Если эта Sub и есть - тело подключаемого файла, то там и надо ее объявлять...

Вот тут все построено на подключаемых файлах:
Модуль индикации на TM1637

0

21

Вот добрался для попробовать... ;)

Основная программа:

Код:
$Regfile="m328pdef.dat"
$Crystal=16000000
$baud = 9600
$hwstack=40
$swstack=16
$framesize=32

'***************
config submode=new

$include "blinkyled.bas"

Config PORTB.4 = OUTPUT

'*******************

do

Call blnk()
waitms 500

loop

end

Подключаемый файл:

Код:
$nocompile

Declare Sub blnk()
Dim light as  Bit

Sub blnk()

If light = 0 Then
   light = 1
   PORTB.4 = 1
   Exit Sub
End If
If light = 1 Then
   light = 0
   PORTB.4 = 0
   Exit Sub
End If

End Sub

Мигает... ;)

0

22

Лучше функции не юзать, если нет четкого представления как работает весь механизм Баскома. Глюков не оберётесь.

0

23

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

Лучше функции не юзать, если нет четкого представления как работает весь механизм Баскома. Глюков не оберётесь.

О чем конкретно речь ?

0

24

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

0

25

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

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

+100500

Только у каждого свой подход и стиль... ;)
Кто-то, имея набор "кирпичиков", складывает из них единую программу, а кому-то удобнее использовать их в виде подключаемых модулей.
И тот и другой вариант имеют полноценное право на жизнь... ;)

ЗЫ. Лично я предпочитаю "все в одном флаконе"... ;)

0

26

А мне можно вопросик???
Дядьки, давайте представим себе некую атмегу с 64-я килобайтами памяти. Т.е. имеем приблизительную(!!!) карту памяти:
0000h - вектора прерываний
0100h - сама программа
C000h - область обновления подпрограммы
F800h - бутлоадер

Собственно вопрос - как заставить компилятор баскома компилить с адреса C000h(шестнадцатеричное) ???

0

27

https://avrhelp.mcselec.com/loader.htm

0

28

Энто не совсем то, что мне нужно. Например, процедуры с адреса C000h имеют (к примеру) десять подпрограмм...
Proc_01:
...
Proc_10:
Каким образом мне их вызывать из тела основной программы???

0

29

Нужно по заранее известному адресу расположить таблицу с адресами подпрограмм. Что-то подобное таблице адресов подпрограмм прерываний.

0

30

Дык а разница то какая???
Допусттим имеем таблицу адресов:
C00h:
JMP XXXX
JMP YYYY
JMP ZZZZ

или
C00h:
Call XXXX
Call YYYY
Call ZZZZ
Разница???

Вопрос в другом... как "подсказать" компилятору вычислять эти адреса XXXX, YYYY, ZZZZ ???

Эта идея не нова, многие девайсы устроены именно так... СУТЬ:
Имеем ТЕЛО программы и БУТлоадер. Тело программы выполняет только роль инициализации проца и нечего более. В зависимости от того, что мы хотим от проца - мы грузим посредством бутлоадера именно ту программу, которая нам нужна в данный момент.
Вроде всё разжевал, ну думаю доступно для понимания...

0


Вы здесь » Программирование ATMEL в BASCOM. » О программе BASCOM AVR/8051 » Как разбить программу на блоки и как их связать