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

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
pavel123
Грызет канифоль
Сообщения: 268
Зарегистрирован: Чт май 17, 2007 09:44:13
Откуда: Украина, г. Кривой Рог

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

Сообщение pavel123 »

Да собственно это вся программка и есть...
Спойлер

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

$regfile = "m8def.dat"
$crystal = 8000000
$hwstack = 32
$swstack = 16
$framesize = 16

$lib "ds1307clock.lib"

Config Lcd = 16 * 2
Config Lcdpin = Pin , E = Portd.1 , Rs = Portd.0 , Db7 = Portc.3 , Db6 = Portc.4 , Db5 = Portc.2 , Db4 = Portc.5
Config Lcdmode = Port

Config Sda = Portd.6
Config Scl = Portd.5

Dim Weekday As Byte

Dim Registr_driver_bin As Byte                              'переменная для чтения регистра управления
Dim Registr_driver_dec As Integer

Const Ds3231w = &HD0
Const Ds3231r = &HD1
Const Upradress = &H0E
Config Clock = User

I2cstart                                                            'установка 
I2cwbyte Ds3231w                                            'регистра управления на
I2cwbyte Upradress                                           'секундные импулься
I2cwbyte &B00100000                                        '
I2cstop

I2cstart
I2cwbyte Ds3231w
I2cwbyte Upradress
I2cstart
I2cwbyte Ds3231r
I2crbyte Registr_driver_bin , Nack
I2cstop

Registr_driver_dec = Binval(registr_driver_bin)      'преобраование bin  в dec

Lcd Registr_driver_dec
End 
Библиотека ds1307clock.lib стандартная из примеров к баскому. Подходит для Ds3231. Часы и дата устанавливаются, секундные импульсы в наличии. Часы нормально идут.
А вот прочитать регистр управления не получается. Выдает ерунду... То 0, то 240...
Я хочу сделать проверку, чтоб при каждом рестарте программы, регистр управления лишний раз не дергать...
Реклама
Аватара пользователя
edm2007
Поставщик валерьянки для Кота
Сообщения: 2255
Зарегистрирован: Вт апр 21, 2009 22:24:10
Откуда: Иркутск
Контактная информация:

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

Сообщение edm2007 »

Binval преобразует строковое представление двоичного числа в число. В RTC же данные хранятся в двоично-десятичном виде, потому Вам нужна Makedec.

Почитайте про двоично-десятичное представление числа, и все станет понятно. Вы обязательно должны делать преобразование туда-обратно, благо, для этого есть парные Makedec и Makebcd. Думаю, так будет понятнее:

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

Dim Registr_driver_dec As Byte                              'переменная для чтения регистра управления в DEC виде
Dim Registr_driver_bindec As Byte                           'переменная для чтения регистра управления в BCD виде

Registr_driver_dec = 123                                                  ' значение в dec формате
Registr_driver_bindec = Makebcd(registr_driver_dec)          ' преобразуем в bcd формат, понятный микросхеме

I2cstart                                                                            ' пишем
I2cwbyte Ds3231w
I2cwbyte Upradress
I2cwbyte Registr_driver_bindec
I2cstop

I2cstart                                                                            ' читаем в bcd формате
I2cwbyte Ds3231w
I2cwbyte Upradress
I2cstart
I2cwbyte Ds3231r
I2crbyte Registr_driver_bindec , Nack
I2cstop

Registr_driver_dec = Makedec(registr_driver_bindec)         'преобразование bindec  в dec
Точно так же необходимо поступать с часами / минутами / секундами.
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
Реклама
Аватара пользователя
Tankor
Встал на лапы
Сообщения: 139
Зарегистрирован: Вт май 03, 2011 10:13:12
Откуда: Россия, Татарстан

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

Сообщение Tankor »

Пришло время оптимизации кода, т.к. не влазит прошивка. Хотел начать с циклов и пришёл в ступор. Пример:
Вот это в баскоме:
Элементы массива Integer
For I = 1 To 12
D(i)=W(i)
Next I
Перевести в асм. Вроде начало понятно, но как приравнивать элементы массива не понимаю.
Push R31
In R31, SREG
Push R31
LDI R31,1
Loop: NOP
...
Вот тут ступор и возник. Понимаю, что необходим адрес ячейки памяти откуда взять. Как взять тоже не понимаю.
...
Incr R31
CPI R31,12
brne Loop
pop R31
out SREG,R31
pop R31
Аватара пользователя
Tankor
Встал на лапы
Сообщения: 139
Зарегистрирован: Вт май 03, 2011 10:13:12
Откуда: Россия, Татарстан

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

