Страница 97 из 304
Re: BASCOM AVR в вопросах и ответах
Добавлено: Чт авг 11, 2011 07:58:26
TRIOD
Доброе время суток.
Вот есть код динамической индикации с регулировкой яркости от
edm2007
Код: Выделить всё
$regfile = "attiny2313.dat" ' тип МК
$crystal = 4000000 ' выбор кристала для расчета задержек
'***[Определение переменных и констант]***
Dim Count As Byte
Dim I(3) As Byte ' три разряда
'***[Инициализация прерываний]***
' конфигурируем таймер (ТАЙМЕР ПРИ СОВПАДЕНИИ НЕ СБРАСЫВАЕМ)
Config Timer0 = Timer , Prescale = 64 , Clear Timer = 0
On Oc0a Refresh ' обзываем прерывание индикации
On Ovf0 Res_ind ' гашение индикации
Ocr0a = 100 ' регистр совпадения
Enable Interrupts ' разрешаем все прерывания
Enable Oc0a ' и для таймера в частности
Enable Ovf0
'***[Присвоение уникальных имен]***
Dig1 Alias Portd.4 ' обзываем разряды
Dig2 Alias Portd.5
Dig3 Alias Portd.6
'***[Начало основной программы]***
I(1) = 3
I(2) = 2
I(3) = 1
Do
Loop
End
'***[Процедуры обработки прерываний]***
Refresh: ' прерывание индикации (каждые 4 мс)
Reset Dig1 : Reset Dig2 : Reset Dig3
Incr Count : If Count > 3 Then Count = 1
Portb = Lookup(i(count) , Digits)
Select Case Count
Case 1 : Set Dig1
Case 2 : Set Dig2
Case 3 : Set Dig3
End Select
Return
'-------------------------
Res_ind: ' прерывание по переполнению
Reset Dig1 : Reset Dig2 : Reset Dig3
Return
Может кто подскажет как организовать мигание разрадов с частотой в один герц. Нужно это для часов которые в режиме установки времени мегают цифрами часов, минут,секунд показывая что конкретно выставляем. Просто некак непойму как совместить динамическую индикацию и мигание цифр.
Re: BASCOM AVR в вопросах и ответах
Добавлено: Пн авг 15, 2011 19:21:33
Magicanin
Уважаемые Коты, подскажите библиотеку для LСD Siemens C55/A55/A52.
Контроллер LPH8694-3
Уже пальцы в мозолях, а внятной Lib для барсика не нашел.
Или хотябы наводку в нужном направлении.
Re: BASCOM AVR в вопросах и ответах
Добавлено: Ср авг 17, 2011 19:06:44
amv2000
Magicanin писал(а):Уважаемые Коты, подскажите библиотеку для LСD Siemens C55/A55/A52.
Контроллер LPH8694-3
Уже пальцы в мозолях, а внятной Lib для барсика не нашел.
Или хотябы наводку в нужном направлении.
Наверное в Bascome врят ли найдется, на СИ встречался на сайте
http://bascomavr.3bb.ru/ караван делал библиотеки может и под него есть или поможет в написании...
Re: BASCOM AVR в вопросах и ответах
Добавлено: Ср авг 17, 2011 19:12:43
amv2000
TRIOD писал(а):
Может кто подскажет как организовать мигание разрадов с частотой в один герц. Нужно это для часов которые в режиме установки времени мегают цифрами часов, минут,секунд показывая что конкретно выставляем. Просто некак непойму как совместить динамическую индикацию и мигание цифр.
так может это проделать с задежкой Wait или Waitms, т.е данные на вывод -далее гасим (не выводим) Waitms 1 через 1 сек снова вывод
Re: BASCOM AVR в вопросах и ответах
Добавлено: Ср авг 17, 2011 20:05:54
edm2007
По поводу регулировки яркости я тут более подробно расписал, да и вообще немного изменил код. Теперь чем больше значение тем выше яркость. Может кому и пригодится.
Семисегментные светодиодные индикаторы. Часть 4. Регулируем яркость.
Что же касается мигания, то полностью с этой задачей не разбирался (хотя задача интересная). Я так заметил что важно одно: чтобы при изменении значений мигание прекращалось, так как трудно устанавливать значения... В своих же часах просто сделал так:
Изменяемый параметр естественно есть, вместо минут прочерки, а секунды и не надо устанавливать.

