Страница 1 из 2
Дальномер на микронтроллере
Добавлено: Вс дек 15, 2013 00:33:26
Dimon11
Re: Дальномер на микронтроллере
Добавлено: Вс дек 15, 2013 07:18:37
zero648
Присваиваем не имя числу, а наверно, все таки, значение присваиваем переменной с именем max.

.
Далее, вершина стека у 16 меги задается не только в SPL, но и SPH, оперативки 1 кг у неё.
Код: Выделить всё
ldi r16,high(RAMEND) ; Main program start
out SPH, r16 ; Set Stack Pointer to top of RAM
ldi r16, low(RAMEND) ;
out SPL, r16 ;
В r20 записываешь 37.5, но на самом деле 37 же, что это за 37.5?
Так проверяют биты а не байты:
это условие будет выполняться, если бит 0 равен 0, а все остальные пофиг что в них
Тут тоже самое, проверяешь только первый бит:
Мда, на какую то задержку целый 16 битный таймер пожертвовал
Теперь на счет точности вычислений, относительно этой константы 37.5, чтобы её повысить, в смысле точность, вместо 37 умножай на 37500, а потом дели на 1000, будет намного точнее.
Re: Дальномер на микронтроллере
Добавлено: Вс дек 15, 2013 16:01:18
Dimon11
А как в АТMega16 осуществить операцию деления? Это имеется ввиду дробное умножение? И потом, где у нас будет хранится результат вычислений. Например за 0.01 секунды у нас насчиталось 1500000 метров. Это получается сразу в несколько регистров такое число записывать?
Re: Дальномер на микронтроллере
Добавлено: Вс дек 15, 2013 16:58:28
zero648
Вот для примера делим слово на 1000: вход r17:r16, выход r16.
Код: Выделить всё
unsigned: ldi r18,$e8
ldi r19,$03
clr r20 ;Count result
div_1000: movw r0,r16 ;Division 1000's
sub r0,r18
sbc r1,r19
brcs ok_1000
inc r20
movw r16,r0
rjmp div_1000 ; Go again
ok_1000: mov r16,r20 ; Store result
Dimon11 писал(а):Это получается сразу в несколько регистров такое число записывать?
Сколько регистров потребуется, во столько и надо записывать. Не обязательно использовать регистры, оперативка для чего, аж целый 1кБ.
Re: Дальномер на микронтроллере
Добавлено: Вс дек 15, 2013 18:05:35
Jack_A
zero648 писал(а):Присваиваем не имя числу, а наверно, все таки, значение присваиваем переменной с именем max.
Никоим образом. Именно константе 40000 присваивается имя max. Ведь в дальнейшем она употребляется с команде CPI, работающей с непосредственным операндом, т.е. с константой. Затем, если при отладке понадобится изменить это значение, за ним не придётся гоняться по всему листингу, достаточно заменить один раз в директиве .equ
Dimon11, насчёт деления сначала надо определиться с форматом операндов : с фиксированной ( на первых порах, думаю ) или плавающей точкой. Например : R16<целая часть>.R17<дробная часть>. Тогда 31.5 будет выглядеть так :
R16 = 1F, R17 = 80 . Точка, разумеется, нигде не хранится, только в уме .
PS Новичку курсовую задать не могут -- как минимум, прослушавшему ( или прогулявшему

) курс лекций по данному предмету.
Re: Дальномер на микронтроллере
Добавлено: Вс дек 15, 2013 18:32:16
zero648
Jack_A писал(а): Никоим образом. Именно константе 40000 присваивается имя max.
Ну, не знаю, как там написано в определениях констант и имен для препроцессоров, но считаю логично, так как, Я, считаю, все что справа присваивается тому, что слева. Хотя приходилось писать код для моторолы, там все наоборот, но только в командах.
прослушавшему ( или прогулявшему ) курс лекций по данному предмету.
Как минимум, это определение он точно знает, походу.

А Я вздумал, видите ли, лекции читать

