Notice: Memcache::get(): Server localhost (tcp 11211) failed with: Connection refused (111) in /home/a146/www/we.easyelectronics.ru/engine/lib/external/DklabCache/Zend/Cache/Backend/Memcached.php on line 134
Первые впечатления от tiny817 / AVR / Сообщество EasyElectronics.ru

Первые впечатления от tiny817

AVR

А чего ещё можно было ожидать от людей, сделавших в своё время контроллер с двенадцатибитной шиной? С тех пор стало ясно всем, что они извращенцы сумрачно гениальные. И вот теперь, после поглощения Атмела, они (микрочип) выпустили новую тиню.
Сразу хочу сказать, что эти люди — достойные хранители дела Analog и STM. В том смысле, что научились делать документацию столь же противоречивую, как и у аналога, и столь же запутанную и обрывчатую, как у ст. Мои им апплодисмены.
Итак — плата attiny817 xplained.
В даташите написано — блаблабла, посмотрите, какую мы классную плату замутили. Вот тут на неё камушек приклеили, а вот тут сделали один-в-один как ардуину.
Ну молодцы, блин, хвалю, чо. А как вы это сделали?
— ну мы тут в серединку камушек приклеили, а по краям дырочек насверлили.
— Не, ну а соединили-то в их как? Вот этот камушек и дырочки?
Тишина.

Спустя некое гугление, нашлась таки и схема. На странице xpaned есть ссылка ATtiny817 Xplained Mini Design Documentation, по ссылке есть зип, в зипе есть pdf, а в нём есть схема. Ну скажите мне, слабо было положить её сразу в user guide?
Примерно та же фигня и с даташитом на кристалл. Зачем-то они включили в список оборудования ptc — periferial touch controller. Прямо так, пунктом 32, между ЦАП-ом и отладочным интерфейсом.
При том что ЦАП — эта такая реально существующая полезная штучка, и отладочный интерфейс — тоже вполне себе присутствует. А вот ptc — это оказывается (sic!) возможность.
Возможность использовать библиотеку qtouch. И есть эта возможность только у восьмикилобайтных кристаллов, потому что в четыре килобайта библиотека не помещается.
Вот и кто они после этого?
Единственная мысль, которая приходит в голову, читая даташит от 817 тини — куда эти сволочи дели тех замечательных людей, которые составляли документацию для Атмела? Убили? Съели? Заманьячили? Выкинули под забор? Посадили в зиндан?
И кто эти люди, которые теперь пишут даташиты? Инопланетяне? Крокодиловые нарики? Дети российских коррупционеров, сбежавших на запад?
Ну ладно, включаем. Шнурка в комплекте с платой нет, но подходит стандартный micro-b usb кабель. К сожалению, олд-труъ-четвертая студия не знает кристалл, ни программатор, поэтому пришлось поставить седьмую.
(Ну вы уже знаете, как называются те, кто придумал держать хэлп в интернете. Не стану я это слово здесь произносить.)
Запускаем студию, делаем проект. или солюшн. или как это там у них называется. Делаем сегмент с кодом, а в нём делаем таблицу векторов. Кстати, то что в даташите они пытаются выдать за таблицу векторов — это даже не детский лепет. Там показан пример таблицы векторов курильщика.
а таблица векторов здорового человека выглядит так:
.org 0
		rjmp	rstvect			; reset vector
		nop
		rjmp	dummy			; crc module NMI
		nop
		rjmp	dummy			; Voltage Level Monitor
		nop
		rjmp	dummy			; PortA
		nop
		rjmp	dummy			; portB
		nop
		rjmp	dummy			; PortC
		nop
		rjmp	dummy			; RTC
		nop
		rjmp	dummy			; Periodic Interrupt Timer (rtc)
		nop
		rjmp	dummy			; TCA0_ovf
		nop
		rjmp	dummy			; TCA0_hunf
		nop
		rjmp	dummy			; TCA0_CMP0
		nop
		rjmp	dummy			; TCA0_CMP1
		nop
		rjmp	dummy			; TCA0_CMP2
		nop
		rjmp	dummy			; TCB0
		nop
		rjmp	dummy			; TCD0_Ovf
		nop
		rjmp	dummy			; TCD0_Trig
		nop
		rjmp	dummy			; AC0 (analog comparator)
		nop
		rjmp	dummy			; ADC0_ResRdy
		nop
		rjmp	dummy			; ADC0_WCOMP
		nop
		rjmp	dummy			; TWI0_TWIS
		nop
		rjmp	dummy			; TWI0_TWIM
		nop
		rjmp	dummy			; SPI0
		nop
		rjmp	dummy			; USART0_RXC
		nop
		rjmp	dummy			; USART0_DRE
		nop
		rjmp	dummy			; USART0_TXC
		nop
		rjmp	dummy			; NVM
