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

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
KOTик
Встал на лапы
Сообщения: 148
Зарегистрирован: Пн июн 07, 2010 16:16:57
Контактная информация:

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

Сообщение KOTик »

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

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

Сообщение edm2007 »

KOTик, первый вариант вообще ерунда какая-то. Пока условие выполняется постоянно перезаписываем регистр сравнения. К чему все это... Проект более - менее полный скиньте. Можете в личку.

amv2000 писал(а):Как то так


Ну да. Или оформить как подпрограмму, вызывать по Gosub и возвращаться по Return. А прелесть функций все же в возможности передать аргументы и получить результат. :tea:
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
domrustika
Грызет канифоль
Сообщения: 257
Зарегистрирован: Чт мар 22, 2007 13:50:33
Откуда: казань
Контактная информация:

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

Сообщение domrustika »

amv2000 писал(а):Как то так

спасибо.

edm2007 писал(а):Ну да. Или оформить как подпрограмму, вызывать по Gosub и возвращаться по Return. А прелесть функций все же в возможности передать аргументы и получить результат. :tea:

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

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

Сообщение edm2007 »

Да запросто.

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

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

Do

Gosub Led_on_off     ' вызов подпрограммы. после выполнения вернемся в основной код
                               ' на строку, следующую за вызовом
Loop

'********************************************************************************
         
'*****   [Процедуры обработки подпрограмм и прерываний]*****************************

Led_on_off:
 
Portc.5 = 1                                               
Waitms 500                                         
Portc.5 = 0                                               
Waitms 500
Portc.4 = 1                                             
Waitms 500                                         
Portc.4 = 0                                             
Waitms 500
Portc.3 = 1                                             
Waitms 500                                             
Portc.3 = 0                                               
итд...
 
Return
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
Аватара пользователя
KOTик
Встал на лапы
Сообщения: 148
Зарегистрирован: Пн июн 07, 2010 16:16:57
Контактная информация:

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

Сообщение KOTик »

edm2007 писал(а):KOTик, первый вариант вообще ерунда какая-то. Пока условие выполняется постоянно перезаписываем регистр сравнения. К чему все это... Проект более - менее полный скиньте. Можете в личку.

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

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

Сообщение edm2007 »

Ответил сразу. Вы просто постарайтесь понять, что из себя представляет вызов подпрограмм. Это лишь оформленные куски кода, к которым можно обратиться в любой момент. В основном цикле (Do ... Loop) у Вас будет только проверка выводов. И если что-то сработало то мы тогда уже уходим в подпрограмму, делаем что нужно и возвращаемся обратно. Нельзя пихать подпрограммы в основной цикл, это же петля, которая обрабатывается по кругу.

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

' ОСНОВНОЙ ЦИКЛ

Do

если ручник поднят, то Gosub Ruchnik
если дальний свет включен, то Gosub Svet

Loop

'----------

' ПОДПРОГРАММЫ

Ruchnik:

тили - тили

Return   ' обработали ручник, возвращаемся в основной цикл

'----------

Svet:

трали - вали

Return   ' обработали включение света, возвращаемся в основной цикл




Допустим, перед нами стоит задача: имеются две кнопки и два светодиода. При нажатии каждой из кнопок должен зажигаться свой светодиод. Если перевести это на Вашу реализацию, то это будет выглядеть так:

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

Do

Если нажата кнопка 1, то Goto Svetik1
Если нажата кнопка 2, то Goto Svetik2

Svetik1:

Включить светодиод 1

Svetik2:

Включить светодиод 2

Loop


Тут вся беда в том, что абсолютно не важно что и как нажималось. Программа беспощадно выполняется от Do к Loop и снова по кругу. Будут проверены кнопки, и даже если кнопки не нажимались то все равно зажгутся оба светодиода (сами подумайте, что будет, если будет нажата кнопка 1. или кнопка 2.)...

А тут суть та же, но исполнение правильное:

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

Do

Если нажата кнопка 1, то Gosub Svetik1
Если нажата кнопка 2, то Gosub Svetik2

Loop

Svetik1:

Включить светодиод 1

Return

Svetik2:

Включить светодиод 2

Return


Я тут уж не говорю о том, что недурственно бы было погасить оба светодиода при отпущеных кнопках. Но суть ясна, я думаю...
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
domrustika
Грызет канифоль
Сообщения: 257
Зарегистрирован: Чт мар 22, 2007 13:50:33
Откуда: казань
Контактная информация:

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