Re: BASCOM AVR в вопросах и ответах
Добавлено: Чт авг 18, 2011 07:02:56
Gordon Shumway
Доброго времени суток, уважаемые знатоки !
Помогите решить задачу: Нужно в EEPROM записать некие константы, чтобы при старте программа их считывала при старте. И еще иногда эти константы нужно менять (очень редко, для настройки девайса под себя).
Как это можно реализовать ? Начитался примеров от Декады - что-то никак не въеду...
Понял, что есть readeeprom и writeeeprom, но как записать число в определенную ячейку и как его потом считать именно оттуда ?...
Re: BASCOM AVR в вопросах и ответах
Добавлено: Чт авг 18, 2011 08:36:35
amv2000
Gordon Shumway писал(а):Доброго времени суток, уважаемые знатоки !
Помогите решить задачу: Нужно в EEPROM записать некие константы, чтобы при старте программа их считывала при старте. И еще иногда эти константы нужно менять (очень редко, для настройки девайса под себя).
Как это можно реализовать ? Начитался примеров от Декады - что-то никак не въеду...
Понял, что есть readeeprom и writeeeprom, но как записать число в определенную ячейку и как его потом считать именно оттуда ?...
в исходнике БП от RAF65 это сделано так
Eeadr = 400 ' начальный адрес записи в еепром
Call Eeread() 'здесь вызов процедур чтения из памяти
Uset_word = Eetmp 'последнего состояние при выключении
Pwm1b = Uset_word 'питания и данныхпосле серв режима
Incr Eeadr
Call Eeread()
Iset_word = Eetmp
Pwm1a = Iset_word
Incr Eeadr
Call Eeread()
Pulstrans = Eetmp
Incr Eeadr
Call Eeread()
Usetmax = Eetmp
Incr Eeadr
Call Eeread()
Isetmax = Eetmp
Здесь подробнее
http://avr.ru/ready/contr/power/power
Re: BASCOM AVR в вопросах и ответах
Добавлено: Чт авг 18, 2011 10:14:01
edm2007
Gordon Shumway, командами
Readeeprom и
Writeeeprom проще некуда. Например, так я делал в своем таймере:
Код: Выделить всё
Dim Minute As Byte , Secunde As Byte ' переменные минут и секунд
..
Readeeprom Minute , 10 ' считываем значение выдержки из eeprom
Readeeprom Secunde , 20
If Minute > 59 Or Secunde > 59 Then ' если это первое чтение (в eeprom FF)
Minute = 0
Secunde = 30
Writeeeprom Minute , 10 ' записываем в eeprom 0:30
Writeeeprom Secunde , 20
End If
..
тут кнопками изменили значение выдержки...
..
Writeeeprom Minute , 10 ' запись в eeprom нового значения выдержки
Writeeeprom Secunde , 20
Все просто и понятно, вроде. Сначала при первом включении считываем в переменные минут и секунд значения из 10 и 20 ячейки eeprom. А так как там значения FF, то перепишем по умолчанию 0 минут : 30 секунд в эти же ячейки. А когда кнопками меняем значение выдержки то пишем новые значения. Все просто.
Есть только одно НО ! Тип переменных не должен быть больше Byte (так как значение ячейки максимум 255). Конечно можно и огромную переменную записать, но немного иначе...
Резюмируем:
Readeeprom переменная, номер ячейки -
забираем в переменную значение из указанной ячейки.
Writeeeprom переменная, номер ячейки -
помещаем значение переменной в указанную ячейку.
Re: BASCOM AVR в вопросах и ответах
Добавлено: Чт авг 18, 2011 12:58:25
Gordon Shumway
edm2007 писал(а):
Резюмируем:
Readeeprom переменная, номер ячейки - забираем в переменную значение из указанной ячейки.
Writeeeprom переменная, номер ячейки - помещаем значение переменной в указанную ячейку.
Спасибо ! все оказалось просто

Видимо мозги на жаре сплавились...
Попробовал - работает !

Re: BASCOM AVR в вопросах и ответах
Добавлено: Чт авг 18, 2011 13:02:10
edm2007
Пожалуйста.