dummy:	reti

Для начала инициализируем стек.
rstvect:	ldi	r16, low(INTERNAL_SRAM_END)
		ldi	r17,high(INTERNAL_SRAM_END)
		out	cpu_sph, r17
		out	cpu_spl, r16

Скажите мне, для чего эти редиски вдруг вздумали переименовать регистры sph и spl в cpu_sph и cpu_spl? Ведь в ядре не изменилось ничего. Формат регистра, предназначение, адрес — всё старое. Новое только имя. Для чего переименовали? Причём переименовали только для этой серии — у других тинь и мег всё осталось по-прежнему.
Далее, стоит помнить — у этого кристалла есть прескалер. И конфигурация прескалера такова, что после сброса он включен и делит на 6. То есть в фузах установлена частота 20MHz, а в реальности всего 3,33.
Модифицируется прескалер (а также некоторые другие регистры) с приколом. Кристалл обзавёлся регистром CCP, в который надо записать сигнатуру, и сразу после этого можно менять значение регистра. Сигнатура для записи защищённых регистров 0xD8 (см. даташит, стр.55)

		ldi	zh,0
		ldi	zl,0x61
		ldi	r17,0
		ldi	r16, 0xd8
		out	CPU_CCP, r16
		st	z,r17

Здесь есть ещё один прикол, или глюк, или фича — непонятно. То есть, если записать значение прескалера по регистровому указателю, как показано выше — то всё работает. А если по непосредственному, используя команду STS — не работает. Вероятно, дело здесь в длине команды. В даташите указано, что запись в защищённый регистр должна произойти в течении четырёх тактов после записи сигнатуры. А запись по непосредственному указателю занимает 2 такта. Даже если приплюсовать один такт на запись сигнатуры — всё равно четырёх не набирается. То есть теоретически как-бы должно работать, а практически — не хочет. Заглянул в еррату — там не описано.
Поехали дальше. Порты.
Похоже, что управление портами переехало в эту тиню из Xmega. Очень удачное решение. На месте старых портов появилось нечто под названием Vport, которое работает точно так же, как и старые порты, только имена сменились.
А выше в общем пространстве адресов появились хитрые штуки, типа DirSet, DirClr, DirTgl, запись в которые вызывает установку, или сброс, или перемену значения соответствующих бит. Если вы знакомы с устройством портов stm32 — очень похоже.
Таким образом, если раньше можно было изменить один бит в порту одной командой, например cbi или sbi, то теперь можно одновременно изменить несколько бит, не устраивая чтение-наложение масок- обратную запись.Также можно настроить отдельно для каждого из пинов аппаратную инверсию и индивидуальную конфиграцию прерываний. Например A0 будет вызывать прерывание по переднему фронту сигнала, а A1 — по заднему. Так же доставляет выбор из нескольких вариантов для назначения альтернативных функций. Вот, например, на выводе PA1 живут вход АЦП AIN1 и MOSI. Если непременно нужны оба этих сигнала, то MOSI можно сдвинуть на PC2. Удобно.

		ldi	r16, 0b00000100		; пробуем конфигурить порты по разному
		sts	PortB_dir,r16		; здесь - классическим образом, но через новые адреса
		sts	PortB_out,r16
		ldi	r16,01
		sts	PortC_dirSet,r16	; здесь через механизм "set"
		sbi	vportc_out,0		; а здесь - зажигаем юзер_лед ...

Дальше — конфигурируем uart. В уарте очень много изменений, сравнительно со старыми моделями кристаллов. Полный список есть в даташите, на мой взгляд, интереснее всего новый baud generator. Похоже, что где-то внутри опорная частота умножается на 64, а потом уже делится на 8 или 16 интервалов, согласно настройке и внутренней логике UART. Значит, формула расчёта делителя для режимов без удвоения скорости будет:
div=4*Fcore/Speed
для желаемой скорости 115200 и частоте ядра 20Mhz получим 80000000/115200 = 694. Если использовать режимы с удвоением скорости, то посчитаное значение можно просто умножить на 2.

