Научите писать под AVR
можете дать пример а то я так и не понял что конкретно делать
Когда кажется что ты все понял, оказывается что ты и половины не знаешь!
- Реклама
я дико извиняюсь, несколько вопросов о вас:Масяня писал(а):можете дать пример а то я так и не понял что конкретно делать
1. у вас какое образование, какой род основной деятельности?
2. какая у вас базовая подготовка: знаете ли вы, что такое бит, байт, машинное слово, регистр, триггер, что такое операция сдвига и т.п.?
3. вы имеете представление, что именно происходит, когда вы пишите PORTB.4 = 1 или PORTB.4 = 0? то есть что означает эта запись по своему смыслу?
без ответов наэти вопросы я вряд ли смогу вам помочь, т.к. не буду знать, какими сущностями оперировать при ответе: то ли для человека более-менее подготовленного, то ли для полного нуля...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Среднее через пол года получу Профессионально техническое (студент Электрик)1. у вас какое образование, какой род основной деятельности?
Бит это 1 или 0, байт 8 бит, машинное слово- набор символов в ОЗУ,Регистр не помню, Триггер-Устройство способное находиться длительное время в одном из двух положений с перебросом состояния электрическим путем (Двоичная память которую можно изменять так сказать) А вот что такое Операция сдвига то с этим я еще пока не сталкивался.2. какая у вас базовая подготовка: знаете ли вы, что такое бит, байт, машинное слово, регистр, триггер, что такое операция сдвига и т.п.?
PORTB.4=1 присваиваю порту B, разряду 4, единицу и на оборот, правда пожалуй, я кроме этих мигалок ничего больше и не умею делать.3. вы имеете представление, что именно происходит, когда вы пишите PORTB.4 = 1 или PORTB.4 = 0? то есть что означает эта запись по своему смыслу?
Когда кажется что ты все понял, оказывается что ты и половины не знаешь!
спасибо, все понятно.
1. читаете и вникаете вот в это: Битовый сдвиг
2. разбираетесь с понятием языка Си "переменная". в частности, с точки зрения языка Си PORTB - это просто обычная переменная типа unsigned char (или, иначе говоря, размером в 1 байт)
3. читаете FAQ по моей ссылке о том, как устанавливать отдельные биты в переменной и сбрасывать их. попутно разбираетесь с понятием языка Си "макрос" (пользуйтесь интернетом, если необходимо, как словарем-справочником)
4. пробуете сделать PORTB.4=1 и PORTB.4=0 без "точечной нотации"
5. после этого размышляете над тем, что такое "бегущий огонек" с точки зрения только что полученных знаний...
1. читаете и вникаете вот в это: Битовый сдвиг
2. разбираетесь с понятием языка Си "переменная". в частности, с точки зрения языка Си PORTB - это просто обычная переменная типа unsigned char (или, иначе говоря, размером в 1 байт)
3. читаете FAQ по моей ссылке о том, как устанавливать отдельные биты в переменной и сбрасывать их. попутно разбираетесь с понятием языка Си "макрос" (пользуйтесь интернетом, если необходимо, как словарем-справочником)
4. пробуете сделать PORTB.4=1 и PORTB.4=0 без "точечной нотации"
5. после этого размышляете над тем, что такое "бегущий огонек" с точки зрения только что полученных знаний...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Сообщения: 3385
- Зарегистрирован: Пн окт 11, 2010 19:00:08
Начинать с нуля, да еще и с ассемблера?Масяня писал(а):Я же писал что знаний у меня почти ноль. С азов и надо учиться, так сказать с нуля.
Начинать нужно с ЯП, имеющего меньший порог вхождения, например с BASCOM-AVR и по мере появления представления об устройстве МК, можно начать учить асм.
PS.
Даташит на ATmega8 надеюсь скачали и ознакомились с ним?
Последний раз редактировалось Мурик Чт сен 04, 2014 14:48:24, всего редактировалось 2 раза.
- Реклама
Именно так. Тогда станут понятные многие неочевидные вещи на сях.Мурик писал(а):Начинать с нуля, да еще и с ассемблера?
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
- Сообщения: 3385
- Зарегистрирован: Пн окт 11, 2010 19:00:08
Думаю что не стоит объяснить какова вероятность "выстрелить в ногу" у новичка?Gudd-Head писал(а):Именно так.
Начинать нужно в высокоуровневого ЯП и по мере обучения, можно браться за асм.
какой BASCOM-AVR посоветуете, если что то характеристики моего компа под спойлером
Процессор 1.80GHz
ОЗУ 2.50 ГБ
32 разрядная система
Спойлер
Windows 7 МаксимальнаяПроцессор 1.80GHz
ОЗУ 2.50 ГБ
32 разрядная система
Когда кажется что ты все понял, оказывается что ты и половины не знаешь!
Прошу прощения... А можно я здесь вопросик задам? Он тоже вроде относится к теме...
Есть АТТини2313, таймер1, который считает. Берем значение в произвольный момент времени из двух регистров TCNT1H и TCNT1L, получается число из двух байт. А теперь, надо поделить это число на 120...
Я понимаю, что достаточно всего лишь сдвинуть его вправо 60 раз, что равносильно делению на 2 этих же 60 раз. Но! Тогда все число уже через 16 сдвигов вывалится в никуда... (((((
А у меня же бывшее число - это замеренное время. А мне надо всего 1/120 часть этого ЗАМЕРЕННОГО времени вычислить, для использования в дальнейшей программе.
З.Ы. Ассемблер
З.З.Ы. И еще, как сдвинуть так, чтобы старший байт двигал и младший?
З.З.З.Ы. Время измеренное вначале в миллисекундах, а при делении на 120 получаются микросекунды, ну или десятые миллисекунды...
З.З.З.З.Ы. И вообще, что-то делаю я не правильно... Вот получилось у меня, например, число 0b10000000 00000000, что в десятичной означает 32768. При делении 32768 на 120 получается 273,07 (примерно), а это чуть больше середины сдвинутого числа...
Есть АТТини2313, таймер1, который считает. Берем значение в произвольный момент времени из двух регистров TCNT1H и TCNT1L, получается число из двух байт. А теперь, надо поделить это число на 120...
Я понимаю, что достаточно всего лишь сдвинуть его вправо 60 раз, что равносильно делению на 2 этих же 60 раз. Но! Тогда все число уже через 16 сдвигов вывалится в никуда... (((((
А у меня же бывшее число - это замеренное время. А мне надо всего 1/120 часть этого ЗАМЕРЕННОГО времени вычислить, для использования в дальнейшей программе.
З.Ы. Ассемблер
З.З.Ы. И еще, как сдвинуть так, чтобы старший байт двигал и младший?
З.З.З.Ы. Время измеренное вначале в миллисекундах, а при делении на 120 получаются микросекунды, ну или десятые миллисекунды...
З.З.З.З.Ы. И вообще, что-то делаю я не правильно... Вот получилось у меня, например, число 0b10000000 00000000, что в десятичной означает 32768. При делении 32768 на 120 получается 273,07 (примерно), а это чуть больше середины сдвинутого числа...
Последний раз редактировалось СКАЗОЧНИК Пт сен 05, 2014 19:14:38, всего редактировалось 1 раз.
Станислав
Сдвиг вправо - ror R16СКАЗОЧНИК писал(а): З.Ы. Ассемблер
З.З.Ы. И еще, как сдвинуть так, чтобы старший байт двигал и младший?
- Сообщения: 3604
- Зарегистрирован: Пн июл 28, 2008 22:12:01
1) 2 ^7 уже 128 , откуда 60 насчиталось?
2) проверяем CARRY
3) в миллисекунде 1000 микросекунд ...
2) проверяем CARRY
3) в миллисекунде 1000 микросекунд ...
Блиииииин!!!! Точно...
Чего это я степень на умножение заменил... (((( Совсем тупею.
Тогда другой вопрос получается.... А я вот, хочу на 120 разделить... А не на 128...
Тогда другой вопрос получается.... А я вот, хочу на 120 разделить... А не на 128...
Станислав
- Сообщения: 3604
- Зарегистрирован: Пн июл 28, 2008 22:12:01
Разложить на множители - степени двойки , оставшийся простой множитель - искать процедуру на асмеСКАЗОЧНИК писал(а):
Тогда другой вопрос получается.... А я вот, хочу на 120 разделить... А не на 128...
Писдес.... я попал.... ((((
Спасибо за информацию! Очень признателен.
Спасибо за информацию! Очень признателен.
Станислав
- Сообщения: 3604
- Зарегистрирован: Пн июл 28, 2008 22:12:01
Не все так страшно ... 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
IDE не требовательна к ресурсам компа. На форуме есть отдельная обширная тема обсуждения BASCOM. http://www.radiokot.ru/forum/viewtopic.php?f=57&t=6408Масяня писал(а):какой BASCOM-AVR посоветуете
Прошу прощения за свою тупость... Но не могу разобраться.. Помогите пожалуйста.
Вот все с делением маюсь. Задача таже, что и выше. Решил замутить свое деление, примеры посмотрел, Ревича почитал. Туплю с операторами subi и sbci.
Вот я решил, что мне достаточно разделить на 120 без остатка. Для простоты схемы надо просто вычитать из ДЕЛИМОГО ДЕЛИТЕЛЬ и проверять не стал ли остаток меньше ДЕЛИТЕЛЯ. И так в цикле, а в одну переменную любую просто инкрементировать счетчик количества циклов, это и будет результат деление, т.е. ЧАСТНОЕ (без остатка).
Тупость у меня в том, что достаточно легко понять, как работает оператор subi с одинм байтом (8 разрядов). А вот как их два применять и как работает флаг переноса (С) и как это работает сразу с двумя байтами??? Что из чего вычитать в первую очередь? Как понять вычитание однобайтного из двухбатного???
Голова квадратная стала с этой арифметикой...
Вот все с делением маюсь. Задача таже, что и выше. Решил замутить свое деление, примеры посмотрел, Ревича почитал. Туплю с операторами subi и sbci.
Вот я решил, что мне достаточно разделить на 120 без остатка. Для простоты схемы надо просто вычитать из ДЕЛИМОГО ДЕЛИТЕЛЬ и проверять не стал ли остаток меньше ДЕЛИТЕЛЯ. И так в цикле, а в одну переменную любую просто инкрементировать счетчик количества циклов, это и будет результат деление, т.е. ЧАСТНОЕ (без остатка).
Тупость у меня в том, что достаточно легко понять, как работает оператор subi с одинм байтом (8 разрядов). А вот как их два применять и как работает флаг переноса (С) и как это работает сразу с двумя байтами??? Что из чего вычитать в первую очередь? Как понять вычитание однобайтного из двухбатного???
Голова квадратная стала с этой арифметикой...
Станислав
- Сообщения: 3832
- Зарегистрирован: Сб сен 10, 2011 17:46:25
зачем велосипед изобретать - выше давали ссылку на библиотеки Чена, вот еще с комментариями на русскомСКАЗОЧНИК писал(а):Решил замутить свое деление
http://we.easyelectronics.ru/AVR/matema ... v-avr.html
ага. это тоже смотрел. )))
Просто хочу разобраться как работает вычитание с переносом... Могу на листочке из двухбайтового вычитать однобайтовое... А как это делает ассемблер не доходит... (((( Именно эти два оператора...
Просто хочу разобраться как работает вычитание с переносом... Могу на листочке из двухбайтового вычитать однобайтовое... А как это делает ассемблер не доходит... (((( Именно эти два оператора...
Станислав
- Сообщения: 3832
- Зарегистрирован: Сб сен 10, 2011 17:46:25
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


