BASCOM AVR в вопросах и ответах
-
осторожно! леоныч!!!
- Сверлит текстолит когтями
- Сообщения: 1156
- Зарегистрирован: Вт дек 09, 2008 20:31:56
Re: BASCOM AVR в вопросах и ответах
Всем доброго времени суток
Весь день сегодня мучался, нужно было сделать многоканальный датчик с выводом ацп на 4 строчный символьный дисплей... Про BASCOM AVR узнал только во второй половине дня... Я вообще не программист а железячник, да и к тому же не молодой
Третий десяток уже пошел давно
Блин написал таки программку. Запустил в протеусе, все работает. Подскажите друзья как бороться с такой бедой. При запуске программы во всех строках на экране нули, но стоит значения довести до максимума "1023" а затем снова в "0" то у меня получаются не снова по одному нолю а уже по 4
Как правильно гасить эти нули? Помогите начинающему

- Реклама
Re: BASCOM AVR в вопросах и ответах
На такой вопрос мало кто ответит. Это же вопрос для ясновидящих. В подобных случаях прикладывают (не вставляют в пост) программу, или ту часть, в которой есть сомнения. Тогда знающие и имеющие время смогут оценить, проанализировать и помочь. А у вас "одни нули"...осторожно! леоныч!!! писал(а):Всем доброго времени сутокВесь день сегодня мучался, нужно было сделать многоканальный датчик с выводом ацп на 4 строчный символьный дисплей... Про BASCOM AVR узнал только во второй половине дня... Я вообще не программист а железячник, да и к тому же не молодой
Третий десяток уже пошел давно
Блин написал таки программку. Запустил в протеусе, все работает. Подскажите друзья как бороться с такой бедой. При запуске программы во всех строках на экране нули, но стоит значения довести до максимума "1023" а затем снова в "0" то у меня получаются не снова по одному нолю а уже по 4
Как правильно гасить эти нули? Помогите начинающему
![]()
![]()
PS Третий десяток, говорите, пошел? Ну совсем старик, может ну его, это программирование, поздно уже
С уважением,
Виктор.
Виктор.
- edm2007
- Поставщик валерьянки для Кота
- Сообщения: 2255
- Зарегистрирован: Вт апр 21, 2009 22:24:10
- Откуда: Иркутск
- Контактная информация:
Re: BASCOM AVR в вопросах и ответах
vanyap1 писал(а):При запуске программы во всех строках на экране нули, но стоит значения довести до максимума "1023" а затем снова в "0" то у меня получаются не снова по одному нолю а уже по 4
Доброго времени суток.
Все верно, старое значение просто не затирается, а остается на индикаторе. Например, значение АЦП было 1000, а затем стало равно 999. В результате на экране сначала будет 1000, а потом 9990. То бишь 0 останется от прежнего значения. И все в том же духе... Самый простой способ решить эту проблему - при выводе затереть ненужное тремя пробелами:
Код: Выделить всё
Lcd "ADC(0):" ; Temp ; " " "Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
Re: BASCOM AVR в вопросах и ответах
Более рационально было бы применить форматированный вывод. Т.е. заранее задать фиксированную длину выводимого числа. Вроде, Бейсик это позволяет.edm2007 писал(а):vanyap1 писал(а):При запуске программы во всех строках на экране нули, но стоит значения довести до максимума "1023" а затем снова в "0" то у меня получаются не снова по одному нолю а уже по 4
Доброго времени суток.
Все верно, старое значение просто не затирается, а остается на индикаторе. Например, значение АЦП было 1000, а затем стало равно 999. В результате на экране сначала будет 1000, а потом 9990. То бишь 0 останется от прежнего значения. И все в том же духе... Самый простой способ решить эту проблему - при выводе затереть ненужное тремя пробелами:Код: Выделить всё
Lcd "ADC(0):" ; Temp ; " "
Мгновенно Гуглом нашел:
http://decada.org.ru/project/lessons/bascom_avr/16/
читать с заголовка "Форматирование вывода на ЖКИ".
А в вашем предложении будет два обращения к дисплею, лишняя трата времени и лишнее мерцание во время обновления.
Последний раз редактировалось ut1wpr Сб апр 14, 2012 18:41:29, всего редактировалось 1 раз.
С уважением,
Виктор.
Виктор.
-
осторожно! леоныч!!!
- Сверлит текстолит когтями
- Сообщения: 1156
- Зарегистрирован: Вт дек 09, 2008 20:31:56
Re: BASCOM AVR в вопросах и ответах
[/quote]PS Третий десяток, говорите, пошел? Ну совсем старик, может ну его, это программирование, поздно уже
[/quote]
Может кому и поздно, не спорю. А мне учиться никогда не поздно. Так что не "ну его"... Буду сам разбираться...
Может кому и поздно, не спорю. А мне учиться никогда не поздно. Так что не "ну его"... Буду сам разбираться...
- Реклама
Re: BASCOM AVR в вопросах и ответах
Не стоит на смайлики обижатьсяосторожно! леоныч!!! писал(а):Может кому и поздно, не спорю. А мне учиться никогда не поздно. Так что не "ну его"... Буду сам разбираться...
Мне седьмой десяток, но я продолжаю учиться. Правда, от Бейсика давно ушел, но почему не помочь советом, если он на поверхности? Прочитайте мой предыдущий пост со ссылкой. Там хорошо описано решение вашей проблемы.
Удачи!
С наступающим...
С уважением,
Виктор.
Виктор.
- edm2007
- Поставщик валерьянки для Кота
- Сообщения: 2255
- Зарегистрирован: Вт апр 21, 2009 22:24:10
- Откуда: Иркутск
- Контактная информация:
Re: BASCOM AVR в вопросах и ответах
Да, форматированый вывод позволяет запросто, но кто сказал что он требуется? Тут уж хозяин - барин. Не всем нравится, когда значение выглядит как 0032, например. А мерцаний не будет, это точно.
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
-
осторожно! леоныч!!!
- Сверлит текстолит когтями
- Сообщения: 1156
- Зарегистрирован: Вт дек 09, 2008 20:31:56
Re: BASCOM AVR в вопросах и ответах
edm2007 писал(а):Да, форматированый вывод позволяет запросто, но кто сказал что он требуется? Тут уж хозяин - барин. Не всем нравится, когда значение выглядит как 0032, например. А мерцаний не будет, это точно.
Спасибо