Сообщение Tankor »

edm2007 писал(а):Binval преобразует строковое представление двоичного числа в число. В RTC же данные хранятся в двоично-десятичном виде, потому Вам нужна Makedec.

Почитайте про двоично-десятичное представление числа, и все станет понятно. Вы обязательно должны делать преобразование туда-обратно, благо, для этого есть парные Makedec и Makebcd. Думаю, так будет понятнее:

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

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

Сообщение edm2007 »

Тут важно понять двоично-десятичное представление. На карте регистров для того же DS1307 прекрасно видно не только по каким адресам что находится, но и как оно распределяется по тетрадам:

Изображение

Видно, что по адресу 01H у нас минуты, например. При этом в старшей части десятки, а в младшей - единицы. Допустим, у нас есть наша переменная минут, в привычном виде. Для записи в микросхему часов ее значение необходимо перевести в двоично-десятичное:

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

минуты в десятичном виде, для разноса по индикаторам = 32

минуты в двоично-десятичном виде для DS1307 = Makebcd(минуты в десятичном виде, для разноса по индикаторам)

записываем в DS1307 переменную "минуты в двоично-десятичном виде для DS1307".
Команда Makebcd сама преобразует значение 32 в понятное для микросхемы значение 3 в старшей тетраде и 2 в младшей. В итоге запишется 0011(3) 0010(2) = 00110010.

Для регистров времени так удобнее, потому как приходится иметь дело с индикаторами, например. Для которых удобнее разнос по разрядам индикаторов, инкремент/декремент значений в меню, и только потом запись в RTC. Но никто не мешает поглядеть в регистр конфигурации 07H и самому составить весь байт. Допустим, мы хотим включить генерацию на выводе SQW/OUT с частотой 32768 Гц. Выставляем бит SQWE и конфигурируем RS1 = 1, RS0 = 1. Записываем 0001 (SQWE = 1) 0011 (RS1 = 1, RS0 = 1). Пишем по адресу 07 число 00010011 без всяких преобразований.
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
Реклама
Аватара пользователя
Tankor
Встал на лапы
Сообщения: 139
Зарегистрирован: Вт май 03, 2011 10:13:12
Откуда: Россия, Татарстан

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

Сообщение Tankor »

edm2007 писал(а):Тут важно понять двоично-десятичное представление. На карте регистров для того же DS1307 прекрасно видно не только по каким адресам что находится, но и как оно распределяется по тетрадам:

Изображение

Видно, что по адресу 01H у нас минуты, например. При этом в старшей части десятки, а в младшей - единицы. Допустим, у нас есть наша переменная минут, в привычном виде. Для записи в микросхему часов ее значение необходимо перевести в двоично-десятичное:

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

минуты в десятичном виде, для разноса по индикаторам = 32

минуты в двоично-десятичном виде для DS1307 = Makebcd(минуты в десятичном виде, для разноса по индикаторам)

записываем в DS1307 переменную "минуты в двоично-десятичном виде для DS1307".
Команда Makebcd сама преобразует значение 32 в понятное для микросхемы значение 3 в старшей тетраде и 2 в младшей. В итоге запишется 0011(3) 0010(2) = 00110010.

Для регистров времени так удобнее, потому как приходится иметь дело с индикаторами, например. Для которых удобнее разнос по разрядам индикаторов, инкремент/декремент значений в меню, и только потом запись в RTC. Но никто не мешает поглядеть в регистр конфигурации 07H и самому составить весь байт. Допустим, мы хотим включить генерацию на выводе SQW/OUT с частотой 32768 Гц. Выставляем бит SQWE и конфигурируем RS1 = 1, RS0 = 1. Записываем 0001 (SQWE = 1) 0011 (RS1 = 1, RS0 = 1). Пишем по адресу 07 число 00010011 без всяких преобразований.
Это понятно, но в DS3231 в регистрах будильника 7-ой бит отвечает за их конфигурацию (т.е. по каким критериям происходит сравнение). Вот и был вопрос установка или сброс бита до преобразования или после. Теперь понял, что после преобразования.
Реклама
Аватара пользователя
edm2007
Поставщик валерьянки для Кота
Сообщения: 2255
Зарегистрирован: Вт апр 21, 2009 22:24:10
Откуда: Иркутск
Контактная информация:

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

