ШИМ-синус на 256 точек на ATTiny45. 34 слова кода (из них собственно генерация ШИМ-синуса - 12 слов) + 128 слов таблица (+)
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено =AVR= 28 ноября 2006 г. 01:45

Компилировать AVRASM2


;--------------------------------------------------------------------
; 256-point +-127 steps 1-KHz sinewave generation with ATTiny45 250-KHz PWM
; Flash usage - 34 code words, 128 data words (sinewave table)
;--------------------------------------------------------------------

.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
RESET:
rjmp main
;--------------------------------------------------------------------

;--------------------------------------------------------------------
; TCNT1 overflow interrupt vector
.org OVF1addr
;--------------------------------------------------------------------

;--------------------------------------------------------------------
; Interrupt service routines (ISR)
;--------------------------------------------------------------------
; 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

Вот скриншот с экрана осциллографа - сигнал с PB1, пропущенный через RC-цепочку 10k+10nF.

Приятного аппетита (это Борщу)

Составить ответ  |||  Конференция  |||  Архив

Ответы


Отправка ответа
Имя (обязательно): 
Пароль: 
E-mail: 

Тема (обязательно):
Сообщение:

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


Rambler's Top100 Рейтинг@Mail.ru
Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание