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

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

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

Сообщение edm2007 »

raf65 писал(а):вот так она и вызывается :)


Угу. :) Ушли по Call Knoblong, проверили, хе, точно нажата. Увеличили счетчик и ушагали дальше в основной код. А где проверка на удержание-то? :) Щелкнем счетчиком и упрыгаем обратно в основной цикл. А если в основном цикле будет что-то долгое? Нужно по факту нажатия проверять, удерживается она дальше или нет, а не запрыгивать в подпрограмму и глядеть.
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
Аватара пользователя
raf65
Встал на лапы
Сообщения: 87
Зарегистрирован: Вс сен 27, 2009 20:49:06
Откуда: Советск

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

Сообщение raf65 »

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

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

Сообщение edm2007 »

raf65 писал(а):периодическое нажатие на копку, в конце концов приведет к срабатыванию


Угу. По мне так это лишнее. Все же проще зафиксировав сам факт нажатия, проверять все остальное.
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
vitalkalm
Первый раз сказал Мяу!
Сообщения: 36
Зарегистрирован: Пт май 23, 2008 03:48:36
Откуда: Украина

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

Сообщение vitalkalm »

edm2007, raf65
Такой код сегодня попробую переработать под свои нужды. Спасибо.
Последний раз редактировалось vitalkalm Вс дек 25, 2011 19:03:05, всего редактировалось 1 раз.
vitalkalm
Первый раз сказал Мяу!
Сообщения: 36
Зарегистрирован: Пт май 23, 2008 03:48:36
Откуда: Украина

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

Сообщение vitalkalm »

edm2007 писал(а):Лично я вижу не кусок кода а законченую подпрограмму Knoblong, о чем явно говорит Sub. Покажите мне вызов этой подпрограммы. Проверка If .. Then позволяет проверить условие только в один проход. Это же не While .. Wend, которое проверяет "до тех пор пока..."

Так можно применить и If .. Then, сделав возврат на начало подпрограммы по меткам. Будет работать также как и While ..Wend.

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

If Pind.2 = 0 Then
Goto Startknoblong
End If
Goto Endknoblong
 Startknoblong:
 Nlock1 = 1
 Startknoblong2:
     Nlock1 = Nlock1 + 1
      Waitms 100
      If Nlock1 = 20 Then
       If Pind.0 = 1 Then
       Reset Portd.0
       Else
       Set Portd.0
       End If
      End If
      Goto Startknoblong2
 End If
Endknoblong:
Аватара пользователя
edm2007
Поставщик валерьянки для Кота
Сообщения: 2255
Зарегистрирован: Вт апр 21, 2009 22:24:10
Откуда: Иркутск
Контактная информация:

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

Сообщение edm2007 »

Да ради бога, кто запрещает-то. Я и более смешные способы знаю. :wink:

P.S. Да, забыл совсем, у Вас в коде встречаются такие штуки как "если = 1 то = 0, иначе = 1". Это касаемо смены состояния на противоположное. Так есть замечательная команда Toggle. Она как раз состояние на противоположное и меняет. Toggle PORTD.0 и всех делов. :)
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
vitalkalm
Первый раз сказал Мяу!
Сообщения: 36
Зарегистрирован: Пт май 23, 2008 03:48:36
Откуда: Украина

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

Сообщение vitalkalm »

Да ради бога, кто запрещает-то. Я и более смешные способы знаю.

Со стороны смешно, наверное. Просто в первый раз разбираю программу на BASCOM-е. В CVAVR чё-то правил для себя. 15 лет назад в универе давали азы в Бейсике. Для серьёзных дел, видимо, прийдется углубиться в изучение предмета.
Да на PORTD.0 хочу прицепить реле, и "длинной" кнопкой делать вкл-выкл.
PS Пока в железе код не реализован...
Аватара пользователя
edm2007
Поставщик валерьянки для Кота
Сообщения: 2255
Зарегистрирован: Вт апр 21, 2009 22:24:10
Откуда: Иркутск
Контактная информация:

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

Сообщение edm2007 »

Нет, со стороны пока не совсем понятно... Вы в итоге хотите просто чей-то исходник под себя поправить? Или это полностью своя реализация будет? Вот уже понятнее про реле. А короткое нажатие что должно делать?
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
vitalkalm
Первый раз сказал Мяу!
Сообщения: 36
Зарегистрирован: Пт май 23, 2008 03:48:36
Откуда: Украина

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

Сообщение vitalkalm »

Вот http://avr.ru/ready/contr/power/power . Автор raf65. Проделал большую работу и исходники не пожалел.
Я собрал-бы и забыл, но пошло-поехало... Короче, там и форум есть, в которм писались проблемы и их решения. Но как-то он там вяленький (форум).
vanyap1
Электрический кот
Сообщения: 1048
Зарегистрирован: Пт июл 30, 2010 11:49:03
Откуда: Украина
Контактная информация:

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

