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

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

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

Сообщение edm2007 »

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

Config Single = Scientific , Digits = 2   


Digits - количество цифр после запятой. Может иметь значение от 1 до 7.

P.S. Вообще любыми путями старайтесь избегать работы с типом Single, он съедает безумно много места. Есть масса вариантов, при помощи которых можно решить задачу и без использования этого типа. Тем более касаемо вывода на LCD. Это не дело, что "программа" с инкрементом двух переменных и выводом на LCD забивает 2313 под завязку.
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
Реклама
Аватара пользователя
amv2000
Опытный кот
Сообщения: 717
Зарегистрирован: Вт апр 26, 2011 13:58:36
Откуда: Ростовская область

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

Сообщение amv2000 »

vanyap1 писал(а):Опрашивать клавиатуру я умею. Кажись уже писал это.
Меня интересует конкретно - сложение нескольких последовательных результатов опроса нажатых кнопок в число.

Я имел ввиду эту ссылку http://forum.avr.ru/bascom-avr-kak-beat ... 796p2.html
Реклама
scrappy
Встал на лапы
Сообщения: 139
Зарегистрирован: Сб май 23, 2009 16:30:23
Откуда: Санкт-Петербург
Контактная информация:

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

Сообщение scrappy »

edm2007 писал(а):Digits - количество цифр после запятой. Может иметь значение от 1 до 7.


Ага спасибо! так работает.

По поводу сингла. Это я просто так проверить, как он считает. Никакого практического применения эта программа не несет.

А почему так происходит с полным синглом?


и еще вопрос.

Я только начал осваивать bascom, т.к. basic знаю достаточно хорошо.
Если, что можно задавать некоторые глупые вопросы?
Аватара пользователя
edm2007
Поставщик валерьянки для Кота
Сообщения: 2255
Зарегистрирован: Вт апр 21, 2009 22:24:10
Откуда: Иркутск
Контактная информация:

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

Сообщение edm2007 »

Ну вроде как форум для вопросов & ответов и нужен. :)

P.S. Только пожалуйста, никогда и нигде больше не говорите, что эти вопросы - глупые, и что Вы новичок, и только начали разбираться. Вопрос сам по себе способен рассказать о Вашем уровне знаний, и в пояснениях не нуждается. А глупым он не может быть хотя бы потому, что Вы пытаетесь разобраться в этой теме. Что уже само по себе достойно уважения. Нет в этом мире ни одного человека, который бы родился сразу со знаниями. :wink:
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
amv2000
Опытный кот
Сообщения: 717
Зарегистрирован: Вт апр 26, 2011 13:58:36
Откуда: Ростовская область

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

Сообщение amv2000 »

edm2007 писал(а):Ну вроде как форум для вопросов & ответов и нужен. :)

Пользуясь случаем задам и я ряд вопросов:
Вернулся к вопросу совместного вывода информации на LED и ЖК индикатор. На LED индикаторы выводится, но стоит включить в основной цикл подпрограмму вывода на ЖК и все виснет со страшной силой, неужели вывод на LED столь ресурсоемкий ?
По отдельности работает, либо вывод на ЖК, либо вывод на LED.

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

'*******************************************************************************
'                             [Основной цикл]
'*******************************************************************************
Do

Call Adc_opros
'Call Displ

Loop

Второе смущает вопрос линейности АЦП при выводе на LED, на входе АЦП 1.409 на экран выводится 14.43 (должно 14.09 как я полагаю), неужели что то при переводе АЦП в цифры?
дабы не засорять? весь код не привожу ибо всё есть в архиве?
Старался комментировать как можно понятнее.
Вложения
74HC595.zip
(91.32 КБ) 160 скачиваний
Реклама
Аватара пользователя
edm2007
Поставщик валерьянки для Кота
Сообщения: 2255
Зарегистрирован: Вт апр 21, 2009 22:24:10
Откуда: Иркутск
Контактная информация:

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

Сообщение edm2007 »

