Компьютерный форум
Правила
Вернуться   Компьютерный форум > Форум программистов > Технологии программирования > Железо. Написание драйверов
Перезагрузить страницу Микропроцессоры 8051
Ответ
 
Опции темы Опции просмотра
  (#1 (permalink)) Старый
Kelt Kelt вне форума
Member
 
Сообщений: 196
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 03.06.2004
По умолчанию Микропроцессоры 8051 - 24.03.2005, 08:01

Вообщем у меня такая задача, у нас у универе идет дисцеплина микропроцессорные системы, нас там обучают всему разному, и архитектуре и программированию. Но программируем мы под эмулятором, так что команд у нас не много, проблема заключается в том что там дали задание, а я ни как не могу в нем разобраться, у нас есть функция
f(x)=a1*x^3+a2*x^2+a3*x+a4
так вот, х должен меняться от 0 до 3, и все эти результаты надо записать отдельно, и организовать это надо с помощью цикла!
Не подскажите как это сделать?
Ответить с цитированием
  (#2 (permalink)) Старый
voodOOpeople voodOOpeople вне форума
Member
 
Сообщений: 1,038
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 07.08.2004
По умолчанию Re: Микропроцессоры 8051 - 24.03.2005, 10:14

Цитата:
Originally posted by Kelt
[b]... есть функция
f(x)=a1*x^3+a2*x^2+a3*x+a4
так вот, х должен меняться от 0 до 3
... похоже задачка на метод Ньютона (см. вычислительная математика)
Цитата:
Originally posted by Kelt
[b]и все эти результаты надо записать отдельно...
Не мог бы ты пояснить что это значит? Если результаты - это вычисление f(x), то в каких точках интервала?

ЗЫ Фигне вас какой-то учат
Ответить с цитированием
  (#3 (permalink)) Старый
Kelt Kelt вне форума
Member
 
Сообщений: 196
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 03.06.2004
По умолчанию 25.03.2005, 08:33

Просто х меняется от 0 до 3 с шагом 1, вот и все, арезультаты надо записать для каждого х, вот в принципе и все, есть такая идея счтобы расчитать этот полином таким способом:
((a3*x+a2)*x+a3)*x+a0, теперь остается только организовать цикл, где сначало будет умножение, а потом сложение. Может кто сталкивался с программирование.
Ответить с цитированием
  (#4 (permalink)) Старый
voodOOpeople voodOOpeople вне форума
Member
 
Сообщений: 1,038
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 07.08.2004
По умолчанию 25.03.2005, 10:45

Теперь понятно что результатом должно быть целое, если коэффициенты тоже целочисленные беззнаковые. Вычислением кубических уравнений не занимался, но могу привести код для сложения и умножения 16-ти разрядных беззнаковых чисел. Оное конечно подстроено под конкретно мои вычисления так что имеются фичи. Но если ты хоть чуть-чуть учился (училась) думаю подправить код под свои нужды будет несложно.

(код написан для транслятора асемблера Keil)
Умножение беззнаковых 16-ти битных чисел:
Код:
;--------------------------------------------------------------------------------------------
mul_dptr_by_scale:
/*
**    Подпрограмма выполняющая умножение DPTR 
**    на 16-разрядный множитель (множитель шкалы)
**    Входящие параметры:
**  R3R2 - множимое шкалы 
**  DPHDPL - множитель (от преремены названий сумма не меняется)
**    На выходе:
**  R7R6R5R4 - пАлучИное чАсло 
*/
  mov    r5, dph
  mov    r4, dpl    

;R7R6=стб мм * стб мн
  mov    a, r3    ;старший байт множимого
  mov    b, r5    ;старший байт множителя
  push    b  ;сохраняем стб мн в стеке, так как он щас будет затерт
  mul    ab  ;перемножаем стб мм * стб мн
  mov    r7, b    ;записываем результат в R7R6
  mov    r6, a    

;R7R6=млб мм * млб мн
  mov    a, r2    ;младший байт множимого
  mov    b, r4    ;младший байт множителя
  push    b  ;сохраняем млб мн в стеке, так как он щас будет затерт
  mul    ab  ;перемножаем млб мм * млб мн
  mov    r5, b    ;записываем результат
  mov    r4, a    

;R6R7DPH увеличиваем на млб мн * стб мм
  mov    a, r3    ;старший байт множимого
  pop    b  ;младший байт множителя
  mul    ab  ;перемножаем млб мн * стб мм
  add    a, r5    ;добавляем к DPH младший байт произведения
  mov    r5, a    
  mov    a, r6    ;добавляем к R6 старший байт произведения
  addc    a, b    ;с учетом переноса
  mov    r6, a    
  mov    a, r7    ;добавляем к R7 перенос от этих сложений
  addc    a, #0    
  mov    r7, a    

;R6R7DPH увеличиваем на млб мм * стб мн
  mov    a, r2    ;младший байт множимого
  pop    b  ;старший байт мноителя
  mul    ab  ;перемножаем млб мм * стб мн
  add    a, r5    ;добавляем к DPH младший байт произведения
  mov    r5, a    
  mov    a, r6    ;добавляем к R6 старший байт произведения
  addc    a, b    ;с учетом переноса
  mov    r6, a    
  mov    a, r7    ;добавляем к R7 перенос от этих сложений
  addc    a, #0    
  mov    r7, a    

;R7R6DPTR - пАлучИное чАсло 
;корректируем полученное произведение из вида 0x xx xx xx  к виду  xx хх хх х0 
;(x0 - представляет собой дробную часть)
  clr    a      ;умножаем частное на 16
  mov    r0, #ar4    ;сдвигаем на 4 бита влево первое слово 
  xch    a, @r0  ;начиная с младших разрядов
  swap    a    
  xchd    a, @r0    
  xch    a, @r0    
  inc    r0    
  xch    a, @r0  ;сдвигаем на 4 бита влево второе слово 
  swap    a    
  xchd    a, @r0    
  xch    a, @r0    
  inc    r0    
  xch    a, @r0  ;сдвигаем на 4 бита влево третье слово 
  swap    a    
  xchd    a, @r0    
  xch    a, @r0    
  inc    r0    
  xch    a, @r0  ;сдвигаем на 4 бита влево четвертое слово 
  swap    a    
  xchd    a, @r0    
  xch    a, @r0    
RET


;--------------------------------------------------------------------------------------------
round_32_todptr:
/*
**    Подпрограмма выполняющая округление 32-битного целого до 16-битного
**    Вхаднящие параметры:
**  R7R6R5R4 - 32битное число для округления 
**    На выходе:
**  DPTR <- R7R6@ - округленное число
*/  
  mov    a, r5  ;округление производим только по байту r5
  anl    a, #0F0h    ;выделяем старший полубайт
  add    a, #90h  ;если он больше или равен 7h возникает перенос
  mov    a, r6  ;цапаем младший байт результата
  addc    a, #0  ;приплюсовываем бит переноса
  mov    dpl, a  ;отправляем результат на хранение в DPL
  mov    a, r7  ;хватаем старший байт результата
  addc    a, #0  ;к нему плюсуем перенос от операции сложения
  mov    dph, a  ;рузальтат на хранение в DPH
  jnc    end_round1    
  mov    dph, #0FFh    ;если от последней операции сложения возник перенос
  mov    dpl, #0FFh    ;то заносим в результат максимально возможное значение

end_round1:
RET
Сложение двух 16 разрядных чисел
Код:
;--------------------------------------------------------------------------------------------
add_r5r4_r3r2:
/*
**    Подпрограмма сложения 16 битных чисел
**    Входящий параметр 
**  R5R4 - 1-ое слагаемое
**  R3R2 - 2-ое слагаемое
**    Выходной параметр
**  R5R4 - сумма
*/
  clr    cy    ;очищаем перенос
  mov    a, r4;складываем млб 1 + млб 2
  add    a, r2
  mov    r4, a
  mov    a, r5;складываем стб 1 + стб 2 + перенос
  addc    a, r3
  mov    r5, a
RET
Тебе попался очень хороший интервал вычислений , поэтому вычисление ((a3*x+a2)*x+a3)*x+a0 вполне прокатит. В жизни такого не бывает - фигне вас учат.
Думаю организовать цикл вычислений элементарно и ты справишся с этим. Если нет пиши. Если коэффициенты все-таки знаковые (или что еще хуже нецелые) придется повозится подольше. Заодно сообщи необходимую разрядность результата. Странно что это не оговаривыется в задании.
Кстати возможно ли приближенное вычисление результата? Обычно такие задачи в реале решаются приближенными численными методами: методом деления отрезка пополам или методом Ньютона например.
Кстати нужна реализация на асме или возможна программа на С?
Ответить с цитированием
  (#5 (permalink)) Старый
Бим Бим вне форума
Member
 
Сообщений: 65
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 27.08.2005
По умолчанию 16.09.2005, 14:35

Знаем знаем такую дисциплину. Всегда наипростейшие задачк дают, ну и орошо для учебы. Плохо для дальнейшего.
Универсальный способ - это подсмотреть, как это делают другие. Напиши на Си, раз плюнуть, потом запускай демо-Кейл Софтвайэ (там код без лишних излишеств генерит), компилируй, деассемблируй и - инджой!
Ответить с цитированием
Ads.
Ads
Ответ

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
На какие параметры передачи настроен COM-порт 8051 Бим Микроконтроллеры 1 12.07.2010 17:34
Нужна помощь в написании программы для процессора 8051 на ассемблере Ketrin Форум программистов 4 09.05.2008 13:44
Нужна помощь с 8051 написание курсовой работы Ketrin007 Железо. Написание драйверов 0 06.05.2008 16:06
Задачки для 8051 Areostar Задания за деньги 3 11.03.2008 19:07
Микропроцессоры и микропроцессорные системы Шура Электроника 2 21.06.2007 18:57
Info-8051 где найти в интернете imported_Гостья Assembler 11 31.08.2005 10:46
Где найти исходниками к asm 8051 voodOOpeople Assembler 4 17.09.2004 18:55
Программированаие на keil 8051 на си 51 и асм51 Swetlana Assembler 0 24.05.2004 15:55



Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Нardforum.ru - компьютерный форум и программирование, форум программистов