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

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

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

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



Глюки в BASCOM

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

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://forumupload.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 - не виснет.

код

'Графический ЖКИ 240*128 с контроллером T6963C, модель
   ' изменить fuse для откл JTAG !!!

   ' шрифты хранятся в самом МК

'$prog &HFF , &HFF , &HD1 , &HF8                             ' generated. Take care that the chip supports all fuse bytes.

$regfile = "m2561def.dat"                                   ' specify the used micro
$crystal = 16000000                                         ' used crystal frequency
$hwstack = 128                                              ' hardware stack
$swstack = 128                                              ' SW stack
$framesize = 128                                            ' frame space

Config Portb = Output
Config Portf = Output
Config Portg = Output

Dim Podsvetka As Byte , Knopki_paneli As Byte , Temp As Byte

Status_gsm Alias Pinf.0 : Config Status_gsm = Input : Portf.0 = 0       ' Статус модема

' Сдвиговый регистр 74HC595     -      Подсветка кнопок
Clc_595 Alias Portf.7                                       ' Тактовая регистра в регистр 595
Ld_595 Alias Portf.6                                        ' Загрузка данных в регистр 595
Dat_595 Alias Portf.5                                       ' Данные в регистр 595

Btn_dat165 Alias Pinf.4 : Config Portf.4 = Input            ' Данные из регистра 165 (кнопки)

Pwm_audio Alias Portb.5 : Config Pwm_audio = Output         ' Звук, ШИМ, подключен на УНЧ LM386

1wire_bus Alias Portf.3                                     ' 1wire

$baud = 9600                                                ' GSM
Print "!GSM"

Sound Pwm_audio , 150 , 400                                 ' пикнем. Длительность, период (чем больше - тем ниже частота)

' неиспользуемые сигналы назначены на несуществующие пины портов !
Config Graphlcd = 240 * 128 , Dataport = Porta , Controlport = Portc , Rd = 0 , Wr = 1 , Cd = 7 , Ce = 2 , Reset = 2 , Fs = 2 , Mode = 8
Cls
Cursor Off

Locate 3 , 1 : Lcd "Autor Alexandr"

Knopka1 Alias 4
Knopka2 Alias 5
Knopka3 Alias 6
Knopka4 Alias 7
Knopka5 Alias 3
Knopka6 Alias 2
Knopka7 Alias 1
Knopka8 Alias 0

Sv1 Alias 0
Sv2 Alias 1
Sv3 Alias 2
Sv4 Alias 3
Sv5 Alias 4
Sv6 Alias 5
Sv7 Alias 6
Sv8 Alias 7

Sound Pwm_audio , 250 , 700                                 ' пикнем. Длительность, период (чем больше - тем ниже частота)

Podsvetka = 0 : Gosub Vkl_svdiody_opros_knopok : Waitms 100
Podsvetka.sv1 = 1 : Gosub Vkl_svdiody_opros_knopok : Waitms 100 : Podsvetka = 0
Podsvetka.sv2 = 1 : Gosub Vkl_svdiody_opros_knopok : Waitms 100 : Podsvetka = 0
Podsvetka.sv3 = 1 : Gosub Vkl_svdiody_opros_knopok : Waitms 100 : Podsvetka = 0
Podsvetka.sv4 = 1 : Gosub Vkl_svdiody_opros_knopok : Waitms 100 : Podsvetka = 0
Podsvetka.sv5 = 1 : Gosub Vkl_svdiody_opros_knopok : Waitms 100 : Podsvetka = 0
Podsvetka.sv6 = 1 : Gosub Vkl_svdiody_opros_knopok : Waitms 100 : Podsvetka = 0
Podsvetka.sv7 = 1 : Gosub Vkl_svdiody_opros_knopok : Waitms 100 : Podsvetka = 0
Podsvetka.sv8 = 1 : Gosub Vkl_svdiody_opros_knopok : Waitms 100 : Podsvetka = 0

'$baud1 = 19200                                              ' MDB
'Open "COM2:" For Binary As #2

