Nun das ganze in Assembler (ist mein erstes Assembler-Programm).
Das kleine Testprogramm schafft bei 51 Schritten ca. 44kHz - aber jetzt
hab ich immer ein nettes Eck in der Kurve (siehe angehängtes Bild).
Wie soll ich nun am besten die Frequenzeinstellung lösen? Mit einem
Timer?
Der Controller muss eigentlich nichts anderes machen als die Tabellen
abzuarbeiten, da das LCD und die Eingabe von einem zweiten Controller
übernommen wird.
.include "m16def.inc"
ser R16
out DDRA,R16
ldi r16,0x05
ldi ZL, low(sine*2)
ldi ZH, HIGH(sine*2)
loop:
add zl, r16
lpm
out PORTA,R0
rjmp loop
sine:
.db 0x80,0x82,0x85,0x88,0x8C,0x8F,0x92,0x95
.db 0x98,0x9B,0x9E,0xA1,0xA4,0xA7,0xAA,0xAD
.db 0xB0,0xB3,0xB6,0xB9,0xBB,0xBE,0xC1,0xC3
.db 0xC6,0xC9,0xCB,0xCE,0xD0,0xD3,0xD5,0xD7
.db 0xDA,0xDC,0xDE,0xE0,0xE2,0xE4,0xE6,0xE8
.db 0xE9,0xEB,0xED,0xEE,0xF0,0xF1,0xF3,0xF4
.db 0xF5,0xF6,0xF8,0xF9,0xF9,0xFA,0xFB,0xFC
.db 0xFD,0xFD,0xFE,0xFE,0xFE,0xFF,0xFF,0xFF
.db 0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0xFE,0xFD
.db 0xFD,0xFC,0xFB,0xFA,0xF9,0xF9,0xF8,0xF6
.db 0xF5,0xF4,0xF3,0xF1,0xF0,0xEE,0xED,0xEB
.db 0xE9,0xE8,0xE6,0xE4,0xE2,0xE0,0xDE,0xDC
.db 0xDA,0xD7,0xD5,0xD3,0xD0,0xCE,0xCB,0xC9
.db 0xC6,0xC3,0xC1,0xBE,0xBB,0xB9,0xB6,0xB3
.db 0xB0,0xAD,0xAA,0xA7,0xA4,0xA1,0x9E,0x9B
.db 0x98,0x95,0x92,0x8F,0x8C,0x88,0x85,0x82
.db 0x80,0x7D,0x7A,0x77,0x73,0x70,0x6D,0x6A
.db 0x67,0x64,0x61,0x5E,0x5B,0x58,0x55,0x52
.db 0x4F,0x4C,0x49,0x46,0x44,0x41,0x3E,0x3C
.db 0x39,0x36,0x34,0x31,0x2F,0x2C,0x2A,0x28
.db 0x25,0x23,0x21,0x1F,0x1D,0x1B,0x19,0x17
.db 0x16,0x14,0x12,0x11,0x0F,0x0E,0x0C,0x0B
.db 0x0A,0x09,0x07,0x06,0x06,0x05,0x04,0x03
.db 0x02,0x02,0x01,0x01,0x01,0x00,0x00,0x00
.db 0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x02
.db 0x02,0x03,0x04,0x05,0x06,0x06,0x07,0x09
.db 0x0A,0x0B,0x0C,0x0E,0x0F,0x11,0x12,0x14
.db 0x16,0x17,0x19,0x1B,0x1D,0x1F,0x21,0x23
.db 0x25,0x28,0x2A,0x2C,0x2F,0x31,0x34,0x36
.db 0x39,0x3C,0x3E,0x41,0x44,0x46,0x49,0x4C
.db 0x4F,0x52,0x55,0x58,0x5B,0x5E,0x61,0x64
.db 0x67,0x6A,0x6D,0x70,0x73,0x77,0x7A,0x7D