Poustka: Generátor signálů

Z MAM wiki

Přejít na: navigace, hledání

Obsah

[editovat] Generátor signálů

Byl navržen program, který generuje průběhy tří signálů – obdélník, pila a sinus. Ovládání výstupu obstarává uživatel pomocí tlačítek klávesnice. Je použito celkem 7 tlačítek což znamená, že na procesoru využijeme 6 pinů portu C, viz následující obrázek a tabulka

[editovat] Schéma zapojení klávesnice

Soubor:obr1.png

[editovat] Grafické rozvržení funkce tlačítek

Soubor:obr2.png

Port B pak bude výstupním portem pro následný 8-bit D/A převod. Zapnutí výstupu nastane po zmáčknutí tlačítka ON. Do té doby procesor čeká v úsporném režimu na příslušné přerušení. Výstup automaticky generuje první signál – obdélník s frekvencí 2 kHz. To odpovídá dekadické hodnotě 128 v registru OCR0A , který nastavuje hodnotu, která je porovnávána s hodnotou v čítači, při jejich shodě dojde k přerušení.

Tlačítkem OFF dojde k přerušení činnosti D/A převodníku pomocí jeho vstupu OE (Output Enable), procesor přejde do režimu spánku a bude čekat na přerušení. Tlačítka + a – zvětšují, nebo zmenšují periodu, tedy frekvenci změnou nastavení registru OCR0A. S výhodou využijeme módu 2, ve kterém je schopen se tento registr měnit za běhu, viz následující tabulka. Druhý řádek klávesnice slouží k výběru zobrazovaného průběhu.

[editovat] Tabulka módů čítače

Soubor:obr3.png

[editovat] Porovnávací registr A

Soubor:Obr4.png

Aby při shodě registrů OCR0A a TCNT0 došlo k vyvolání přerušení, je třeba nastavit bit 0 registru TIMSK0 na log 1, který nastaví, kdy dojde k přerušení. Soubor:obr5.png

[editovat] Realizace v jazyku symbolických adres

;pouzivane piny
;PortB - DA prevodnik (8pinu)
;PortC - klavesnice (6 pinu)
;sloupce - C.0 - C.3
;radky - C.4, C.5
;R20 - delka trvani jednoho useku periody
;R21 - vyber signalu
;R22 - zmena periody
;R23 - aktualni hodnota signalu
;R24 - pametove misto pro cteni sinusu
.INCLUDE "m88def.inc"

.org 0x0000 ;hlavni program/preruseni RESET
	rjmp main

.org 0x0004	; preruseni od stisknuteho tlacitka
	rjmp tlacitko

.org 0x000E ; preruseni preteceni casovace/citace0
	rjmp citac

main:

; Stack pointer init:
	ldi r16,high(RAMEND); Main program start
	out SPH,r16 ; Set Stack Pointer to top of RAM
	ldi r16,low(RAMEND)
	out SPL,r16

	ldi R16, 0b00110000
	out DDRC, R16  ;definice vstup/vystup. C.0-C.3 vstup, C.4,C.5 vystup, C6 vystup DAC CS
	ldi R16, 0b01101111
	out PortC, R16 ;nastaveni vstupu do mekke "1", nastaveni aktivniho radku 1 (C.4)
	ldi R16, 0b11111111 
	out DDRB, R16 ;nastaveni vystupu pro DA prevodnik

	ldi R22, 5 ;nastaveni kroku zmeny periody
	ldi R20, 0x80; prednastaveni delky jednoho useku
	;ldi R21, 1 ;na zacatku programu(po zmacknuti tlac. ON) pobezi obdelnik
	ldi R21, 3
	ldi R23, 0x80 ;pocatecni nastaveni signalu na polovinu rozsahu

;nastaveni cteni dat z pameti programu
  ldi ZL, LOW(2*SinTab) 
  ldi ZH, HIGH(2*SinTab) 
;nastaveni horniho limitu tabulky 

;nastaveni sleep modu
; SMCR: 0,0,0,0,SM2,SM1,SM0,SE   SM2..0: Sleep Mode Select Bits, SE: Sleep enabled)

	ldi r16,0b00000001 ; Idle mode 
	out SMCR,r16 ; Sleep mode set

;povoleni preruseni od portu C
	ldi r26, PCICR ; load address of PCICR in Y low
	clr r27 ; load high byte with 0
	ldi r16,0b00000010 ; activate PCINT1 (port C)
	st X, r16 ; store new PCINT1

;preruseni povoleno od portu C, bity 0..3
	ldi r26, PCMSK1 ; load address of PCMSK1 in Y low
	clr r27 ; load high byte with 0
	ldi r16,0b00001111 ; allow pin change interrupt on portC bits 1
	st X, r16 ; store new PCMSK1

