BASCOM AVR в вопросах и ответах

Обсуждаем контроллеры компании Atmel.
осторожно! леоныч!!!
Сверлит текстолит когтями
Сообщения: 1156
Зарегистрирован: Вт дек 09, 2008 20:31:56

Re: BASCOM AVR в вопросах и ответах

Сообщение осторожно! леоныч!!! »

Всем доброго времени суток :) Весь день сегодня мучался, нужно было сделать многоканальный датчик с выводом ацп на 4 строчный символьный дисплей... Про BASCOM AVR узнал только во второй половине дня... Я вообще не программист а железячник, да и к тому же не молодой :))) Третий десяток уже пошел давно :oops: Блин написал таки программку. Запустил в протеусе, все работает. Подскажите друзья как бороться с такой бедой. При запуске программы во всех строках на экране нули, но стоит значения довести до максимума "1023" а затем снова в "0" то у меня получаются не снова по одному нолю а уже по 4 :cry: Как правильно гасить эти нули? Помогите начинающему :))) :))) :)))
Реклама
ut1wpr
Вымогатель припоя
Сообщения: 581
Зарегистрирован: Ср янв 05, 2011 10:03:18

Re: BASCOM AVR в вопросах и ответах

Сообщение ut1wpr »

осторожно! леоныч!!! писал(а):Всем доброго времени суток :) Весь день сегодня мучался, нужно было сделать многоканальный датчик с выводом ацп на 4 строчный символьный дисплей... Про BASCOM AVR узнал только во второй половине дня... Я вообще не программист а железячник, да и к тому же не молодой :))) Третий десяток уже пошел давно :oops: Блин написал таки программку. Запустил в протеусе, все работает. Подскажите друзья как бороться с такой бедой. При запуске программы во всех строках на экране нули, но стоит значения довести до максимума "1023" а затем снова в "0" то у меня получаются не снова по одному нолю а уже по 4 :cry: Как правильно гасить эти нули? Помогите начинающему :))) :))) :)))
На такой вопрос мало кто ответит. Это же вопрос для ясновидящих. В подобных случаях прикладывают (не вставляют в пост) программу, или ту часть, в которой есть сомнения. Тогда знающие и имеющие время смогут оценить, проанализировать и помочь. А у вас "одни нули"... :)
PS Третий десяток, говорите, пошел? Ну совсем старик, может ну его, это программирование, поздно уже :lol:
С уважением,
Виктор.
Реклама
Аватара пользователя
edm2007
Поставщик валерьянки для Кота
Сообщения: 2255
Зарегистрирован: Вт апр 21, 2009 22:24:10
Откуда: Иркутск
Контактная информация:

Re: BASCOM AVR в вопросах и ответах

Сообщение edm2007 »

vanyap1 писал(а):При запуске программы во всех строках на экране нули, но стоит значения довести до максимума "1023" а затем снова в "0" то у меня получаются не снова по одному нолю а уже по 4


Доброго времени суток.

Все верно, старое значение просто не затирается, а остается на индикаторе. Например, значение АЦП было 1000, а затем стало равно 999. В результате на экране сначала будет 1000, а потом 9990. То бишь 0 останется от прежнего значения. И все в том же духе... Самый простой способ решить эту проблему - при выводе затереть ненужное тремя пробелами:

Код: Выделить всё

Lcd "ADC(0):" ; Temp ; "   "   
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
ut1wpr
Вымогатель припоя
Сообщения: 581
Зарегистрирован: Ср янв 05, 2011 10:03:18

Re: BASCOM AVR в вопросах и ответах

Сообщение ut1wpr »

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 Третий десяток, говорите, пошел? Ну совсем старик, может ну его, это программирование, поздно уже :lol:[/quote]

Может кому и поздно, не спорю. А мне учиться никогда не поздно. Так что не "ну его"... Буду сам разбираться...
Реклама
ut1wpr
Вымогатель припоя
Сообщения: 581
Зарегистрирован: Ср янв 05, 2011 10:03:18

Re: BASCOM AVR в вопросах и ответах

Сообщение ut1wpr »