Наверчено непонятного конечно, куча. Из одной индикации столько лишних прыжков... Ну и не компилируется. Ругается, что имена переменных совпадают с метками из библиотеки. А так оно и есть... Разнос по разрядам вообще удивителен. :) Любое число можно разнести в цикле всего двумя командами, без всяких промежуточных вычислений:

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

Dim Value As Word                      ' переменная для разноса
Dim I(4) As Word                        ' разряды
Dim Temp As Byte                       ' вспомогательная переменная

Value = 1234

..........................................

For Temp = 4 To 1 Step -1            ' в цикле разбиваем переменную по разрядам

I(temp) = Value Mod 10
Value = Value / 10

Next


Тут остается только разрядность задавать. И не забывать, что тип массива должен соответствовать типу переменной. А еще лучше создать переменную дя копии значения, и работать уже с ней. Так разнос еще на одну операцию увеличится, но зато массив не нужно будет избыточным по типу делать. Да и само значение будет целым, а иначе при выходе оно будет равно нулю, о чем можно забыть, и долго искать ошибку.
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
Реклама
Аватара пользователя
amv2000
Опытный кот
Сообщения: 717
Зарегистрирован: Вт апр 26, 2011 13:58:36
Откуда: Ростовская область

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

Сообщение amv2000 »

edm2007 писал(а):Ну и не компилируется. Ругается, что имена переменных совпадают с метками из библиотеки. А так оно и есть...

Ну да как и говорил люблю имена переменных одинаковые :))) Т.е вся это абракадабра таится где то в закоулках моего (извините за выражение КОДА)
У меня кстати всё компилируется в версии 1.11.9.8, ну это так отступление.
Аватара пользователя
amv2000
Опытный кот
Сообщения: 717
Зарегистрирован: Вт апр 26, 2011 13:58:36
Откуда: Ростовская область

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

Сообщение amv2000 »

edm2007 писал(а):Из одной индикации столько лишних прыжков...

Вы за этот кусок ?

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

'************************ [прерывание таймера Т0] ******************************
Refresh:
'=============== Разряды ===================
 Incr Count : If Count > 4 Then Count = 1                   ' увеличиваем значение счетчика на 4 разряда
   Ledout = Lookup(count , Razr)                            ' забираем номер разряда
  'Gosub Mig_razr                                            ' подпрограмма мигания разряда
  Gosub Registr

'========== Второй индикатор ===============
 Ledout = Lookup(number(count + 4) , Digits)                ' забираем код цифры для ВТОРОГО индикатора
  Gosub Tochka2 : Gosub Registr                             'зажигаем точку, закидываем в регистр

'========== Первый индикатор ===============
 Ledout = Lookup(number(count) , Digits)                    ' забираем код цифры для ПЕРВОГО индикатора
  Gosub Tochka1 : Gosub Registr                             'зажигаем точку, закидываем в регистр

 Pulseout Portc , 2 , 20                                    ' защелкиваем данные (для 4МГц импульс 5мкс)

Return


'<---------- подпрограмма отправки данных в регистр
Registr:

  Shiftout 595data , 595clock , Ledout , 1                  'задвигаем данные
Return
'<---------- управление точками ПЕРВОГО индикатора
Tochka1:

 If H_flag1(count) = 1 Then                                 ' если установлен флаг
   Ledout = Ledout Xor &B10000000                           ' зажигаем точку
  End If
Return
'<---------- управление точками ВТОРОГО индикатора
Tochka2:

 If H_flag2(count) = 1 Then                                 ' если установлен флаг
   Ledout = Ledout Xor &B10000000                           ' зажигаем точку
  End If
Return

'<---------- Мигаем разрядами
Mig_razr:

