Телесистемы
 Разработка, производство и продажа радиоэлектронной аппаратуры
На главную   | Карта сайта | Пишите нам | В избранное
Требуется программист в Зеленограде
- обработка данных с датчиков; ColdFire; 40 тыс.
e-mail:jobsmp@pochta.ru

Телесистемы | Электроника | Конференция «Микроконтроллеры и их применение»

Могу дать осмысленный пример. DDS-генератор на AVR, на Си это невозможно.

Отправлено Леонид Иванович (87.252.227.56) 22 мая 2010, г. 14:14
В ответ на: Надо прям на примерах. Кто даст неболшой осмысленный пример чтобы в сишный код принципиально был в 2 и больше раз асемблерного на одном алгоритме. отправлено VasilyS 22 мая 2010, г. 09:37

Конкретно, вот это место:


DDS: ldi XL,(1<<COM1A0)
out TCCR1A,XL ;OC1A toggle
ldi XL,(1<<COM1A0) | (1<<FOC1A)
out TCCR1A,XL ;set SCK (OC1A force toggle)
Port_I2SWS_0 ;clear WS
out TCCR1A,XL ;clear SCK (OC1A force toggle)

out SPDR,SinH ;---> load DAC high byte

in tsreg,SREG ;save status register
clr r1
add PhaseK,FreqK ;Phase(0..33) = Phase(0..33) + Freq(0..31)
adc PhaseL,FreqL
adc PhaseM,FreqM
adc PhaseN,FreqN
adc PhaseP,r1 ;r1 = 0

mov XL,PhaseN ;XL = wa (word address)
mov r0,PhaseM ;r0 = dx
sbrc PhaseP,0 ;if(Phase.32 == 0)
com XL ;wa = !wa
sbrc PhaseP,0 ;if(Phase.32 == 0)
com r0 ;dx = !dx

ldi XH,high(LUT) ;XH = table base (low(LUT) = 0)
add XL,XL ;offset * 2 (word offset)
adc XH,r1 ;r1 = 0
nop

out SPDR,SinL ;---> load DAC low byte

ld SinL,X+ ;SinL = lo sin[x]
ld SinH,X+ ;SinH = hi sin[x]
ld r1,X ;r1 = lo sin[x + 1]
sub r1,SinL ;r1 = dA
mul r1,r0 ;r1,r0 = dA * dx
rol r0 ;C = 1 if r0.7 == 1
clr r0
adc SinL,r1 ;SinH:SinL = sin[x] + round(r1:r0 / 256)
adc SinH,r0 ;SinH:SinL = A

sbrs PhaseP,1
rjmp ph_cd ;jump if Phase.33 == 0

ph_ab: com SinL ;SIN > 0, data line has NOT gate,
com SinH ;SinH:SinL = !SinH:SinL
rjmp ph_all

ph_cd: sec
sbc SinL,r0 ;SIN < 0, data line has NOT gate,
sbc SinH,r0 ;SinH:SinL = SinH:SinL - 1

ph_all: ldi XL,(1<<COM1A0) | (1<<FOC1A)
out TCCR1A,XL ;OC1A force toggle
out SPDR,r0 ;zero data for another DAC channel
Port_I2SWS_1 ;set WS
ldi XL,(1<<COM1A1)
out TCCR1A,XL ;OC1A clear on compare

out SREG,tsreg ;restore status register
reti


У меня это прерывание взывается с частотой 216 кГц при тактовой 16 МНц. Слабо на Си такое сделать?


Составить ответ | Вернуться на конференцию

Ответы


Отправка ответа
Имя*: 
Пароль: 
E-mail: 
Тема*:

Сообщение:

Ссылка на URL: 
URL изображения: 

если вы незарегистрированный на форуме пользователь, то
для успешного добавления сообщения заполните поле, как указано ниже:
увеличьте 6 на 2:

Перейти к списку ответов | Конференция | Раздел "Электроника" | Главная страница | Карта сайта

Rambler's Top100 Рейтинг@Mail.ru
 
Web telesys.ru