Администрация форума не несёт ответственности за достоверность информации и оставляет за собой право редактировать или в особых случаях даже удалять посты без предупреждения. Спасибо за понимание.

Программирование ATMEL в BASCOM.

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Программирование ATMEL в BASCOM. » Примеры применения Xmega в среде Баском » Переходим на xmega. Вопросы и решения.


Переходим на xmega. Вопросы и решения.

Сообщений 1 страница 13 из 13

1

Добрый день!

Сейчас делаю свой первый проект на xmega. Некоторые вопросы (и ответы на них) оказались не настолько очевидны и изучение различий с традиционными (старыми) контроллерами занимает у меня определенное время. Некоторые моменты буду записывать здесь. Разумеется никакой эксклюзивности, это все есть в документации и хелпе, надо лишь понимать, что там искать.
Пост будет обновляться.

АЦП
-----------
1.1 В xmega нельзя просто взять и обратиться к каналу АЦП, надо сначала объявить, что каким каналом будет являться. Для этого служит опция muxN, где N - номер канала.
Формат такой: muxN=&B0_AAAA_BBB, где AAAA - номер входного канала (ножки) adc0-adc15 для положительного входа (он же единственный для недифференциального режима), а ВВВ - номер для отрицательного входа. Отрицательными входами могут быть не все ножки, так что сверяйтесь с документацией, прежде чем рисовать плату.

Пример  описания АЦП, в котором я использую входы 4,3,9,8 как каналы 1-4 в недифференциальном режиме. 12 разрядов без знака:

Код:
Config Adca = Single , Convmode = Unsigned , Resolution = 12bit , Dma = Off , _
Reference = Int1v , Event_mode = None , Prescaler = 256 , Sweep = Ch01 , _
Ch0_gain = 1 , Ch0_inp = Single_ended , Mux0 = &B0_0100_000 , _
Ch1_gain = 1 , Ch1_inp = Single_ended , Mux1 = &B0_0011_000 , _
Ch2_gain = 1 , Ch2_inp = Single_ended , Mux2 = &B0_1001_000 , _
Ch3_gain = 1 , Ch3_inp = Single_ended , Mux3 = &B0_1000_000
...
W = Getadc(adca , 0 )

1.2 Каналов АЦП 4, а входов 16. Для того, чтобы использовать больше 4-х каналов надо подменять значение mux в выбранном канале, перенастраивая его на новый вход. В Баскоме это делается непосредственно параметром оператора Getadc:
W = Getadc(adca , 3 , &B0_0101_000) - выбор входа 5 для канала 3
Новое значение запоминается и в дальнейшем будет использовано, если этот параметр не указывать

2. В недифференциальном режиме, АЦП имеет смещение, т.е. при "0" на входе, на выходе будет некое число. В доках примерно 200, у меня около 165. Надо учитывать при калибровке.

Отредактировано Civil (2015-11-05 17:58:18)

+1

2

Mrshilov, спасибо, сейчас допишу.

Калибровка
-----------------
В Х завод записывает калибровочные константы не только для генератора, но и для АЦП, ЦАП, датчика температуры. Там же можно прочитать уникальный номер контроллера. Это плюс. Минус в том, что сам контроллер в эту область памяти не обращается и нам предоставлена возможность самостоятельно перенести константы в нужные регистры. В Баскоме для этого служит оператор READSIG. В его хелпе можно найти адреса констант, а в описании , например, АЦП - названия регистров.
Пример:

Код:
'Read calibration bytes from Signature row
'ADCA
Adca_call = Readsig(20)
Adca_calh = Readsig(21)

Компаратор
------------------
Его применение удобно и не требует описания, но в процессе работы выявился небольшой баг: не включается выход компаратора ACA1 (комп. 2.0.7.8.004), что можно исправить непосредственной записью в регистр бита 0 (а не 1 как казалось бы):

Код:
Config Aca0 = On , Hispeed = Enabled , Hysmode = Off , Muxplus = 4 , Muxmin = 1 , Output = Enabled     
Config Aca1 = On , Hispeed = Enabled , Hysmode = Off , Muxplus = 3 , Muxmin = 0 , Output = Enabled      
Aca_ctrla.0 = 1

+1

3

Система событий
-------------------------
Если кратко - то, что мы раньше делали с помощью прерываний теперь (отчасти) можно делать с СС без участия процессора.
Одной из возможностей СС является считывание энкодера.
Пример:

Код:
Config Portd.4 = Input
Config Portd.5 = Input
Portd_pin4ctrl = &B00011011                                 'вход, подтяжка, обнаружение 0
Portd_pin5ctrl = &B00011011

Evsys_ch0mux = &B0110_1_100                                 'выбор источника событий в канале 0 - portd.4
Evsys_ch0ctrl = &B0_00_01_011                               'вкл. в канале квадр дек и цифр фильтрацию(0-2)

