;400Hz Sinus/Cosinus Generator fuer Thetawellen ;1.Versuch bei 400 Hz mit 4,8MHZ Clock ;bei 128 kHz clock steigt Poyprog aus. Also clock /64 siehe Text ----- .include "tn13def.inc" ;GND -|4 5|- PB0 .def A = r16 ;PB4 -|3 6|- PB1 .def B = r18 ;PB3 -|2 7|- PB2 ;Fuses für 4,8MHz clock in Softw def. ;Reset= PB5 -|1 8|- Vcc ;Fuse HI 0xFF --°-- ;Fuse LO 0x7A .org 0 rjmp anfang ; Platz fuer ev. Interrupttabellen die aber leer bleiben .org 16 anfang: ldi r16, RAMEND out SPL, r16 ; setup stack pointer ; sei ; global enable interrupts ;clock auf 70 kHz umschalten******************************************* ldi A,128 ;bit 7 setzen Seite 25 out CLKPR, A ;getan, nun gleich die Einstellung Seite 24 ldi A,7 ; Clock auf 9,6 / 128 setzen out CLKPR, A ; so tiny13 läuft nun mit 150kHz ;nicht über die Fuses gesetzt, damit das ELO-Lernpaket funktioniert ;Port PB0 und PB1 auf Output setzen************************************* ldi A ,3 ;PB0 und PB1 auf Ausgang out DDRB,A ;andere Port Pins auf Eingang ldi A, 0b0011_1100 ;schalte die Pullups ein out PortB,A ;bis auf PB0 und PB1 ;PWM initialisieren PWM steht für Pulse Width Modulator****************** ldi A, 128 out OCR0A, A ; ersten Ersatz Vergleichswert setzen ldi A, 0xF3 ; Kanal A und B Seite 69 und 71 out TCCR0A, A ; Fast PWM table 27 und table 32 ldi A,1 ;Start ohne Vorteiler out TCCR0B,A ;table 33/s72 no clockI/O prescaling ; setze Tabelle der Sinusfunktion aktiv********************************** ; ldi ZH,high(sin*2) ; setup Z pointer hi ; ldi ZL,low(sin*2) ; setup Z pointer lo ; Z zeigt also auf Byteadresse 2*80h = 100h, ZH bleibt konstant ;************************************************************************* ;Timer 0 läuft jetzt los und teilt die Clock durch 256, da Timer 0 ein 8bit ;counter ist. Initial mit 128:128 Tastverhältnis. Der Wert in OCROA bestimmt das ;Tastverhältnis. Der Zählerstand ist die Basis für den Wert ;aus der Sinustabelle ;Register ZL, 8bit breit, adressiert die 256 Werte aus der Sinustabelle. ;Diese, an OCR0A weitergegeben, bestimmen die Tastverhältnisse des mit OCR0A ;verbundenen PortB0. Die Tabelle hat 256 Werte. ;Ein Durchlauf des 8-bit Timers, s.o. braucht also 256 * 0,208 µs = 53,2µs ;Die Samplefrequenz ist also der Kehrwert mit ~ 18kHz. ;Hat also Timer0 den OCR0x_Wert erreicht, schalten die Ports auf 1. ;läuft der Zähler über, so wird das Port wieder auf 0 gesetzt. ;************************************************************************* Schleife: ldi ZH,1 ; setup Z pointer hi ;1 LPM B,Z ;hole Wert aus Sinustabelle ;3 ; ldi B,128 ;check zur Messung der Clockfrequenz out OCR0A, B ;Wert ausgeben an PB0 ;1 ; ldi ZH,2 ;hole Wert aus Sinustabelle ;1 subi ZL, -64 ;aber +90° = cos LPM B,Z ;3 out OCR0B, B ;Wert ausgeben an PB1 ;1 subi ZL,63 ; inc ZL ;adressiere nächsten Wert.der Tabellen ;1 ;die 256 Byte versetzt sind, ZL ist gleich ;ZH wird OCR0A/B neu direkt adressiert ldi A, 6 ;delay zur Einstellung der gew. Frequenz;1 ;10 delay: dec A ;1 brne delay ; ;2|1 ;17 ; nop ;Feineinstellung der Frequenz ;1 rjmp Schleife ;2 ; in Summe ;27 ;27 cycles * 13,3 µs = 360µs *256 = 92ms = 11 Hz (9 real)bei 5V VCC ; ;ohne delay bei 4,8 MHZ und 12 cycles 1508 (1390)Hz ;In den 55µs kann je nach Tabellenwert, wenn TOP noch nicht erreicht ist ;OCR0x upgedated werden. Es tritt natürlich der digitale +-1 Jitter auf. ; ;****************************************************************************** ; Tabelle fuer Zählerwert zu Sinustabelle PWM comparator. ; bei anderen Tabellenwerten sind andere Spannungsformen erzielbar ;****************************************************************************** ; Lege Tabellenanfang auf 256 byte Grenze im Memeory .org 0x80 ;word address ;2x 256 step sine/coswave table sin:.db 0x80,0x83,0x86,0x89,0x8c,0x8f,0x92,0x95,0x98,0x9c,0x9f,0xa2,0xa5,0xa8,0xab,0xae .db 0xb0,0xb3,0xb6,0xb9,0xbc,0xbf,0xc1,0xc4,0xc7,0xc9,0xcc,0xce,0xd1,0xd3,0xd5,0xd8 .db 0xda,0xdc,0xde,0xe0,0xe2,0xe4,0xe6,0xe8,0xea,0xec,0xed,0xef,0xf0,0xf2,0xf3,0xf5 .db 0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfc,0xfc,0xfd,0xfe,0xfe,0xff,0xff,0xff,0xff,0xff .db 0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfe,0xfd,0xfc,0xfc,0xfb,0xfa,0xf9,0xf8,0xf7 .db 0xf6,0xf5,0xf3,0xf2,0xf0,0xef,0xed,0xec,0xea,0xe8,0xe6,0xe4,0xe2,0xe0,0xde,0xdc .db 0xda,0xd8,0xd5,0xd3,0xd1,0xce,0xcc,0xc9,0xc7,0xc4,0xc1,0xbf,0xbc,0xb9,0xb6,0xb3 .db 0xb0,0xae,0xab,0xa8,0xa5,0xa2,0x9f,0x9c,0x98,0x95,0x92,0x8f,0x8c,0x89,0x86,0x83 .db 0x80,0x7c,0x79,0x76,0x73,0x70,0x6d,0x6a,0x67,0x63,0x60,0x5d,0x5a,0x57,0x54,0x51 .db 0x4f,0x4c,0x49,0x46,0x43,0x40,0x3e,0x3b,0x38,0x36,0x33,0x31,0x2e,0x2c,0x2a,0x27 .db 0x25,0x23,0x21,0x1f,0x1d,0x1b,0x19,0x17,0x15,0x13,0x12,0x10,0x0f,0x0d,0x0c,0x0a .db 0x09,0x08,0x07,0x06,0x05,0x04,0x03,0x03,0x02,0x01,0x01,0x00,0x00,0x00,0x00,0x00 .db 0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x05,0x06,0x07,0x08 .db 0x09,0x0a,0x0c,0x0d,0x0f,0x10,0x12,0x13,0x15,0x17,0x19,0x1b,0x1d,0x1f,0x21,0x23 .db 0x25,0x27,0x2a,0x2c,0x2e,0x31,0x33,0x36,0x38,0x3b,0x3e,0x40,0x43,0x46,0x49,0x4c .db 0x4f,0x51,0x54,0x57,0x5a,0x5d,0x60,0x63,0x67,0x6a,0x6d,0x70,0x73,0x76,0x79,0x7c