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

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

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

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


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


Обнаруженые ошибки компилятора.

Сообщений 31 страница 60 из 82

31

Может кто знает какого хрена при вызове функции "f1" значение "a1" всегда равно 58,
это глюк ?. или нормальное явление в BASCOM-AVR 2.0.7.1
в других версиях не пробовал,может кто проверит?

$Regfile="m16def.dat"
$Crystal=4000000
$hwstack=32
$swstack=8
$framesize=24

declare Function f1(byval a1 as Byte,byval a2 as Byte,byval a3 as Byte,byval a4 as Byte)as Byte

dim r as Byte

r=f1 (&H0,&H0,&H0,&H0)
r=f1 (&H0,&H0,&H0,&H0)
stop

Function f1(byval a1 as Byte,byval a2 as Byte,byval a3 as Byte,byval a4 as Byte)as Byte
print a1
print a2
print a3
print a4
f1=0
end FUNCTION

0

32

$Regfile="m16def.dat"
$Crystal=4000000
$hwstack = 64
$swstack = 32
$framesize = 24

так работает в 2.0.7.2

Declare Function F1(byval A1 As Byte , Byval A2 As Byte , Byval A3 As Byte , Byval A4 As Byte)as Byte

dim r as Byte

R = F1(&H0 , &H0 , &H0 , &H0)
R = F1(&H0 , &H0 , &H0 , &H0)
stop

Function F1(a1 As Byte , A2 As Byte , A3 As Byte , A4 As Byte)as Byte
print a1
print a2
print a3
print a4
F1 = 0
End Function

0

33

Действительно так работает нормально !!!
Огромнейшая благодарность!!!
Вот только каким образом определять сколько отстегнуть аппаратному и сколько программному стеку?,
ведь заранее не известно как компилятор наворотит программу?

0

34

читать мануал, там всё есть
я как раз перевёл на русский часть про переменные и стек
ищите в форуме ссылки

и проблема у вас в выделенной жирным строке

0

35