Сообщение vanyap1 »

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

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

Сообщение amv2000 »

Примеры чего? кода или схемы применения...
Схема к примеру здесь http://service4u.narod.ru/html/tda7313.html
vitalkalm
Первый раз сказал Мяу!
Сообщения: 36
Зарегистрирован: Пт май 23, 2008 03:48:36
Откуда: Украина

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

Сообщение vitalkalm »

vanyap1 писал(а):Может есть примеры работы с tda7313?

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

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

Сообщение amv2000 »

vitalkalm писал(а):Тут где-то рядом коты обсуждали.

http://radiokot.ru/circuit/audio/amplifier/31/ здесь
http://radiokot.ru/circuit/audio/filter/05/ здесь
http://radiokot.ru/circuit/audio/amplifier/27/ и здесь
Аватара пользователя
max50
Мучитель микросхем
Сообщения: 497
Зарегистрирован: Ср дек 10, 2008 21:24:28
Откуда: Алтайский край, Барнаул

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

Сообщение max50 »

Всех С НОВЫМ 2012 ГОДОМ!
Того, кто не задумывается о далеких трудностях, ожидают близкие неприятности.
vanyap1
Электрический кот
Сообщения: 1048
Зарегистрирован: Пт июл 30, 2010 11:49:03
Откуда: Украина
Контактная информация:

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

Сообщение vanyap1 »

amv2000 писал(а):
vitalkalm писал(а):Тут где-то рядом коты обсуждали.

http://radiokot.ru/circuit/audio/amplifier/31/ здесь
http://radiokot.ru/circuit/audio/filter/05/ здесь
http://radiokot.ru/circuit/audio/amplifier/27/ и здесь


Хотел кусок кода для работы с этой микросхемой.
... так, для примера и общего познания.
Аватара пользователя
Gordon Shumway
Мучитель микросхем
Сообщения: 485
Зарегистрирован: Пн авг 20, 2007 21:35:45
Откуда: Мытищи, Московская область
Контактная информация:

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

Сообщение Gordon Shumway »

Доброго времени суток !

Всех с Новым 2012 годом !!!

Решил вот в выходные поиздеваться над часиками DS1307... Благо Баском и Протеус под рукой всегда, а паяльник - только на работе ! :)

Как читать время и дату и как ее корректировать - это понятно, все работает.

Непонятно - как перевести ее из 24-часового режима в 12-часовой ? В даташите написано:

Бит 6 регистра часов отвечает за
выбор 12- или 24-часового режима. Когда он установлен в 1, выбран 12-часовой режим.


Но как добраться до этого бита - никак не пойму.

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

I2cstart
I2cwbyte Ds1307w
I2cwbyte 2                                         
I2cwbyte Hour
I2cstop


Еще до кучи: объясните, плиз, что делают операторы

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

bcd
makebcd
makedec



И еще хочу разобраться - как использовать встроенное ОЗУ для своих нужд. Это на будущее, сразу после шестого бита :)

PS не судите строго, зависон головы случился...

PPS Всех с праздником !
Последний раз редактировалось Gordon Shumway Вт янв 03, 2012 21:39:22, всего редактировалось 2 раза.
С уважением,
Алексей.
RDW
Родился
Сообщения: 19
Зарегистрирован: Пт май 20, 2011 15:28:49

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

Сообщение RDW »

Эх, а я в этом году осилил статейку про робота. Код для контроллера написан на бейсике. Он конечно не совершенен (код), но работает. :))

зы: целая проблема была с отправкой/приёмом нуля в баскоме (в обще привычном бейсике таких проблем нет).
Аватара пользователя
mr4ester
Держит паяльник хвостом
Сообщения: 900
Зарегистрирован: Чт авг 27, 2009 20:09:01
Откуда: Приднестровье г.Бендеры
Контактная информация:

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

Сообщение mr4ester »

Вообщем пишу первую свою программу на бейсике, да и вообще первую. Программу вроде бы написал, но столкнулся с такой проблемой каждые 3 сек счет часов, а именно секунд немного притормаживает и не могу придумать что в коде поменять, и как оптимизировать, может вам с более большим опытом что то придет в голову?

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