Config Tcc0 = Normal , Prescale = E0 , Event_source = E0 , Event_action = Qdec       'вкл таймер 0 порта С, источник канал событий 0, тип - кв. дек.
Tcc0_per = 40003                                            '79                                               'N*4-1 (N=20)
Tcc0_cnt = 20000

В регистре Tcc0_cnt текущее значение, в Tcc0_per - цикл (круг). Если посчитать per  по ф-ле N*4-1 (N=20 для ибеевского энкодера), то cnt будет показывать абсолютное положение ручки.

Таймер
-----------
Пример запуска ПП 10 раз в секунду

Код:
Config Priority = Static , Vector = Application , Lo = Enabled       'Init Interrupts  
...
Config Tcc1 = Normal , Prescale = 1024
Tcc1_per = 3125                                             '32MHz/1024 = 31250 --> One Second Tick   (10/s)
On Tcc1_ovf Tc1_isr                                         'Setup overflow interrupt of Timer/Counter C0 and
Enable Tcc1_ovf , Lo                                        'Enable overflow interrupt in LOW Priority
Enable Interrupts
...
Tc1_isr:
   Toggle Ledblue
Return

+2

4

Литература
-----------------
1. AN #192 - Getting Started With ATXMEGA and BASCOM-AVR - Part 1
2. В журнале Радио №№ 1,2,6,7 за 2015 вышла серия статей А.Савченко о применении Bascoma  с xmega.
3. gaw.ru общая информация
4. Документация с Atmel.

Программатор
--------------------
xmega программируется через интерфейс PDI. Хороший вариант - клон MKII (см. большую тему на Коте). Также можно найти инструкцию по переделке USBASP (не пробовал)

Код для старта
---------------------
Возможно его придется подкорректировать, но примерно он должен быть таким:

Код:
$regfile = "xm32a4def.dat"
$crystal = 32000000
$hwstack = 40
$swstack = 16
$framesize = 32

$lib "xmega.lib"
$external _xmegafix_clear
$external _xmegafix_rol_r1014

Config Eeprom = Mapped                                      'when using EEPROM , add this config command

Config Osc = Enabled , 32mhzosc = Enabled
Config Sysclock = 32mhz , Prescalea = 1 , Prescalebc = 1_1
Config Priority = Static , Vector = Application , Lo = Enabled       'Init Interrupts

+1

5

спасибо!
тоже накачал себе разного, но пока не вижу, куда Я могу применить эти мощности :)

(так же купил stm32 пару штук, скачал демоверсию Бейсика от МикроЕлектроника. Помигал, выдал в uart строку. Пока лежат, так как для моих задач даже мега 32 не всегда занята на половину, не говоря о мега128 (хотя часть проектов не ней из-за большого объема кода).

0

6

У меня сейчас реально получается система на чипе, при том, что к Атмеге пришлось бы добавить ЦАП и компаратор. Да и 12х АЦП лишним не будет.
И я сравнивал с stm - насколько я понял, по крайней мере в этой ценовой категории у них нет компаратора. Так что мне пока нравится.

0

7

В DIP корпусе их нет?

0

8

Там такой же шаг 0.8, что и в обычных мегах.

Макрос для ATxmega32A4U, должен подойти и другим 44-выводным чипам.
Макрос для Spriint Layout 6

Отредактировано Civil (2015-11-06 00:28:11)

0

9

Из описания

8/16-bit

Это как? :O
Они 8 или 16 битные? :)

0

10

Интел когда-то тоже так делал. Вообще на gaw.ru можно почитать.

0

11

Посмотрел цены на Али...
Дешевле взять STM32. Правда под него на прогу баскоме не напишешь, но зато 32 битный ARM на основе ядра Cortex-M3...

0

12

Пётр, у меня тажа делема, только АВР пока рулит из-за подседание на Баском. :D
При всей сладостности СТМ, там и проблем хватает (начиная от путаной документации и кончая сложной настройкой переферии в чипе).

ps: а под хмегу я себе давно развел маленькие платки для прототипирования (всё что видел в инете - не понравилось).

0

13

были бы задачи под дешевые и мощные 32-битные МК :)
у меня - нет.

тем более, они на 3вольта, а у меня вообще вся электроника на 5 вольт. Исключение только SD-карточки и иже с ними: micro-SD и mini-Sd
лежат у меня несколько stm8 и stm32
если для stm32 есть более-менее адекватные компиляторы Си, Паскаля и Бейска, то stm8 просто слёзы... так и будут лежать эти 20 шт...

Отредактировано Александр Д. (2015-11-06 11:03:35)

0


Вы здесь » Программирование ATMEL в BASCOM. » Примеры применения Xmega в среде Баском » Переходим на xmega. Вопросы и решения.