Дальномер на микронтроллере

Обсуждаем контроллеры компании Atmel.
Dimon11
Первый раз сказал Мяу!
Сообщения: 23
Зарегистрирован: Вс дек 15, 2013 00:07:02

Дальномер на микронтроллере

Сообщение Dimon11 »

Всем привет. Итак, задали новичку делать курсовую, поэтому строго не судите за глупые ошибки. Пока что решил, что максимальное время задержки будет равно 0.01 секунды. Кнопки нет - как только подаем питание, передатчик работает сразу. Пока написал только часть программы, которая осуществляет только время задержки. Вывод на индикатор еще не делал. Оцените пожалуйста.

Изображение
Изображение
Изображение
Реклама
Аватара пользователя
zero648
Вымогатель припоя
Сообщения: 650
Зарегистрирован: Пн июн 18, 2012 12:01:04
Откуда: Челябинская область, Копейск

Re: Дальномер на микронтроллере

Сообщение 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, а все остальные пофиг что в них

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

sbrc temp,0
Тут тоже самое, проверяешь только первый бит:

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

sbrc temp,1
Мда, на какую то задержку целый 16 битный таймер пожертвовал :o

Теперь на счет точности вычислений, относительно этой константы 37.5, чтобы её повысить, в смысле точность, вместо 37 умножай на 37500, а потом дели на 1000, будет намного точнее.
Реклама
Dimon11
Первый раз сказал Мяу!
Сообщения: 23
Зарегистрирован: Вс дек 15, 2013 00:07:02

Re: Дальномер на микронтроллере

Сообщение Dimon11 »

А как в АТMega16 осуществить операцию деления? Это имеется ввиду дробное умножение? И потом, где у нас будет хранится результат вычислений. Например за 0.01 секунды у нас насчиталось 1500000 метров. Это получается сразу в несколько регистров такое число записывать?
Аватара пользователя
zero648
Вымогатель припоя
Сообщения: 650
Зарегистрирован: Пн июн 18, 2012 12:01:04
Откуда: Челябинская область, Копейск

Re: Дальномер на микронтроллере

Сообщение 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кБ.
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
Jack_A
Друг Кота
Сообщения: 6308
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

Re: Дальномер на микронтроллере

Сообщение Jack_A »

zero648 писал(а):Присваиваем не имя числу, а наверно, все таки, значение присваиваем переменной с именем max. :))
Никоим образом. Именно константе 40000 присваивается имя max. Ведь в дальнейшем она употребляется с команде CPI, работающей с непосредственным операндом, т.е. с константой. Затем, если при отладке понадобится изменить это значение, за ним не придётся гоняться по всему листингу, достаточно заменить один раз в директиве .equ

Dimon11, насчёт деления сначала надо определиться с форматом операндов : с фиксированной ( на первых порах, думаю ) или плавающей точкой. Например : R16<целая часть>.R17<дробная часть>. Тогда 31.5 будет выглядеть так :
R16 = 1F, R17 = 80 . Точка, разумеется, нигде не хранится, только в уме . :)

PS Новичку курсовую задать не могут -- как минимум, прослушавшему ( или прогулявшему :) ) курс лекций по данному предмету.
Реклама
Аватара пользователя
zero648
Вымогатель припоя
Сообщения: 650
Зарегистрирован: Пн июн 18, 2012 12:01:04
Откуда: Челябинская область, Копейск

Re: Дальномер на микронтроллере

Сообщение zero648 »

Jack_A писал(а): Никоим образом. Именно константе 40000 присваивается имя max.
Ну, не знаю, как там написано в определениях констант и имен для препроцессоров, но считаю логично, так как, Я, считаю, все что справа присваивается тому, что слева. Хотя приходилось писать код для моторолы, там все наоборот, но только в командах.
прослушавшему ( или прогулявшему ) курс лекций по данному предмету.
Как минимум, это определение он точно знает, походу. :))) А Я вздумал, видите ли, лекции читать :))) .
Реклама
Dimon11
Первый раз сказал Мяу!
Сообщения: 23
Зарегистрирован: Вс дек 15, 2013 00:07:02

Re: Дальномер на микронтроллере

Сообщение Dimon11 »

Кстати, а на какой частоте будет работать таймер, если частота микроконтроллера находится в диапазоне ( от 0 до 16) МГц ? То есть можно брать любое значение из этого диапазона?
aardvark
Родился
Сообщения: 1
Зарегистрирован: Пн дек 16, 2013 08:05:23

Re: Дальномер на микронтроллере

Сообщение aardvark »

zero648 писал(а):Теперь на счет точности вычислений, относительно этой константы 37.5, чтобы её повысить, в смысле точность, вместо 37 умножай на 37500, а потом дели на 1000, будет намного точнее.
Ну зачем же так радикально?
Достаточно умножить на 75 (=37.5х2) и затем поделить на 2 (сдвиг вправо на один бит).
И точность никоим образом не пострадает, и деление выполняется всего за один такт...
Dimon11
Первый раз сказал Мяу!
Сообщения: 23
Зарегистрирован: Вс дек 15, 2013 00:07:02