.equ baudrate=0x02b6	; для скорости 115200 при частоте ядра 20MHz
UartInit:
		ldi	r16,low (baudrate)
		ldi	r17,high(baudrate)
		sts	Usart0_baud, r16	
		sts	Usart0_baud+1, r17
		outi1	Usart0_ctrlb, 0x40	; tx enable
		outi1	Usart0_ctrlc,0x03	; async, 8n1 
		ret

Эти плохие люди, делавшие файл с заголовками, зачем-то переименовали простые и короткие наименования битов во что-то гигантоманское. Как вам конструкция типа (USART_RXEN_bm|USART_TXEN_bm)? Да её читать устанешь.
Передача байта осталась прежней, за исключением переименованных регистров и битов.
UartSend:	push	r17
_usendwaitrdy:	lds	r17,Usart0_Status
		sbrs	r17,5
		rjmp	_usendwaitrdy
		sts	Usart0_txdatal,r16
		pop	r17
		ret

Компортом, который живёт на девборде, пользоваться надо с осторожностью, ибо глючит. Глюки проявляются в периодическом срыве синхронизации, и искажении входящего потока. Подключил вместо него китайский свисток Prolific — через свисток работает нормально. Вероятно, что-то с софтом medbg.
Хотел было написать — а теперь следите за руками, сейчас будет фокус… Но случилось вот то самое, за что я не хотел переходить на седьмую студию. Это надо же сделать такое блядство! Мне потребовалось всего-то записать EEPROM. Что бы я делал, если бы не снёс четвертую студию — сделал бы
.eseg
estring:	.db	"Hello from EEPROM",0x0d,0x0a

нажал бы “скомпиллить” и влил бы программатором получившийся файл в микросхему. Но это же старый одскульный инструмент.
А новый прогрессивный инструмент сказал — всё ништяк, собралось, типа, no errors.
А файлика *.eep нет. От слова совсем.
Ну ладно, полазил по менюшкам, нашёл место, где надо галочку поставить, и файлик появился. Однако теперь другая засада — программатор не хочет записывать его. Говорит —

Посмотрел в интернетиках — там народ мечется с подобными проблемами, и никакой ясности, отчего это происходит. Предположил, что файл кривой. Подсунул ему другой файл, гарантированно прямой. Та же история.
Одним словом — программатор считает (умнее всех, ссука!), что EEPROM у этой тини начинается с адреса 0x1400. А компиллятор так не считает. Попытка вручную подправить адрес вызвала ругань на кривую контрольку. Пришлось скачать hextobin, сделать бинарь, затем скачать Srecord, изучить мануал от него, и сконвертить бинарь назад в HEX, но уже с нужным адресом.Короче, дрочево вприсядку.
А теперь можно написать — следите за руками, сейчас будет фокус:

		ldi	r17,18
		ldi	xl,low(teststring<<1)
		ldi	xh,0x80+high(teststring<<1)
		rcall	UartSendArrayX
 
		ldi	r17,19
		ldi	xl,low(estring)
		ldi	xh,0x14+high(estring)
		rcall	UartSendArrayX
 
halt:		rjmp	pc
 
teststring:	.db	"Hello from Flash",0x0d,0x0a
 
UartSendArrayX:
		ld	r16,x+
		rcall	UartSend
		dec	r17
		brne	UartSendArrayX
		ret

И результат этого фокуса выглядит вот так:

Если кто не понял — самая прикольная фишка новой тини — то, что RAM, EEPROM и Flash находятся в едином адресном пространстве (по крайней мере, для чтения). И можно применять унифицированные методы доступа к данным.
На этом все. Хотя нет.
Выводы:
Микросхема — хорошая, годная. Хотя немного странная.
Девбоард — ничо так, под пиво проканает.
Программная поддерхка — третий сорт, не брак. Но очень близко к браку, буквально на волосок.
Документация — полнейший ацтой. Аффтар, убей себя жестоко!

PS:
Упомянутые глюки компорта на девборде выглядят вот так:
Глючок-с
И ещё пара весёлых картинок.
Включаем режим RS485 для USART.
Пишем 0x01 в Usart0_ctrla, и ножка B0 начинает работать как управление драйвером rs485 шины, то есть переключает приём-передача.
Жёлтый луч — управление, синий луч — данные передатчика.