осторожно! леоныч!!! писал(а):Может кому и поздно, не спорю. А мне учиться никогда не поздно. Так что не "ну его"... Буду сам разбираться...
Не стоит на смайлики обижаться :)
Мне седьмой десяток, но я продолжаю учиться. Правда, от Бейсика давно ушел, но почему не помочь советом, если он на поверхности? Прочитайте мой предыдущий пост со ссылкой. Там хорошо описано решение вашей проблемы.
Удачи!
С наступающим...
С уважением,
Виктор.
Реклама
Аватара пользователя
edm2007
Поставщик валерьянки для Кота
Сообщения: 2255
Зарегистрирован: Вт апр 21, 2009 22:24:10
Откуда: Иркутск
Контактная информация:

Re: BASCOM AVR в вопросах и ответах

Сообщение edm2007 »

Да, форматированый вывод позволяет запросто, но кто сказал что он требуется? Тут уж хозяин - барин. Не всем нравится, когда значение выглядит как 0032, например. А мерцаний не будет, это точно.
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
осторожно! леоныч!!!
Сверлит текстолит когтями
Сообщения: 1156
Зарегистрирован: Вт дек 09, 2008 20:31:56

Re: BASCOM AVR в вопросах и ответах

Сообщение осторожно! леоныч!!! »

edm2007 писал(а):Да, форматированый вывод позволяет запросто, но кто сказал что он требуется? Тут уж хозяин - барин. Не всем нравится, когда значение выглядит как 0032, например. А мерцаний не будет, это точно.


Спасибо :) Да я и не обижался вовсе :))) Завтра буду пробовать. На сегодня хватит :))) Моск кипит :shock: За 12 часов научится новому для меня не просто :beer:
ut1wpr
Вымогатель припоя
Сообщения: 581
Зарегистрирован: Ср янв 05, 2011 10:03:18

Re: BASCOM AVR в вопросах и ответах

Сообщение ut1wpr »

edm2007 писал(а):Да, форматированый вывод позволяет запросто, но кто сказал что он требуется? Тут уж хозяин - барин. Не всем нравится, когда значение выглядит как 0032, например. А мерцаний не будет, это точно.
Я повторяю, с Бейсиком на сегодня не работаю. Но команда Format обязана уметь не выводить незначащие нули.
Если в этом примере:

Код: Выделить всё

$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 в вопросах и ответах

Сообщение edm2007 »

C лидирующими нулями там все понятно давно, а вот чтобы просто по маске занять места "###0", увы... Обязана уметь, да, но именно так не выходит...
Последний раз редактировалось edm2007 Сб апр 14, 2012 21:18:01, всего редактировалось 1 раз.
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
ut1wpr
Вымогатель припоя
Сообщения: 581
Зарегистрирован: Ср янв 05, 2011 10:03:18

Re: BASCOM AVR в вопросах и ответах

Сообщение ut1wpr »

edm2007 писал(а):C лидирующими нулями там все понятно давно, а вот чтобы просто по маске занять места "###0", увы... Обязана уметь, да, но именно так не выходит...
Вам виднее. Вы ведь постоянно с этим диалектом Бейсика работаете. А их ну очень уж много... :) Возможно, в Баскоме Format усечен по сравнению с другими диалектами, я ж не спорю. Честно говоря, я даже ни одной программы на Баскоме не написал, ни одной строчки. Просто увидел ссылку на эту команду, вспомнилось, что она может в других диалектах. Увы попробовать в тех или иных комбинациях не могу. Обычно через неизвестно-непонятное продираюсь методом проб и ошибок, перебирая возможные комбинации. И если ничего не помогает - читаю, наконец, документацию... Как и все мы... :) :) :)
С уважением,
Виктор.
Аватара пользователя
edm2007
Поставщик валерьянки для Кота
Сообщения: 2255
Зарегистрирован: Вт апр 21, 2009 22:24:10
Откуда: Иркутск
Контактная информация:

Re: BASCOM AVR в вопросах и ответах

Сообщение edm2007 »

Ну вот и я перепробовал всякие разные комбинации. Вкупе с чтением документации. :) Да всё как-то не то... Может кто и разбирался с этой бедой...
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
ut1wpr
Вымогатель припоя
Сообщения: 581
Зарегистрирован: Ср янв 05, 2011 10:03:18

Re: BASCOM AVR в вопросах и ответах

Сообщение ut1wpr »

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 в вопросах и ответах

Сообщение edm2007 »