Incr Blink_count : If Blink_count > 400 Then Blink_count = 1       ' длительность мигания

 If Blink_flag(count) = 1 And Blink_count > 200 Then        ' если флаг мигания выставлен и счетчик > 200
  Ledout = Lookup(0 , Razr)                                 ' выключаем разряд
 Else                                                       ' иначе (флаг не выставлен, либо счетчик < 200)
  Ledout = Lookup(count , Razr)                             ' забираем в переменную номер разряда
 End If
Return

Если за него, то как не странно таким образом код стал немного меньше, принимал во внимание совет
- похожие программы оформлять в подпрограммы. Различия формировать ветвлением и дроблением участков;
Аватара пользователя
edm2007
Поставщик валерьянки для Кота
Сообщения: 2255
Зарегистрирован: Вт апр 21, 2009 22:24:10
Откуда: Иркутск
Контактная информация:

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

Сообщение edm2007 »

Да это понятно, но например откуда еще у Вас вызываются Tochka1 и Tochka2? Я еще бы понял, если бы это был вызов для обеих индикаторов (как с Registr).
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
Аватара пользователя
amv2000
Опытный кот
Сообщения: 717
Зарегистрирован: Вт апр 26, 2011 13:58:36
Откуда: Ростовская область

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

Сообщение amv2000 »

Ну да с точками согласен, (вызывается командой Gosub Tochka2, Gosub Tochka1) пока не придумал как в одной подпрограмме опрашивать, поэтому оставил пока так... Это сильно тормозит выполнение кода, или просто вносит не понятки и сумятицу (читаемость кода)?
В принципе можно включить в общий код прерывания Refresh:
Аватара пользователя
edm2007
Поставщик валерьянки для Кота
Сообщения: 2255
Зарегистрирован: Вт апр 21, 2009 22:24:10
Откуда: Иркутск
Контактная информация:

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

Сообщение edm2007 »

Дело тут даже не в торможении, просто Bascom по своей милой привычке и так все регистры сохраняет в стек без разбора, а тут еще вызовы CALL, где адрес возврата тоже в стеке сохраняется... Да еще библиотека дисплея... Это та же история повторяется, что и с термометром в этой теме. Там по всей видимости стек переполняло и вылазили разные нехорошие вещи. Собственно, тут Proteus и пишет в логах, о выходе за пределы памяти.
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
Аватара пользователя
amv2000
Опытный кот
Сообщения: 717
Зарегистрирован: Вт апр 26, 2011 13:58:36
Откуда: Ростовская область

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

Сообщение amv2000 »

edm2007 писал(а):Дело тут даже не в торможении, просто Bascom по своей милой привычке и так все регистры сохраняет в стек без разбора

А если применить директиву NOSAVE (Запретить автоматическое сохранение регистров в прерывании) ?

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

On Ovf0 Refresh NOSAVE

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

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

Сообщение edm2007 »

Если Вы укажете NOSAVE, то он сам вообще ничего сохранять не будет. Представьте, выполняется любая процедура LCD индикатора, и тут вызывается прерывание, в котором РОН всяко-разно крутятся и изменяются, а потом мы возвращаемся к выполнению прерванной процедуры. С непонятно какими значениями в регистрах...
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
Аватара пользователя
amv2000
Опытный кот
Сообщения: 717
Зарегистрирован: Вт апр 26, 2011 13:58:36
Откуда: Ростовская область

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

Сообщение amv2000 »

Да я примерно понял про директиву, не понятно как в ручную сохранять? Только вставкой на ассемблере или есть свои команды...... или выигрыша нет и не стоит заморачиваться?
Deeelta
Родился
Сообщения: 6
Зарегистрирован: Вс май 15, 2011 17:38:59

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

Сообщение Deeelta »

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

$regfile = "ATtiny13A.DAT"
Dim U As Integer
Do
Loop
End


Выдает Out of SRAM space.

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

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

Сообщение edm2007 »

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

$regfile = "ATtiny13A.DAT"

$hwstack = 32
$swstack = 8
$framesize = 16

Dim U As Integer

Do
Loop
End
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
Deeelta
Родился
Сообщения: 6
Зарегистрирован: Вс май 15, 2011 17:38:59

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