Сообщение domrustika »

спасибо всем ответившим. все работает :) тут еще вопрос возник. собрал термометр на ds1821 +жк44780
есть 2 кода . 1 -мой сам написал что хочу видеть на экране. 2 - код какого то немца про опрос датчика ds1821.
СпойлерМой код-------

Locate 1 , 3
Lcd "Temperatura-"
Lowerline
Lcd "Doma:"
Waitms 3000

Спойлеркод Немца------

Dim Ar As Byte
Dim Temperatur As Integer

Lcd "DS1821 an PD.6"
Wait 1
Cls
Lcd "Temp:"
Do
1wreset
1wwrite &HEE
Waitms 100
1wreset
1wwrite &HAA
Ar = 1wread()
1wwrite &H22
Locate 2 , 7
Temperatur = Ar
If Temperatur > 127 Then
Lcd "-"
Temperatur = 256 - Temperatur
Else
Lcd " "
End If
Lcd Temperatur ;
Lcd "°C"
Wait 1
Loop

End

вопрос как объединить 2 кода что бы после моей части кода Lcd "Doma: ЗДЕСЬ вывелась температура"?
Аватара пользователя
KOTик
Встал на лапы
Сообщения: 148
Зарегистрирован: Пн июн 07, 2010 16:16:57
Контактная информация:

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

Сообщение KOTик »

edm2007 писал(а):Ответил сразу. Вы просто постарайтесь понять, что из себя представляет вызов подпрограмм. Это лишь оформленные куски кода, к которым можно обратиться в любой момент. В основном цикле (Do ... Loop) у Вас будет только проверка выводов. И если что-то сработало то мы тогда уже уходим в подпрограмму, делаем что нужно и возвращаемся обратно. Нельзя пихать подпрограммы в основной цикл, это же петля, которая обрабатывается по кругу.
....
А тут суть та же, но исполнение правильное:

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

Do

Если нажата кнопка 1, то Gosub Svetik1
Если нажата кнопка 2, то Gosub Svetik2

Loop

Svetik1:

Включить светодиод 1

Return

Svetik2:

Включить светодиод 2

Return


Я тут уж не говорю о том, что недурственно бы было погасить оба светодиода при отпущеных кнопках. Но суть ясна, я думаю...


Спасибо, учитель! :))
Данный момент ооочень доходчиво объяснили.
Получается, все что в do...loop идет построчно, зациклинно.
Сейчас пойду переписывать программу :)