.
Re: Дальномер на микронтроллере
Добавлено: Вс дек 15, 2013 20:30:28
Dimon11
Кстати, а на какой частоте будет работать таймер, если частота микроконтроллера находится в диапазоне ( от 0 до 16) МГц ? То есть можно брать любое значение из этого диапазона?
Re: Дальномер на микронтроллере
Добавлено: Пн дек 16, 2013 08:14:58
aardvark
zero648 писал(а):Теперь на счет точности вычислений, относительно этой константы 37.5, чтобы её повысить, в смысле точность, вместо 37 умножай на 37500, а потом дели на 1000, будет намного точнее.
Ну зачем же так радикально?
Достаточно умножить на 75 (=37.5х2) и затем поделить на 2 (сдвиг вправо на один бит).
И точность никоим образом не пострадает, и деление выполняется всего за один такт...
Re: Дальномер на микронтроллере
Добавлено: Ср дек 18, 2013 21:14:49
Dimon11
Сделал максимальное число, до которого считает счетчик равным 50000. Теперь нам нужно умножать не на 37.5 , а на 30, тут все нормально. У меня компилирует без ошибок. Но как же так? Допустим, у нас досчитало до 50000, умножаем на 30, получается 1500000...Почему не выдает ошибки, то что регистр R20 переполнен (куда сохраняет результат произведения)?
Re: Дальномер на микронтроллере
Добавлено: Чт дек 19, 2013 05:29:44
zero648
Dimon11 писал(а):досчитало до 50000, умножаем на 30, получается 1500000...Почему не выдает ошибки, то что регистр R20 переполнен (куда сохраняет результат произведения)?
Ошибки не будет, вы сами должны об этом позаботится, нужно просто при переполнении r20 складывать переполнения в другой свободный регистр командой ADC rxx,rnn, где rnn=0
Re: Дальномер на микронтроллере
Добавлено: Чт дек 19, 2013 09:36:45
pyzhman
Dimon11 писал(а):Почему не выдает ошибки...?
Мк, а равно и компилятору, по барабану ошибки при переполнении. Нужно самому такие ситуации отслеживать. Как и указал предыдущий оратор.

Re: Дальномер на микронтроллере
Добавлено: Пт дек 20, 2013 00:39:13
Dimon11
Тогда почему при попытке записи числа 11Е1А300 ( значение скорости света) компилятор ругался, если ему все равно на ошибки?
Re: Дальномер на микронтроллере
Добавлено: Пт дек 20, 2013 03:24:01
akl
Про компиляторы не скажу,

Ассемблер, конечно, имеет ограничения при представлении чисел, но такие числа преобразует легко.
Код: Выделить всё
; заданная скорость света
Vo:
.DB BYTE4(300000000),BYTE3(300000000)
.DB BYTE2(300000000),BYTE1(300000000)
или
Код: Выделить всё
LDI R20,BYTE4(300000000)
LDI R21,BYTE3(300000000)
LDI R22,BYTE2(300000000) ;HIGH(300000000)
LDI R23,BYTE1(300000000) ;LOW(300000000)
Re: Дальномер на микронтроллере
Добавлено: Вс дек 22, 2013 19:10:47
Dimon11
Что то я запутался. Мы, в подпрограмме задержки, сначала поместили в регистр temp значение TCNT1L, а потом поместили в в temp значение TCNT1H...Куда делось первое значение младшего счетного регистра ?
Re: Дальномер на микронтроллере
Добавлено: Вс дек 22, 2013 21:50:31
zero648
Нужно сохранять в разные регистры например temp_l и temp_h, а так младшее значение TCNT1L просто заменилось старшим TCNT1H.
Re: Дальномер на микронтроллере
Добавлено: Ср дек 25, 2013 22:30:44
Dimon11
А как мне вывести результат на 7-мисегментный индикатор. Допустим у меня получилось число 16Е360, (хранится в трех регистрах). Его надо как то преобразовывать в другую систему исчисления или т.п ?
Re: Дальномер на микронтроллере
Добавлено: Чт дек 26, 2013 06:05:06
zero648
Его надо как то преобразовывать в другую систему исчисления или т.п ?
Проще в десятичную систему, раскидать разряды по регистрам, можно в BCD формат упаковать, так регистров в два раза меньше потребуется для хранения.
Здесь
http://radiokot.ru/forum/viewtopic.php? ... 6&start=20 код выкладывал для 16 битного числа, вам нужно аналогично только 32 битное раскидать.
Re: Дальномер на микронтроллере
Добавлено: Чт дек 26, 2013 07:08:50
akl
Удалил.

Re: Дальномер на микронтроллере
Добавлено: Чт дек 26, 2013 12:14:09
Dimon11
А это выводимое число надо в отдельные цифры преобразовывать?
Re: Дальномер на микронтроллере
Добавлено: Чт дек 26, 2013 12:20:38
akl
Удалил.
