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

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

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

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



Глюки в BASCOM

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

1

Вот столкнулся с такими непонятками:
1. Работаем с буферизированным вводом по UART. Читаем Help и видим следующее:

The following internal variables will be generated for UART0:
(Следующие внутренние переменные будут сгенерированы для UART0.)
_RS_HEAD_PTR0 , a byte counter that stores the head of the buffer
_RS_TAIL_PTR0 , a byte counter that stores the tail of the buffer.
_RS232INBUF0 , an array of bytes that serves as a ring buffer for the received characters.
_RS_BUFCOUNTR0, a byte that holds the number of bytes that are in the buffer.

Отлично. Воспользуемся этим правом и будем их использовать в своих целях. Но компилятор грозит страшными карами за это.
http://s7.uploads.ru/t/ULIeo.jpg
А самое смешное, что не смотря ни на что, всё прекрасно работает. :flag:
2. Нужно выводить много отладочной информации. Чтобы сократить код сделал маленькую подпрограммку для вывода. Принимает строку и тупо её печатает.
Возник вопрос, как определить длину строки для передачи её в подпрограмму? Т.е. описать этот параметр Sub DebugPrint(byval Message as String * 254)?
Сделал два варианта:
Первый - т.к. строки длинные описал вот так.
http://s3.uploads.ru/t/hPMmn.jpg
Как видим в левой части рисунка сразу отстегнулось нехилое количество ОЗУ. FrameSize=280.  o.O
Ладно думаю, фиг с тобой и убираю количество символов в строке. т.е. делаю так:   Sub DebugPrint(byval Message as String).
Теперь другое дело.  :crazyfun:
http://sg.uploads.ru/t/nolqD.jpg
И опять самое смешное всё работает. Правда в листинге после компиляции появляется грозная строка.

Source string could be too big to fit into target string [SERVERNAME>___XL]  in line  20

Ругается вот на это:
http://s8.uploads.ru/t/1Of6b.jpg
Вот теперь сижу и думаю. Так оставить или глюк потом вылезет? :dontknow:

Интересно, что если продекларировать так Sub DebugPrint(byval Message as String * 254), то строка

Source string could be too big to fit into target string [SERVERNAME>___XL]  in line  20

исчезает.

Отредактировано sva-don (2019-12-23 15:22:17)

0

2

Попробуйте передавать строку используя byref. Это передаст указатель на строку и не потребует много памяти.
Но склейка строк как в 20 строке на картинке работать не будет.

0

3

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

Попробуйте передавать строку используя byref. Это передаст указатель на строку и не потребует много памяти.

Спасибо, попробую, а строку можно склеить до отправки.

0

4

Параметр byref может передаваться только из переменной, поскольку передается адрес переменной в коде; и не может передаваться из константы -- именованной или неименованной (CONST sString = "some_string" или просто где-то в коде "some_string").

А вот вам настоящий глюк (2.0.8.2).
Если вы поставите в коде модификатор $nocompile, то закомменчивание раскрашивает его в цвет комментария, но НЕ ОТМЕНЯЕТ его действия.
Таким образом, имеем дело с работающим комментарием (!)

0

5

Если нашли баг, то пишите о нём на офф ресурс, в личку: support(at)mcselec(dot)com
На счёт синтетической реализации динамических переменных/функций: ну а как вы хотели, ресурсы все на пересчёт, пока работает - потом глючить начнёт и не сразу будет понятно где, ибо во что-то уперлось. Тему уже "100 раз" обсуждали.

0

6

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

араметр byref может передаваться только из переменной, поскольку передается адрес переменной в коде; и не может передаваться из константы -- именованной или неименованной

Это один из недостатков раздельного адресного пространства.
Как правило его нет в МК с единым адресным пространством где одинаков метод доступа к флеш, оперативной памяти, регистрам периферии и т. д.

+1

7

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

Если нашли баг, то пишите о нём на офф ресурс, в личку: support(at)mcselec(dot)com