$regfile = "m16def.dat"
$crystal = 8000000
$baud = 9600
$lib "mcsbyte.lbx"                                          ' for smaller code
$lib "ds1307clock.lib"                                      ' modified lib
$framesize = 16
$hwstack = 24
$swstack = 16
Config Lcd = 16 * 2
Config Lcdpin = Pin , Rs = Porta.0 , E = Porta.1 , Db4 = Porta.2 , Db5 = Porta.3 , Db6 = Porta.4 , Db7 = Porta.5
Cls
Cursor Off
'* * * настройка пинов для подключния lcd
'* * * подключаем библиотеку ds1307
$lib "ds1307clock.lib"
Config Clock = User
'* * * конфигурируем scl и sda пины
Config Sda = Portd.6                                        ' I2C Data
Config Scl = Portd.5                                        ' I2C Clock
Config 1wire = Portd.4
'* * * заводим константы на биты чтения и записи ds1307
Const Ds1307w = &HD0                                        ' бит записи
Const Ds1307r = &HD1                                        ' бит чтения
'* * * заводим и разрешаем прерывания от UART
On Urxc Getchar
Enable Interrupts
Enable Urxc
'* * * заводим переменные для своих нужд
Dim C As Word
Dim Seco As Byte
Dim Mine As Byte
Dim Hour As Byte
Dim Day As Byte
Dim Dat As Byte
Dim Month As Byte
Dim Year As Byte
Dim S As String * 5                                         ' переменная для работы UART
Dim Byte0 As Byte
Dim Byte1 As Byte
Dim Signtemperatura As String * 1
Dim T1 As Single
Dim T2 As Integer
Dim Ttemp As Byte
Dim Hh As Byte
Dim Mm As Byte

Deflcdchar 0 , 28 , 20 , 28 , 32 , 32 , 32 , 32 , 32
Locate 1 , 4
Lcd "२§OMH®¦"
Locate 2 , 6
Lcd "ЁPOEKT"
Wait 2
Cls
Locate 1 , 1
Lcd "----ᥪPOBO¦---- "
Locate 2 , 1
Lcd "----TEPMOMETP---"
Wait 2
Cls
'* * * * * * основной цикл программы
Do
         Gosub Ds1307                                       'уходим на выполнение подпрограммы чтобы узнать время и дату
         Gosub Ds18b20
         Gosub Displey                                      'выполняем подпрограмму вывода на дисплей
Loop
'----------
'* * * узнаем время и дату
Ds1307:
        I2cstart                                            ' даем часам понять что сейчас будем с ними работать
        I2cwbyte Ds1307w                                    ' отправляем
        I2cwbyte &H00                                       ' адрес откуда начачинаем читать данные
        I2cstart                                            ' даем сигнал старт
        I2cwbyte Ds1307r                                    ' на прочтение данных
        I2crbyte Seco , Ack                                 ' ловим секунды
        I2crbyte Mine , Ack                                 ' минуты
        I2crbyte Hour , Ack                                 ' часы
        I2crbyte Day , Ack                                  ' день недели
        I2crbyte Dat , Ack                                  ' число месяца
        I2crbyte Month , Ack                                ' месяц
        I2crbyte Year , Nack                                ' год
        I2cstop
        Seco = Makedec(seco)
        Mine = Makedec(mine)
        Hour = Makedec(hour)
        Day = Makedec(day)
        Dat = Makedec(dat)
        Month = Makedec(month)
        Year = Makedec(year)

Return
'_____
'***  измеряем температуру
Ds18b20:
1wreset
If Err = 1 Then                                             'если при опросе появился флаг ошибки
Cls
Locate 1 , 12
Lcd "Ѕeї"                                                   'нет
Locate 2 , 10
Lcd "гaїАёєa"                                               ' датчика
Wait 1

Else
1wreset
1wwrite &HCC
1wwrite &H44
Waitms 700                                                  ' задержка
1wreset
1wwrite &HCC
1wwrite &HBE                                                ' Команда чтения ОЗУ датчика
Byte0 = 1wread()                                            ' Читаем нулевой байт
Byte1 = 1wread()                                            ' Читаем первый байт
End If
If Byte1 >= 248 Then                                        ' Проверяем на отрицательную температуру.248 в десятичном - 11111000 в двоичном. Если температура отрицательная - вычитаем из &HFF
Byte0 = &HFF - Byte0
Byte1 = &HFF - Byte1
Signtemperatura = "-"
Else
Signtemperatura = "+"
End If
T1 = Byte0 / 16                                             ' Сдвигаем нулевой байт вправо на 4 бита (2*2*2*2=16)
T2 = Byte1 * 16                                             ' Сдвигаем первый байт влево на 4 бита (2*2*2*2=16)
T1 = T1 + T2
Hh = Fix(t1)                                                'отсекаем от температуры все после запятой
Ttemp = T1 * 10                                             '
Mm = Ttemp Mod 10                                           'берем десятичную часть температуры

Return
'----------
'* * * подпрограмма вывода на дисплей
Displey:
Locate 1 , 1
         If Hour < 10 Then
             Lcd "0" ; Hour ; ":"
             Else                                           ' выводим время
         Lcd Hour ; ":" ;
         End If
         If Mine < 10 Then
            Lcd "0" ; Mine ; ":" ;
         Else
            Lcd Mine ; ":" ;
         End If
         If Seco < 10 Then
            Lcd "0" ; Seco
         Else
            Lcd Seco
         End If