Сообщение edm2007 »

Tankor писал(а):Это понятно
Ну надо полагать. Раз Вы на АСМе пишете, то такие азы Вам явно известны. Я просто развернуто написал про все сразу, продолжая беседу для предыдущих постов. Часы / минуты / секунды / года и прочие дни недели удобнее преобразовывать перед записью (ибо удобнее в привычном виде с ними работать), а конфигурацию проще напрямую писать, мне кажется...
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
Аватара пользователя
Tankor
Встал на лапы
Сообщения: 139
Зарегистрирован: Вт май 03, 2011 10:13:12
Откуда: Россия, Татарстан

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

Сообщение Tankor »

edm2007 писал(а):
Tankor писал(а):Это понятно
Ну надо полагать. Раз Вы на АСМе пишете, то такие азы Вам явно известны. Я просто развернуто написал про все сразу, продолжая беседу для предыдущих постов. Часы / минуты / секунды / года и прочие дни недели удобнее преобразовывать перед записью (ибо удобнее в привычном виде с ними работать), а конфигурацию проще напрямую писать, мне кажется...
На асме писал ещё на синклере- это было давно, всё изменилось с тех пор и стало сложнее. Не практиковался более 15 лет, вот решил... Но на предыдущий пост по асму так ответа пока не нашёл.
Oleg-galaxy
Родился
Сообщения: 5
Зарегистрирован: Вс янв 31, 2010 21:08:11

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

Сообщение Oleg-galaxy »

Вечер добрый всем.Очень нужна помощь в написании простой программы. Алгоритм такой. При повороте энкодера вправо более чем на 300 имп. должен появиться импульс 2 сек. на PORTB.1. Далее при повороте влево назад как только попадаем в зону нуля (-100....+100) появляется такой же импульс но на выводе PORTB.3. При повороте энкодера влево принцип такой же, только выводы PORTB.2 и PORTB.4 соответственно. Сам сначала делал для постоянного сигнала на выводах, вот так
$regfile = "m8def.dat"
$crystal = 8000000

Config Lcdpin = Pin , Db4 = Portc.3 , Db5 = Portc.2 , Db6 = Portc.1 , Db7 = Portc.0 , E = Portc.4 , Rs = Portc.5
Config Lcd = 16 * 2

Dim Conl As Byte
Dim Con As Byte
Dim Con_n As Integer
Dim I As Integer

Initlcd
Cursor Off
Cls
Locate 1 , 1
Lcd "**Rotate sensor**"
Wait 1
Cls

Portd.6 = 1
Portd.7 = 1
Portd.5 = 1
Portb.0 = 1
Portb.1 = 1
Portb.2 = 1
Portb.3 = 1
Portb.4 = 1

Config Portd.6 = Input : Config Portd.7 = Input : Config Portd.5 = Input
Config Portb.0 = Output : Config Portb.1 = Output : Config Portb.2 = Output
Config Portb.3 = Output : Config Portb.4 = Output


Config Timer0 = Timer , Prescale = 8

On Timer0 Tim0:
Enable Timer0
Enable Interrupts

Do
If Con_n <= 100 And Con_n >= -100 Then Portb.0 = 0 Else Portb.0 = 1 'определяем центр
If Con_n >= 300 Then Portb.1 = 0 Else Portb.1 = 1 'правое положение на включение'
If Con_n <= -300 Then Portb.2 = 0 Else Portb.2 = 1 'левое положение на включение'
If Pind.5 = 0 Then Con_n = 0 'установка нуля, центр'
If Pind.5 = 0 Then Lcd "Zero position"
If I <> Con_n Then Lcd Con_n 'вывод на экран для удобства настройки'
I = Con_n
Waitms 5
Cls
Loop


