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

- Реклама
- Сообщения: 581
- Зарегистрирован: Ср янв 05, 2011 10:03:18
На такой вопрос мало кто ответит. Это же вопрос для ясновидящих. В подобных случаях прикладывают (не вставляют в пост) программу, или ту часть, в которой есть сомнения. Тогда знающие и имеющие время смогут оценить, проанализировать и помочь. А у вас "одни нули"...осторожно! леоныч!!! писал(а):Всем доброго времени сутокВесь день сегодня мучался, нужно было сделать многоканальный датчик с выводом ацп на 4 строчный символьный дисплей... Про BASCOM AVR узнал только во второй половине дня... Я вообще не программист а железячник, да и к тому же не молодой
Третий десяток уже пошел давно
Блин написал таки программку. Запустил в протеусе, все работает. Подскажите друзья как бороться с такой бедой. При запуске программы во всех строках на экране нули, но стоит значения довести до максимума "1023" а затем снова в "0" то у меня получаются не снова по одному нолю а уже по 4
Как правильно гасить эти нули? Помогите начинающему
![]()
![]()
PS Третий десяток, говорите, пошел? Ну совсем старик, может ну его, это программирование, поздно уже
С уважением,
Виктор.
Виктор.
Доброго времени суток.vanyap1 писал(а):При запуске программы во всех строках на экране нули, но стоит значения довести до максимума "1023" а затем снова в "0" то у меня получаются не снова по одному нолю а уже по 4
Все верно, старое значение просто не затирается, а остается на индикаторе. Например, значение АЦП было 1000, а затем стало равно 999. В результате на экране сначала будет 1000, а потом 9990. То бишь 0 останется от прежнего значения. И все в том же духе... Самый простой способ решить эту проблему - при выводе затереть ненужное тремя пробелами:
Код: Выделить всё
Lcd "ADC(0):" ; Temp ; " " "Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
- Сообщения: 581
- Зарегистрирован: Ср янв 05, 2011 10:03:18
Более рационально было бы применить форматированный вывод. Т.е. заранее задать фиксированную длину выводимого числа. Вроде, Бейсик это позволяет.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
[/quote]PS Третий десяток, говорите, пошел? Ну совсем старик, может ну его, это программирование, поздно уже
[/quote]
Может кому и поздно, не спорю. А мне учиться никогда не поздно. Так что не "ну его"... Буду сам разбираться...
Может кому и поздно, не спорю. А мне учиться никогда не поздно. Так что не "ну его"... Буду сам разбираться...
- Реклама
- Сообщения: 581
- Зарегистрирован: Ср янв 05, 2011 10:03:18
Не стоит на смайлики обижатьсяосторожно! леоныч!!! писал(а):Может кому и поздно, не спорю. А мне учиться никогда не поздно. Так что не "ну его"... Буду сам разбираться...
Мне седьмой десяток, но я продолжаю учиться. Правда, от Бейсика давно ушел, но почему не помочь советом, если он на поверхности? Прочитайте мой предыдущий пост со ссылкой. Там хорошо описано решение вашей проблемы.
Удачи!
С наступающим...
С уважением,
Виктор.
Виктор.
Да, форматированый вывод позволяет запросто, но кто сказал что он требуется? Тут уж хозяин - барин. Не всем нравится, когда значение выглядит как 0032, например. А мерцаний не будет, это точно.
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
- Сообщения: 1156
- Зарегистрирован: Вт дек 09, 2008 20:31:56
Спасибоedm2007 писал(а):Да, форматированый вывод позволяет запросто, но кто сказал что он требуется? Тут уж хозяин - барин. Не всем нравится, когда значение выглядит как 0032, например. А мерцаний не будет, это точно.
- Сообщения: 581
- Зарегистрирован: Ср янв 05, 2011 10:03:18
Я повторяю, с Бейсиком на сегодня не работаю. Но команда 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
Стоит также поэкспериментировать с шаблоном " ##0", тогда символ плюс будет заменен пробелом, в случае отрицательного числа должен выводится символ минуса, а ширина выводимого числа должна быть в три символа.
При желании и имении под рукой инструментария вы можете это легко проверить.
Во многом форматирование вывода перекликается с функцией printf, правда шаблонирование немного отличается. Но принцип тот же..
Повторяю, я могу и ошибаться, однако многие диалекты Бейсика именно так и выполняют команду Format.
С уважением,
Виктор.
Виктор.
C лидирующими нулями там все понятно давно, а вот чтобы просто по маске занять места "###0", увы... Обязана уметь, да, но именно так не выходит...
Последний раз редактировалось edm2007 Сб апр 14, 2012 21:18:01, всего редактировалось 1 раз.
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
- Сообщения: 581
- Зарегистрирован: Ср янв 05, 2011 10:03:18
Вам виднее. Вы ведь постоянно с этим диалектом Бейсика работаете. А их ну очень уж много...edm2007 писал(а):C лидирующими нулями там все понятно давно, а вот чтобы просто по маске занять места "###0", увы... Обязана уметь, да, но именно так не выходит...
С уважением,
Виктор.
Виктор.
Ну вот и я перепробовал всякие разные комбинации. Вкупе с чтением документации.
Да всё как-то не то... Может кто и разбирался с этой бедой...
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
- Сообщения: 581
- Зарегистрирован: Ср янв 05, 2011 10:03:18
Эк меня забрало.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 пробелов, и вторым заходом выводим данные. Недостатки этого варианта мы уже рассмотрели выше - увеличение времени обращения к дисплею за счет большего количества операций вывода. Ну и не будет однозначного позиционирования разрядов числа. При программном псевдоформатировании каждый разряд всегда на своем месте.
Интересно, если вы предложите более "вкусные" способы. Всегда интересно, когда другие придумывают "красиво" и эффектно/эффективно.
С уважением,
Виктор.
Виктор.
Да, программный вариант встречается.
Мне во всем этом не нравится одно - перевод переменной в строку и последующие шаманизмы с ней... Вот потому я и написал:
Хотя, согласен, это конечно некрасивое решение...
P.S. У Вас сейчас выравнивание по правому краю, такой же эффект я получил при использовании маски из пробелов:
Вот пробелами как раз лидирующие нули гасятся, и все выводится верно. Но выравнивание по правому краю мне не нравится. И если в Вашем коде это решается легко, то тут уже ничего не поделаешь...
Там даже не нужно заранее очищать место, пробелы идут просто прицепом к переменной:edm2007 писал(а):Самый простой способ решить эту проблему - при выводе затереть ненужное тремя пробелами
Код: Выделить всё
Lcd "ADC(0):" ; Temp ; " " P.S. У Вас сейчас выравнивание по правому краю, такой же эффект я получил при использовании маски из пробелов:
Код: Выделить всё
Loglevelstrformat = Format(loglevelstr , " ") "Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
- Сообщения: 1156
- Зарегистрирован: Вт дек 09, 2008 20:31:56
Народ просьба сильно не пинать новичка в программировании
Делаю проект меню отсюда 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 ошибку (неизвестное прерывание)
Пожалуйста подскажите где я совсем дурак
Это что такое?
Команда On объявляет используемое прерывание. Грубо говоря, "обзывает" его. Именно на эту метку и прыгнет программа, при обработке прерывания.
Теперь при срабатывании прерывания 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
NOSAVE пока не трогаем. Допустим, если необходимо объявить внешнее прерывание к которому подключена кнопка, то пишем:Синтаксис:
ON прерывание метка [NOSAVE]
Код: Выделить всё
On Int0 Up
Команда Enable разрешает какое-либо прерывание. Когда Вы набираете команду Enable, Bascom сам предлагает выпадающий список из доступных прерываний для этого МК. И если мы объявили прерывание Int0, то его нужно разрешить:
Код: Выделить всё
Enable Interrupts ' разрешаем прерывания
Enable Int0 ' и Int0 в частности
А у Вас конечно ругаться будет, что это еще за прерывание Porta4. Откуда Вы вообще это взяли?
P.S. К слову, если Вы хотите делать обработку кнопок как в статье на внешних прерываниях, то к меге 32 сможете подключить лишь три кнопки. Потому как у нее всего три внешних прерывания (Int0, Int1 и Int2).
Последний раз редактировалось edm2007 Вс апр 15, 2012 10:08:22, всего редактировалось 1 раз.
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
- Сообщения: 1156
- Зарегистрирован: Вт дек 09, 2008 20:31:56
Это часть кода из примера, но у меня другой контроллер и пришлось попытаться переписать порты. Я пока не могу вьехать... Там прерывания с кнопок должны включаться вроде.... 
Чувствую себя идиотом....
Ладно сейчас попробуем.
Чувствую себя идиотом....
Последний раз редактировалось осторожно! леоныч!!! Вс апр 15, 2012 10:15:33, всего редактировалось 1 раз.
Ну про прерывания я выше написал подробно. Ну так и цепляйте кнопки к прерываниям. Посмотрите распиновку в даташите, на каких ногах находятся нужные прерывания, и подключайте. А потом пишите:
И так далее... При чем тут вообще порт А... Дело в том что внешние прерывания наглухо приколочены к определенным ногам. И их нельзя переназначить на другие выводы. Если, например, Int0 на 16 ноге, то только туда и нужно подключаться...
Код: Выделить всё
On Int0 Up 'кнопка "UP"
On Int1 Down 'кнопка "DOWN"
On Int2 Ok 'кнопка "OK"
Enable Interrupts
Enable Int0
Enable Int1
Enable Int2
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
Пора уже прекращать с этим.осторожно! леоныч!!! писал(а):Чувствую себя идиотом....![]()
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
- Сообщения: 581
- Зарегистрирован: Ср янв 05, 2011 10:03:18
Вот тут я и споткнулся. Выравнивание маской пробелов работает, пока нет отрицательных чисел. С появлением минуса все "уползает". Одним словом, до классического "printf" этому форматтеру далеко. Но не стоит огорчаться. Полный printf в Си тоже не так уж хорош. Возможности у него, конечно, сильнейшие, но он круто увеличивает размер кодов, поэтому приходится часто пользоваться его укороченной версией, без форматирования чисел с плавучкой. А с целыми или со строковыми он работает бесподобно.edm2007 писал(а):P.S. У Вас сейчас выравнивание по правому краю, такой же эффект я получил при использовании маски из пробелов...
Вот пробелами как раз лидирующие нули гасятся, и все выводится верно. Но выравнивание по правому краю мне не нравится. И если в Вашем коде это решается легко, то тут уже ничего не поделаешь...
С уважением,
Виктор.
Виктор.


