Научите писать под AVR

Обсуждаем контроллеры компании Atmel.
Ответить
Прорезались зубы
Аватара пользователя
Сообщения: 231
Зарегистрирован: Вс мар 31, 2013 17:22:21
Откуда: Бурятия

Сообщение Масяня »

можете дать пример а то я так и не понял что конкретно делать
Когда кажется что ты все понял, оказывается что ты и половины не знаешь!
Реклама
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18785
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

Масяня писал(а):можете дать пример а то я так и не понял что конкретно делать
я дико извиняюсь, несколько вопросов о вас:
1. у вас какое образование, какой род основной деятельности?
2. какая у вас базовая подготовка: знаете ли вы, что такое бит, байт, машинное слово, регистр, триггер, что такое операция сдвига и т.п.?
3. вы имеете представление, что именно происходит, когда вы пишите PORTB.4 = 1 или PORTB.4 = 0? то есть что означает эта запись по своему смыслу?

без ответов наэти вопросы я вряд ли смогу вам помочь, т.к. не буду знать, какими сущностями оперировать при ответе: то ли для человека более-менее подготовленного, то ли для полного нуля...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Реклама
Прорезались зубы
Аватара пользователя
Сообщения: 231
Зарегистрирован: Вс мар 31, 2013 17:22:21
Откуда: Бурятия

Сообщение Масяня »

1. у вас какое образование, какой род основной деятельности?
Среднее через пол года получу Профессионально техническое (студент Электрик)
2. какая у вас базовая подготовка: знаете ли вы, что такое бит, байт, машинное слово, регистр, триггер, что такое операция сдвига и т.п.?
Бит это 1 или 0, байт 8 бит, машинное слово- набор символов в ОЗУ,Регистр не помню, Триггер-Устройство способное находиться длительное время в одном из двух положений с перебросом состояния электрическим путем (Двоичная память которую можно изменять так сказать) А вот что такое Операция сдвига то с этим я еще пока не сталкивался.
3. вы имеете представление, что именно происходит, когда вы пишите PORTB.4 = 1 или PORTB.4 = 0? то есть что означает эта запись по своему смыслу?
PORTB.4=1 присваиваю порту B, разряду 4, единицу и на оборот, правда пожалуй, я кроме этих мигалок ничего больше и не умею делать.
Когда кажется что ты все понял, оказывается что ты и половины не знаешь!
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18785
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

спасибо, все понятно.
1. читаете и вникаете вот в это: Битовый сдвиг
2. разбираетесь с понятием языка Си "переменная". в частности, с точки зрения языка Си PORTB - это просто обычная переменная типа unsigned char (или, иначе говоря, размером в 1 байт)
3. читаете FAQ по моей ссылке о том, как устанавливать отдельные биты в переменной и сбрасывать их. попутно разбираетесь с понятием языка Си "макрос" (пользуйтесь интернетом, если необходимо, как словарем-справочником)
4. пробуете сделать PORTB.4=1 и PORTB.4=0 без "точечной нотации"
5. после этого размышляете над тем, что такое "бегущий огонек" с точки зрения только что полученных знаний...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Друг Кота
Аватара пользователя
Сообщения: 3385
Зарегистрирован: Пн окт 11, 2010 19:00:08

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

Масяня писал(а):Я же писал что знаний у меня почти ноль. С азов и надо учиться, так сказать с нуля.
Начинать с нуля, да еще и с ассемблера? :shock: :shock:
Начинать нужно с ЯП, имеющего меньший порог вхождения, например с BASCOM-AVR и по мере появления представления об устройстве МК, можно начать учить асм.

PS.
Даташит на ATmega8 надеюсь скачали и ознакомились с ним?
Последний раз редактировалось Мурик Чт сен 04, 2014 14:48:24, всего редактировалось 2 раза.
Реклама
Друг Кота
Аватара пользователя
Сообщения: 20104
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Сообщение Gudd-Head »

Мурик писал(а):Начинать с нуля, да еще и с ассемблера?
Именно так. Тогда станут понятные многие неочевидные вещи на сях.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Реклама
Друг Кота
Аватара пользователя
Сообщения: 3385
Зарегистрирован: Пн окт 11, 2010 19:00:08

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

Gudd-Head писал(а):Именно так.
Думаю что не стоит объяснить какова вероятность "выстрелить в ногу" у новичка?
Начинать нужно в высокоуровневого ЯП и по мере обучения, можно браться за асм.
Прорезались зубы
Аватара пользователя
Сообщения: 231
Зарегистрирован: Вс мар 31, 2013 17:22:21
Откуда: Бурятия

Сообщение Масяня »