Tim0: 'обработка энкодера'
If Pind.6 = 0 And Pind.7 = 0 Then : Conl = 0 : End If
If Pind.6 = 1 And Pind.7 = 0 Then : Conl = 1 : End If
If Pind.6 = 1 And Pind.7 = 1 Then : Conl = 2 : End If
If Pind.6 = 0 And Pind.7 = 1 Then : Conl = 3 : End If
If Con = 0 And Conl = 1 Then : Incr Con_n : End If
If Con = 1 And Conl = 2 Then : Incr Con_n : End If
If Con = 2 And Conl = 3 Then : Incr Con_n : End If
If Con = 3 And Conl = 0 Then : Incr Con_n : End If
If Con = 0 And Conl = 3 Then : Decr Con_n : End If
If Con = 1 And Conl = 0 Then : Decr Con_n : End If
If Con = 2 And Conl = 1 Then : Decr Con_n : End If
If Con = 3 And Conl = 2 Then : Decr Con_n : End If


Con = Conl

Return

А с импульсами зашел в стопор. Помогите плиз.
Аватара пользователя
dimon-790
Мучитель микросхем
Сообщения: 442
Зарегистрирован: Пт авг 29, 2008 09:22:37
Контактная информация:

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

Сообщение dimon-790 »

Приветсвую хвостатые :) . Весь день сегодня , безуспешно пытался запустить простейшую функцию getrc5 на mega8535 - зависает на глухо . Проблему решил в лоб, заменил камень на мегу32 . Но на будущее , хотелось-бы иметь альтернативные варианты а не тупо менять камни . Признавайтесь кому довелось столкнуться с подобной проблемой ?
Все мы работаем по методу Робинзона Крузо – ждем пятницу.
Аватара пользователя
fedyasolder
Поставщик валерьянки для Кота
Сообщения: 2168
Зарегистрирован: Ср май 01, 2013 13:53:56
Откуда: с пальмы в Рио-Инженейро

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

Сообщение fedyasolder »

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

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

Сообщение edm2007 »

dimon-790 писал(а):хотелось-бы иметь альтернативные варианты а не тупо менять камни
Здравствуйте.

Хороший альтернативный вариант, который однозначно будет работать на всем семействе AVR - написание своей библиотеки. :tea:
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
Аватара пользователя
Jack_A
Друг Кота
Сообщения: 6319
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

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

Сообщение Jack_A »

Tankor писал(а): но как приравнивать элементы массива не понимаю.
Во-первых, надо быть точным в терминологии. Форум - не партсобрание, где говори абы што. В данном случае "приравнивать" по правильному - копировать поэлементно один массив в другой. Делается это приблизительно так;

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

LDI ZL,low(D)
LDI ZH,high(D)
LDI YL,low(W)
LDI YH,high(W)
  ; Это делается  до  входа  в  цикл.
  ; А в цикле :
loop:
LD  r16,Y+
ST  Z+,r16
CPI YL,low(W)+12
BLT  loop
Само собой, регистры, участвующие в этом действе, д.быть сохранены а потом восстановлены. Кстати, R31 он же ZL уже сохранен. Тут есть одна засада: для правильной работы фрагмента необходимо, чтобы массив W размещался внутри одной "страницы" памяти ( в адресах начала и конца массива 0xABC A должно быть одно и то же, это легко устанавливается по карте распределения памяти) . Такова плата за компактность и быстродействие фрагмента кода, о чем надо помнить при возможных модификациях программы. Если этим не напрягать бошку, придется использовать еще один регистр - счетчик байт.

------------------------------------------
Ставим плюсы (С) :)
serg5757
Родился
Сообщения: 2
Зарегистрирован: Пт авг 28, 2015 08:01:50

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

Сообщение serg5757 »

1. А как прошить внешним HEX- ом МК из BASCOM?
2. И где лежит HEX после компиляции?
Аватара пользователя
Мурик
Друг Кота
Сообщения: 3384
Зарегистрирован: Пн окт 11, 2010 19:00:08

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

Сообщение Мурик »

serg5757 писал(а):А как прошить внешним HEX- ом МК из BASCOM?
В меню "Буфер" нужно кликнуть по "Загрузить из файла" или нажать соответствующую кнопку на панели инструментов.
serg5757 писал(а):где лежит HEX после компиляции?
Там же где исходник.
Аватара пользователя
константин_KoSS_89
Вымогатель припоя
Сообщения: 602
Зарегистрирован: Пн дек 29, 2008 01:40:28
Откуда: (Украина, г. Стаханов, Луганская обл.) теперь Кемерово :)

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

Сообщение константин_KoSS_89 »