Да писала (по какому-то еще багу -- их в баскоме как в булке изюму). Стали приставать, спрашивать серийник... Нувыпонели ))) И в итоге послали лесом.
Довольно странный подход к багрепортам. Жадность тут, имхо, не совсем уместна.

+1

8

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

Довольно странный подход к багрепортам. Жадность тут, имхо, не совсем уместна.

У "них" нет ресурсов, дело одного человека, видимо оборот никакущий. И тратить время, проверять...видимо работает на другой работе. Я как-то один раз задонатил "их", так человек так был рад и благодарен.)
Ещё может быть причина в корявости ломаной версии, тут (на форуме) пробегали подобные вещи. Смысл распинаться перед пиратами, если есть уже последяя версия продукта, где этой проблемы нет.

+1

9

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

если есть уже последяя версия продукта, где этой проблемы нет.

Это какая?

0

10

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

У "них" нет ресурсов, дело одного человека

Ну например PureBasic дело двух человек, но при этом язык и компилятор намного лучше. Условия приобретения очень похожи на баскомовские - один раз заплатил 79 евро и все существующие версии и последующие бесплатно.
Бета версии доступны всем, а не некоторым как в случае баскома.
О найденных ошибках можно сообщить на форуме. Для этого существует отдельный раздел. https://www.purebasic.fr/english/viewforum.php?f=30
Никто не спрашивает есть у вас лицензия или нет и никто не закрывает форум для нелицензионных пользователей...
Часть кода в открытом доступе... https://github.com/fantaisie-software/purebasic

0

11

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

PureBasic

Неудачный пример. Всё, что делается на писи - более легкая входная точка массовости. Достаточно поставить программу и начать программировать. С баскомом нужно ещё железо, а железо - это даже не дуня.)

0

12

Речь о ЯП и компиляторе. Думаете компилятор для ПК, да еще и для 3 платформ (Windows, Linux, MacOS) сделать и поддерживать проще чем для AVR?
Баском конечно хороший, но в нем нет элементарных вещей (структур например, или вычислений в одной строке). И программируя на баскоме я не всегда уверен что получится в результате кодогенерации (были всякие непонятные случаи).

+1

13

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

0

14

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

Баском конечно хороший, но в нем нет элементарных вещей (структур например, или вычислений в одной строке)

Большой жирный плюс.

0

15

В дополнение к посту №1.
Я использую ATmega328PB. Версия BASCOM 2.0.8.0. В нём есть два TWI 0 и 1. Для работы с ними есть библиотека "I2C_TWI-MULTI.lib", но...
При попытке чтения памяти с любого адреса получаем первый байт всегда 0хА1, остальные как записано  o.O  Ставлю старую "I2C_TWI.lib" всё ок.
Мало того при попытке включить буферизованный ввод на UART1 вылетает ошибка. Оказалось, что  в файле "m328PBdef.dat"  не секции с описанием такого режима. Для UART0 есть, а для UART1 нет.
Вставил вручную, вроде всё заработало, а вот с памятью косяк. Написал в поддержку. Оперативно отреагировали и посоветовали обновиться до 2.0.8.2.
Обновился и всё заработало, как надо.
Теперь чуть не по теме.
Я выбирал 328РВ с таким расчётом, что он просыпается из POWERDOWN по старту UART.
Не ведитесь на этот крючок. Оказалось, что просыпаться то он просыпается, но только при работе от внутреннего генератора и скорости передачи не более 500 б/сек.  :crazyfun:
Вот такие дела.

Отредактировано sva-don (2020-01-15 13:55:02)

+3

16

Объявление переменных через запятую с указанием типа для каждой переменной выделяет память в прямом порядке; а через запятую с одним общим типом -- в обратном порядке.
Это может быть важно, если вы используете оверлеи для быстрого доступа к структурам данным.

Например:

Dim A as byte, B as byte
Dim C(2) as byte at A overlay

A = 1
B = 2

при этом, согласно ожиданию, С(1) = 1; С(2) = 2

Однако, допустимая в Bascom запись
Dim A, B as byte
Dim C(2) as byte at A overlay

