Страница 4 из 7

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

Добавлено: Ср сен 03, 2014 14:50:08
Масяня
можете дать пример а то я так и не понял что конкретно делать

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

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

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

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

Добавлено: Ср сен 03, 2014 15:21:47
Масяня
1. у вас какое образование, какой род основной деятельности?
Среднее через пол года получу Профессионально техническое (студент Электрик)
2. какая у вас базовая подготовка: знаете ли вы, что такое бит, байт, машинное слово, регистр, триггер, что такое операция сдвига и т.п.?
Бит это 1 или 0, байт 8 бит, машинное слово- набор символов в ОЗУ,Регистр не помню, Триггер-Устройство способное находиться длительное время в одном из двух положений с перебросом состояния электрическим путем (Двоичная память которую можно изменять так сказать) А вот что такое Операция сдвига то с этим я еще пока не сталкивался.
3. вы имеете представление, что именно происходит, когда вы пишите PORTB.4 = 1 или PORTB.4 = 0? то есть что означает эта запись по своему смыслу?
PORTB.4=1 присваиваю порту B, разряду 4, единицу и на оборот, правда пожалуй, я кроме этих мигалок ничего больше и не умею делать.

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

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

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

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

PS.
Даташит на ATmega8 надеюсь скачали и ознакомились с ним?

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

Добавлено: Чт сен 04, 2014 14:45:16
Gudd-Head
Мурик писал(а):Начинать с нуля, да еще и с ассемблера?
Именно так. Тогда станут понятные многие неочевидные вещи на сях.

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

Добавлено: Чт сен 04, 2014 14:51:50
Мурик
Gudd-Head писал(а):Именно так.
Думаю что не стоит объяснить какова вероятность "выстрелить в ногу" у новичка?
Начинать нужно в высокоуровневого ЯП и по мере обучения, можно браться за асм.

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

Добавлено: Пт сен 05, 2014 17:08:49
Масяня
какой BASCOM-AVR посоветуете, если что то характеристики моего компа под спойлером
СпойлерWindows 7 Максимальная
Процессор 1.80GHz
ОЗУ 2.50 ГБ
32 разрядная система

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

Добавлено: Пт сен 05, 2014 18:52:52
СКАЗОЧНИК
Прошу прощения... А можно я здесь вопросик задам? Он тоже вроде относится к теме...

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

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

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

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


З.З.З.З.Ы. И вообще, что-то делаю я не правильно... Вот получилось у меня, например, число 0b10000000 00000000, что в десятичной означает 32768. При делении 32768 на 120 получается 273,07 (примерно), а это чуть больше середины сдвинутого числа...

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

Добавлено: Пт сен 05, 2014 19:11:56
НАПАЛМ
СКАЗОЧНИК писал(а): З.Ы. Ассемблер :write:

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

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

Добавлено: Пт сен 05, 2014 19:12:09
dosikus
1) 2 ^7 уже 128 , откуда 60 насчиталось?
2) проверяем CARRY
3) в миллисекунде 1000 микросекунд ...

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

Добавлено: Пт сен 05, 2014 19:18:57
СКАЗОЧНИК
Блиииииин!!!! Точно... :oops: Чего это я степень на умножение заменил... (((( Совсем тупею.

Тогда другой вопрос получается.... А я вот, хочу на 120 разделить... А не на 128...

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

Добавлено: Пт сен 05, 2014 19:24:32
dosikus
СКАЗОЧНИК писал(а):
Тогда другой вопрос получается.... А я вот, хочу на 120 разделить... А не на 128...
Разложить на множители - степени двойки , оставшийся простой множитель - искать процедуру на асме

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

Добавлено: Пт сен 05, 2014 19:29:39
СКАЗОЧНИК
Писдес.... я попал.... ((((

Спасибо за информацию! Очень признателен.

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

Добавлено: Пт сен 05, 2014 19:38:58
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

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

Добавлено: Пт сен 05, 2014 19:58:19
Мурик
Масяня писал(а):какой BASCOM-AVR посоветуете
IDE не требовательна к ресурсам компа. На форуме есть отдельная обширная тема обсуждения BASCOM. http://www.radiokot.ru/forum/viewtopic.php?f=57&t=6408

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

Добавлено: Сб сен 06, 2014 09:32:38
СКАЗОЧНИК
Прошу прощения за свою тупость... Но не могу разобраться.. Помогите пожалуйста. :oops:

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

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

Голова квадратная стала с этой арифметикой...

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

Добавлено: Сб сен 06, 2014 10:39:40
oleg110592
СКАЗОЧНИК писал(а):Решил замутить свое деление
зачем велосипед изобретать - выше давали ссылку на библиотеки Чена, вот еще с комментариями на русском
http://we.easyelectronics.ru/AVR/matema ... v-avr.html

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

Добавлено: Сб сен 06, 2014 10:47:52
СКАЗОЧНИК
ага. это тоже смотрел. )))

Просто хочу разобраться как работает вычитание с переносом... Могу на листочке из двухбайтового вычитать однобайтовое... А как это делает ассемблер не доходит... (((( Именно эти два оператора...

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

Добавлено: Сб сен 06, 2014 10:52:07
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