;preruseni povoleno od preteceni citace 1
	ldi R26, TIMSK0
	clr R27
	ldi R17, 0b00000010 ;preruseni od preteceni casovace/citace 0
	st X, R17
	sei; globalni povoleni preruseni
	ldi R26, OCR0A
	clr R27
	out OCR0A, R20

;zapnuti casovace citace
	ldi R17, 0b00000010	; mod 2, konec v OCRA 
	out TCCR0A, R17
	ldi R17, 0b00000001 ; delicka vypnuta - 1 takt procesoru = 1 citnuti
	out TCCR0B, R17
	rjmp spat

spat:

	sleep
	nop
	rjmp spat

tlacitko:

	rcall wait

	cbi PortC, 4 ;nastaveni aktivniho radku 1
	sbi portC, 5

	sbis portC, 0 ;skip if bit is set
	cbi PortC, 6 ; zapnuti vystupu DAC prevodniku
	
	sbis portC, 1
	sbi PortC, 6 ; vypnuti vystupu DAC
	
	sbis portC, 2
	rjmp perplus
	;add R20, R22 ;zvetseni periody
	;inc R20   ;- nastaveni pro nejmensi krok a usetreni registru R22

	sbis portC, 3
	rjmp perminus
	;sub R20, R22 ;zmenseni periody
	;dec R20

	sbi PortC, 4
	cbi PortC, 5;zmena radku, nastaveni aktivniho radku 2

	sbis portC, 0
	ldi R21, 01 ;obdelnik
	
	sbis portC, 1
	ldi R21, 02 ;pila
	
	sbis portC, 2 
	ldi R21, 03 ;sinus

	cbi PortC, 4;
	cbi PortC, 5; aktivovani obou radku - kvuli dalsimu stisku tlacitka
	rjmp endtlac
perplus:
	add R20, R22
	out OCR0A, R20
	rjmp endtlac
perminus:
	sub R20, R22
	out OCR0A, R20
	rjmp endtlac

endtlac:
reti
 

citac:

;napred je treba zjistit ktery signal je vybrany (registr R21)
;a podle toho pokracovat v dalsim vzorku
;sinus = precist dalsi vzorek z pameti
;obd = nastavit opacnou hodnotu nez je nastavena
;pila = inkrementovat
;CPI = compare with immediate (porovnej s konstantou)
;BRNE = branch if not equal (skoc pokud se neshoduji)
;     = neskakej pokud jsou stejne
;01 obd
;02 pila
;03 sinus
;R21 - navoleny signal
;R23 - aktualni hodnota signalu
;R24 - pametove misto pro cteni sinusu
	MOV R25, R21;ulozeni vybraneho signalu do pomocneho registru (CP instrukce prep)
	CPI R25, 01
	BREQ obd
	MOV R25, R21;znovunacteni vybraneho signalu po provedeni CP instrukce ([cpi Rd, k] totiz dela tohle Rd = Rd-k)
	CPI R25, 02
	BREQ pila
	MOV R25, R21
	CPI R25, 03
	BREQ sinus
	LDI R21, 01 ; pokud se program dostane sem, je nekde chyba a nastaveni se resetuje na generovani obdelniku
	rjmp endcitac

obd:	;pouze meni nejmensi a nejvetsi hodnotu
	CPI R23, 0 ;porovnani s nulou - pokud je cokoliv jineho, nastavi nulu
	BREQ negovat
	Ldi R23, 0
	rjmp endcitac
negovat: 
	Ldi R23, 0xFF
	rjmp endcitac
	
pila:  ;inkrementace s pretekanim
	inc R23
	rjmp endcitac		

sinus: ;cteni hodnoty z pameti programu
	lpm R23, Z+ ;nasteni hodnoty z pameti, nasledna inkrementace registru Z
	;kontrola jestli se nepretekla tabulka
	CPI ZL, 32
	brne endcitac
	ldi ZL, 0
	rjmp endcitac

endcitac:
	out PortB, R23  ;zapis aktualni hodnoty signalu na vystup
reti


WAIT:
;	LDI	R16, 4			; LDI - Load Immediate
;WAIT1:	INC	R1
;	BRNE	WAIT1
;	INC	R2
;	BRNE	WAIT1
;	DEC	R16
;	BRNE	WAIT1
nop
nop
	RET
.org 0x0200

SinTab:

.DB 64,76,88,99,109,117,123,126
.DB 127,126,123,117,109,99,88,76
.DB 64,51,39,28,19,11,5,1
.DB 0,1,5,11,19,28,39,51
Osobní nástroje