Регистрация | Вход
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
Страница 1 из 212»
Модератор форума: demanik 
Форум Picbasic.ru » Программирование МК » Proton PicBasic » Проблема при делении
Проблема при делении
ntro123 Дата: Пн, 28.06.2010, 21:53  |                                                                                                                Сообщение # 1
Группа: Пользователи
Ранг:  Понимаю
Сообщений: 62
Репутация: 0   ±
Замечания:   ±
На сайте с 28.06.2010

Статус: Offline

Добрый день!

Тут такая проблема ... весь код пашет но как тока добавил строчку "Constanta=1 / Constanta"
так он выдает ошибки по типу:

Error[126] F:\DOCUME~1\B262~1\0016~1\BASIC\LCD2.ASM 98 : Argument out of range (1119 not between 0 and 1023)

вот полный код программы:

Code

Device = 16F84A
XTAL = 4
Dim VR1 As word
Dim VR2 As word
Dim sred As Float  
Dim WorkVar as Byte
Dim WorkTime as Word
Dim Constanta As Float
Dim i as word
Dim Workt As Float
Print At 1, 1, "00000"
Print At 1, 8, "SH/T:"
i=100 / 10
main:
BUTTON PORTA.1, 0, 500, 100, WorkVar, 1, Delo  
BUTTON PORTA.0, 0, 500, 100, WorkVar, 1, resetall  

if WorkTime=1 Then
While i < 80
    delayms 50
    i=i+1
    BUTTON PORTA.1, 0, 500, 100, WorkVar, 1, Delo  
    BUTTON PORTA.0, 0, 500, 100, WorkVar, 1, resetall    
Wend
WorkTime=0
i=0
Print At 1, 13, "XXXX"
endif
goto main

Delo:
if PORTA.1=0 Then goto delo
VR1=VR1 + 1
;--------------------
if VR1<10 Then
Print At 1, 5, dec VR1
else
  if VR1<100 Then
  Print At 1, 4, dec VR1
  else
   if VR1<1000 Then
   Print At 1, 3, dec VR1
   else
    if VR1<10000 Then
    Print At 1, 2, dec VR1
    else
     if VR1<100000 Then
     Print At 1, 1, dec VR1
     Endif
    Endif
   Endif
  Endif
Endif
;--------------------
BUTTON PORTA.0, 0, 500, 100, WorkVar, 1, resetall  
if i!=0 Then
Constanta=i * 0.05
Constanta=1 / Constanta ;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Print At 1, 13, dec Constanta
i=0
goto main
endif
WorkTime=1
goto main

resetall:
cls
delayMS 500
WorkTime=0
VR1=0
Print At 1, 1, "00000"
Print At 1, 8, "SH/T:"
goto main

Добавлено (28.06.2010, 21.53.14)
---------------------------------------------
Главное умножение пашет и + и -.
А как тока деление так сразу орет ...

ЯНДЕКС Дата: 28.06.2010
Dmitry Дата: Пн, 28.06.2010, 23:15  |                                                                                                                Сообщение # 2
Группа: Пользователи
Ранг:  Могу и подсказать
Сообщений: 161
Репутация: 6   ±
Замечания:   ±
На сайте с 12.05.2009

Статус: Offline

Мож глюк какой в компиляторе - мне как-то тоже раз не давал одну и ту же переменную по обе стороны от равно ставить. Попробуйте через промежуточную переменную

dim tempfl as float

...
tempfl = constanta
constanta = 1 / tempfl

ntro123 Дата: Вт, 29.06.2010, 10:12  |                                                                                                                Сообщение # 3
Группа: Пользователи
Ранг:  Понимаю
Сообщений: 62
Репутация: 0   ±
Замечания:   ±
На сайте с 28.06.2010

Статус: Offline

Quote (Dmitry)
Мож глюк какой в компиляторе - мне как-то тоже раз не давал одну и ту же переменную по обе стороны от равно ставить. Попробуйте через промежуточную переменную
dim tempfl as float
...
tempfl = constanta
constanta = 1 / tempfl