Здравствуйте, подскажите такой момент по функции (Rnd). На сколько мне известно функция Rnd - выбирает значения из таблицы абсолютно не связанных друг с другом цифр, но ведь при использовании этой функции МК будет выдавать одни и те же значения после перезагрузки? Будут ли два одинаковых МК прошитых одинаковой программой выдавать одни и те же значения? Если да, то как реализовать полноценный рандом выбор числа не зависящий ни от чего?
Спасибо.
Аватара пользователя
Tankor
Встал на лапы
Сообщения: 139
Зарегистрирован: Вт май 03, 2011 10:13:12
Откуда: Россия, Татарстан

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

Сообщение Tankor »

Jack_A писал(а):
Tankor писал(а): но как приравнивать элементы массива не понимаю.
Во-первых, надо быть точным в терминологии. Форум - не партсобрание, где говори абы што. В данном случае "приравнивать" по правильному - копировать поэлементно один массив в другой. Делается это приблизительно так;

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

LDI ZL,low(D)
LDI ZH,high(D)
LDI YL,low(W)
LDI YH,high(W)
  ; Это делается  до  входа  в  цикл.
  ; А в цикле :
loop:
LD  r16,Y+
ST  Z+,r16
CPI YL,low(W)+12
BLT  loop
Само собой, регистры, участвующие в этом действе, д.быть сохранены а потом восстановлены. Кстати, R31 он же ZL уже сохранен. Тут есть одна засада: для правильной работы фрагмента необходимо, чтобы массив W размещался внутри одной "страницы" памяти ( в адресах начала и конца массива 0xABC A должно быть одно и то же, это легко устанавливается по карте распределения памяти) . Такова плата за компактность и быстродействие фрагмента кода, о чем надо помнить при возможных модификациях программы. Если этим не напрягать бошку, придется использовать еще один регистр - счетчик байт.

------------------------------------------
Ставим плюсы (С) :)
Решил так:
Loadadr Real_p(1) , X
gosub 1

1:
!ldi R18 , 24
!ldi r19 , 0
!push R27
!push R26
Next_i_temp:
!pop R26
!pop R27
!push R27
!push R26
!add R26 , R18
!adc R27 , R19
!ld R16 , -X
!ld R17 , -X
Loadadr Sortirovka(1) , X
!add R26 , R18
!adc R27 , R19
!st -X , R16
!st -X , R17
Loadadr Sortirovka1(1) , X
!add R26 , R18
!adc R27 , R19
!st -X , R16
!st -X , R17
!subi R18 , 2
!brne Next_i_temp
!pop R26
!pop R27

Сейчас дошло до того (оптимизация), что надо вычисления математические доводить до ассемблера. Вот тут, засада, хотя это и азы. Надо сложить, вычитать, умножить, делить single- головная боль. Чувствую, что в итоге будет один асм. :))
Аватара пользователя
Мурик
Друг Кота
Сообщения: 3384
Зарегистрирован: Пн окт 11, 2010 19:00:08

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

Сообщение Мурик »

Не проще взять МК с большим объемом памяти под прошивку? Сейчас какой МК используется?
Аватара пользователя
Tankor
Встал на лапы
Сообщения: 139
Зарегистрирован: Вт май 03, 2011 10:13:12
Откуда: Россия, Татарстан

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

Сообщение Tankor »

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

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

Сообщение edm2007 »

константин_KoSS_89, да, это псевдорандом. И да, он будет повторяться при перезагрузке. Для настоящей случайности нужно что-то действительно случайное. Например, шум. В одной из конструкций я делал небольшую антенну прямо на плате (печатным способом), подключенную к АЦП. "Грязи" там немеряно. Можно использовать свойство некоторых деталей "шуметь" - стабилитрона, например (помнится мне, примерно лет триста назад делал всякие генераторы шума прибоя, ветра и проч. на стабилитроне)... А для лампы настроения я поступил проще (хотелось же, чтобы при каждом включении цвет был разный): завел счетчик в eeprom, и при каждом включении доставал его и инициализировал функцию рандома этим значением. После чего счетчик инкрементировался и записывался обратно. Конечно, он когда-то снова перевалится в 0, но это уже никто не вспомнит, что там было (переменная была uint16_t, как мне помнится).

P.S. А можно просто прикрутить к контроллеру обиженную женщину. Уверен, гадать на что и когда она обиделась Вы будете очень долго. Тут любой генератор случайностей отдыхает. :tea:
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
Ответить

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