какой BASCOM-AVR посоветуете, если что то характеристики моего компа под спойлером
СпойлерWindows 7 Максимальная
Процессор 1.80GHz
ОЗУ 2.50 ГБ
32 разрядная система
Когда кажется что ты все понял, оказывается что ты и половины не знаешь!
Идёт направо - песнь заводит, Налево - сказку говорит.
Аватара пользователя
Сообщения: 5000
Зарегистрирован: Чт апр 21, 2011 17:55:50
Откуда: Иркутск

Сообщение СКАЗОЧНИК »

Прошу прощения... А можно я здесь вопросик задам? Он тоже вроде относится к теме...

Есть АТТини2313, таймер1, который считает. Берем значение в произвольный момент времени из двух регистров TCNT1H и TCNT1L, получается число из двух байт. А теперь, надо поделить это число на 120...
Я понимаю, что достаточно всего лишь сдвинуть его вправо 60 раз, что равносильно делению на 2 этих же 60 раз. Но! Тогда все число уже через 16 сдвигов вывалится в никуда... ((((( :oops:
А у меня же бывшее число - это замеренное время. А мне надо всего 1/120 часть этого ЗАМЕРЕННОГО времени вычислить, для использования в дальнейшей программе.

З.Ы. Ассемблер :write:

З.З.Ы. И еще, как сдвинуть так, чтобы старший байт двигал и младший?

З.З.З.Ы. Время измеренное вначале в миллисекундах, а при делении на 120 получаются микросекунды, ну или десятые миллисекунды...


З.З.З.З.Ы. И вообще, что-то делаю я не правильно... Вот получилось у меня, например, число 0b10000000 00000000, что в десятичной означает 32768. При делении 32768 на 120 получается 273,07 (примерно), а это чуть больше середины сдвинутого числа...
Последний раз редактировалось СКАЗОЧНИК Пт сен 05, 2014 19:14:38, всего редактировалось 1 раз.
Станислав
Это не хвост, это антенна
Аватара пользователя
Сообщения: 1315
Зарегистрирован: Пт ноя 27, 2009 19:47:13
Откуда: Казань

Сообщение НАПАЛМ »

СКАЗОЧНИК писал(а): З.Ы. Ассемблер :write:

З.З.Ы. И еще, как сдвинуть так, чтобы старший байт двигал и младший?
Сдвиг вправо - ror R16
Друг Кота
Аватара пользователя
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Сообщение dosikus »

1) 2 ^7 уже 128 , откуда 60 насчиталось?
2) проверяем CARRY
3) в миллисекунде 1000 микросекунд ...
Идёт направо - песнь заводит, Налево - сказку говорит.
Аватара пользователя
Сообщения: 5000
Зарегистрирован: Чт апр 21, 2011 17:55:50
Откуда: Иркутск

Сообщение СКАЗОЧНИК »

Блиииииин!!!! Точно... :oops: Чего это я степень на умножение заменил... (((( Совсем тупею.

Тогда другой вопрос получается.... А я вот, хочу на 120 разделить... А не на 128...
Станислав
Друг Кота
Аватара пользователя
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Сообщение dosikus »

СКАЗОЧНИК писал(а):
Тогда другой вопрос получается.... А я вот, хочу на 120 разделить... А не на 128...
Разложить на множители - степени двойки , оставшийся простой множитель - искать процедуру на асме
Идёт направо - песнь заводит, Налево - сказку говорит.
Аватара пользователя
Сообщения: 5000
Зарегистрирован: Чт апр 21, 2011 17:55:50
Откуда: Иркутск

Сообщение СКАЗОЧНИК »

Писдес.... я попал.... ((((

Спасибо за информацию! Очень признателен.
Станислав
Друг Кота
Аватара пользователя
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Сообщение dosikus »

СКАЗОЧНИК писал(а):Писдес.... я попал.... ((((
Не все так страшно ... http://we.easyelectronics.ru/AVR/matema ... v-avr.html
А так же здесь AVR assembler libraries http://elm-chan.org/cc_e.html

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

;-----------------------------------------------------------------------------:
; 16bit/16bit Unsigned Division
;
; Register Variables
;  Call:  var1[1:0] = dividend (0x0000..0xffff)
;         var2[1:0] = divisor (0x0001..0x7fff)
;         mod[1:0]  = <don't care>
;         lc        = <don't care> (high register must be allocated)
;
;  Result:var1[1:0] = var1[1:0] / var2[1:0]
;         var2[1:0] = <not changed>
;         mod[1:0]  = var1[1:0] % var2[1:0]
;         lc        = 0
;
; Size  = 16 words
; Clock = 179..211 cycles (+ret)
; Stack = 0 byte


div16u:		clr	mod0		;initialize variables
		clr	mod1		;  mod = 0;
		ldi	lc,16		;  lc = 16;
					;---- calcurating loop
		lsl	var10		;var1 = var1 << 1;
		rol	var11		;/
		rol	mod0		;mod = mod << 1 + carry;
		rol	mod1		;/
		cp	mod0,var20	;if (mod => var2) {
		cpc	mod1,var21	; mod -= var2; var1++;
		brcs	PC+4		; }
		inc	var10		;
		sub	mod0,var20	;
		sbc	mod1,var21	;/
		dec	lc		;if (--lc > 0)
		brne	PC-11		; continue loop;
		ret
Последний раз редактировалось dosikus Пт сен 05, 2014 20:16:44, всего редактировалось 2 раза.
Друг Кота
Аватара пользователя
Сообщения: 3385
Зарегистрирован: Пн окт 11, 2010 19:00:08

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

Масяня писал(а):какой BASCOM-AVR посоветуете
IDE не требовательна к ресурсам компа. На форуме есть отдельная обширная тема обсуждения BASCOM. http://www.radiokot.ru/forum/viewtopic.php?f=57&t=6408
Идёт направо - песнь заводит, Налево - сказку говорит.
Аватара пользователя
Сообщения: 5000
Зарегистрирован: Чт апр 21, 2011 17:55:50
Откуда: Иркутск

Сообщение СКАЗОЧНИК »

Прошу прощения за свою тупость... Но не могу разобраться.. Помогите пожалуйста. :oops:

Вот все с делением маюсь. Задача таже, что и выше. Решил замутить свое деление, примеры посмотрел, Ревича почитал. Туплю с операторами subi и sbci.
Вот я решил, что мне достаточно разделить на 120 без остатка. Для простоты схемы надо просто вычитать из ДЕЛИМОГО ДЕЛИТЕЛЬ и проверять не стал ли остаток меньше ДЕЛИТЕЛЯ. И так в цикле, а в одну переменную любую просто инкрементировать счетчик количества циклов, это и будет результат деление, т.е. ЧАСТНОЕ (без остатка).

Тупость у меня в том, что достаточно легко понять, как работает оператор subi с одинм байтом (8 разрядов). А вот как их два применять и как работает флаг переноса (С) и как это работает сразу с двумя байтами??? Что из чего вычитать в первую очередь? Как понять вычитание однобайтного из двухбатного???

Голова квадратная стала с этой арифметикой...
Станислав
Друг Кота
Аватара пользователя
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Сообщение oleg110592 »

СКАЗОЧНИК писал(а):Решил замутить свое деление
зачем велосипед изобретать - выше давали ссылку на библиотеки Чена, вот еще с комментариями на русском
http://we.easyelectronics.ru/AVR/matema ... v-avr.html
Идёт направо - песнь заводит, Налево - сказку говорит.
Аватара пользователя
Сообщения: 5000
Зарегистрирован: Чт апр 21, 2011 17:55:50
Откуда: Иркутск

Сообщение СКАЗОЧНИК »

ага. это тоже смотрел. )))

Просто хочу разобраться как работает вычитание с переносом... Могу на листочке из двухбайтового вычитать однобайтовое... А как это делает ассемблер не доходит... (((( Именно эти два оператора...
Станислав
Друг Кота
Аватара пользователя
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Сообщение oleg110592 »

Atmel application notes
Спойлер

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

;***************************************************************************
;* 
;* "sub16" - Subtracting 16-bit registers 
;*
;* This example subtracts two pairs of register variables (sub1l,sub1h) 
;* from (sub2l, sub2h)  The result is stored in registers sub1l, sub1h.
;*
;* Number of words	:2
;* Number of cycles	:2
;* Low registers used	:None
;* High registers used	:4
;*
;* Note: The result and "sub1" share the same register.  This causes "sub1"
;* to be overwritten by the result.
;*
;***************************************************************************

;***** Register Variables
.def sub1l = r16
.def sub1h = r17
.def sub2l = r18
.def sub2h = r19

;***** Code
sub16:	sub	sub1l,sub2l		;Subtract low bytes
	sbc	sub1h,sub2h		;Add high byte with carry
	;Expected result is 0x4646



;***************************************************************************
;* 
;* "subi16" - Subtracting immediate 16-bit number from a 16-bit register
;*
;* This example subtracts the immediate 16-bit number subi2 from the
;* 16-bit register (subi1l,subi1h)  The result is placed in registers
;* subi1l, subi1h.
;*
;* Number of words	:2
;* Number of cycles	:2
;* Low registers used	:None
;* High registers used	:2
;*
;* Note: The result and "subi1" share the same register.  This causes 
;* "subi1" to be overwritten by the result.
;*
;***************************************************************************

;***** Register Variables
.def subi1l = r16
.def subi1h = r17

;***** Immediate 16-bit number
.equ subi2 = 0x1234

;***** Code
subi16:	subi	subi1l,low(subi2)	;Subtract low bytes
	sbci	subi1h,high(subi2)	;Subtract high byte with carry
	;Expected result is 0x3412
Ответить

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