А вот какая разница между Goto и Gosub не понял :(
И еще, а что если мне надо мигать светодиодом в подпрограмме до некоторого условия.
И пока условие истинно цикл будет повторятся эН-ое кол-во раз.
Можно ли в подпрограмме использовать do...loop или Loop until...

Я представляю этот пример так.
(Не бейте, если что не так)

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

Do
...

İf PINB.0 = 1 Gosub Led 'если кнопка нажата, переходим к Led
...

Loop


Led:
Do
PORTB.1 = 1
waitms 500
PORTB.1 = 0
waitms 500
Loop
Return


Мне показалось, что мигание надо залупить, чтобы вручную не писать кол-во мигание, ибо оно может быть очень долгим, бесконечным. А если не залупить, то получается светодиод вспыхнет разок-второй (сколько прописать) и произойдет Return.
В данный момент баском и протеус не доступен, потому проверить не могу.
Аватара пользователя
amv2000
Опытный кот
Сообщения: 717
Зарегистрирован: Вт апр 26, 2011 13:58:36
Откуда: Ростовская область

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

Сообщение amv2000 »

domrustika писал(а):вопрос как объединить 2 кода что бы после моей части кода Lcd "Doma: ЗДЕСЬ вывелась температура"?

Ну наверное всё же собраться и прочитать хелп, хотя бы в рамках того, что Вы написали.

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

Locate 1 , 3  ' Здесь Вы выводите в первой строке индикатора, начиная с третьего столбца -> 
Lcd "Temperatura-"  ' строковую переменную в простонародье англицкое слово температура
Lowerline  ' Этой командой мы опускаемся на одну строку ниже ->
Lcd "Doma:" ' и соответственно выводим полуанглицкое слово Дома:
Waitms 3000  ' ждем 3 сек

А теперь найти соответствующие буковки в тексте немца и поменять на свои.
Последний раз редактировалось amv2000 Ср июн 12, 2013 08:16:29, всего редактировалось 2 раза.
Аватара пользователя
amv2000
Опытный кот
Сообщения: 717
Зарегистрирован: Вт апр 26, 2011 13:58:36
Откуда: Ростовская область

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

Сообщение amv2000 »

KOTик писал(а):А вот какая разница между Goto и Gosub не понял.

По Gosub выполняется переход в подпрограмму,
по Goto переходим к указанной метке, у Вас в коде выше как раз метка, а вчем разница между меткой и подпрограммой выше писалось.
Про циклы можете тут почитать http://robotsspace.ucoz.ru/publ/chto_ta ... t/8-1-0-69
А тут вообще бомба, извините не мог не обратить внимание:
KOTик писал(а):Мне показалось, что мигание надо залупить, ........... А если не залупить, то получается светодиод вспыхнет разок-второй

Где же Вы слова такие находите? В словаре: Залупить:обнажить головку полового члена.
Есть же слово зациклить и понятное и на ругань не похожее.
Хотя насчет циклов, помнится писалось не рекомендуется вставлять цикл в цикл.

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

$crystal = 16000000                                         'для рассчета времени задержки при компиляции, частоту выставляем фьюзами
$regfile = "m32def.dat"                                     'заголовочный файл для определения типа контроллера
' ****************************************************************************
'                            конфигурация
' ****************************************************************************
Config Portb.1 = Output                                     'конфигурируем вывод 1 порта B как выход
Светодиод Alias Portb.1
Светодиод = 0                                                 'устанавливаем 0 на ножке1 порта B
Config Pinb.0 = Input                                       'конфигурация порта B0 Кнопка
Кнопка Alias Pinb.0
Set Кнопка                                                  'включить внутренний подтягивающий резистор
' ****************************************************************************
'                            Объявляем переменные
' ****************************************************************************
Dim I As Byte
'*****************************************************************************
'                              начало программы
'*****************************************************************************                                                           '
'---------- цикл программы------------- ----------
Начало:
 Do
  If Кнопка = 0 Then
                Goto Мигаем                                 'если кнопка нажата, Мигаем
  Else
                Goto Начало                                 ' иначе в Начало
  End If
 Loop
End                                                         'конец программы
'----------
'                                    процедуры
'----------
Мигаем:
 For I = 0 To 6
    Toggle Светодиод : Waitms 500                           ' инвертируем порт в.1 каждые 0,5 сек  'Повторяемый блок
 Next
Return

P.S. Для кнопки желательно программку для подавления дребезга, еще так и не понял почему цикл отрабатывает не 6 а 4 раза.
Последний раз редактировалось amv2000 Ср июн 12, 2013 13:56:45, всего редактировалось 1 раз.
Аватара пользователя
KOTик
Встал на лапы
Сообщения: 148
Зарегистрирован: Пн июн 07, 2010 16:16:57
Контактная информация:

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

Сообщение KOTик »

amv2000 писал(а):....
Где же Вы слова такие находите? В словаре: Залупить:обнажить головку полового члена.
Есть же слово зациклить и понятное и на ругань не похожее.
...
P.S. Хотел попробовать решить это через оператор If, не получилось.

Разумеется, в данном контексте, это означало зациклить :)
Просто, вот такой неудачный синтез слов получился

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

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

Сообщение edm2007 »

KOTик писал(а):А вот какая разница между Goto и Gosub не понял


amv2000 все верно объяснил. Gosub это переход к подпрограмме. Перед прыжком в стеке будет сохранен адрес, на который программа вернется по Return после выполнения подпрограммы. При Goto ничего не запоминается, программа просто уходит в другое место. И именно по этой причине ее не рекомендуют использовать. Можно запросто перепрыгнуть важный участок кода (не заметив этого), а потом вообще ушагать в дебри.

KOTик писал(а):Можно ли в подпрограмме использовать do...loop или Loop until...


Для таких задач можно использовать Do .. Loop Until и While .. Wend. Разница лишь в том, что в первом случае программа хоть один раз но код заключенный в конструкцию выполнит. И только потом проверит условие на истинность. Во втором случае сначала проверяется условие, и если оно не истина - программа прыгает на строку, следующую за Wend.

