Re: BASCOM AVR в вопросах и ответах
Добавлено: Вт июн 11, 2013 11:26:07
А мне никто не подскажет 
Здесь можно немножко помяукать :)
https://radiokot.ru/forum/
Ну да. Или оформить как подпрограмму, вызывать по Gosub и возвращаться по Return. А прелесть функций все же в возможности передать аргументы и получить результат.amv2000 писал(а):Как то так
спасибо.amv2000 писал(а):Как то так
а можно поконкретней с телом программы?)edm2007 писал(а):Ну да. Или оформить как подпрограмму, вызывать по Gosub и возвращаться по Return. А прелесть функций все же в возможности передать аргументы и получить результат.
Код: Выделить всё
'****************** [Основной цикл] **********************************************
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
Благодарю за отзывчивость!edm2007 писал(а):KOTик, первый вариант вообще ерунда какая-то. Пока условие выполняется постоянно перезаписываем регистр сравнения. К чему все это... Проект более - менее полный скиньте. Можете в личку.
Код: Выделить всё
' ОСНОВНОЙ ЦИКЛ
Do
если ручник поднят, то Gosub Ruchnik
если дальний свет включен, то Gosub Svet
Loop
'-------------------------------------------------------------------------------------
' ПОДПРОГРАММЫ
Ruchnik:
тили - тили
Return ' обработали ручник, возвращаемся в основной цикл
'------------------------------------------
Svet:
трали - вали
Return ' обработали включение света, возвращаемся в основной цикл
Код: Выделить всё
Do
Если нажата кнопка 1, то Goto Svetik1
Если нажата кнопка 2, то Goto Svetik2
Svetik1:
Включить светодиод 1
Svetik2:
Включить светодиод 2
Loop
Код: Выделить всё
Do
Если нажата кнопка 1, то Gosub Svetik1
Если нажата кнопка 2, то Gosub Svetik2
Loop
Svetik1:
Включить светодиод 1
Return
Svetik2:
Включить светодиод 2
Return
Спасибо, учитель!edm2007 писал(а):Ответил сразу. Вы просто постарайтесь понять, что из себя представляет вызов подпрограмм. Это лишь оформленные куски кода, к которым можно обратиться в любой момент. В основном цикле (Do ... Loop) у Вас будет только проверка выводов. И если что-то сработало то мы тогда уже уходим в подпрограмму, делаем что нужно и возвращаемся обратно. Нельзя пихать подпрограммы в основной цикл, это же петля, которая обрабатывается по кругу.
....
А тут суть та же, но исполнение правильное:
Я тут уж не говорю о том, что недурственно бы было погасить оба светодиода при отпущеных кнопках. Но суть ясна, я думаю...Код: Выделить всё
Do Если нажата кнопка 1, то Gosub Svetik1 Если нажата кнопка 2, то Gosub Svetik2 Loop Svetik1: Включить светодиод 1 Return Svetik2: Включить светодиод 2 Return
Код: Выделить всё
Do
...
İf PINB.0 = 1 Gosub Led 'если кнопка нажата, переходим к Led
...
Loop
Led:
Do
PORTB.1 = 1
waitms 500
PORTB.1 = 0
waitms 500
Loop
ReturnНу наверное всё же собраться и прочитать хелп, хотя бы в рамках того, что Вы написали.domrustika писал(а):вопрос как объединить 2 кода что бы после моей части кода Lcd "Doma: ЗДЕСЬ вывелась температура"?
Код: Выделить всё
Locate 1 , 3 ' Здесь Вы выводите в первой строке индикатора, начиная с третьего столбца ->
Lcd "Temperatura-" ' строковую переменную в простонародье англицкое слово температура
Lowerline ' Этой командой мы опускаемся на одну строку ниже ->
Lcd "Doma:" ' и соответственно выводим полуанглицкое слово Дома:
Waitms 3000 ' ждем 3 секПо Gosub выполняется переход в подпрограмму,KOTик писал(а):А вот какая разница между Goto и Gosub не понял.
Где же Вы слова такие находите? В словаре: Залупить:обнажить головку полового члена.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Разумеется, в данном контексте, это означало зациклитьamv2000 писал(а): ....
Где же Вы слова такие находите? В словаре: Залупить:обнажить головку полового члена.
Есть же слово зациклить и понятное и на ругань не похожее.
...
P.S. Хотел попробовать решить это через оператор If, не получилось.
amv2000 все верно объяснил. Gosub это переход к подпрограмме. Перед прыжком в стеке будет сохранен адрес, на который программа вернется по Return после выполнения подпрограммы. При Goto ничего не запоминается, программа просто уходит в другое место. И именно по этой причине ее не рекомендуют использовать. Можно запросто перепрыгнуть важный участок кода (не заметив этого), а потом вообще ушагать в дебри.KOTик писал(а):А вот какая разница между Goto и Gosub не понял
Для таких задач можно использовать Do .. Loop Until и While .. Wend. Разница лишь в том, что в первом случае программа хоть один раз но код заключенный в конструкцию выполнит. И только потом проверит условие на истинность. Во втором случае сначала проверяется условие, и если оно не истина - программа прыгает на строку, следующую за Wend.KOTик писал(а):Можно ли в подпрограмме использовать do...loop или Loop until...
Код: Выделить всё
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
Нет, там все верно, состояние светодиода меняется 7 раз (0 - 6). Другое дело что Goto Начало совершенно лишнее, у нас же и так цикл Do .. Loop. Ну и вызов мигалки нужен по Gosub. Она же Return'ом заканчивается.amv2000 писал(а):еще так и не понял почему цикл отрабатывает не 6 а 4 раза
Вы меня опередили сидел думал дребезг по быстрому, чем устранить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 ' возврат в главный циклНу да, Debounce справляется с этим прекрасно.amv2000 писал(а):сидел думал дребезг по быстрому, чем устранить
С помощью форматирования Temperatur = Fusing(t , "##.#")domrustika писал(а):что бы показывалась еще число после запятой, например 28,5 С?
Воспользуйтесь fuse-bit калькулятором. Доходчиво, просто и удобно.dbf-334 писал(а):Всем привет!![]()
Подскажите плиз, у меня версия BascomAVR 2.0.7.1. Мне нужно подключить внешний кварц на 4МГц, выставив требуемые фьюзы...Боюсь залочить МК.
Вроде нашел, где фьюзы находятся. Перед программированием МК открывается диалоговое окно с тремя вкладками: Flash, EEPROM и Lock and Fuse bit. Нам нужна третья вкладка.Только фьюзы в ней расположены нестандартным способом (галочки не ставятся) и название фьюзов совсем другие. Там все построено какими-то раскрывающимися списками с выбором параметров.