Страница 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
Мурик
Масяня писал(а):Я же писал что знаний у меня почти ноль. С азов и надо учиться, так сказать с нуля.
Начинать с нуля, да еще и с ассемблера?
Начинать нужно с ЯП, имеющего меньший порог вхождения, например с 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 сдвигов вывалится в никуда... (((((
А у меня же бывшее число - это замеренное время. А мне надо всего 1/120 часть этого ЗАМЕРЕННОГО времени вычислить, для использования в дальнейшей программе.
З.Ы. Ассемблер
З.З.Ы. И еще, как сдвинуть так, чтобы старший байт двигал и младший?
З.З.З.Ы. Время измеренное вначале в миллисекундах, а при делении на 120 получаются микросекунды, ну или десятые миллисекунды...
З.З.З.З.Ы. И вообще, что-то делаю я не правильно... Вот получилось у меня, например, число 0b10000000 00000000, что в десятичной означает 32768. При делении 32768 на 120 получается 273,07 (примерно), а это чуть больше середины сдвинутого числа...
Re: Научите писать под AVR
Добавлено: Пт сен 05, 2014 19:11:56
НАПАЛМ
СКАЗОЧНИК писал(а):
З.Ы. Ассемблер
З.З.Ы. И еще, как сдвинуть так, чтобы старший байт двигал и младший?
Сдвиг вправо - 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
СКАЗОЧНИК
Блиииииин!!!! Точно...

Чего это я степень на умножение заменил... (((( Совсем тупею.
Тогда другой вопрос получается.... А я вот, хочу на 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
СКАЗОЧНИК
Прошу прощения за свою тупость... Но не могу разобраться.. Помогите пожалуйста.
Вот все с делением маюсь. Задача таже, что и выше. Решил замутить свое деление, примеры посмотрел, Ревича почитал. Туплю с операторами 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