Do

   Podsvetka = 0
   If Knopki_paneli.knopka1 = 0 Then
      Podsvetka.sv1 = 1
      Sound Pwm_audio , 110 , 510                           ' пикнем. Длительность, период (чем больше - тем ниже частота)
   End If

   If Knopki_paneli.knopka2 = 0 Then Podsvetka.sv2 = 1
   If Knopki_paneli.knopka3 = 0 Then Podsvetka.sv3 = 1
   If Knopki_paneli.knopka4 = 0 Then Podsvetka.sv4 = 1
   If Knopki_paneli.knopka5 = 0 Then Podsvetka.sv5 = 1
   If Knopki_paneli.knopka6 = 0 Then Podsvetka.sv6 = 1
   If Knopki_paneli.knopka7 = 0 Then Podsvetka.sv7 = 1

   If Knopki_paneli.knopka8 = 0 Then
      Podsvetka.sv8 = 1
      Sound Pwm_audio , 70 , 850                            ' пикнем. Длительность, период (чем больше - тем ниже частота)
   End If

   Gosub Vkl_svdiody_opros_knopok                           ' включим св.диоды подсветки кнопок, и опрос кнопок
   Locate 2 , 1 : Lcd Bin(knopki_paneli)

   Print "GSM"

   'Print #2 , "MDB"
   'Sound Pwm_audio , 30 , 150                               ' пикнем. Длительность, период (чем больше - тем ниже частота)

   Waitms 100
Loop

End

   '=========================================================
Vkl_svdiody_opros_knopok:                                   ' включим св.диоды подсветки кнопок, и опрос кнопок
' Вначале опрос кнопок из hc165, потом загрузка в hc595

   Ld_595 = 0                                               ' Загрузка из параллельных входов в регистр
   Clc_595 = 0
   Waitus 10
   Ld_595 = 1                                               ' Запоминаем в регистрах загруженное значение
   Waitus 10

' Теперь в регистрах значения состояний кнопок
   For Temp = 0 To 7                                        ' Загрузка из параллельных входов в регистр
      Knopki_paneli.temp = Btn_dat165                       ' Загружаем в переменную значение кнопок
      Clc_595 = 1                                           ' Сдвигаем из регистров на выход
      Waitus 20
      Clc_595 = 0
      Waitus 20
   Next

   Ld_595 = 0

   Temp = 0                                                 ' Если ноль - гасим все св.диоды на панели

   If Podsvetka.sv1 = 1 Then Temp.0 = 1
   If Podsvetka.sv2 = 1 Then Temp.1 = 1
   If Podsvetka.sv3 = 1 Then Temp.2 = 1
   If Podsvetka.sv4 = 1 Then Temp.3 = 1
   If Podsvetka.sv5 = 1 Then Temp.4 = 1
   If Podsvetka.sv6 = 1 Then Temp.5 = 1
   If Podsvetka.sv7 = 1 Then Temp.6 = 1
   If Podsvetka.sv8 = 1 Then Temp.7 = 1

   Shiftout Dat_595 , Clc_595 , Temp , 1 , 8 , 20           ' загрузка в hc595
   Ld_595 = 1 : Waitus 50 : Ld_595 = 0

Return

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

24

Вот, нашёл ещё глюк.
Стояла версия 2.0.8.2  В разделе Code Explorer показывалось дерево программы где были видны переменные, константы, подпрограммы и т.д. и т.п. Всё было нормально и удобно.
Обновился до 2.0.8.4, этот раздел оказался пустым. Создал проект, добавил в него нужные файлы, откомпилировал и ничего. Все манипуляции с настройками ни к чему не привели.
Перешел обратно на 2.0.8.2, все показывало до сегодняшнего дня, сегодня пусто. o.O
Может кто сталкивался с этим? Как побороть?
http://forumupload.ru/uploads/0000/25/b8/819/t83790.png

0

25

а если в профиле пользователя удалить настройки Баскома?

0

26

Будем пробовать.

0

27

У меня ассоциации файлов нет, кто с таким боролся?

0

28

В контекстном меню: Открыть с помощью... Два три раза открываете так, потом всё нормально. Это в восьмёрке.

0

29

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

Вот, нашёл ещё глюк.
Стояла версия 2.0.8.2  В разделе Code Explorer показывалось дерево программы

Прикольно, всё появилось само собой. Ничего не делал. :crazyfun:
Теперь другая беда. Программатор AVR ISP mk2 (оригинал) категорически не хочет работать.
Заметил следующее, сначала всё было нормально, потом всё чаще перестала читаться сигнатура МК и, соответственно, невозможно ничего залить.
Теперь вообще отказывается работать. Думал с платой беда, но перепробовал все имеющиеся, ничего. Точно уверен, что одна рабочая, там мигают светики при работе.
При этом сам программатор в устройствах определяется нормально. Установлена lib usb 1.2.6
Убил два дня, ничего не помогает. Ставил студию 6, фиг вам. Похоже что накрылся сам?
http://forumupload.ru/uploads/0000/25/b8/819/t893147.png

0

30

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

В контекстном меню: Открыть с помощью... Два три раза открываете так, потом всё нормально.

Даже не выбирается, только блокнот.

0