BASCOM AVR в вопросах и ответах
Re: BASCOM AVR в вопросах и ответах
А мне никто не подскажет 
- edm2007
- Поставщик валерьянки для Кота
- Сообщения: 2255
- Зарегистрирован: Вт апр 21, 2009 22:24:10
- Откуда: Иркутск
- Контактная информация:
Re: BASCOM AVR в вопросах и ответах
KOTик, первый вариант вообще ерунда какая-то. Пока условие выполняется постоянно перезаписываем регистр сравнения. К чему все это... Проект более - менее полный скиньте. Можете в личку.
Ну да. Или оформить как подпрограмму, вызывать по Gosub и возвращаться по Return. А прелесть функций все же в возможности передать аргументы и получить результат.
amv2000 писал(а):Как то так
Ну да. Или оформить как подпрограмму, вызывать по Gosub и возвращаться по Return. А прелесть функций все же в возможности передать аргументы и получить результат.

"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
-
domrustika
- Грызет канифоль
- Сообщения: 257
- Зарегистрирован: Чт мар 22, 2007 13:50:33
- Откуда: казань
- Контактная информация:
Re: BASCOM AVR в вопросах и ответах
amv2000 писал(а):Как то так
спасибо.
edm2007 писал(а):Ну да. Или оформить как подпрограмму, вызывать по Gosub и возвращаться по Return. А прелесть функций все же в возможности передать аргументы и получить результат.
а можно поконкретней с телом программы?)
- edm2007
- Поставщик валерьянки для Кота
- Сообщения: 2255
- Зарегистрирован: Вт апр 21, 2009 22:24:10
- Откуда: Иркутск
- Контактная информация:
Re: BASCOM AVR в вопросах и ответах
Да запросто.
Код: Выделить всё
'****************** [Основной цикл] **********************************************
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
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
Re: BASCOM AVR в вопросах и ответах
edm2007 писал(а):KOTик, первый вариант вообще ерунда какая-то. Пока условие выполняется постоянно перезаписываем регистр сравнения. К чему все это... Проект более - менее полный скиньте. Можете в личку.
Благодарю за отзывчивость!
Написал Вам ЛС.
Никак не могу понять, почему не работет, хоть убейся!
- edm2007
- Поставщик валерьянки для Кота
- Сообщения: 2255
- Зарегистрирован: Вт апр 21, 2009 22:24:10
- Откуда: Иркутск
- Контактная информация:
Re: BASCOM AVR в вопросах и ответах
Ответил сразу. Вы просто постарайтесь понять, что из себя представляет вызов подпрограмм. Это лишь оформленные куски кода, к которым можно обратиться в любой момент. В основном цикле (Do ... Loop) у Вас будет только проверка выводов. И если что-то сработало то мы тогда уже уходим в подпрограмму, делаем что нужно и возвращаемся обратно. Нельзя пихать подпрограммы в основной цикл, это же петля, которая обрабатывается по кругу.
Допустим, перед нами стоит задача: имеются две кнопки и два светодиода. При нажатии каждой из кнопок должен зажигаться свой светодиод. Если перевести это на Вашу реализацию, то это будет выглядеть так:
Тут вся беда в том, что абсолютно не важно что и как нажималось. Программа беспощадно выполняется от Do к Loop и снова по кругу. Будут проверены кнопки, и даже если кнопки не нажимались то все равно зажгутся оба светодиода (сами подумайте, что будет, если будет нажата кнопка 1. или кнопка 2.)...
А тут суть та же, но исполнение правильное:
Я тут уж не говорю о том, что недурственно бы было погасить оба светодиода при отпущеных кнопках. Но суть ясна, я думаю...
Код: Выделить всё
' ОСНОВНОЙ ЦИКЛ
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 в вопросах и ответах
спасибо всем ответившим. все работает
тут еще вопрос возник. собрал термометр на 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: ЗДЕСЬ вывелась температура"?
есть 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: ЗДЕСЬ вывелась температура"?
Re: BASCOM AVR в вопросах и ответах
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 в вопросах и ответах
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 в вопросах и ответах
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
ReturnP.S. Для кнопки желательно программку для подавления дребезга, еще так и не понял почему цикл отрабатывает не 6 а 4 раза.
Последний раз редактировалось amv2000 Ср июн 12, 2013 13:56:45, всего редактировалось 1 раз.
Re: BASCOM AVR в вопросах и ответах
amv2000 писал(а):....
Где же Вы слова такие находите? В словаре: Залупить:обнажить головку полового члена.
Есть же слово зациклить и понятное и на ругань не похожее.
...
P.S. Хотел попробовать решить это через оператор If, не получилось.
Разумеется, в данном контексте, это означало зациклить
Просто, вот такой неудачный синтез слов получился
Спасибо за объяснение и за ссылку.
Пойду копать дальше...
- edm2007
- Поставщик валерьянки для Кота
- Сообщения: 2255
- Зарегистрирован: Вт апр 21, 2009 22:24:10
- Откуда: Иркутск
- Контактная информация:
Re: BASCOM AVR в вопросах и ответах
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 в вопросах и ответах
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 в вопросах и ответах
amv2000 писал(а):сидел думал дребезг по быстрому, чем устранить
Ну да, Debounce справляется с этим прекрасно.
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
-
domrustika
- Грызет канифоль
- Сообщения: 257
- Зарегистрирован: Чт мар 22, 2007 13:50:33
- Откуда: казань
- Контактная информация:
Re: BASCOM AVR в вопросах и ответах
спасибо. подскажите пожалуйста еще как исправить этот код
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 С?
Спойлер
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 в вопросах и ответах
domrustika писал(а):что бы показывалась еще число после запятой, например 28,5 С?
С помощью форматирования Temperatur = Fusing(t , "##.#")
- dimon-790
- Мучитель микросхем
- Сообщения: 442
- Зарегистрирован: Пт авг 29, 2008 09:22:37
- Контактная информация:
Re: BASCOM AVR в вопросах и ответах
Пытаюсь написать прогу к одному девайсу . Суть в кратце такова , нужно принять данные по последовательному порту (трёх проводная схема ) . Разложить по байтикам , если нужно подправить и передать по второму порту на принёмник . Приёмник состоит из трёх индикаторов и двух драйверов с последовательной загрузкой , включеных каскадно. В общем с приемом и передачей разобрася , всё работает как задуманно . Но есть одна заковырка , биты в пакетах идут согласно раводки п.п. примерно так 3-бита на 1-разряд , 3-бита на 2-й разряд и т.д. что создает определенные трудности с их редактированием . Всвязи с этим такой вопрос к уваж. сообществу : возможно-ли в барсике менять местами биты не по одному и в произвольном порядке ?, ну например так .
...подправил мот так будет понятнее...
dim buf as (10)byte
swap buf(1).1.2.5,buf(4).6.7.3
...подправил мот так будет понятнее...
dim buf as (10)byte
swap buf(1).1.2.5,buf(4).6.7.3
Все мы работаем по методу Робинзона Крузо – ждем пятницу.
Re: BASCOM AVR в вопросах и ответах
Всем привет!
Подскажите плиз, у меня версия BascomAVR 2.0.7.1. Мне нужно подключить внешний кварц на 4МГц, выставив требуемые фьюзы...
Боюсь залочить МК.
Вроде нашел, где фьюзы находятся. Перед программированием МК открывается диалоговое окно с тремя вкладками: Flash, EEPROM и Lock and Fuse bit. Нам нужна третья вкладка.
Только фьюзы в ней расположены нестандартным способом (галочки не ставятся) и название фьюзов совсем другие. Там все построено какими-то раскрывающимися списками с выбором параметров.
Подскажите плиз, у меня версия BascomAVR 2.0.7.1. Мне нужно подключить внешний кварц на 4МГц, выставив требуемые фьюзы...
Вроде нашел, где фьюзы находятся. Перед программированием МК открывается диалоговое окно с тремя вкладками: Flash, EEPROM и Lock and Fuse bit. Нам нужна третья вкладка.
Re: BASCOM AVR в вопросах и ответах
Всем спасибо! 
Методом тыка нашел нужные фьюзы.
Если кому будет интересно, то в окне программирования в вкладке "Lock and Fuse bits" находим раздел - "Fusebits". В этом разделе три пункта, нас интересуют следующие настройки фьюзов:
FusebitC -> 1:Devide clock by 8 disabled (по умолчанию было включено)
Fusebit KLA987 -> 001010: Ext. Crystal Osc. (указали, что используем внешний кварц на 4МГц согласно даташиту)
Вроде все заработало как надо...
В работе посмотрю потом еще, как себя схема вести будет.