Да, программный вариант встречается. :) Мне во всем этом не нравится одно - перевод переменной в строку и последующие шаманизмы с ней... Вот потому я и написал:

edm2007 писал(а):Самый простой способ решить эту проблему - при выводе затереть ненужное тремя пробелами


Там даже не нужно заранее очищать место, пробелы идут просто прицепом к переменной:

Код: Выделить всё

Lcd "ADC(0):" ; Temp ; "   "   


Хотя, согласен, это конечно некрасивое решение...

P.S. У Вас сейчас выравнивание по правому краю, такой же эффект я получил при использовании маски из пробелов:

Код: Выделить всё

Loglevelstrformat = Format(loglevelstr , "    ")    


Вот пробелами как раз лидирующие нули гасятся, и все выводится верно. Но выравнивание по правому краю мне не нравится. И если в Вашем коде это решается легко, то тут уже ничего не поделаешь...
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
осторожно! леоныч!!!
Сверлит текстолит когтями
Сообщения: 1156
Зарегистрирован: Вт дек 09, 2008 20:31:56

Re: BASCOM AVR в вопросах и ответах

Сообщение осторожно! леоныч!!! »

Народ просьба сильно не пинать новичка в программировании :shock:

Делаю проект меню отсюда http://avrproject.ru/publ/menu_on_a_mic ... r/1-1-0-33

Но под атмега 32.

При компиляции пишет 117 ошибку (неизвестное прерывание)

Пожалуйста подскажите где я совсем дурак :oops: Код прилагаю.
menu32.rar
Аватара пользователя
edm2007
Поставщик валерьянки для Кота
Сообщения: 2255
Зарегистрирован: Вт апр 21, 2009 22:24:10
Откуда: Иркутск
Контактная информация:

Re: BASCOM AVR в вопросах и ответах

Сообщение edm2007 »

Это что такое? :shock:

Код: Выделить всё

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 в вопросах и ответах

Сообщение осторожно! леоныч!!! »

Это часть кода из примера, но у меня другой контроллер и пришлось попытаться переписать порты. Я пока не могу вьехать... Там прерывания с кнопок должны включаться вроде.... :roll:

Чувствую себя идиотом.... :oops: Ладно сейчас попробуем.
Последний раз редактировалось осторожно! леоныч!!! Вс апр 15, 2012 10:15:33, всего редактировалось 1 раз.
Аватара пользователя
edm2007
Поставщик валерьянки для Кота
Сообщения: 2255
Зарегистрирован: Вт апр 21, 2009 22:24:10
Откуда: Иркутск
Контактная информация:

Re: BASCOM AVR в вопросах и ответах

Сообщение edm2007 »

Ну про прерывания я выше написал подробно. Ну так и цепляйте кнопки к прерываниям. Посмотрите распиновку в даташите, на каких ногах находятся нужные прерывания, и подключайте. А потом пишите:

Код: Выделить всё

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 в вопросах и ответах

Сообщение edm2007 »

осторожно! леоныч!!! писал(а):Чувствую себя идиотом.... :oops:


Пора уже прекращать с этим. :) Можно подумать, кто-то родился сразу со знаниями...
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
ut1wpr
Вымогатель припоя
Сообщения: 581
Зарегистрирован: Ср янв 05, 2011 10:03:18

Re: BASCOM AVR в вопросах и ответах

Сообщение ut1wpr »

edm2007 писал(а):P.S. У Вас сейчас выравнивание по правому краю, такой же эффект я получил при использовании маски из пробелов...
Вот пробелами как раз лидирующие нули гасятся, и все выводится верно. Но выравнивание по правому краю мне не нравится. И если в Вашем коде это решается легко, то тут уже ничего не поделаешь...
Вот тут я и споткнулся. Выравнивание маской пробелов работает, пока нет отрицательных чисел. С появлением минуса все "уползает". Одним словом, до классического "printf" этому форматтеру далеко. Но не стоит огорчаться. Полный printf в Си тоже не так уж хорош. Возможности у него, конечно, сильнейшие, но он круто увеличивает размер кодов, поэтому приходится часто пользоваться его укороченной версией, без форматирования чисел с плавучкой. А с целыми или со строковыми он работает бесподобно.
С уважением,
Виктор.
Ответить

Вернуться в «AVR»