Re: BASCOM AVR в вопросах и ответах
Я повторяю, с Бейсиком на сегодня не работаю. Но команда Format обязана уметь не выводить незначащие нули.edm2007 писал(а):Да, форматированый вывод позволяет запросто, но кто сказал что он требуется? Тут уж хозяин - барин. Не всем нравится, когда значение выглядит как 0032, например. А мерцаний не будет, это точно.
Если в этом примере:
Код: Выделить всё
$regfile = "2313def.dat"
$crystal = 4000000
$sim
Dim Loglevel As Integer
Dim Loglevelstr As String * 5
Dim Loglevelstrformat As String * 5
Cls
Loglevel = -2
Loglevelstr = Str(loglevel)
Loglevelstrformat = Format(loglevelstr , "+00")
Lcd Loglevelstrformat ; " dBm"
End
попробовать заменить шаблон формата "+00" на "+#0", вполне возможно лидирующие нули будут заменены пробелами.
Стоит также поэкспериментировать с шаблоном " ##0", тогда символ плюс будет заменен пробелом, в случае отрицательного числа должен выводится символ минуса, а ширина выводимого числа должна быть в три символа.
При желании и имении под рукой инструментария вы можете это легко проверить.
Во многом форматирование вывода перекликается с функцией printf, правда шаблонирование немного отличается. Но принцип тот же..
Повторяю, я могу и ошибаться, однако многие диалекты Бейсика именно так и выполняют команду Format.
С уважением,
Виктор.
Виктор.
- edm2007
- Поставщик валерьянки для Кота
- Сообщения: 2255
- Зарегистрирован: Вт апр 21, 2009 22:24:10
- Откуда: Иркутск
- Контактная информация:
Re: BASCOM AVR в вопросах и ответах
C лидирующими нулями там все понятно давно, а вот чтобы просто по маске занять места "###0", увы... Обязана уметь, да, но именно так не выходит...
Последний раз редактировалось edm2007 Сб апр 14, 2012 21:18:01, всего редактировалось 1 раз.
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
Re: BASCOM AVR в вопросах и ответах
Вам виднее. Вы ведь постоянно с этим диалектом Бейсика работаете. А их ну очень уж много...edm2007 писал(а):C лидирующими нулями там все понятно давно, а вот чтобы просто по маске занять места "###0", увы... Обязана уметь, да, но именно так не выходит...
С уважением,
Виктор.
Виктор.
- edm2007
- Поставщик валерьянки для Кота
- Сообщения: 2255
- Зарегистрирован: Вт апр 21, 2009 22:24:10
- Откуда: Иркутск
- Контактная информация:
Re: BASCOM AVR в вопросах и ответах
Ну вот и я перепробовал всякие разные комбинации. Вкупе с чтением документации.
Да всё как-то не то... Может кто и разбирался с этой бедой...
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
Re: BASCOM AVR в вопросах и ответах
Эк меня забрало.edm2007 писал(а):Ну вот и я перепробовал всякие разные комбинации. Вкупе с чтением документации.Да всё как-то не то... Может кто и разбирался с этой бедой...
Скачал и поставил Баском.
Действительно, в этом диалекте форматтер немного усеченный. Точного позиционирования не происходит.
Есть два варианта.
Если в памяти кодов есть достаточно места, можно решить вопрос программно:
Код: Выделить всё
$regfile = "m8def.dat"
$crystal = 8000000
$sim
Dim Nmb As Integer
Dim Ns As String * 5
Cls
Nmb = -345
Ns = Str(nmb)
Select Case Len(ns)
Case 3 : Ns = " " + Ns
Case 2 : Ns = " " + Ns
Case 1 : Ns = " " + Ns
End Select
Lcd Ns ; " dBm"
EndЭто вариант для вывода трехзначного числа. Для десятичного представления байта вполне достаточно.
На дисплее при выводе этого числа будет заполненяться 4 знакоместа. 3 под само число и одно под знак минуса либо пробел, если
число положительное. Если разрядность вывода предполагается большей, то веток case должно быть соответственно больше.
Если разрядность числа будет большая (24-32 бит), можно просто организовать цикл по вычисленной длине стринга и "довешивать" в цикле лидирующие пробелы. Для малоразрядного варианта case будет экономнее.
Зато сэкономил на исключении вызова функции FORMAT.
Ну и второй вариант. Очищаем "посадочное место" для вывода посылкой на дисплей N пробелов, и вторым заходом выводим данные. Недостатки этого варианта мы уже рассмотрели выше - увеличение времени обращения к дисплею за счет большего количества операций вывода. Ну и не будет однозначного позиционирования разрядов числа. При программном псевдоформатировании каждый разряд всегда на своем месте.
Интересно, если вы предложите более "вкусные" способы. Всегда интересно, когда другие придумывают "красиво" и эффектно/эффективно.
С уважением,
Виктор.
Виктор.
- edm2007
- Поставщик валерьянки для Кота
- Сообщения: 2255
- Зарегистрирован: Вт апр 21, 2009 22:24:10
- Откуда: Иркутск
- Контактная информация:
Re: BASCOM AVR в вопросах и ответах
Да, программный вариант встречается.
Мне во всем этом не нравится одно - перевод переменной в строку и последующие шаманизмы с ней... Вот потому я и написал:
Там даже не нужно заранее очищать место, пробелы идут просто прицепом к переменной:
Хотя, согласен, это конечно некрасивое решение...
P.S. У Вас сейчас выравнивание по правому краю, такой же эффект я получил при использовании маски из пробелов:
Вот пробелами как раз лидирующие нули гасятся, и все выводится верно. Но выравнивание по правому краю мне не нравится. И если в Вашем коде это решается легко, то тут уже ничего не поделаешь...
edm2007 писал(а):Самый простой способ решить эту проблему - при выводе затереть ненужное тремя пробелами
Там даже не нужно заранее очищать место, пробелы идут просто прицепом к переменной:
Код: Выделить всё
Lcd "ADC(0):" ; Temp ; " " Хотя, согласен, это конечно некрасивое решение...
P.S. У Вас сейчас выравнивание по правому краю, такой же эффект я получил при использовании маски из пробелов:
Код: Выделить всё
Loglevelstrformat = Format(loglevelstr , " ") Вот пробелами как раз лидирующие нули гасятся, и все выводится верно. Но выравнивание по правому краю мне не нравится. И если в Вашем коде это решается легко, то тут уже ничего не поделаешь...
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
-
осторожно! леоныч!!!
- Сверлит текстолит когтями
- Сообщения: 1156
- Зарегистрирован: Вт дек 09, 2008 20:31:56
Re: BASCOM AVR в вопросах и ответах
Народ просьба сильно не пинать новичка в программировании
Делаю проект меню отсюда http://avrproject.ru/publ/menu_on_a_mic ... r/1-1-0-33
Но под атмега 32.
При компиляции пишет 117 ошибку (неизвестное прерывание)
Пожалуйста подскажите где я совсем дурак
Код прилагаю.
Делаю проект меню отсюда http://avrproject.ru/publ/menu_on_a_mic ... r/1-1-0-33
Но под атмега 32.
При компиляции пишет 117 ошибку (неизвестное прерывание)
Пожалуйста подскажите где я совсем дурак
- edm2007
- Поставщик валерьянки для Кота
- Сообщения: 2255
- Зарегистрирован: Вт апр 21, 2009 22:24:10
- Откуда: Иркутск
- Контактная информация:
Re: BASCOM AVR в вопросах и ответах
Это что такое?
Команда On объявляет используемое прерывание. Грубо говоря, "обзывает" его. Именно на эту метку и прыгнет программа, при обработке прерывания.
NOSAVE пока не трогаем. Допустим, если необходимо объявить внешнее прерывание к которому подключена кнопка, то пишем:
Теперь при срабатывании прерывания Int0, программа перейдет на метку Up (обработчик по этой метке должен быть написан, разумеется. и условие генерации прерывания тоже должно быть настроено заранее, само собой).
Команда Enable разрешает какое-либо прерывание. Когда Вы набираете команду Enable, Bascom сам предлагает выпадающий список из доступных прерываний для этого МК. И если мы объявили прерывание Int0, то его нужно разрешить:
Таким образом, для работы прерывания необходимо оное сконфигурировать (для Int0, например, условия срабатывания - по фронту, по спаду, по любому изменению состояния), объявить (ON), разрешить (Enable), ну и написать сам обработчик (Up ... Return).
А у Вас конечно ругаться будет, что это еще за прерывание Porta4. Откуда Вы вообще это взяли?
P.S. К слову, если Вы хотите делать обработку кнопок как в статье на внешних прерываниях, то к меге 32 сможете подключить лишь три кнопки. Потому как у нее всего три внешних прерывания (Int0, Int1 и Int2).
Код: Выделить всё
On Porta 0 Up 'кнопка "UP"
On Porta 1 Down 'кнопка "DOWN"
On Porta 2 Ok 'кнопка "OK"
On Porta 3 Esc 'кнопка "ESC"
Enable Interrupts
Enable Porta4
Enable Porta5
Enable Porta6
Enable Porta7
Команда On объявляет используемое прерывание. Грубо говоря, "обзывает" его. Именно на эту метку и прыгнет программа, при обработке прерывания.
Синтаксис:
ON прерывание метка [NOSAVE]
NOSAVE пока не трогаем. Допустим, если необходимо объявить внешнее прерывание к которому подключена кнопка, то пишем:
Код: Выделить всё
On Int0 Up
Теперь при срабатывании прерывания Int0, программа перейдет на метку Up (обработчик по этой метке должен быть написан, разумеется. и условие генерации прерывания тоже должно быть настроено заранее, само собой).
Команда Enable разрешает какое-либо прерывание. Когда Вы набираете команду Enable, Bascom сам предлагает выпадающий список из доступных прерываний для этого МК. И если мы объявили прерывание Int0, то его нужно разрешить:
Код: Выделить всё
Enable Interrupts ' разрешаем прерывания
Enable Int0 ' и Int0 в частности
Таким образом, для работы прерывания необходимо оное сконфигурировать (для Int0, например, условия срабатывания - по фронту, по спаду, по любому изменению состояния), объявить (ON), разрешить (Enable), ну и написать сам обработчик (Up ... Return).
А у Вас конечно ругаться будет, что это еще за прерывание Porta4. Откуда Вы вообще это взяли?
P.S. К слову, если Вы хотите делать обработку кнопок как в статье на внешних прерываниях, то к меге 32 сможете подключить лишь три кнопки. Потому как у нее всего три внешних прерывания (Int0, Int1 и Int2).
Последний раз редактировалось edm2007 Вс апр 15, 2012 10:08:22, всего редактировалось 1 раз.
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
-
осторожно! леоныч!!!
- Сверлит текстолит когтями
- Сообщения: 1156
- Зарегистрирован: Вт дек 09, 2008 20:31:56
Re: BASCOM AVR в вопросах и ответах
Это часть кода из примера, но у меня другой контроллер и пришлось попытаться переписать порты. Я пока не могу вьехать... Там прерывания с кнопок должны включаться вроде.... 
Чувствую себя идиотом....
Ладно сейчас попробуем.
Чувствую себя идиотом....
Последний раз редактировалось осторожно! леоныч!!! Вс апр 15, 2012 10:15:33, всего редактировалось 1 раз.
- edm2007
- Поставщик валерьянки для Кота
- Сообщения: 2255
- Зарегистрирован: Вт апр 21, 2009 22:24:10
- Откуда: Иркутск
- Контактная информация:
Re: BASCOM AVR в вопросах и ответах
Ну про прерывания я выше написал подробно. Ну так и цепляйте кнопки к прерываниям. Посмотрите распиновку в даташите, на каких ногах находятся нужные прерывания, и подключайте. А потом пишите:
И так далее... При чем тут вообще порт А... Дело в том что внешние прерывания наглухо приколочены к определенным ногам. И их нельзя переназначить на другие выводы. Если, например, Int0 на 16 ноге, то только туда и нужно подключаться...
Код: Выделить всё
On Int0 Up 'кнопка "UP"
On Int1 Down 'кнопка "DOWN"
On Int2 Ok 'кнопка "OK"
Enable Interrupts
Enable Int0
Enable Int1
Enable Int2
И так далее... При чем тут вообще порт А... Дело в том что внешние прерывания наглухо приколочены к определенным ногам. И их нельзя переназначить на другие выводы. Если, например, Int0 на 16 ноге, то только туда и нужно подключаться...
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
- edm2007
- Поставщик валерьянки для Кота
- Сообщения: 2255
- Зарегистрирован: Вт апр 21, 2009 22:24:10
- Откуда: Иркутск
- Контактная информация:
Re: BASCOM AVR в вопросах и ответах
осторожно! леоныч!!! писал(а):Чувствую себя идиотом....![]()
Пора уже прекращать с этим.
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
Re: BASCOM AVR в вопросах и ответах
Вот тут я и споткнулся. Выравнивание маской пробелов работает, пока нет отрицательных чисел. С появлением минуса все "уползает". Одним словом, до классического "printf" этому форматтеру далеко. Но не стоит огорчаться. Полный printf в Си тоже не так уж хорош. Возможности у него, конечно, сильнейшие, но он круто увеличивает размер кодов, поэтому приходится часто пользоваться его укороченной версией, без форматирования чисел с плавучкой. А с целыми или со строковыми он работает бесподобно.edm2007 писал(а):P.S. У Вас сейчас выравнивание по правому краю, такой же эффект я получил при использовании маски из пробелов...
Вот пробелами как раз лидирующие нули гасятся, и все выводится верно. Но выравнивание по правому краю мне не нравится. И если в Вашем коде это решается легко, то тут уже ничего не поделаешь...
С уважением,
Виктор.
Виктор.


