<<< Zpět



; ===== Generator sinusovky a pily
; Sinusovka: Um=4V, f=41,67 kHz
; Trojuhelnik: Um=3V, f=50 kHz, vrchol v 3/4 T
; Vystup na port B, 8-bitovy D/A prevodnik TLC7524C
; Tlacitko na vstupu PD2 prepina vystupni signal.

.nolist
#include <avr/io.h>
.list

; ------------- registry

		.equ	tmp,24			; pracovni registr
		.equ	sin,25			; priznak: 1=sinus, 0=trojuhelnik

; ------------- makra - vystup sinusovky

.macro OUT1 d1					; vystup 1 bajtu na D/A prevodnik
						; [2 takty = 0.1us]
		ldi	tmp,\d1			; [1 takt] hodnota bajtu
		out	_SFR_IO_ADDR(PORTB),tmp	; [1 takt] vystup bajtu
.endm

.macro OUT10 d1 d2 d3 d4 d5 d6 d7 d8 d9 d10	; vystup 10 bajtu na D/A prevodnik
		OUT1	\d1			; kazdy vzorek 2 takty
		OUT1	\d2
		OUT1	\d3
		OUT1	\d4
		OUT1	\d5
		OUT1	\d6
		OUT1	\d7
		OUT1	\d8
		OUT1	\d9
		OUT1	\d10
.endm

; ------------- makra - vystup trojuhelniku

.macro OUTU1					; vystup 1 bajtu s inkrementaci o 1
						; [2 takty = 0.1us]
		inc	tmp			; [1 takt] zvyseni hodnoty vzorku
		out	_SFR_IO_ADDR(PORTB),tmp	; [1 takt] vystup bajtu
.endm

.macro OUTU10					; vystup 10 bajtu s inkrementaci o 1
		OUTU1				; kazdy vzorek 2 takty
		OUTU1
		OUTU1
		OUTU1
		OUTU1
		OUTU1
		OUTU1
		OUTU1
		OUTU1
		OUTU1
.endm

.macro OUTD1					; vystup 1 bajtu s dekrementaci o 3
						; [2 takty = 0.1us]
		subi	tmp,3			; [1 takt] snizeni hodnoty vzorku
		out	_SFR_IO_ADDR(PORTB),tmp	; [1 takt] vystup bajtu
.endm

.macro OUTD10					; vystup 10 bajtu s dekrementaci o 3
		OUTD1				; kazdy vzorek 2 takty
		OUTD1
		OUTD1
		OUTD1
		OUTD1
		OUTD1
		OUTD1
		OUTD1
		OUTD1
		OUTD1
.endm

; ------------- tabulka vektoru

		.text
		.org	0

		rjmp	Reset			; 0x0000: (1) RESET
		rjmp	Int0			; 0x0001: (2) INT0

; ------------- inicializace registru

		.global	Reset
Reset:		eor	sin,sin			; sin <- 0 (vystup trojuhelnik)
		out	_SFR_IO_ADDR(SREG),sin	; nulovani status registru
		ldi	tmp,RAMEND		; konec RAM
		out	_SFR_IO_ADDR(SPL),tmp	; ukazatel zasobniku

; ------------- inicializace vystupniho D/A portu

		ldi	tmp,0xff		; vsechny bity vystup
		out	_SFR_IO_ADDR(DDRB),tmp	; nastaveni portu B na vystup

; ------------- zapnuti pull-up pro vstup z tlacitka

		out	_SFR_IO_ADDR(PORTD),tmp	; zapnuti pull-up bitu portu D

; ------------- inicializace preruseni od tlacitka (INT0, vstup PD2)

		ldi	tmp,1<<INT0		; preruseni od INT0
		out	_SFR_IO_ADDR(GIMSK),tmp	; povoleno preruseni od INT0
		ldi	tmp,1<<ISC01		; preruseni sestupnou hranou INT0
		out	_SFR_IO_ADDR(MCUCR),tmp	; nastaveni preruseni
		sei				; povoleni globalniho preruseni

; ------------- vystup sinusovky (2 takty na vzorek, pro 41,67 kHz celkem 240 vzorku,
; pro napeti max. 4V je stred 2V, rozsah hodnot 0 az 204, stred 102)

