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

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

1 (один) 8-ногий МК за 80 центов и 1 RC-цепочка выходного фильтра vs геморрой с генератором Вина. Исходник внутри

Отправлено =AVR= 06 апреля 2007 г. 00:34
В ответ на: ОС сделать по амплитуде... Вроде у Х-Х что-то подобное было, но могу путать. отправлено SM 06 апреля 2007 г. 00:30


;--------------------------------------------------------------------
; 256-point +-127 steps 1-KHz sinewave generation with ATTiny25/45 250-KHz PWM
; Flash usage - 34 code words, 128 data words (sinewave table)
; (c) =AVR= 2006
;--------------------------------------------------------------------

.nolist
.include "tn45def.inc"
.list

;--------------------------------------------------------------------
; Register assignments
;--------------------------------------------------------------------
.def stat = r2 ; SR save/restore register
.def tmp = r16 ; Temporary working register
.def sinptrl = r24 ; Sinewave table pointer register LSB
.def sinptrh = r25 ; Sinewave table pointer register MSB
;--------------------------------------------------------------------

;--------------------------------------------------------------------
; Code segment start
.cseg
;--------------------------------------------------------------------
; Interrupt vector table (IVT)
;--------------------------------------------------------------------
; RESET vector
.org 0
rjmp main
;--------------------------------------------------------------------
; TCNT1 overflow interrupt vector
.org OVF1addr
; TCNT1 overflow ISR, located in IVT area since no further interrupts are used
; Executes in 20 clocks (1.25 uS @16 MHz)
OVF1ISR:
push zl ; Save Z, SREG registers
push zh ;
in stat,SREG ;

ldi sinptrh,2*high(sintab) ; Initialise sinewave table pointer MSB
movw zl,sinptrl ; Copy sinewave table pointer to Z reg

lpm sinptrh,Z ; Read a next table entry (byte)
out OCR1A,sinptrh ; Set a new PWM value

inc sinptrl ; Advance a sinewave table pointer (LSB only)

out SREG,stat ; Restore SREG, Z registers
pop zh ;
pop zl ;

reti
;--------------------------------------------------------------------

;--------------------------------------------------------------------
; Main code
main:
rcall init_PLL ; Initialise PLL
rcall init_T1 ; Initialise TCNT1
sbi DDRB,PB1 ; Set up PB1 as PWM output

clr sinptrl ; Initialise a sinewave table pointer LSB

ldi tmp,(1 << TOIE1); Enable TCNT1 overflow interrupt
out TIMSK,tmp ;
sei ; Global interrupt enable

rjmp PC ; Loop forever
;--------------------------------------------------------------------

;--------------------------------------------------------------------
; Subroutines
;--------------------------------------------------------------------
; PLL setup
init_PLL:
ldi tmp,(1 << PLLE) ; Enable PLL
out PLLCSR,tmp ;

pllwait:
in tmp,PLLCSR ; Wait until PLL is locked
sbrs tmp,PLOCK ;
rjmp pllwait ;

ori tmp,(1 << PCKE) ; Switch peripheral clock to PLL
out PLLCSR,tmp ;
ret
;--------------------------------------------------------------------

;--------------------------------------------------------------------
; Setup TCNT1
init_T1:
ldi tmp,255 ; Set TCNT1 TOP value
out OCR1C,tmp ; to get 0..255 PWM depth range

ldi tmp,(1 << CS10)|(1 << PWM1A)|(2 << COM1A0) ; Run TCNT1 at 64 MHz PLL CLOCK
out TCCR1,tmp ; in Fast PWM mode (PWM carrier frequency = 250 KHz)
ret
;--------------------------------------------------------------------

;--------------------------------------------------------------------
; Constants in Flash
;--------------------------------------------------------------------
; Sinewave table must be aligned at 256 word boundary to simplify indexing
; This macro is used for arbitrary boundary value alignment
;--------------------------------------------------------------------
.macro align
.org @0+PC-PC%@0
.endm
;--------------------------------------------------------------------

align 256
;--------------------------------------------------------------------
; 256-entry*1 byte, +-127 magnitude sinewave table
sintab: .db 128,131,134,137,140,144,147,150,153,156,159,162,165,168,171,174
.db 177,179,182,185,188,191,193,196,199,201,204,206,209,211,213,216
.db 218,220,222,224,226,228,230,232,234,235,237,239,240,241,243,244
.db 245,246,248,249,250,250,251,252,253,253,254,254,254,254,254,254
.db 254,254,254,254,254,254,254,253,253,252,251,250,250,249,248,246
.db 245,244,243,241,240,239,237,235,234,232,230,228,226,224,222,220
.db 218,216,213,211,209,206,204,201,199,196,193,191,188,185,182,179
.db 177,174,171,168,165,162,159,156,153,150,147,144,140,137,134,131
.db 128,125,122,119,116,112,109,106,103,100,97,94,91,88,85,82
.db 79,77,74,71,68,65,63,60,57,55,52,50,47,45,43,40
.db 38,36,34,32,30,28,26,24,22,21,19,17,16,15,13,12
.db 11,10,8,7,6,6,5,4,3,3,2,2,2,1,1,1
.db 1,1,1,1,2,2,2,3,3,4,5,6,6,7,8,10
.db 11,12,13,15,16,17,19,21,22,24,26,28,30,32,34,36
.db 38,40,43,45,47,50,52,55,57,60,63,65,68,71,74,77
.db 79,82,85,88,91,94,97,100,103,106,109,112,116,119,122,125
;--------------------------------------------------------------------
.exit



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

Ответы


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

Сообщение:

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

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

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

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