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

Программирование 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 - не виснет.

код

'Графический ЖКИ 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