A = 1
B = 2

вопреки ожиданию, приведет к тому, что С(1) = 2; С(2) = 1

В инструкции ничего про эту "особенность" :-/ не сказано.

На иллюстрации -- распределение памяти переменным.
http://forumuploads.ru/uploads/0000/25/b8/2070/t79793.png

+6

17

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

если вы используете оверлеи для быстрого доступа к структурам данным.

Вот из-за таких ловушек никогда не пользуюсь оверлеями. Иду в лоб. Читаю адрес переменной Varptr и оттуда достаю всё, что мне нужно.  :glasses:

0

18

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

Вот из-за таких ловушек никогда не пользуюсь оверлеями. Иду в лоб. Читаю адрес переменной Varptr и оттуда достаю всё, что мне нужно.

Да какая разница: все будет задом наперед. Или нет. Смотря как объявили переменные.

0

19

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

Да какая разница: все будет задом наперед.

Однажды наткнулся на подобные грабли, но, не вдаваясь в причины, теперь объявляю каждую переменную отдельной строчкой. ;)

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

+1

20

приветствую!
размещу тут, может кто подскажет.
Такого косяка я еще не встречал, а лезть в ассемблер через 14 лет уже весьма сложно, так как почти всё забыто (да и писал на ассме я под PIC)

коротко:
atmega2561
Если одновременно в программе включить:
графический дисплей T6963,
оба UART
звук (sound) на portb.5

то при первом же обращении к дисплею по LCD "" программа перезапускается. День воюю.
Есть комбинации, когда работает, но стоит добавить где-то в код SOUND и всё снова начинает виснуть.

Если из кода убрать GLCD или обращение к uart2 - не виснет.

код

0

21

The SOUND statement is not intended to generate accurate frequencies. Use a TIMER to do that.

Оператор SOUND не предназначен для генерации точных частот. Используйте ТАЙМЕР, чтобы сделать это.

Может быть какой-то конфликт, надо смотреть как сделаны библиотеки..)

0

22

вот и пытаюсь понять, какие он подключает...
я, конечно, могу без звука обойтись или с uart работать на уровне регистров (что и будет сделано в этом проекте), но как-то странно! Это первый глюк, который остановил процесс на сутки ))

ps
может кому пригодится:
связь настроил так:
Baud = 9600                                                 ' GSM
$baud1 = 19200                                              ' MDB

обратите внимание на первую строку, первый символ - не $

Звук генерирую сам в подпрограмме, дергая ногу в цикле нужной длительности.
В uart1 данные шлю так:

   While Ucsr1a.udre1 = 0 : Wend                            ' Ждём освобождения буфера передатчика
   Ucsr1b.txb81 = 0                                         '  0 разряд - TXB8 = 8-й разряд передаваемых данных
   Udr1 = Data_my                                           ' загрузка байта в буфер передатчика

Отредактировано Александр Д. (2020-03-03 23:13:30)

0

23

Александр Д. написал(а):

Если одновременно в программе включить:
графический дисплей T6963,
оба UART
звук (sound) на portb.5
то при первом же обращении к дисплею по LCD "" программа перезапускается. День воюю.
Есть комбинации, когда работает, но стоит добавить где-то в код SOUND и всё снова начинает виснуть.

Судя по RTFM:

SOUND pin, duration, pulses
Pin - Any I/O pin such as PORTB.0 etc.
Duration - The number of pulses to send. Byte, integer/word or constant.
Pulses - The time the pin is pulled low and high. This is the value for a loop counter.

Компилятор создает в коде вложенный цикл вроде такого:

Код:
for iDuration = 0 to Duration
   for iPulses =0 to nPulses 
      REM (неизвестно, корректирует ли компилятор число nPulses смотря по частоте кварца, используя внутреннюю константу _XTAL, или тупо берет nPulses = Pulses)
      toggle Pin
   next iPulses
next iDuration

Следуя такой логике, почему бы Вам не сделать собственную, полностью контролируемую процедуру вроде mySound?

+1