Locate 2 , 1                                                ' выводим дату
Lcd Dat
Locate 2 , 3
Lcd "/"
Locate 2 , 4
If Month < 10 Then
   Lcd "0" ; Month
   Else
   Lcd Month
   End If
Locate 2 , 12
                                                'обзываем каждый месяц
  If Day = 1 Then
         Lcd "ѕoЅeг"                                        'январь
  End If
   If Day = 2 Then
         Lcd "іїopЅ"                                        'февраль
  End If
   If Day = 3 Then
        Lcd "cpeгa"                                         'март и так далее
  End If
   If Day = 4 Then
         Lcd "Аeїі"
  End If
   If Day = 5 Then
         Lcd "ѕЗїЅ"
  End If
   If Day = 6 Then
         Lcd "cyІoї"
  End If
   If Day = 7 Then
         Lcd "іocєp"
  End If

Locate 2 , 6
    Lcd "/" ; "20" ; Year
    Locate 1 , 10
Lcd Signtemperatura ; Hh ; "." ; Mm                         'выводим целую часть потом рисуем точку потом десятую часть температуры
Locate 1 , 15
Lcd Chr(0) ; "C"
Return
'----------
'* * * обработчик прерывания UART
Getchar:
Input S                                                     'то что пришло по UART
    If S = "сек" Then                                       'настроим секунды
    Print "введите секунды"
       Input C
       Seco = C
         Seco = Makebcd(seco)
         I2cstart                                           ' подаем сигнал старт
         I2cwbyte Ds1307w                                   ' отправляем команду записи
         I2cwbyte 0                                         ' отправляем адрес куда пишем - &H00
         I2cwbyte Seco                                      ' записываем значение переменной по этому адресу
         I2cstop                                            ' закончили работать с I2C
   Cls
    End If
    If S = "min" Then                                       'настроим минуты
    Print "input min..."
       Input C
       Mine = C
         Mine = Makebcd(mine)
         I2cstart
         I2cwbyte Ds1307w
         I2cwbyte 1                                         'адрес хранения минут &H01
         I2cwbyte Mine
         I2cstop
   Cls
    End If
    If S = "hour" Then                                      'настроим часы
    Print "input hour..."
       Input C
       Hour = C
        Hour = Makebcd(hour)
        I2cstart
        I2cwbyte Ds1307w
        I2cwbyte 2                                          'адрес хранения часов
        I2cwbyte Hour
        I2cstop
   Cls
    End If
    If S = "day" Then                                       'настроим дату
    Print "input day..."
      Input C
        Day = C
        Day = Makebcd(day)
        I2cstart
        I2cwbyte Ds1307w
        I2cwbyte 3                                          'адрес хранения дня недели
        I2cwbyte Day
        I2cstop
   Cls
     End If
    If S = "dat" Then                                       'настроим дату
    Print "input dat..."
       Input C
       Dat = C
        Dat = Makebcd(dat)
        I2cstart
        I2cwbyte Ds1307w
        I2cwbyte 4                                          'адрес хранения даты
        I2cwbyte Dat
        I2cstop
   Cls
    End If
    If S = "month" Then                                     'настроим месяц
    Print "input month..."
       Input C
       Month = C
        Month = Makebcd(month)
        I2cstart
        I2cwbyte Ds1307w
        I2cwbyte 5                                          'адрес хранения месяца
        I2cwbyte Month
        I2cstop
   Cls
    End If
    If S = "year" Then                                      'настроим год
    Print "input year..."
       Input C
       Year = C
        Year = Makebcd(year)
        I2cstart
        I2cwbyte Ds1307w
        I2cwbyte 6                                          'адрес хранения года
        I2cwbyte Year
        I2cstop
   Cls
    End If
Return
End
Работа избавляет нас от трех великих зол: скуки, порока, нужды. (Вольтер)
BVS
Потрогал лапой паяльник
Сообщения: 336
Зарегистрирован: Пн май 23, 2011 18:27:41

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

Сообщение BVS »

такое происходит если читать ds1307 ассинхронно от нее
поэтому используйте выход "SWQ/OUT" ds1307 для синхронизации
Аватара пользователя
mr4ester
Держит паяльник хвостом
Сообщения: 900
Зарегистрирован: Чт авг 27, 2009 20:09:01
Откуда: Приднестровье г.Бендеры
Контактная информация:

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

Сообщение mr4ester »

можно небольшой пример? если бы не примеры я бы даже не написал и эту программу.
Работа избавляет нас от трех великих зол: скуки, порока, нужды. (Вольтер)
Ответить

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