Re: BASCOM AVR в вопросах и ответах
Добавлено: Чт авг 18, 2011 13:41:47
kip96
Если нет необходимости в определённой ячейке, то можно проще:
Код: Выделить всё
Dim A As Byte
Dim Aeep As Eram Byte
'-------------------
'старт программы
A = Aeep
'
Do
'
Gosub изменение
'
Loop
Изменение:
Incr A
Aeep = A
return
при этом любую перменную, на то он и BASCOM AVR, всё сам делает.
Re: BASCOM AVR в вопросах и ответах
Добавлено: Чт авг 18, 2011 13:45:39
edm2007
Да, разумеется. Только 2 комплекта переменных надо... И "BASCOM AVR всё сам делает" тоже не всегда хорошо, он и при обработке прерывания ВСЕ регистры в стек сохраняет, допустим... Лично я хочу видеть и знать куда и что помещается (для отладки в том же Proteus, например).
Re: BASCOM AVR в вопросах и ответах
Добавлено: Сб авг 20, 2011 11:38:31
Delta
Доброго времени суток, уважаемые коты. А не завалялся ли у кого кусок готового кода для вычисления квадратного корня под Bascom? Алгоритм нашел, а вот описать - что-то перемудреное получается.
Re: BASCOM AVR в вопросах и ответах
Добавлено: Сб авг 20, 2011 12:02:13
Radan
Delta писал(а):Доброго времени суток, уважаемые коты. А не завалялся ли у кого кусок готового кода для вычисления квадратного корня под Bascom? Алгоритм нашел, а вот описать - что-то перемудреное получается.
A =Sqr(9)
Print A ' prints 3
Re: BASCOM AVR в вопросах и ответах
Добавлено: Сб авг 20, 2011 12:10:29
Gordon Shumway
Delta писал(а):Доброго времени суток, уважаемые коты. А не завалялся ли у кого кусок готового кода для вычисления квадратного корня под Bascom? Алгоритм нашел, а вот описать - что-то перемудреное получается.
Код: Выделить всё
Dim A As Single
Dim B As Single
Do
Input "A-?" , A 'вводим значение A
B = Sqr(a) 'вычисляем квадратный корень из A,
'печатаем результат
Print "B=" ; B
Loop
Re: BASCOM AVR в вопросах и ответах
Добавлено: Сб авг 20, 2011 13:18:28
Delta
ААаааа!
Вот я туплю! Нужно больше отдыхать

