Проблема при делении
|
|
ntro123 |
Дата: Пн, 28.06.2010, 21:53 | Сообщение # 1 |
Группа:
Пользователи
Ранг:
Пытаюсь разобраться
Сообщений:
45
Замечания:
±
На сайте с 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) --------------------------------------------- Главное умножение пашет и + и -. А как тока деление так сразу орет ...
|
|
|
|
Dmitry |
Дата: Пн, 28.06.2010, 23:15 | Сообщение # 2 |
Группа:
Пользователи
Ранг:
Могу и подсказать
Сообщений:
157
Замечания:
±
На сайте с 12.05.2009
Статус:
Offline
|
Мож глюк какой в компиляторе - мне как-то тоже раз не давал одну и ту же переменную по обе стороны от равно ставить. Попробуйте через промежуточную переменную dim tempfl as float ... tempfl = constanta constanta = 1 / tempfl
|
|
|
|
ntro123 |
Дата: Вт, 29.06.2010, 10:12 | Сообщение # 3 |
Группа:
Пользователи
Ранг:
Пытаюсь разобраться
Сообщений:
45
Замечания:
±
На сайте с 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 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
448
Замечания:
±
На сайте с 11.12.2007
Статус:
Offline
|
Quote (ntro123) Да уже как только не пытался ((( вот без переменной все проходит. т.е. constanta = 1 / 2 Похоже программа не влазит в пик. Я поробовал поставить другой пик 16F628А с большей памятью (он и стоит дешевле) и все ОК.
Попробуй всё и вся... может быть пол...
|
|
|
|
ntro123 |
Дата: Вт, 29.06.2010, 11:04 | Сообщение # 5 |
Группа:
Пользователи
Ранг:
Пытаюсь разобраться
Сообщений:
45
Замечания:
±
На сайте с 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 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
448
Замечания:
±
На сайте с 11.12.2007
Статус:
Offline
|
Quote (ntro123) 16F628А не пашет. все равно ошибку выдает. У меня нормально, без ошыбок.
Попробуй всё и вся... может быть пол...
|
|
|
|
ntro123 |
Дата: Вт, 29.06.2010, 11:17 | Сообщение # 7 |
Группа:
Пользователи
Ранг:
Пытаюсь разобраться
Сообщений:
45
Замечания:
±
На сайте с 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 |
Группа:
Пользователи
Ранг:
Помогаю всем
Сообщений:
451
Замечания:
±
На сайте с 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 |
Группа:
Пользователи
Ранг:
Пытаюсь разобраться
Сообщений:
45
Замечания:
±
На сайте с 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 |
Администратор
Группа:
Администраторы
Ранг:
Специалист
Сообщений:
1086
Замечания:
±
На сайте с 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 |
Группа:
Пользователи
Ранг:
Помогаю всем
Сообщений:
451
Замечания:
±
На сайте с 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 уже неоднократно облуждались и в этих ветках форума все описано и разжёвано. Поэтому просьба к новичкам - прежде чем задавать любые вопросы очень прошу Вас внимательно просматривайте хотя бы названия тем форума. Уверяю Вас, почти всё уже спрашивалось и на эти вопросы уже есть ответы.
Если у в Вас что-то не получается, подумай, не стоит ли прочитать инструкцию...!
Сообщение отредактировал
terrarus - Ср, 30.06.2010, 10:59
|
|
|
|
ntro123 |
Дата: Ср, 30.06.2010, 10:56 | Сообщение # 12 |
Группа:
Пользователи
Ранг:
Пытаюсь разобраться
Сообщений:
45
Замечания:
±
На сайте с 28.06.2010
Статус:
Offline
|
ADMIN, спасибо большое. все сделал как ты сказал все запахало и русский текст тоже и протеус не ноет.
токлько вот я так и не полнел нашет команды
BUTTON PORTA.1, 0, 100, 100, WorkVar, 1, Delo BUTTON PORTA.0, 0, 100, 100, WorkVar, 1, resetall
вроде подключены порты правельно (см. рис.) но при нажатии реакция 0. т.е. я тупо незнаю как называется порт который нужно слушать на событие клика.
Сообщение отредактировал
ntro123 - Ср, 30.06.2010, 10:58
|
|
|
|
terrarus |
Дата: Ср, 30.06.2010, 11:11 | Сообщение # 13 |
Группа:
Пользователи
Ранг:
Помогаю всем
Сообщений:
451
Замечания:
±
На сайте с 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 |
Группа:
Пользователи
Ранг:
Пытаюсь разобраться
Сообщений:
45
Замечания:
±
На сайте с 28.06.2010
Статус:
Offline
|
terrarus, может я конешно дурак, но нечео не помогает. но вот проект и исходник если Вам не сложно попробуйте ... ПС. а вот порт С пашет.
Сообщение отредактировал
ntro123 - Ср, 30.06.2010, 14:56
|
|
|
|
Matrix252005 |
Дата: Ср, 30.06.2010, 15:58 | Сообщение # 15 |
Группа:
Проверенные
Ранг:
Разобрался
Сообщений:
636
Замечания:
±
На сайте с 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
|
|
|
|