Да уже как только не пытался (((

вот без переменной все проходит.
т.е.
constanta = 1 / 2

ПС. если закоментить следушию строку "Print At 1, 13, dec Constanta" то се норм ... но тогда как выводит ьна экран??? ппц мне так понравился бейсик под пик ... а тут такая шняга...

Сообщение отредактировал ntro123 - Вт, 29.06.2010, 10:34
demanik Дата: Вт, 29.06.2010, 10:54  |                                                                                                                Сообщение # 4
Группа: Модераторы
Ранг:  Помогаю всем
Сообщений: 451
Репутация: 10   ±
Замечания:   ±
На сайте с 11.12.2007

Статус: Offline

Quote (ntro123)
Да уже как только не пытался (((
вот без переменной все проходит.
т.е.
constanta = 1 / 2

Похоже программа не влазит в пик. Я поробовал поставить другой пик 16F628А с большей памятью (он и стоит дешевле) и все ОК. cool


Попробуй всё и вся... может быть пол...

ntro123 Дата: Вт, 29.06.2010, 11:04  |                                                                                                                Сообщение # 5
Группа: Пользователи
Ранг:  Понимаю
Сообщений: 62
Репутация: 0   ±
Замечания:   ±
На сайте с 28.06.2010

Статус: Offline

И в правду ... поставил 18F252 и се гуд .... но хотелосьбы под 16F84A т.к. он есть у меня.

мб надо както код оптимизировать ???

Добавлено (29.06.2010, 11.04.25)
---------------------------------------------
16F628А не пашет. все равно ошибку выдает.

Сообщение отредактировал ntro123 - Вт, 29.06.2010, 11:01
demanik Дата: Вт, 29.06.2010, 11:05  |                                                                                                                Сообщение # 6
Группа: Модераторы
Ранг:  Помогаю всем
Сообщений: 451
Репутация: 10   ±
Замечания:   ±
На сайте с 11.12.2007

Статус: Offline

Quote (ntro123)
16F628А не пашет. все равно ошибку выдает.

У меня нормально, без ошыбок.


Попробуй всё и вся... может быть пол...

ntro123 Дата: Вт, 29.06.2010, 11:17  |                                                                                                                Сообщение # 7
Группа: Пользователи
Ранг:  Понимаю
Сообщений: 62
Репутация: 0   ±
Замечания:   ±
На сайте с 28.06.2010

Статус: Offline

Quote (demanik)
У меня нормально, без ошыбок.

вот мой код

Code
Device = 16F628A
XTAL = 4
Dim VR1 As word
Dim VR2 As word
Dim WorkVar as Byte
Dim WorkTime as Word
Dim Woasd as Word
Dim Constanta As Float
Dim i as word
Dim Workt As Float
Print At 1, 1, "00000"
Print At 1, 8, "SH/T:"
i=0
main:
BUTTON PORTA.1, 0, 500, 100, WorkVar, 1, Delo  
BUTTON PORTA.0, 0, 500, 100, WorkVar, 1, resetall  

if WorkTime=1 Then
While i < 80
    delayms 50
    i=i+1
    BUTTON PORTA.1, 0, 500, 100, WorkVar, 1, Delo  
    BUTTON PORTA.0, 0, 500, 100, WorkVar, 1, resetall    
Wend
WorkTime=0
i=0
Print At 1, 13, "XXXX"
endif
goto main

Delo:
if PORTA.1=0 Then goto delo
VR1=VR1 + 1
;--------------------
if VR1<10 Then
Print At 1, 5, dec VR1
else
  if VR1<100 Then
  Print At 1, 4, dec VR1
  else
   if VR1<1000 Then
   Print At 1, 3, dec VR1
   else
    if VR1<10000 Then
    Print At 1, 2, dec VR1
    else
     if VR1<100000 Then
     Print At 1, 1, dec VR1
     Endif
    Endif
   Endif
  Endif
Endif
;--------------------
BUTTON PORTA.0, 0, 500, 100, WorkVar, 1, resetall  
if i!=0 Then
Constanta=i * 0.05
Constanta=1 / Constanta
Print At 2, 13, dec Constanta
i=0
goto main
endif
WorkTime=1
goto main

resetall:
cls
delayMS 500
WorkTime=0
VR1=0
Print At 1, 1, "00000"
Print At 1, 8, "SH/T:"
goto main

выдает ошибки:
Error[115] F:\PROGRA~1\CROWNH~1\INC\P16F628A.LPB 179 : Duplicate label ("VR2" or redefining symbol that cannot be redefined)
Error[115] F:\PROGRA~1\CROWNH~1\INC\P16F628A.LPB 180 : Duplicate label ("VR1" or redefining symbol that cannot be redefined)

компилятор proton+ compiler version 2.1.3

terrarus Дата: Вт, 29.06.2010, 12:29  |                                                                                                                Сообщение # 8
Группа: Модераторы
Ранг:  Разобрался
Сообщений: 542
Репутация: 16   ±
Замечания:   ±
На сайте с 21.08.2008

Статус: Offline

ntro123, Я поменял в Вашей программе всего лишь процессор 16F84A на Device = 16F873A и все сразу стало компилится без ошибок.
Кстати код вашего примера с 16f628A тоже компилится без проблем. 16F84A скорее всего негодится из-за специфических страниц памяти -не хватает место для переменных. Я заменил
Dim i As Word на
Dim i As Byte
и стало компилится и с 16F84A но компилятор говорит что переменными занято 1022 байта из 1024 пожтому точно места нехватает в основной памяти 16F84A
А в вашей проге есть переменныее типа FLOAT . А вот другие 14 и 16 ядерные микроконтроллеры подходят хорошо.

Кстати блок кода
Constanta = i * 0.05
Constanta = 1 / Constanta
можно заменить на
Constanta = 20 / i

Нет, не операция деления съедает место в памяти а все ваши переменные. Нужно уменьшать их количество и типы.
Но есть и другое, например строчка вашего кода
If VR1<100000 Then
говорит о том, что переменная VR1 должна быть объявлена как Dword так как переменная типа Word не может быть более 65535. У Вас же Dim VR1 As Word. A переменные Dim VR2 As Word и
Переменная же Dim WorkTime As Word а принимает значения в проге только 1 или 0 достаточно было ее объявить как Byte. ообщем если уж вы уцепились за 16f84A, то получите массу ограничений либо используйте более современные и более дешёвые процессоры например 16F873A


Если у в Вас что-то не получается, подумай, не стоит ли прочитать инструкцию...!
Сообщение отредактировал terrarus - Вт, 29.06.2010, 13:14
ntro123 Дата: Вт, 29.06.2010, 19:08  |                                                                                                                Сообщение # 9
Группа: Пользователи
Ранг:  Понимаю
Сообщений: 62
Репутация: 0   ±
Замечания:   ±
На сайте с 28.06.2010

Статус: Offline

да извените все компилет моя ошщибка ... так значит проблема в том что не достаточно памети?
т.е. операция деление занимает много места? странно ... умножение и т.д. все норм

Добавлено (29.06.2010, 18.35.13)
---------------------------------------------
terrarus, огромно спасибо за исчерпывающий ответ!

и можно я задам еще один глупый вопрос ...
у меня отображаются краскозябры если юзать рус символы
Print "ыыыы крако зябры"

Никто не подскажет как это исправить??? и в самом редакторе протон+ тоже самое кряко зябы проблема с кодировкой и т.д. мб какнить через ascII ?? да я вот незнаю как ...

ПС. а как порты называются в 16F873A ??
а то на porta portb не откликаются

BUTTON PORTA.1, 0, 100, 100, WorkVar, 1, Delo
не пашет следовательно ...
(пытался даташить курить не вышло, да и вобше извените за глупые напригающие вопросы, я новичок в МК, а на бейсике для МК так вобше третий день)

Добавлено (29.06.2010, 19.08.13)
---------------------------------------------
прям ошибка на ошибки ...
при использовании

Code
   
DEFTXT: Cdata "00000 SH/T:", 0
Print CStr DEFTXT

с компилятором слава богу все норм.
а вот протеус ноет мол:
Attempt to execute illegal opcode (0x0030) - NOP executed.

это не смертельно?

Сообщение отредактировал ntro123 - Вт, 29.06.2010, 19:08
ADMIN Дата: Ср, 30.06.2010, 06:15  |                                                                                                                Сообщение # 10
Администратор
Группа: Администраторы
Ранг:  Специалист
Сообщений: 1110
Репутация: 24   ±
Замечания:   ±
На сайте с 20.08.2007

Статус: Offline

Для отображения русских букв нужен, во-первых дисплей русскоязычный. Если эмуляцию делаешь в протеусе, то нужно изменить библиотеку под русифицированный дисплей. Если у кого есть в данный момент эта библиотека, дайте человеку. Закинь в папку models протеуса, заменишь родной файл. называется lcdalpha.dll. Это первое. Второе. в протоне используй этот плагин. На вкладке "Индикация" есть инструмент для преобразования русских букв в коды для русифицированных ЖКИ. В своей программе вместо русских букв нужно вставлять эти коды. Там есть кнопка для вставки.
Вот здесь есть статья, описывающая прибор. В программе посмотри, как написаны команды Print. Там стоят какие-то цифры. Эти цифры - и есть закодированные русские буквы.

Насчет этого:
DEFTXT: Cdata "00000 SH/T:", 0
Print CStr DEFTXT

в описании модификатора Cstr, оператор Cdata стоит в конце программы, а не до команды Print. Команда Cdata использует свободную программную память, если не ошибаюсь. Если что, поправьте меня. поставь строку
DEFTXT: Cdata "00000 SH/T:", 0 в конце программы, после end. Поэкспериментируй. Думаю, проблема в этом. Компилятор правильно все отрабатывает, а вот протеус выполняет программу последовательно. Я не могу сейчас ни на чем ни проверить ни откомпилировать твою программу, так что все по памяти.

terrarus Дата: Ср, 30.06.2010, 10:52  |                                                                                                                Сообщение # 11
Группа: Модераторы
Ранг:  Разобрался
Сообщений: 542
Репутация: 16   ±
Замечания:   ±
На сайте с 21.08.2008

Статус: Offline

ADMIN, Максим здравствуйте. Давно хотел сказать по вопросу ProtonHeaderMaker 6.0.0.0 . У меня на работе с конца февраля стоит антивирус Аvast 4.8 Pro. Так он начисто блокирует ProtonHeaderMaker 6.0.0.0 - говорит что в нем Вирус/Червь Win32:Induc в E:\Program Files\ProtonHeaderMaker\ProtonHeaderMaker.exe. На домашних компьютерах у меня стоит легальный DrWeb и он ничего не находит. Обоими антивирусами я очень доволен.
Посмотрите пожалуйста, может там действительно что-то не так. Или может быть никакого вируса там нет а исполняемый файл ProtonHeaderMaker 6.0.0.0 нужно просто поправить немного.
На работе мне приходится пользоваться более ранним ProtonHeaderMaker, а хочется использовать ProtonHeaderMaker 6.0.0.0.
И ещё, старая версия содержит такую функцию которой нет в ProtonHeaderMaker 6.0.0.0. В старой версии можно скопировать в буфер обмена компа коды набранных букв русского текста и прямо вставить эти коды в программу *.bas в редакторе Протона.
А в версии ProtonHeaderMaker 6.0.0.0 скопировать коды русских букв напрямую в буфер нельзя, и приходится сохранять весь проект который сгенерил ProtonHeaderMaker 6.0.0.0, что не всегда нужно и удобно.

Для ntro123, я сюда прикрепил русифицированный файл lcdalpha.dll который взял из своей рабочей программы Proteusa. Этот файл lcdalpha.dll ( 75 кб) скачайте и скопируйте его в папки вашего Протеусе - С:\Program Files\Labcenter Electronics\Proteus 7 Professional\MODELS и С:\Program Files\Labcenter Electronics\Proteus 7 Professional\PatchWise.bak\Models. В этих папках уже есть не русифицированный файл lcdalpha.dll (113 кб). Поэтому на вопросы системы "Заменить имеющийся файл" ответьте да. И все больше ничего делать ненужно. Теперь Протеус будет нормально отображать русские буквы. Только нужно в программе *.bas в операторе принт писать не русские буквы а их коды например так:

Print At 1 ,6,$50,$61,$B7,$70,$61,$B2,$6F,$BF,$BA,$61 ' "Разработка"
Print At 2, 2, $41,$48,$41,$54,$4F,$A7,$A5,$B1,$20,$4D,$45,$E0,$42,$45,$E0,$45,$42,$41 ' "АНАТОЛИЯ МЕДВЕДЕВА"

Используя ProtonHeaderMaker 6.0.0.0 очень легко получить эти коды. Кстати эту замечательную программку написал наш admin. Скажите ему спасибо!

И еще, покупая алфавитно-цифровы индикаторы ЖКИ смотрите чтобы они поддерживали русские буквы.
Кстати на нашем форуме вопросы русификации ЖКИ в Протеусе и использования ProtonHeaderMaker уже неоднократно облуждались и в этих ветках форума все описано и разжёвано. Поэтому просьба к новичкам - прежде чем задавать любые вопросы очень прошу Вас внимательно просматривайте хотя бы названия тем форума. Уверяю Вас, почти всё уже спрашивалось и на эти вопросы уже есть ответы.

Прикрепления: LCDALPHA.dll(74Kb)


Если у в Вас что-то не получается, подумай, не стоит ли прочитать инструкцию...!
Сообщение отредактировал terrarus - Ср, 30.06.2010, 10:59
ntro123 Дата: Ср, 30.06.2010, 10:56  |                                                                                                                Сообщение # 12
Группа: Пользователи
Ранг:  Понимаю
Сообщений: 62
Репутация: 0   ±
Замечания:   ±
На сайте с 28.06.2010

Статус: Offline

ADMIN, спасибо большое. все сделал как ты сказал все запахало и русский текст тоже и протеус не ноет.

токлько вот я так и не полнел нашет команды

BUTTON PORTA.1, 0, 100, 100, WorkVar, 1, Delo
BUTTON PORTA.0, 0, 100, 100, WorkVar, 1, resetall

вроде подключены порты правельно (см. рис.)
но при нажатии реакция 0. т.е. я тупо незнаю как называется порт который нужно слушать на событие клика.
Прикрепления: 4811157.jpg(77Kb)

Сообщение отредактировал ntro123 - Ср, 30.06.2010, 10:58
terrarus Дата: Ср, 30.06.2010, 11:11  |                                                                                                                Сообщение # 13
Группа: Модераторы
Ранг:  Разобрался
Сообщений: 542
Репутация: 16   ±
Замечания:   ±
На сайте с 21.08.2008

Статус: Offline

Quote (ntro123)
я тупо незнаю как называется порт который нужно слушать на событие клика

Этот порт называется PORTA, все у вас правильно.
Добавьте в начало программы строку
Declare All_Digital = On ;Установить все порты цифровыми входами/выходами
Дело в том, что при использовании как цифровые входы выводов PORTA нужно в PORTA по этим выводам отключать аналоговые компараторы. Эта строка установит весь PORTA в режим цифровых входов и отключит внутренние компараторы. Если использовать не PORTA а PORTB, PORTC, PORTD то эту сроку добавлять не нужно все и так заработает.


Если у в Вас что-то не получается, подумай, не стоит ли прочитать инструкцию...!
Сообщение отредактировал terrarus - Ср, 30.06.2010, 11:42
ntro123 Дата: Ср, 30.06.2010, 14:52  |                                                                                                                Сообщение # 14
Группа: Пользователи
Ранг:  Понимаю
Сообщений: 62
Репутация: 0   ±
Замечания:   ±
На сайте с 28.06.2010

Статус: Offline

terrarus, может я конешно дурак, но нечео не помогает.
но вот проект и исходник если Вам не сложно попробуйте ...

ПС. а вот порт С пашет.

Прикрепления: mypro.rar(14Kb)

Сообщение отредактировал ntro123 - Ср, 30.06.2010, 14:56
Matrix252005 Дата: Ср, 30.06.2010, 15:58  |                                                                                                                Сообщение # 15
Группа: Проверенные
Ранг:  Разобрался
Сообщений: 676
Репутация: 36   ±
Замечания:   ±
На сайте с 12.10.2007

Статус: Offline

Приятного времени суток. Извините если что не так. Программированием занимаюсь недавно. ntro123, Проверил Вашу прогу в Proteus,e - она работает. Правда я не знаю как она должна работать!!!! При нажатии на SB1 (PortA.1 "Delo") идет счет: 00001 шт/ч: 3428, при повторном нажатии: тоже самое. При 3 нажатии: 00003 шт/ч: ХХХХ. Если можете объясните, что она должна делать!!! Может это все можно сделать проще.

З.Ы. Меня интересует эта строка:

If i!=0 Then - ?????????????? Что это? Или это просто очетятка!!!


THE TRUTH IS OUT THERE.

С уважением, Николай.

Сообщение отредактировал Matrix252005 - Ср, 30.06.2010, 16:00
Форум Picbasic.ru » Программирование МК » Proton PicBasic » Проблема при делении
Страница 1 из 212»
Поиск: