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

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
TRIOD
Вымогатель припоя
Сообщения: 693
Зарегистрирован: Вт сен 15, 2009 16:23:06
Откуда: Москва

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

Сообщение 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




Может кто подскажет как организовать мигание разрадов с частотой в один герц. Нужно это для часов которые в режиме установки времени мегают цифрами часов, минут,секунд показывая что конкретно выставляем. Просто некак непойму как совместить динамическую индикацию и мигание цифр.
Только абсолютная пустота бездны принесёт мне покой.
Аватара пользователя
Magicanin
Нашел транзистор. Понюхал.
Сообщения: 184
Зарегистрирован: Чт янв 13, 2011 11:36:16
Откуда: Красноярский край

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

Сообщение Magicanin »

Уважаемые Коты, подскажите библиотеку для LСD Siemens C55/A55/A52.
Контроллер LPH8694-3
Уже пальцы в мозолях, а внятной Lib для барсика не нашел.
Или хотябы наводку в нужном направлении.
[size=85][color=#80BF00][b]Извращение это[/b][/color]: программатор - [color=#40BFBF]AVR910 by Prottoss[/color], прошивка - [color=#40BFBF]Doper[/color], драйвер - [color=#40BFBF]Osamu Tamura[/color], называется - [color=#FF0000]STK500[/color]![/size]
Аватара пользователя
amv2000
Опытный кот
Сообщения: 717
Зарегистрирован: Вт апр 26, 2011 13:58:36
Откуда: Ростовская область

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

Сообщение amv2000 »

Magicanin писал(а):Уважаемые Коты, подскажите библиотеку для LСD Siemens C55/A55/A52.
Контроллер LPH8694-3
Уже пальцы в мозолях, а внятной Lib для барсика не нашел.
Или хотябы наводку в нужном направлении.
Наверное в Bascome врят ли найдется, на СИ встречался на сайте http://bascomavr.3bb.ru/ караван делал библиотеки может и под него есть или поможет в написании...
Аватара пользователя
amv2000
Опытный кот
Сообщения: 717
Зарегистрирован: Вт апр 26, 2011 13:58:36
Откуда: Ростовская область

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

Сообщение amv2000 »

TRIOD писал(а):Может кто подскажет как организовать мигание разрадов с частотой в один герц. Нужно это для часов которые в режиме установки времени мегают цифрами часов, минут,секунд показывая что конкретно выставляем. Просто некак непойму как совместить динамическую индикацию и мигание цифр.

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

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

Сообщение edm2007 »

По поводу регулировки яркости я тут более подробно расписал, да и вообще немного изменил код. Теперь чем больше значение тем выше яркость. Может кому и пригодится. Семисегментные светодиодные индикаторы. Часть 4. Регулируем яркость.

Что же касается мигания, то полностью с этой задачей не разбирался (хотя задача интересная). Я так заметил что важно одно: чтобы при изменении значений мигание прекращалось, так как трудно устанавливать значения... В своих же часах просто сделал так:

Изображение

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

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

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

Доброго времени суток, уважаемые знатоки !

Помогите решить задачу: Нужно в EEPROM записать некие константы, чтобы при старте программа их считывала при старте. И еще иногда эти константы нужно менять (очень редко, для настройки девайса под себя).
Как это можно реализовать ? Начитался примеров от Декады - что-то никак не въеду...
Понял, что есть readeeprom и writeeeprom, но как записать число в определенную ячейку и как его потом считать именно оттуда ?...
С уважением,
Алексей.
Аватара пользователя
amv2000
Опытный кот
Сообщения: 717
Зарегистрирован: Вт апр 26, 2011 13:58:36
Откуда: Ростовская область

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

Сообщение 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
Аватара пользователя
edm2007
Поставщик валерьянки для Кота
Сообщения: 2255
Зарегистрирован: Вт апр 21, 2009 22:24:10
Откуда: Иркутск
Контактная информация:

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

Сообщение 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 переменная, номер ячейки - помещаем значение переменной в указанную ячейку.
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
Аватара пользователя
Gordon Shumway
Мучитель микросхем
Сообщения: 485
Зарегистрирован: Пн авг 20, 2007 21:35:45
Откуда: Мытищи, Московская область
Контактная информация:

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

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

edm2007 писал(а):Резюмируем:

Readeeprom переменная, номер ячейки - забираем в переменную значение из указанной ячейки.

Writeeeprom переменная, номер ячейки - помещаем значение переменной в указанную ячейку.


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

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

Сообщение edm2007 »

Пожалуйста. :)
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
Аватара пользователя
kip96
Держит паяльник хвостом
Сообщения: 965
Зарегистрирован: Ср авг 26, 2009 08:24:50
Откуда: 1300км от Пупа

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

Сообщение kip96 »

Если нет необходимости в определённой ячейке, то можно проще:

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

 Dim A As Byte
 Dim Aeep As Eram Byte
 '----------
 'старт программы
 A = Aeep
 '
 Do
 '
 Gosub изменение
 '
 Loop

 Изменение:
 Incr A
 Aeep = A
 return

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

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

Сообщение edm2007 »

Да, разумеется. Только 2 комплекта переменных надо... И "BASCOM AVR всё сам делает" тоже не всегда хорошо, он и при обработке прерывания ВСЕ регистры в стек сохраняет, допустим... Лично я хочу видеть и знать куда и что помещается (для отладки в том же Proteus, например).
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
Delta
Родился
Сообщения: 5
Зарегистрирован: Сб июн 21, 2008 21:07:39

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

Сообщение Delta »

Доброго времени суток, уважаемые коты. А не завалялся ли у кого кусок готового кода для вычисления квадратного корня под Bascom? Алгоритм нашел, а вот описать - что-то перемудреное получается.
Radan
Мучитель микросхем
Сообщения: 465
Зарегистрирован: Ср июн 21, 2006 08:24:32
Откуда: Лисичанск
Контактная информация:

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

Сообщение Radan »

Delta писал(а):Доброго времени суток, уважаемые коты. А не завалялся ли у кого кусок готового кода для вычисления квадратного корня под Bascom? Алгоритм нашел, а вот описать - что-то перемудреное получается.

A =Sqr(9)
Print A ' prints 3
Аватара пользователя
Gordon Shumway
Мучитель микросхем
Сообщения: 485
Зарегистрирован: Пн авг 20, 2007 21:35:45
Откуда: Мытищи, Московская область
Контактная информация:

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

Сообщение 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
С уважением,
Алексей.
Delta
Родился
Сообщения: 5
Зарегистрирован: Сб июн 21, 2008 21:07:39

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

Сообщение Delta »

ААаааа!
Вот я туплю! Нужно больше отдыхать :)
А то начал по методу Ньюона считать.
Спасибо, коты!
Аватара пользователя
kkozyrev
Открыл глаза
Сообщения: 67
Зарегистрирован: Пт дек 11, 2009 02:40:44
Откуда: C-Петербург
Контактная информация:

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

Сообщение kkozyrev »

не расскажет ли кто-нибудь как в баскоме работать с внешней памятью?
может у кого есть готовый кусочек кода под внешний I2C EEPROM серии 24LCxxx?

даташит я почитал. кое что понял, но на готовом примере было бы проще разобраться.
не судите, я учусь -)
Аватара пользователя
Magicanin
Нашел транзистор. Понюхал.
Сообщения: 184
Зарегистрирован: Чт янв 13, 2011 11:36:16
Откуда: Красноярский край

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

Сообщение 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
[size=85][color=#80BF00][b]Извращение это[/b][/color]: программатор - [color=#40BFBF]AVR910 by Prottoss[/color], прошивка - [color=#40BFBF]Doper[/color], драйвер - [color=#40BFBF]Osamu Tamura[/color], называется - [color=#FF0000]STK500[/color]![/size]
Аватара пользователя
kkozyrev
Открыл глаза
Сообщения: 67
Зарегистрирован: Пт дек 11, 2009 02:40:44
Откуда: C-Петербург
Контактная информация:

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

Сообщение kkozyrev »

спасибо
не судите, я учусь -)
Aleks8383
Родился
Сообщения: 19
Зарегистрирован: Ср ноя 24, 2010 21:44:30
Откуда: Мичуринск

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

Сообщение 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
Ответить

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