А то начал по методу Ньюона считать.
Спасибо, коты!
Re: BASCOM AVR в вопросах и ответах
Добавлено: Пн авг 22, 2011 12:42:23
kkozyrev
не расскажет ли кто-нибудь как в баскоме работать с внешней памятью?
может у кого есть готовый кусочек кода под внешний I2C EEPROM серии 24LCxxx?
даташит я почитал. кое что понял, но на готовом примере было бы проще разобраться.
Re: BASCOM AVR в вопросах и ответах
Добавлено: Пн авг 22, 2011 15:42:16
Magicanin
kkozyrev писал(а):не расскажет ли кто-нибудь как в баскоме работать с внешней памятью?
может у кого есть готовый кусочек кода под внешний I2C EEPROM серии 24LCxxx?
Код: Выделить всё
...
Config Scl = Portc.0 'Is serial clock SCL
Config Sda = Portc.1 'Is serial data SDa
...
Dim Adres As Byte , Value As Byte
...
Declare Sub Write_eeprom(byval Adres As Byte , Byval Value As Byte)
Declare Sub Read_eeprom(byval Adres As Byte , Value As Byte)
...
Const Addressw = &B10100000 'slave writeaddress
Const Addressr = &B10100001 'slave readaddress
...
Call Read_eeprom(adres , Value)
Call Write_eeprom(adres , Value)
...
'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Sub Write_eeprom(byval Adres As Byte , Byval Value As Byte)
I2cstart 'start condition
I2cwbyte Addressw 'slave address
I2cwbyte Adres 'asdress of EEPROM
I2cwbyte Value 'value to write
I2cstop 'stop condition
Waitms 10 'wait for 10milliseconds
End Sub
'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Sub Read_eeprom(byval Adres As Byte , Value As Byte)
I2cstart 'generate start
I2cwbyte Addressw 'slave adsress
I2cwbyte Adres 'address of EEPROM
I2cstart 'repeated start
I2cwbyte Addressr 'slave address(read)
I2crbyte Value , Nack 'read byte
I2cstop 'generate stop
End Sub
Re: BASCOM AVR в вопросах и ответах
Добавлено: Пн авг 22, 2011 17:19:53
kkozyrev
спасибо
Re: BASCOM AVR в вопросах и ответах
Добавлено: Пн авг 22, 2011 17:55:06
Aleks8383
Попреветствую всех,делаю вольтметр с 3 пределами измерения 5,50 и 100в.Чего то я не как не разберусь что не так делаю.Сначало включается предел 5 вольт все нормально работает,сделал по прерыванию INT0 переключение пределов так вот с 5 переключает на 50 и всё не влево не вправо не переклячает .Посмотрите код что я там на бедакурил,конт.Atmega 8.
Код: Выделить всё
$regfile = "m8def.dat" ' atmega8
$crystal = 4000000 ' частота установленного кварца 4 mHz
'указываем конфигурацию подключения дисплея к портам МК
Config Lcdpin = Pin , Rs = Portb.5 , E = Portb.4 , Db4 = Portb.3 , Db5 = Portb.2 , Db6 = Portb.1 , Db7 = Portd.6
Config Lcd = 16 * 2 'используем дисплей на 2 строчки по 16 знакомест в каждой
Config Adc = Single , Prescaler = Auto , Reference = Avcc 'конфигурация АЦП
Config Portd = &B1101111
Config Pind.2 = Input
Config Pinc.0 = Input
'объявляем переменные
Dim W As Word
Dim U As Single
Dim Ulcd As Single
Dim A As Word
Dim B As Word
Dim C As Single
Declare Sub Limit1
Declare Sub Limit2
Declare Sub Limit3
Declare Sub Alarm
On Int0 Button
Config Int0 = Rising 'конфигурируем прерывание по фронту сигнала
Config Debounce = 50
Const Debouncetime = 50
Enable Interrupts 'разрешаем прерывание и в частности INT0
Enable Int0
'главный цикл программы
Portd.0 = 1 'включаем реле 1 делителя
U = 0.00488755 'устанавливаем начальные коэф.для 5 в
A = 5
C = 4.95
Start Adc 'запускаем аналого-цифровое преобразование
Do
'здесь проверяем установленные переменные и если надо переходим к подпрограммам установки переменных
If U > 0.00488755 Then
Goto Limit1
End If
M1:
If U > 0.04887585 Then
Goto Limit2
End If
M2:
If U > 0.09775171 Then
Goto Limit3
End If
M3:
W = Getadc(0) ' измеряем напряжение по входу 0 (РС.0)
Ulcd = U * W ' умножаем что получилось на коэфициент
If Ulcd > C Then 'проверяем на предельное напряжение и если надо переходим к подпрограмме индикации предела
Goto Alarm
End If
M4:
Locate 1 , 1 'выводим на экран
Lcd "Voltage"
Locate 2 , 1
Lcd "U=" ; Fusing(ulcd , "##.#") ; " B "
Locate 1 , 12
Lcd "limit"
Locate 2 , 12
Lcd A
Locate 2 , 15
Lcd "B"
Waitms 100
Loop
Button: 'обработка прерывания
Incr U
Waitms Debouncetime
Gifr = 64
Return
'подпрограмма 1 установка 50в
Sub Limit1
If U > 0.00488755 Then
Portd.0 = 0 'выключаем реле 1 делителя
Portd.1 = 1 'включаем реле 2 делителя
U = 0.04887585 'устанавливаем коэф.для измерения
A = 50 'устанавливаем предел на индикацию
C = 49.95 'устанавливаем предел для защиты
End If
Goto M2
End Sub
Sub Limit2 'подпрограмма 2 установка 100в
If U > 0.04887585 Then
Portd.1 = 0 'выключаем реле 2 делителя
Portd.3 = 1 'включаем реле 3 делителя
U = 0.09775171
A = 100
C = 99.95
End If
Goto M3
End Sub
Sub Limit3 'подпрограмма 3 установка 5в
If U > 0.09775171 Then
Portd.3 = 0 'выключаем реле 3 делителя
Portd.0 = 1 'включаем реле 1 делителя
U = 0.00488755
A = 5
C = 4.95
End If
Goto M1
End Sub
'подпрограмма предела измерений
Sub Alarm
Portd.5 = 1 'включаем реле блокировки входа
Cls
Cursor Off 'подаём сигнал и индикацию предела
Sound , Portd.4 , 200 , 300
Locate 1 , 5
Lcd "LIMIT"
Wait 2
Portd.5 = 0 'выключаем реле блокировки входа
Goto M4
End Sub
End