Re: Дальномер на микронтроллере

Сообщение Dimon11 »

Сделал максимальное число, до которого считает счетчик равным 50000. Теперь нам нужно умножать не на 37.5 , а на 30, тут все нормально. У меня компилирует без ошибок. Но как же так? Допустим, у нас досчитало до 50000, умножаем на 30, получается 1500000...Почему не выдает ошибки, то что регистр R20 переполнен (куда сохраняет результат произведения)?
Аватара пользователя
zero648
Вымогатель припоя
Сообщения: 650
Зарегистрирован: Пн июн 18, 2012 12:01:04
Откуда: Челябинская область, Копейск

Re: Дальномер на микронтроллере

Сообщение zero648 »

Dimon11 писал(а):досчитало до 50000, умножаем на 30, получается 1500000...Почему не выдает ошибки, то что регистр R20 переполнен (куда сохраняет результат произведения)?
Ошибки не будет, вы сами должны об этом позаботится, нужно просто при переполнении r20 складывать переполнения в другой свободный регистр командой ADC rxx,rnn, где rnn=0
Аватара пользователя
pyzhman
Друг Кота
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск
Контактная информация:

Re: Дальномер на микронтроллере

Сообщение pyzhman »

Dimon11 писал(а):Почему не выдает ошибки...?
Мк, а равно и компилятору, по барабану ошибки при переполнении. Нужно самому такие ситуации отслеживать. Как и указал предыдущий оратор. :)
Docendo discimus
Dimon11
Первый раз сказал Мяу!
Сообщения: 23
Зарегистрирован: Вс дек 15, 2013 00:07:02

Re: Дальномер на микронтроллере

Сообщение Dimon11 »

Тогда почему при попытке записи числа 11Е1А300 ( значение скорости света) компилятор ругался, если ему все равно на ошибки?
akl
Друг Кота
Сообщения: 4445
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Re: Дальномер на микронтроллере

Сообщение akl »

Про компиляторы не скажу, :dont_know: Ассемблер, конечно, имеет ограничения при представлении чисел, но такие числа преобразует легко.

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

; заданная скорость света
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)
Dimon11
Первый раз сказал Мяу!
Сообщения: 23
Зарегистрирован: Вс дек 15, 2013 00:07:02

Re: Дальномер на микронтроллере

Сообщение Dimon11 »

Что то я запутался. Мы, в подпрограмме задержки, сначала поместили в регистр temp значение TCNT1L, а потом поместили в в temp значение TCNT1H...Куда делось первое значение младшего счетного регистра ?
Аватара пользователя
zero648
Вымогатель припоя
Сообщения: 650
Зарегистрирован: Пн июн 18, 2012 12:01:04
Откуда: Челябинская область, Копейск

Re: Дальномер на микронтроллере

Сообщение zero648 »

Нужно сохранять в разные регистры например temp_l и temp_h, а так младшее значение TCNT1L просто заменилось старшим TCNT1H.
Dimon11
Первый раз сказал Мяу!
Сообщения: 23
Зарегистрирован: Вс дек 15, 2013 00:07:02

Re: Дальномер на микронтроллере

Сообщение Dimon11 »

А как мне вывести результат на 7-мисегментный индикатор. Допустим у меня получилось число 16Е360, (хранится в трех регистрах). Его надо как то преобразовывать в другую систему исчисления или т.п ?
Аватара пользователя
zero648
Вымогатель припоя
Сообщения: 650
Зарегистрирован: Пн июн 18, 2012 12:01:04
Откуда: Челябинская область, Копейск

Re: Дальномер на микронтроллере

Сообщение zero648 »

Его надо как то преобразовывать в другую систему исчисления или т.п ?
Проще в десятичную систему, раскидать разряды по регистрам, можно в BCD формат упаковать, так регистров в два раза меньше потребуется для хранения.
Здесь http://radiokot.ru/forum/viewtopic.php? ... 6&start=20 код выкладывал для 16 битного числа, вам нужно аналогично только 32 битное раскидать.
akl
Друг Кота
Сообщения: 4445
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Re: Дальномер на микронтроллере

Сообщение akl »

Удалил. :sleep:
Последний раз редактировалось akl Чт дек 26, 2013 12:52:21, всего редактировалось 1 раз.
Dimon11
Первый раз сказал Мяу!
Сообщения: 23
Зарегистрирован: Вс дек 15, 2013 00:07:02

Re: Дальномер на микронтроллере

Сообщение Dimon11 »

А это выводимое число надо в отдельные цифры преобразовывать?
akl
Друг Кота
Сообщения: 4445
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Re: Дальномер на микронтроллере

Сообщение akl »

Удалил. :sleep:
Последний раз редактировалось akl Чт дек 26, 2013 12:53:24, всего редактировалось 1 раз.
Ответить

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