Сообщение Deeelta »

Семен Семеныч! Спасибо! Конец дня лишает мозга
Аватара пользователя
amv2000
Опытный кот
Сообщения: 717
Зарегистрирован: Вт апр 26, 2011 13:58:36
Откуда: Ростовская область

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

Сообщение amv2000 »

А правильно ли будет включить разбивку разрядов в подпрограмму прерывания?

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

'************************ [прерывание таймера Т0] ******************************
Refresh:
'=============== Разряды ===================
 Incr Count : If Count > 4 Then Count = 1                   ' увеличиваем значение счетчика на 4 разряда
   Ledout = Lookup(count , Razr)                            ' забираем номер разряда
  'Gosub Mig_razr                                            ' подпрограмма мигания разряда

  Gosub Registr
'========== Второй индикатор ===============

Call Uimetr
Value = I * 3                                               ' переменная для разноса
 For Temp = 8 To 4 Step -1                                  ' в цикле разбиваем переменную по разрядам
Number(temp) = Value Mod 10
Value = Value / 10
Next

 Ledout = Lookup(number(count + 4) , Digits)                ' забираем код цифры для ВТОРОГО индикатора
  Gosub Tochka2 : Gosub Registr                             'зажигаем точку, закидываем в регистр

'========== Первый индикатор ===============

 Call Uimetr
Value = V * 3                                               ' переменная для разноса
 For Temp = 4 To 1 Step -1                                  ' в цикле разбиваем переменную по разрядам
Number(temp) = Value Mod 10
Value = Value / 10
Next

 Ledout = Lookup(number(count) , Digits)                    ' забираем код цифры для ПЕРВОГО индикатора
  Gosub Tochka1 : Gosub Registr                             'зажигаем точку, закидываем в регистр

 Pulseout Portc , 2 , 20                                    ' защелкиваем данные (для 4МГц импульс 5мкс)

Return


'<---------- подпрограмма отправки данных в регистр
Registr:

  Shiftout 595data , 595clock , Ledout , 1                  'задвигаем данные
Return
'<---------- управление точками ПЕРВОГО индикатора
Tochka1:

 If H_flag1(count) = 1 Then                                 ' если установлен флаг
   Ledout = Ledout Xor &B10000000                           ' зажигаем точку
  End If
Return
'<---------- управление точками ВТОРОГО индикатора
Tochka2:

 If H_flag2(count) = 1 Then                                 ' если установлен флаг
   Ledout = Ledout Xor &B10000000                           ' зажигаем точку
  End If
Return

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

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

Сообщение edm2007 »

amv2000 писал(а):Вроде советуют в обработке прерываний ставить только флаги и не каких вычислений.


Ну вообще правильно советуют. Не так категорично, конечно. Просто любое прерывание, как не сложно догадаться, прерывает выполнение программы. И очень нежелательно, чтобы это длилось долго. Например на Си я в прерывание индикации вообще прихожу не просто с разбитой по разрядам переменной, а с уже готовыми для индикатора цифрами. Остается только загнать значение в порт и зажечь его.

Но тут опять же от самой реализации кода тоже все зависит. Например, у меня есть конструкции, в которых вся работа выполняется именно в прерывании, а основной цикл вообще пустой.

У Вас же получается, что все друг другу мешают. :)

P.S. А вообще такая индикация выполняется очень быстро. Можете сами проверить в протеусе, это буквально каких-то 60 - 70 микросекунд.
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
Аватара пользователя
pavel123
Грызет канифоль
Сообщения: 268
Зарегистрирован: Чт май 17, 2007 09:44:13
Откуда: Украина, г. Кривой Рог

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

Сообщение pavel123 »

Добрый день,
Пытаюсь сделать драйвер мощного светодиода
С ШИМом разобрался, но вот возник вопрос измерить ток на этом самом светодиоде.
Как это правильно сделать.
Спасибо.
Ответить

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