Например, может быть так:

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

Config Portb.0 = Input
Config Portb.1 = Output

Do


If Pinb.0 = 0 Then Gosub Led     'если кнопка нажата, переходим к Led


Loop


Led:

Do                                         ' крутимся в цикле и мигаем, пока удерживается кнопка

PORTB.1 = 1
waitms 500
PORTB.1 = 0
waitms 500

Loop Until Pinb.0 = 1                ' покидаем цикл, если кнопка отпущена

Return


amv2000 писал(а):еще так и не понял почему цикл отрабатывает не 6 а 4 раза


Нет, там все верно, состояние светодиода меняется 7 раз (0 - 6). Другое дело что Goto Начало совершенно лишнее, у нас же и так цикл Do .. Loop. Ну и вызов мигалки нужен по Gosub. Она же Return'ом заканчивается.
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
Аватара пользователя
amv2000
Опытный кот
Сообщения: 717
Зарегистрирован: Вт апр 26, 2011 13:58:36
Откуда: Ростовская область

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

Сообщение amv2000 »

edm2007 писал(а):Нет, там все верно, состояние светодиода меняется 7 раз (0 - 6).

Вы меня опередили сидел думал дребезг по быстрому, чем устранить

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

$crystal = 16000000                                         'для рассчета времени задержки при компиляции, частоту выставляем фьюзами
$regfile = "m32def.dat"                                     'заголовочный файл для определения типа контроллера
' ****************************************************************************
'                            конфигурация
' ****************************************************************************
Светодиод Alias Portb.1
Config Светодиод = Output                                   'конфигурируем вывод 1 порта B как выход
Светодиод = 0                                               'устанавливаем 0 на ножке1 порта B
Кнопка Alias Pinb.0
Config Кнопка = Input                                       'конфигурация порта B0 Кнопка
Set Кнопка                                                  'включить внутренний подтягивающий резистор
Config Debounce = 30                                        'значение по умолчанию 25 мс, но мы переопределим 30 мс
' ****************************************************************************
'                            Объявляем переменные
' ****************************************************************************
Dim Период As Byte                                          ' переменная для подсчета кол-ва миганий
'*****************************************************************************
'                              начало программы
'*****************************************************************************                                                             '
'---------- цикл программы------------- ----------
 Do
Debounce Кнопка , 0 , Мигаем , Sub                          'Debounce PinB.0 , 1 , Pr 'когда на пин B.0 приходит 1
'                                 ^----- переход на метку
'                 ^---------- когда на пин приходит 0
'             ^---------- пин кнопка
 Loop
End                                                         'конец программы
'----------
'                                    процедуры
'----------
Мигаем:
 For Период = 1 To 6                                        ' запускаем цикл здесь 010101 т.е три раза моргаем
    Toggle Светодиод : Waitms 500                           ' инвертируем порт в.1 каждые 0,5 сек  'Повторяемый блок
 Next Период                                                ' в начало цикла
Return                                                      ' возврат в главный цикл
Последний раз редактировалось amv2000 Ср июн 12, 2013 13:54:21, всего редактировалось 5 раз.
Аватара пользователя
edm2007
Поставщик валерьянки для Кота
Сообщения: 2255
Зарегистрирован: Вт апр 21, 2009 22:24:10
Откуда: Иркутск
Контактная информация:

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

Сообщение edm2007 »

amv2000 писал(а):сидел думал дребезг по быстрому, чем устранить


Ну да, Debounce справляется с этим прекрасно. :) Только еще нужно параметр Sub подписать. Если он указан, то переходим по Gosub. Если его нет - то по Goto.
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
domrustika
Грызет канифоль
Сообщения: 257
Зарегистрирован: Чт мар 22, 2007 13:50:33
Откуда: казань
Контактная информация:

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

Сообщение domrustika »

спасибо. подскажите пожалуйста еще как исправить этот код
СпойлерLcd "Temp na Ulice:"
1wreset
1wwrite &HEE
Waitms 100
1wreset
1wwrite &HAA
Ar = 1wread()
1wwrite &H22
Locate 2 , 7
Temperatur = Ar
If Temperatur > 127 Then
Lcd "-"
Temperatur = 256 - Temperatur
Else
Lcd " "
End If
Lcd Temperatur ;
Lcd "°C"
Waitms 3000
Cls

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

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

Сообщение amv2000 »