Методом тыка нашел нужные фьюзы.
FusebitC -> 1:Devide clock by 8 disabled (по умолчанию было включено)
Fusebit KLA987 -> 001010: Ext. Crystal Osc. (указали, что используем внешний кварц на 4МГц согласно даташиту)
Вроде все заработало как надо...
Re: BASCOM AVR в вопросах и ответах
dbf-334 писал(а):Всем привет!![]()
Подскажите плиз, у меня версия BascomAVR 2.0.7.1. Мне нужно подключить внешний кварц на 4МГц, выставив требуемые фьюзы...Боюсь залочить МК.
Вроде нашел, где фьюзы находятся. Перед программированием МК открывается диалоговое окно с тремя вкладками: Flash, EEPROM и Lock and Fuse bit. Нам нужна третья вкладка.Только фьюзы в ней расположены нестандартным способом (галочки не ставятся) и название фьюзов совсем другие. Там все построено какими-то раскрывающимися списками с выбором параметров.
Воспользуйтесь fuse-bit калькулятором. Доходчиво, просто и удобно.
Поповоду "залочить" - если вы выставите тактирование МК от внешнего кварца, то при повторной прошивке этот же кварц должен быть на соответствующих ножках МК.
В противном случае МК не войдет в режим программирование/прошивки, т.е. будет нуу, как бы "залочен".
У меня была такая ситуация. МК тактировался от внеш.кристалла и схема нормально работала.
Но при перепрошивке, программатор и прога ругалась. Подвесил кварц 4 МГц на ножки и МК оживился.
Можно и меандр на ногу xtal подать...