Столкнулся тут с проблемой: Chr - воспринимает значения от 1 до 255, но 0 - нет. (
Ноль воспринимается как полностью отсутствующий символ, если складывать с строкой.
Пример:

Str_in = "Tst"
Str_in = Str_in + Chr(0)

В Str_in - получаем просто "Tst", а не "Tst" + 0.

Вариант: "Tst" + Chr(0) - приводит к тому же результату плачевному. (

Как это обходить пока идей нет.

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

Отредактировано RDW (2011-11-13 16:56:29)

0

36

Это не баг, а нормальное поведение - признаком конца строки является байт со значением 0. http://ru.wikipedia.org/wiki/%CD%F3%EB% … 0%EE%EA%E0
Так ведет себя не только баском но и другие компиляторы, в т. ч. и для компа.
А у символа "0" код 48.

Отредактировано Пётр (2011-11-13 17:15:05)

0

37

Ошибаетесь, не путайте - это Бэйсик.
Не поленился проверить:

http://uploads.ru/t/R/Z/d/RZd5b.png

Видите между тире пустота - не с проста.)

Ещё: http://en.wikibooks.org/wiki/Visual_Bas … erence#Chr

Отредактировано RDW (2011-11-13 17:39:21)

0

38

У вас эти символы печатаются отдельно. Попробуйте объединить в строку и посмотрите что получится.

Я тоже не поленился и проверил.

Компиляция в ASCII.
http://i020.radikal.ru/1111/b8/cb15781600bd.png

Компиляция в юникоде.
http://s49.radikal.ru/i125/1111/c8/42226d1c818c.png

Как видим, если строка в ASCII, то, то что после нулевого байта - отсекается.

Ну и смотрим в справку баскома.
http://i068.radikal.ru/1111/10/9e1448485bc9.png

0

39

Объединил в строку:

http://uploads.ru/t/o/i/u/oiuOJ.png

Как видим, все функции бэйсика работают как надо с нулём.

Из-за этой пакости невозможно с порта нормально обрабатывать данные. ( Через массив гонять не хочется без надобности.

Отредактировано RDW (2011-11-13 18:24:02)

0

40

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

Как видим, все функции бэйсика работают как надо с нулём.

А что реально творится в памяти? Получите указатель на строку и покажите что там. Там юникод походу! А баском хранит строки в юникоде?
В VB 6 нестандартный тип строки http://www.vbstreets.ru/VB/Articles/66364.aspx
Он несовместим с большинством других языков и даже WinAPI. Поэтому не нужно ставить VB6 в пример.
Скрины адекватного реагирования на Chr(0) я выкладывал выше.

0

41

Если посмотреть содержимое памяти ASCII строки (в таком виде баском хранит строки), то видно что нет и намека на второй символ -.
Это адекватное поведение для случая, нуль-терминированной строки.

http://s017.radikal.ru/i432/1111/da/663f0ab36003.png

0

42

Вы можете мне что угодно говорить, но я ещё для убедительности попробовал тоже самое в QBasic (DOS) - там такая же картина, он прекрасно понимает ноль в строке.
То, что Баском не умеет правильно работать с нулём как должен настоящий Бэйсик - это дело десятое. Значит это уже не совсем Бэйсик, а гибрид похожий на него.

0

43

Вообще-то отклонение от стандарта это не есть норма!
Баском соответствует стандарту, а вот продукты мелкософта (VB6, QB) нет или в них используются не нуль-терминированные строки!

Еще раз повторяю ссылку http://ru.wikipedia.org/wiki/%CD%F3%EB% … 0%EE%EA%E0
Это стандарт для обычных строк, принятый во многих языках программирования.
А в VB6 это баг, ссылку давал выше - адекватный язык программирования не допустит такой ситуации!

Отредактировано Пётр (2011-11-13 19:23:13)

0

44

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

0

45

Еще доказательство моей правоты - только один дефис, а не два!

http://s017.radikal.ru/i412/1111/fa/acc04a792ba0.png

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

Это современный стандарт, с учетом всех современных кодировок, т.ч. он отношения никакого не имеет к бэйсику.

Минуточку, разве баском древний язык программирования?
Марк шагает в ногу со временем.

Да и вообще все современные языки программирования (особенно компьютерные и бейсик не исключение) должны его придерживаться, иначе будут проблемы с совместимостью или при работе с API ОС.

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

Меня теперь интересует как теперь ещё можно решить задачу обработки и текста, и кода в одном месте, с такими извратами.

Массив не подходит?

0

46

Дело в том, что бэйсик - это не только синтаксис, но и идеология.
А чтобы не было конфликтов с прочими современностями нужно либо дать пользователю переключать эту возможность или самому контролировать её (все нюансовые моменты). Хотя впрочем большинство разработак никак не связаны с API ОС.

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

Массив не подходит?

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

0

47

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

Дело в том, что бэйсик - это не только синтаксис, но и идеология.

То есть, если есть баг в VB6 то он должен быть во всех других бейсиках?  :O VB6 это еще не эталон и на него не нужно ориентироваться!
Повторяю, в VB6 нестандартный тип строки (тем более что юникодный) и в других языках (в т. ч. бейсиках не от микрософта) этого бага вроде нет!

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

А чтобы не было конфликтов с прочими современностями нужно либо дать пользователю переключать эту возможность

Включать в выключать баг? :D

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

Хотя впрочем большинство разработак никак не связаны с API ОС.

Если вы не используете WinAPI (в VB6 это еще тот геморрой с декларированием функций) то это не значит что другие не используют.
Баг есть баг, и его нужно исправлять, только микросфту уже не нужен VB6 и он его не поддерживает.

----

Баском как и другие нормальные языки, по символу с кодом 0 определяет конец строки, т. е. 0 это признак окончания строки.

Отредактировано Пётр (2011-11-13 21:06:22)

0

48

Сколько писал в VB6 и прочих бейсиках не от мелкософта - не было никаких проблем с таким. В бэйсике "строка" не означает, что в ней должно быть наличие "конец строки" - это делается отдельным флагом и не использует имеющиеся данные.

0

49

RDW
может хватит лить воду?
всё по стандарту, который был ДО всех бейсиков, паскалей и проч
0 = стандартный "конец строки". Везде, где мне приходилось программировать

тем более, в даташите Марк указал все нюансы и полностью выполнил стандарт
Нравится, не нравится - это флуд.
давайте поставим на этом строчку

0

50

ПРОСТО К СВЕДЕНИЮ
'ранее жаловался, что новые версии bascom дают какую-то фатальную ошибку с Mega128
'что оказалось:
' 1) ошибка, конечно, моя, написал MCUCR = &h80 (назначить IDLE - как для M32) вместо
'   MCUCR = &H20. В результате включалась внешняя шина и на портах PA и PC при выполнении
'   команд ST Z,Rxx и LD Rxx,Z генерировались импульсы;
' 2) в ver.1.11.9.8 эта ошибка исправлялась компилятором
'  in      r24,MCUCR
'  andi    r24,&H07 'здесь биты разрешения шины сбрасываются
'  ori     r24,&H20
'  out     MCUCR,r24
'    а в ver.2.0.x.x генерился следующий код
'  in      r23,MCUCR
'  andi    r23,&HC3  'а здесь биты разрешения шины не сбрасываются!
'  ori     r23,&H20
'  out     MCUCR,r23
'    Значение маски, которую компилятор накладывает на действительно важные биты,
'    мало понятно.
' 3) мое назначение переставлено и вынесено за пределы блока инициализации регистров.
'    А в самом блоке инициализации применяется такое назначение (зачем-то)
'  ldi R23 , &H32 'powersave + не действующее назначение блока векторов прерывания???
'  Out MCUCR , R23
' 4) вывод. Учитавая нездоровое внимание компилятора к MCUCR теперь придется,
'    что бы получить нужный результа, писать только так
'  $asm
'  Ldi R24 , &H20
'  Out MCUCR , R24
'  $end asm

+1

51

Ну даже не знаю компилирую один и тот же файл в версии 1.11.9.8 компилируется без ошибок и работает, а во 2 версиях компилируется, но в протеусе градусы по нулям.

Код:
'*********************************************[Псевдокоманды управления]*****************************************

$regfile = "m8535.dat"                                      ' тип МК
$crystal = 8000000                                          ' выбор кристала для расчета задержек

'*****************************************[Определение переменных и констант]************************************

Dim B0 As Byte , B1 As Byte , T As Byte , Des As Byte
Dim Sign As String * 1

'***********************************************[Инициализация портов]*******************************************

Config 1wire = Portb.0                                      ' конфигурация шины 1-Wire

'-------------------------------

' конфигурация дисплея
Config Lcdpin = Pin , Rs = Portb.2 , E = Portb.3 , Db4 = Portb.4 , Db5 = Portb.5 , Db6 = Portb.6 , Db7 = Portb.7
Config Lcd = 16 * 2

'*********************************************[Начало основной программы]****************************************

Cursor Off                                                  ' выключаем курсор
Cls                                                         ' очистка дисплея

Deflcdchar 0 , 6 , 9 , 9 , 6 , 32 , 32 , 32 , 32            ' значок градуса

Do                                                          ' основной цикл

1wreset                                                     ' сбрасываем линию
1wwrite &HCC                                                ' пропуск ПЗУ
1wwrite &H44                                                ' запускаем преобразование температуры

Waitms 750                                                  ' задержка для окончания преобразования

1wreset                                                     ' сбрасываем линию
1wwrite &HCC                                                ' пропуск ПЗУ
1wwrite &HBE                                                ' читаем из ОЗУ полученную температуру

B0 = 1wread()                                               ' читаем нулевой и первый байт памяти датчика
B1 = 1wread()                                               ' (в них хранится считанная температура)

Cls                                                         ' очищаем дисплей
Locate 1 , 1                                                ' и выводим значения байтов температуры
Lcd "Byte0: " ; Bin(b0)
Locate 2 , 1
Lcd "Byte1: " ; Bin(b1)
Wait 1

If B1 >= 248 Then                                           ' если температура отрицательная...
B0 = &HFF - B0
B1 = &HFF - B1
Sign = "-"
Else
Sign = "+"
End If

Des = B0 And &B00001111                                     ' получаем дробную часть температуры
Des = Des * 10                                              ' расчитываем дробную часть
Des = Des / 16

Shift B0 , Right , 4                                        ' вырезаем нужное
Shift B1 , Left , 4

T = B0 + B1                                                 ' и собираем целую часть в кучу

Cls
Lcd Sign ; T ; "," ; Des ; Chr(0) ; "C"                     ' выводим значение на индикацию
Waitms 1000

Loop

End

'*****************************************************[Прочее]***************************************************
'-------------------------
'----------------------------------------------------------------------------------------------------------------

версии брал все демо может в этом дело, но писали же, что работоспособны ограничения только в размере кода. пробовал 2.0.5.0, 2.0.7.1, 2.0.7.3 - не пашет а 1.11.9.8 как из пушки :canthearyou:

Отредактировано amv2000 (2012-01-30 19:27:14)

0

52

Вы только в Протеусе проверяли?
я им вообще не пользую.сь - сколько гемора!!!

я тоже нашел несколько шуточек от компилятора последней версии.
начиная от Waitms ХХ , где хх я не объявил, а он принял и что-то там даже делал
заканчивая работой с битами,
Еще что-то находил. Не хаписал и забыл. Но промучался знатно :(

0

53

Да и без протеуса не компилируется код http://forum.avr.ru/laboratornyy-blok-p … 53p30.html вернее компиллируется с ошибками а версия 1.11.9.8 все в порядке, уже задавался вопросами, потом плюнул, а сейчас опять всплыли ошибки.
Вот и хотел спросить может из за того, что демо может в полной версии все в порядке? А если нет то может написать Марку в чем причина то....

0

54

1 Дело не демо. Хотя лучше найти полную.
2 Сделать вставки вывода промежуточных результатов и определить где (на каком участке или операции) возникла ошибка.
3 Версии 2хх отличаются жестко урезанным блоком инициализации и даже изменением ее логики (что-переставлено, что-то что-то не
делается автоматически), за счет этого размер кода и сокращен. Просто нужно более
тщательно подробно инициализировать оборудования не упуская ничего

0

55

Исходник хоть и не мой, но бегло пробежав создалось впечатление, что проблемы с переменными. В частности если поменять наименование подпрограммы DPZ на DIPZ все компилируется правда в железе не проверял.
С термометром пока не разобрался, может в железе он и работает, а я зря наговариваю.

0

56

Всех поздравляю, вышла новая версия, изменения:

2.0.7.4 BETA

- SSD1325 lib updated. fonts were not shown properly (there was a pixel between each line)
- AVR-DOS SDHC driver updated for Xmega and included.
- oled sample included
- modbus slave included
- right margin line can be adjusted.
- DCF77 support added for Xmega       
- internal numeric conversion routine will report non-numerical trailing data that was previously ignored (spaces, etc.)
- added support for xmega big memory(8MB), this is still considered a BETA feature.
- added Find in Files option to the IDE.
- changed HWMUL=1 into HWMUL=0 for usb162,usb82,m32u2def
- STOP TIMER1 did not stop timer for tiny25/45/85
- attiny25 adc noise canceler.bas sample added from MAK3
- attiny13A.dat file powermode section corrected.
- .align worked with word address instead of byte address as intended.
- A = &H6000 Or &H8000 resulted in error 51.
- using select case with a string function would only work for the first case.
- RTC32 support added for Xmega
- atmega128RFA1 dat file added.
- attiny85 as SPI SLAVE using USI sample added from MAK3
- data line would not convert a const correct for single/double : const x=12.34 : data x! would fail
- the following code is no longer required for the xmega:
  $lib "xmega.lib" : $external _xmegafix_clear : $external _xmegafix_rol_r1014
- CTRL+J will show templates.
- XTEAENCODE and XTEADECODE statements added to encrypt/decrypt using XTEA algo
- added hexval.lib from user MWS. This is an alternative lib for HEXVAL that removes spaces and sets ERR if illegal characters are found
- string() and space() when used with a string array with a variable index : var(varx)=space(x) will result in a memory overwrite, depending on the index and address of the array.
- attiny261/461/861 have one shared interrupt flag for PCINT but 2 individual enable flags. Added to the dat files.
- added BANDGAP=ENABLED|DISABLED to CONFIG ACI. It will only work for chips that support this option(most new chips)
- for external programmer, {CHIP} can be used to specify the device/chip.
- m32M1 missed PCICR register in dat file. The prescale value for timer0 was not correct loaded for config timer0
- [FLAG] section updated. Some chips have combined flag/normal in extended IO space. For example USISR in the M169
  These regs need special handling to reset a bit.
- waitus improved. normally an internal sub routine is called but for some xtal values and delays, this is not possible.
  in such a case, NOPS are generated. But this can be as much as 14 nops. In such cases a small single byte loop delay is generated.   
- INP/OUT support Xmega huge memory   
- added Arduino V2 progammer (uses stk500v2 protocol) for M2560 R3       
- CONFIG XPIN added for xmega pin setup.   
- print bin() used with a long/dword would overflow the internal string buffer. the frame is used now.   
- array with negative offset like : ar(constant - var) pointed to the wrong memory. var-constant was no problem.
- added project mode option with explorer. you might need to reset the docking to make it visible.       
- ON interrupts accepts SAVE and SAVEALL too. SAVE is the default and used when no parameter is provided.
- 2074 requires an update of the bascomp.exe command line utility

Радует, что XMega совершенствуют...

Кстати жаль, что нет до сих пор sByte (-127, +127) системы счисления.

0

57

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

- for external programmer, {CHIP} can be used to specify the device/chip.

НАКОНЕЦ-ТО!!!

0

58

скачал, но ставится как версия 2 0 7 3 :(

0

59

Толи они не обновили пока архив, то ли это так задумано, но я тоже изрядно попотел прежде чем допер, как ставить через "UpdateWiz" и через файл "lic".

0

60

аналогично сделал

0

Похожие темы


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