Видно, что пока в сдвиговом регистре передатчика есть данные, (запись по флагу status.5) — бит управления всегда в единице. Синхронно с завершением стоп-бита последнего байта — переключается на приём. Классная фича.

Комментарии (9)

RSS свернуть / развернуть
Пришлось скачать hextobin, сделать бинарь, затем скачать Srecord, изучить мануал от него, и сконвертить бинарь назад в HEX, но уже с нужным адресом.Короче, дрочево вприсядку.
WinHex позволяет все это сделать в одной программе.
Алсо, можно попробовать сдвинуть адресацию командой установки базового адреса. Не помню только, есть ли там команда, умеющая устанавливать 16 младших бит.

Насчет отладки — какими отладчиками поддерживается? Старые атмеловские или что-то микрочиповское? Что на борде распаяно и можно ли ее юзать для отладки других камней?
0
  • avatar
  • Vga
  • 13 июня 2017, 19:42
Отладка работает через UPDI, я так понял, что это дальнейшее развитие дебагвайра. Отладчик есть на девборде, можно выпаять резистор, отделить таржет от отладчика и использовать внешний отладчик. Видимо, можно и девбордовский отладчик к другому чипу прикрутить, но не на чем попробовать — у меня нет других микросхем с UPDI. Новый atmel ice поддерживает updi, дракон не поддерживает, даже с обновлённой прошивкой.
А винхекс надо будет попробовать. Вроде когда-то качал, и остался недоволен… Может свежий лучше?
0
А винхекс надо будет попробовать. Вроде когда-то качал, и остался недоволен… Может свежий лучше?
Последнее, что у пробовал — 16.х. На мой вкус — самый функциональный hex-редактор, ни один из опробованных на замену и близко такой функциональности не имел.
0
Как вам конструкция типа (USART_RXEN_bm|USART_TXEN_bm)?

Мне норм, самое то. :)

Такие имена очень облегчают жизнь при использовании IDE с автодополнением. Вместо того, чтобы помнить точные имена всех битов, можно просто набрать, скажем, «USART_» и ждать, что предложит автодополнение. Ну а дальше выбрать подходящий вариант и нажать Enter. :)

У STM32 еще круче — название бита включает имя регистра, для которого он релевантен. Это еще удобнее — не даст записать не то не туда. А соблазн есть, потому что названия некоторых битов ох как похожи…
0
Аналогично:
Как вам конструкция типа (USART_RXEN_bm|USART_TXEN_bm)
Самое то что надо. Гораздо лучше чем в MegaAVR.
У STM32 еще круче — название бита включает имя регистра, для которого он релевантен.
А вот не факт что лучше — вспоминай каждый раз куда писать USART_RXEN_bm — в CTRLA или CTRLВ или CTRLC. Хотя и с регистром тоже сойдёт — имя регистра и пропустить можно (автодополнение должно и так отработать).
0
Ну не совсем так:
а таблица векторов здорового человека выглядит так:
.
GCC должен вроде сам неиспользуемые вектора на один dummy перенаправлять.

Скажите мне, для чего эти редиски вдруг вздумали переименовать регистры sph и spl в cpu_sph и cpu_spl
А оно надо вообще SP задавать? Он после сброса в определённом состоянии.

Кристалл обзавёлся регистром CCP,
Это правильно — от XMEGA перетащили.
сконвертить бинарь назад в HEX, но уже с нужным адресом.
Можно было сделать по-другому — зашить прошивку, которая EEPROM в нужное состояние запрограммирует.
Если кто не понял — самая прикольная фишка новой тини — то, что RAM, EEPROM и Flash находятся в едином адресном пространстве (по крайней мере, для чтения).
И что? Можно теперб код из SRAM или EEPROM исполнять?
0
Очень интересная статья, и интересно написана, спасибо-)
0
Стыдно видеть как некогда отличный продуцент перешел на стратегию «Хуяк, хуяк, и в продакшон». Вот мы сделали классный чип, а дальше ебитесь как хотите.
А потом плачутся маркетологи что неразумный народ не ценит их принципиально лучшее железо и вообще плохо о них отзывается.
0
мде. evsi был прав, хоть тогда и не поняли…
0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.