domrustika писал(а):что бы показывалась еще число после запятой, например 28,5 С?

С помощью форматирования Temperatur = Fusing(t , "##.#")
Аватара пользователя
dimon-790
Мучитель микросхем
Сообщения: 442
Зарегистрирован: Пт авг 29, 2008 09:22:37
Контактная информация:

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

Сообщение dimon-790 »

Пытаюсь написать прогу к одному девайсу . Суть в кратце такова , нужно принять данные по последовательному порту (трёх проводная схема ) . Разложить по байтикам , если нужно подправить и передать по второму порту на принёмник . Приёмник состоит из трёх индикаторов и двух драйверов с последовательной загрузкой , включеных каскадно. В общем с приемом и передачей разобрася , всё работает как задуманно . Но есть одна заковырка , биты в пакетах идут согласно раводки п.п. примерно так 3-бита на 1-разряд , 3-бита на 2-й разряд и т.д. что создает определенные трудности с их редактированием . Всвязи с этим такой вопрос к уваж. сообществу : возможно-ли в барсике менять местами биты не по одному и в произвольном порядке ?, ну например так .
...подправил мот так будет понятнее...

dim buf as (10)byte
swap buf(1).1.2.5,buf(4).6.7.3
Все мы работаем по методу Робинзона Крузо – ждем пятницу.
dbf-334
Первый раз сказал Мяу!
Сообщения: 32
Зарегистрирован: Чт мар 06, 2008 10:59:45

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

Сообщение dbf-334 »

Всем привет! :)

Подскажите плиз, у меня версия BascomAVR 2.0.7.1. Мне нужно подключить внешний кварц на 4МГц, выставив требуемые фьюзы... :( Боюсь залочить МК.

Вроде нашел, где фьюзы находятся. Перед программированием МК открывается диалоговое окно с тремя вкладками: Flash, EEPROM и Lock and Fuse bit. Нам нужна третья вкладка. :) Только фьюзы в ней расположены нестандартным способом (галочки не ставятся) и название фьюзов совсем другие. Там все построено какими-то раскрывающимися списками с выбором параметров.
dbf-334
Первый раз сказал Мяу!
Сообщения: 32
Зарегистрирован: Чт мар 06, 2008 10:59:45

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

Сообщение dbf-334 »

Всем спасибо! :beer:

Методом тыка нашел нужные фьюзы. :) Если кому будет интересно, то в окне программирования в вкладке "Lock and Fuse bits" находим раздел - "Fusebits". В этом разделе три пункта, нас интересуют следующие настройки фьюзов:

FusebitC -> 1:Devide clock by 8 disabled (по умолчанию было включено)
Fusebit KLA987 -> 001010: Ext. Crystal Osc. (указали, что используем внешний кварц на 4МГц согласно даташиту)

Вроде все заработало как надо... :) В работе посмотрю потом еще, как себя схема вести будет.
Аватара пользователя
KOTик
Встал на лапы
Сообщения: 148
Зарегистрирован: Пн июн 07, 2010 16:16:57
Контактная информация:

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

Сообщение KOTик »

dbf-334 писал(а):Всем привет! :)

Подскажите плиз, у меня версия BascomAVR 2.0.7.1. Мне нужно подключить внешний кварц на 4МГц, выставив требуемые фьюзы... :( Боюсь залочить МК.

Вроде нашел, где фьюзы находятся. Перед программированием МК открывается диалоговое окно с тремя вкладками: Flash, EEPROM и Lock and Fuse bit. Нам нужна третья вкладка. :) Только фьюзы в ней расположены нестандартным способом (галочки не ставятся) и название фьюзов совсем другие. Там все построено какими-то раскрывающимися списками с выбором параметров.


Воспользуйтесь fuse-bit калькулятором. Доходчиво, просто и удобно.

Поповоду "залочить" - если вы выставите тактирование МК от внешнего кварца, то при повторной прошивке этот же кварц должен быть на соответствующих ножках МК.
В противном случае МК не войдет в режим программирование/прошивки, т.е. будет нуу, как бы "залочен".

У меня была такая ситуация. МК тактировался от внеш.кристалла и схема нормально работала.
Но при перепрошивке, программатор и прога ругалась. Подвесил кварц 4 МГц на ножки и МК оживился.
Можно и меандр на ногу xtal подать...
Ответить

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