BASCOM AVR в вопросах и ответах
Не умеет. Исполняемый оператор в строке может быть только один. Мне тоже жаль. 
- Реклама
У меня вопрос по дисплеям нокиа 3310 и 5110-может кто решил
Как рисовать линии?бывает ли такая библиотека?или лучше создавать буфер на 504 ячейки,складывать рисунок туда и потом все передавать в жки как картинку?
Как рисовать линии?бывает ли такая библиотека?или лучше создавать буфер на 504 ячейки,складывать рисунок туда и потом все передавать в жки как картинку?
[uquote="Novice user",url="/forum/viewtopic.php?p=3286638#p3286638"]вопрос по I2C
Одно устройство подключено по I2C к одним портам(Config Scl = Portc.5,Config Sda = Portc.4),второе к другим(Config Scl = Portc.0,Config Sda = Portc.1),как переназначать программно порты?[/uquote]
Удалось решить этот вопрос? Если нет, вот пример с сайта Баскома, случайно нашел.
Одно устройство подключено по I2C к одним портам(Config Scl = Portc.5,Config Sda = Portc.4),второе к другим(Config Scl = Portc.0,Config Sda = Portc.1),как переназначать программно порты?[/uquote]
Удалось решить этот вопрос? Если нет, вот пример с сайта Баскома, случайно нашел.
Спойлер
Код: Выделить всё
'name : I2C-multibus.bas
'copyright : (c) 1995-2016, MCS Electronics
'purpose : demonstrates I2C multibus library
'micro : Mega88
'suited for demo : no, lib not included in demo
'commercial addon needed : no
'------------------------------------------------------------------------------
$regfile = "m88def.dat"
$crystal = 8000000
$hwstack = 32
$swstack = 24
$framesize = 24
Config I2cbus = 0 , Scl = Portc.0 , Sda = Portc.1 'each bus requires a configuration of the SCL and SDA pins
Config I2cbus = 1 , Scl = Portc.2 , Sda = Portc.3 'this sample creates 4 busses
Config I2cbus = 2 , Scl = Portd.2 , Sda = Portd.3
Config I2cbus = 3 , Scl = Portd.4 , Sda = Portd.5
Dim J As Byte
For J = 0 To 3 'the first bus is 0 !!!
I2cbus = J 'select the BUS
I2cinit 'init the pins and state
Next
Do
For J = 0 To 3
I2cbus = J 'select the bus
I2csend &H40 , &B01010101 'send some data
Next
Waitms 100
Loop
EndНакидайте пожалуйста простую программу. Аттини 2313. Пусть на порт PB3 будет повешена кнопка, а на порт PB2 светодиод. кнопка подтянута на плюс внешним резистором 10Ком. Надо чтобы светодиод вспыхивал каждое 3-е нажатие кнопки например на 100милисекунд.
то есть жмём кнопку 1-2-3 (вспышка) 4-5-6 (вспышка) 7-8-9 (вспышка)
Да, антидребезг нужен.
- Реклама
[uquote="nik_81",url="/forum/viewtopic.php?p=3389902#p3389902"]Накидайте пожалуйста простую программу....[/uquote]
там делов то,можно и самому сладить...
там делов то,можно и самому сладить...
4-й день бьюсь. Уже надоело. Без антидребезга у меня то на 2-е, то на 4-е нажатие срабатывает. А как всё это написать через прерывания я не осиляю. Готового примера в сети тоже не нашёл.
nik_81 писал(а):Готового примера в сети тоже не нашёл.
A:
If Pind.2 = 0 Then 'при нажатии кнопки
Waitms 50 'антидребезг
Bitwait Pind.2 , Set 'ждём отпускания кнопки
Else
Goto A
End If
Спасибо за помощь. Получилось следующее. Всё работает в протеусе, но почему то моргает не 0,1 Сек а где-то 1-1,5Сек, как будто код выполняется очень медленно или это просто глюк протеуса? И ещё вопрос почему при объявлении переменной для Аттини 13 протеус выдаёт ошибку, а для 2313 всё нормально. Не ужели не хватает памяти ? использую протеус версии 8,6 sp2
$regfile = "attiny2313.dat"
$crystal = 8000000
Config Portb.3 = Input 'настройка пина b3 на вход(S1)
Config Portb.2 = Output 'настройка пина b2 на выход(LED1)
Dim N As Byte ' Объявляем переменную N как байт
Do 'начало цикла
If Pinb.3 = 0 Then 'опрос кнопки и присвоение переменной N соответствующего значения
Waitms 10 ' задержка антидребезга
Bitwait Pinb.3 , Set 'ждём отпускания кнопки
N = N + 1 'с каждым нажатием увеличиваем N на 1
End If
If N = 3 Then Portb.2 = 1 Else Portb.2 = 0 ' 0 /@
If N = 3 Then waitms 100 ' Если светит, ждём 0,1С (моргаем)
If N = 3 Then N = 0 'N равен 3, то обнуляем
Loop 'конец цикла
End
$regfile = "attiny2313.dat"
$crystal = 8000000
Config Portb.3 = Input 'настройка пина b3 на вход(S1)
Config Portb.2 = Output 'настройка пина b2 на выход(LED1)
Dim N As Byte ' Объявляем переменную N как байт
Do 'начало цикла
If Pinb.3 = 0 Then 'опрос кнопки и присвоение переменной N соответствующего значения
Waitms 10 ' задержка антидребезга
Bitwait Pinb.3 , Set 'ждём отпускания кнопки
N = N + 1 'с каждым нажатием увеличиваем N на 1
End If
If N = 3 Then Portb.2 = 1 Else Portb.2 = 0 ' 0 /@
If N = 3 Then waitms 100 ' Если светит, ждём 0,1С (моргаем)
If N = 3 Then N = 0 'N равен 3, то обнуляем
Loop 'конец цикла
End
Немного причешу ваш код
Чтобы в Протеусе показывало правильно уберите галочку с фьюза CKDIV8.
Код: Выделить всё
$regfile = "attiny2313.dat"
$crystal = 8000000
Config Pinb.3 = Input 'настройка пина b3 на вход(S1)
Config Portb.2 = Output 'настройка пина b2 на выход(LED1)
Dim N As Byte ' Объявляем переменную N как байт
Config Debounce = 150 ' антидребезг
Reset Portb.2
N = 0
Do
If Pinb.3 = 0 Then
Bitwait Pinb.3 , Set
Incr N
If N = 3 Then
Set Portb.2
Waitms 100
Reset Portb.2
N = 0
End If
End If
Loop 'конец цикла
EndНе могу понять в чем дело-по прерыванию INT0 аттини2313а не просыпается,может еще чего не хватает?
$Crystal = 4000000
Config PORTB.2 = Output
Config Int0 = Low Level
On Int0 Button:
Enable Interrupts
Enable Int0
Do
Set PORTB.2
Wait 1
Reset PORTB.2
Powerdown
Loop
Button:
'Gifr = 64 'Wait 1
Return
End
Спойлер
$Regfile = "attiny2313a.dat"$Crystal = 4000000
Config PORTB.2 = Output
Config Int0 = Low Level
On Int0 Button:
Enable Interrupts
Enable Int0
Do
Set PORTB.2
Wait 1
Reset PORTB.2
Powerdown
Loop
Button:
'Gifr = 64 'Wait 1
Return
End
У меня работает Ваш код.
$crystal = 4000000
Config PORTB.2 = Output
Config Int0 = Low Level
Set Portd.2
On Int0 Button
Enable Interrupts
Enable Int0
Do
Set PORTB.2
Wait 1
Reset PORTB.2
Powerdown
Loop
Button:
'Gifr = 64 'Wait 1
Return
End
Убрал двоеточие после "On Int0 Button" (не влияет ни на что) и добавил "Set Portd.2", чтобы не паять резистор к плюсу.
Спойлер
$Regfile = "attiny2313a.dat"$crystal = 4000000
Config PORTB.2 = Output
Config Int0 = Low Level
Set Portd.2
On Int0 Button
Enable Interrupts
Enable Int0
Do
Set PORTB.2
Wait 1
Reset PORTB.2
Powerdown
Loop
Button:
'Gifr = 64 'Wait 1
Return
End
У меня резистор к плюсу,в Powerdown не просыпался никак,в idle все норм но потребление около 1 ма-так и оставил
Я запускал такты от внутреннего генератора на 8 МГц. Возможно, причина в настройках fuse бит, нужно включить задержку запуска?
ребят нужна помощь. есть код такой
код работает так. при T более 27 градусов реле включает нагрузку- вентиляторы. соответственно менее 27 реле не включается. НО
при таком коде считывается данные термодатчика каждую секунду, из за чего постоянно включается \выключается реле.
подскажите как изменить код так, что бы работало след образом -
1. измерял температуру не каждую секунду, а раз в 10 минут.
2. прошло 10 минут - измерил, если более 27 включил реле, снизил до 27 и выключился.
помогите пожалуйста!
Спойлер
Код: Выделить всё
Do
1wreset
If Err = 1 Then
Cls
Lcd "Err"
Do
Loop
Else
1wwrite &HCC
1wwrite &H44
Waitms 750
1wreset
1wwrite &HCC
1wwrite &HBE
A = 1wread()
B = 1wread()
If A > 248 Then
A = &HFF - A
B = &HFF - B
E = 2
Else
E = 1
End If
C = A / 16
D = B * 16
C = C + D
If E = 2 Then C = C + 1
If E = 1 And C = 0 Then E = 0
Cls
Lcd "V O D A= "
If E = 0 Then Lcd " " ; C ; "'" ; "C"
If E = 1 Then Lcd "+" ; C ; "'" ; "C"
If E = 2 Then Lcd "-" ; C ; "'" ; "C"
End If
If C <= 27 Then ' разМЫКАЕТ 2 И 3 контакт сверху реле . зеленый диод на реле ГОРИТ. это для ВыкЛЮЧЕНИЯ вентиляторов.
Reset Out_1
Locate 2 , 1
Lcd "C O O L E R O F F"
End If
If C > 27 Then ' в ином случае Замыкает 2 и 3 контакт сверху реле . зеленый диод на реле НЕ горит. это для ВКЛЮЧЕНИЯ вентиляторов.
Set Out_1
Locate 2 , 1
Lcd "C O O L E R O N"
End If
при таком коде считывается данные термодатчика каждую секунду, из за чего постоянно включается \выключается реле.
подскажите как изменить код так, что бы работало след образом -
1. измерял температуру не каждую секунду, а раз в 10 минут.
2. прошло 10 минут - измерил, если более 27 включил реле, снизил до 27 и выключился.
помогите пожалуйста!
[uquote="domrustika",url="/forum/viewtopic.php?p=3436182#p3436182"]снизил до 27 и выключился.[/uquote]
Так не получится. Измерение раз в 10 минут. За это время температура может снизиться и до 20 градусов и ниже. Отсчет времени лучше всего делать по прерыванию таймера. Берете переменную, в обработчике прерывания таймера инкременируете ее. Когда она достигает определенного значения, меряете температуру, переменную сбрасываете в ноль. Включаете вентилятор. Но вентилятор будет крутить до следующего измерения.
Так не получится. Измерение раз в 10 минут. За это время температура может снизиться и до 20 градусов и ниже. Отсчет времени лучше всего делать по прерыванию таймера. Берете переменную, в обработчике прерывания таймера инкременируете ее. Когда она достигает определенного значения, меряете температуру, переменную сбрасываете в ноль. Включаете вентилятор. Но вентилятор будет крутить до следующего измерения.
спасибо! но было бы хорошо , если бы написали код как это будет выглядеть.

сам так не смогу написать
сам так не смогу написать
Этот код вообще не должен работать
Do
1wreset
If Err = 1 Then
Cls
Lcd "Err"
Do <<<<<<<<<
Loop <<<<<<<<<< Шта энто? как отсюда выбраться?
Do
1wreset
If Err = 1 Then
Cls
Lcd "Err"
Do <<<<<<<<<
Loop <<<<<<<<<< Шта энто? как отсюда выбраться?
Так, видимо, и не планировалось оттуда выбираться. Если датчика нет, то усё, приехали. 
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
- Сообщения: 5
- Зарегистрирован: Пт май 13, 2011 18:45:36
BASCOM-AVR 2.0.8.1 и BASCOM-8051 2.0.16.0 http://rutracker.org/forum/viewtopic.php?t=5607303


