Угу.raf65 писал(а):вот так она и вызывается
BASCOM AVR в вопросах и ответах
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
- Реклама
в данной конкретной программе нет чего то долгого, кроме вывода на дисплей, хотя Вы правы, здесь нет проверки на конкретное удержание, и периодическое нажатие на копку, в конце концов приведет к срабатыванию
Угу. По мне так это лишнее. Все же проще зафиксировав сам факт нажатия, проверять все остальное.raf65 писал(а):периодическое нажатие на копку, в конце концов приведет к срабатыванию
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
edm2007, raf65
Такой код сегодня попробую переработать под свои нужды. Спасибо.
Такой код сегодня попробую переработать под свои нужды. Спасибо.
Последний раз редактировалось vitalkalm Вс дек 25, 2011 19:03:05, всего редактировалось 1 раз.
Так можно применить и If .. Then, сделав возврат на начало подпрограммы по меткам. Будет работать также как и While ..Wend.edm2007 писал(а): Лично я вижу не кусок кода а законченую подпрограмму Knoblong, о чем явно говорит Sub. Покажите мне вызов этой подпрограммы. Проверка 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:
- Реклама
Да ради бога, кто запрещает-то. Я и более смешные способы знаю. 
P.S. Да, забыл совсем, у Вас в коде встречаются такие штуки как "если = 1 то = 0, иначе = 1". Это касаемо смены состояния на противоположное. Так есть замечательная команда Toggle. Она как раз состояние на противоположное и меняет. Toggle PORTD.0 и всех делов.
P.S. Да, забыл совсем, у Вас в коде встречаются такие штуки как "если = 1 то = 0, иначе = 1". Это касаемо смены состояния на противоположное. Так есть замечательная команда Toggle. Она как раз состояние на противоположное и меняет. Toggle PORTD.0 и всех делов.
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
Со стороны смешно, наверное. Просто в первый раз разбираю программу на BASCOM-е. В CVAVR чё-то правил для себя. 15 лет назад в универе давали азы в Бейсике. Для серьёзных дел, видимо, прийдется углубиться в изучение предмета.Да ради бога, кто запрещает-то. Я и более смешные способы знаю.
Да на PORTD.0 хочу прицепить реле, и "длинной" кнопкой делать вкл-выкл.
PS Пока в железе код не реализован...
Нет, со стороны пока не совсем понятно... Вы в итоге хотите просто чей-то исходник под себя поправить? Или это полностью своя реализация будет? Вот уже понятнее про реле. А короткое нажатие что должно делать?
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
Вот http://avr.ru/ready/contr/power/power . Автор raf65. Проделал большую работу и исходники не пожалел.
Я собрал-бы и забыл, но пошло-поехало... Короче, там и форум есть, в которм писались проблемы и их решения. Но как-то он там вяленький (форум).
Я собрал-бы и забыл, но пошло-поехало... Короче, там и форум есть, в которм писались проблемы и их решения. Но как-то он там вяленький (форум).
Может есть примеры работы с tda7313?
Примеры чего? кода или схемы применения...
Схема к примеру здесь http://service4u.narod.ru/html/tda7313.html
Схема к примеру здесь http://service4u.narod.ru/html/tda7313.html
Тут где-то рядом коты обсуждали.vanyap1 писал(а):Может есть примеры работы с tda7313?
http://radiokot.ru/circuit/audio/amplifier/31/ здесьvitalkalm писал(а):Тут где-то рядом коты обсуждали.
http://radiokot.ru/circuit/audio/filter/05/ здесь
http://radiokot.ru/circuit/audio/amplifier/27/ и здесь
Всех С НОВЫМ 2012 ГОДОМ!
Того, кто не задумывается о далеких трудностях, ожидают близкие неприятности.
Хотел кусок кода для работы с этой микросхемой.amv2000 писал(а):http://radiokot.ru/circuit/audio/amplifier/31/ здесьvitalkalm писал(а):Тут где-то рядом коты обсуждали.
http://radiokot.ru/circuit/audio/filter/05/ здесь
http://radiokot.ru/circuit/audio/amplifier/27/ и здесь
... так, для примера и общего познания.
Доброго времени суток !
Всех с Новым 2012 годом !!!
Решил вот в выходные поиздеваться над часиками DS1307... Благо Баском и Протеус под рукой всегда, а паяльник - только на работе !
Как читать время и дату и как ее корректировать - это понятно, все работает.
Непонятно - как перевести ее из 24-часового режима в 12-часовой ? В даташите написано:
Еще до кучи: объясните, плиз, что делают операторы
И еще хочу разобраться - как использовать встроенное ОЗУ для своих нужд. Это на будущее, сразу после шестого бита
PS не судите строго, зависон головы случился...
PPS Всех с праздником !
Всех с Новым 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 раза.
С уважением,
Алексей.
Алексей.
Вообщем пишу первую свою программу на бейсике, да и вообще первую. Программу вроде бы написал, но столкнулся с такой проблемой каждые 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Работа избавляет нас от трех великих зол: скуки, порока, нужды. (Вольтер)
- Сообщения: 336
- Зарегистрирован: Пн май 23, 2011 18:27:41
такое происходит если читать ds1307 ассинхронно от нее
поэтому используйте выход "SWQ/OUT" ds1307 для синхронизации
поэтому используйте выход "SWQ/OUT" ds1307 для синхронизации
можно небольшой пример? если бы не примеры я бы даже не написал и эту программу.
Работа избавляет нас от трех великих зол: скуки, порока, нужды. (Вольтер)