Sinus:
		OUT10	204 204 204 204 203 203 203 202 202 201	; 0..9
		OUT10	201 200 199 198 197 196 195 194 193 192	; 10..19
		OUT10	190 189 188 186 185 183 181 180 178 176	; 20..29
		OUT10	174 172 170 168 166 164 162 160 158 155	; 30..39
		OUT10	153 151 148 146 143 141 139 136 134 131	; 40..49
		OUT10	128 126 123 121 118 115 113 110 107 105	; 50..59
		OUT10	102  99  97  94  91  89  86  83  81  78	; 60..69
		OUT10	 76  73  70  68  65  63  61  58  56  53	; 70..79
		OUT10	 51  49  46  44  42  40  38  36  34  32	; 80..89
		OUT10	 30  28  26  24  23  21  19  18  16  15	; 90..99
		OUT10	 14  12  11  10   9   8   7   6   5   4	; 100..109
		OUT10	  3   3   2   2   1   1   1   0   0   0	; 110..119
		OUT10	  0   0   0   0   1   1   1   2   2   3	; 120..129
		OUT10	  3   4   5   6   7   8   9  10  11  12	; 130..139
		OUT10	 14  15  16  18  19  21  23  24  26  28	; 140..149
		OUT10	 30  32  34  36  38  40  42  44  46  49	; 150..159
		OUT10	 51  53  56  58  61  63  65  68  70  73	; 160..169
		OUT10	 76  78  81  83  86  89  91  94  97  99	; 170..179
		OUT10	102 105 107 110 113 115 118 121 123 126	; 180..189
		OUT10	128 131 134 136 139 141 143 146 148 151	; 190..199
		OUT10	153 155 158 160 162 164 166 168 170 172	; 200..209
		OUT10	174 176 178 180 181 183 185 186 188 189	; 210..219
		OUT10	190 192 193 194 195 196 197 198 199 200	; 220..229
		;OUT10	201 201 202 202 203 203 203 204 204 204	; 230..239
		OUT1	201	; 230
		OUT1	201	; 231
		OUT1	202	; 232
		OUT1	202	; 233
		OUT1	203	; 234
		OUT1	203	; 235
		OUT1	203	; 236
		OUT1	204	; 237
		;OUT1	204	; 238 [2 takty]
		;OUT1	204	; 239 [2 takty]
		nop		; [1 takt] pro casovani
		sbrc	sin,0	; [1/2 takty] je sinusovka?
		rjmp	Sinus	; [2 takty] je sinusovka

; ------------- vystup trojuhelniku (2 takty na vzorek, pro 50 kHz celkem 200 vzorku,
; tj. pro 3/4 T je to 150 + 50 vzorku, pro napeti 3V je rozsah hodnot 0 az 150)

Trian:
		;OUT1	1	; 1
		;OUT1	2	; 2
		OUT1	3	; 3
		OUT1	4	; 4
		OUT1	5	; 5
		OUT1	6	; 6
		OUT1	7	; 7
		OUT1	8	; 8
		OUT1	9	; 9
		OUT1	10	; 10, inicializace vzorku
		OUTU10		; 11..20
		OUTU10		; 21..30
		OUTU10		; 31..40
		OUTU10		; 41..50
		OUTU10		; 51..60
		OUTU10		; 61..70
		OUTU10		; 71..80
		OUTU10		; 81..90
		OUTU10		; 91..100
		OUTU10		; 101..110
		OUTU10		; 111..120
		OUTU10		; 121..130
		OUTU10		; 131..140
		OUTU10		; 141..150

		OUTD10		; 147..120
		OUTD10		; 117..90
		OUTD10		; 87..60
		OUTD10		; 57..30
		OUTD10		; 27..0

		nop		; [1 takt] pro casovani
		sbrs	sin,0	; [1/2 takty] je sinusovka?
		rjmp	Trian	; [2 takty] je trojuhelnik

		rjmp	Sinus	; je sinusovka

; ------------- obsluha preruseni od tlacitka (INT0)
; Pozor, neuchovava stavovy registr SREG !

Int0:		com	sin	; inverze priznaku signalu
		reti

<<< Zpět