Uživatel:Sobotzde

Z MAM wiki

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


Obsah

[editovat] Zadání práce: Generátor signálů

Procesor bude generovat na výstup průběhy pily, trojúhelníku, obdelníku a sinu. Změnu periody budou obstarávat tlačítka (ve smyčce zpoždění). Napěťová úroveň se bude měnit pomocí jednoduchého děliče na výstupu.

[editovat] Autoři práce

Zdeněk Sobotka, Tomáš Zvolský[[1]].

[editovat] Realizace

Program samostatné práce je napsán v jazyku assembler. Využili jsme nekonečné smyčky a přerušení pro obsluhu tlačítek. Tlačítka jsou celkem čtyři a je možné vybrat mezi sinem, obdélníkem, pilou a tlačítkem pro změnu periody v osmi krocích. Pozn.: Výstup jsme museli udělat jen sedmibitově (využíváme Attiny2313)

[editovat] Co by šlo ještě dodělat

Generátor zatím funguje, ale jen na náhodných frekvencích. Pokud bude dostatek času (obáváme se, že asi nebude) šlo by realizovat generování průběhů na přesných frekvencích. Využilo by se 16bit čítač/časovač Attiny2313, který by v přerušení vykresloval průběh v určitých časových intervalech.

Od věci by také nebylo přidat WatchDog, pro hlídaní spravné funkce programu.

V realizaci tohoto nám brání:

a) potřebujeme připojit externí krystal, ale naše Attiny2313 je zamknutá, lock bity na 00, tudíž nemůžeme přeprogramovat fuse bity při připojení externího krystalu. (údajně bychom se o tom měli něco dozvědět na 11 cvičení). Tento problém nám zabraňuje v tom, aby generátor běhal na vyšších frekvencích. Ale co jsme zkoušeli v simulátoru, s 16MHz krystalem bychom se dostali na maximální frekvenci cca +-10kHz(pro sinus 32 vzorků, pokud by se sinus generoval tabulkou, kdybychom generovali PWMkou, možna bysme se dostali i nad 100kHz, ale to už je jiný příběh:) )

b) nemáme doma čítač, abychom měřili přesné frekvence

c) nedostatek času

[editovat] Schéma

Soubor:Schema_sobotka_zvolsky.PNG

[editovat] Kód programu

; PROGRAM 012 Generator signalu s prerusenim
;************************************************
;* date: 20/4/2011				*
;* verze: 1.0 					*
;* for AVR: 2313 				*
;* clock frequency: 1MHz			*
;************************************************

;Program Function: 
;_____________________________________________________________________
;Program generuje sinus, obdelnik, pilu a meni periodu(v 8mi krocich)
;_____________________________________________________________________


;==================
;Declarations

	.include "2313def.inc"
	.def temp 	=r16			; R16 jako docasny registr
	.def zpozd 	=r17			; R17 registr pro obsluhu zpozdeni
	.def konst 	=r18			; R18 vyssi inkrementace pro pilu


;==================
;Start of Program

	rjmp Init 				; prvni radek programu, skok na Init
;==================

.ORG 0x000B  					; preruseni od tlacitek pro vyber prubehu	
	rjmp Preruseni 				; 

;==================

Init: 	
	ser temp				; PD0 bude vystup
	out DDRB, temp				;
	out DDRD, temp				; 

	clr temp 

	ldi	zpozd, 1			; konstanta, pro ROL ve zpozdi
	ldi	konst, 4			; konstanta, pro strmejsi pilu

;--------------------				; taky nastaveni pro preruseni

	ldi temp,0b00100000			; povoleni ext. pro jakykoliv pin change
	out GIMSK,temp
	ser temp				; vsechny PCINT aktivni(jako tlacitka, nechce se mi premyslet, ktery je ktery :))
	out 0x20,temp				; adresa registru PCMSK je 0x20 (asi to neni zaincludovany)

	ldi ZH,HIGH(2*Sinetable) 		; nacteni tabulky 
	ldi ZL,LOW(2*Sinetable)


;===========================================================================
Hlavni:
	sei					; globalni povoleni preruseni
	rjmp Hlavni				; smycka

;__________________________________________________________________
	
Pila:
	out PORTD, temp				; obsah temp na vystup(kolik bylo nainktrementovano)
	add temp, konst				; strmejsi pila
	
	rcall cekej				; nastaveni periody

	rjmp Pila

;__________________________________________________________________

Obdelnik:
	clr temp				; registr do log 1
	out PORTD, temp				; obsah temp na vystup
	rcall cekej5x				; nastaveni periody, 5x aby pubehy byly vice mene vyrovnane

	ser temp				; registr do log 0
	out PORTD, temp				; obsah temp na vystup
	rcall cekej5x				; nastaveni periody, 5x aby pubehy byly vice mene vyrovnane

	rjmp Obdelnik

;__________________________________________________________________

sinus:
	lpm 					; load (R0<-Z) z tabulkovych hodnot
	rcall cekej				; nastaveni periody
	out PORTD,R0 				; tabulkova hodnota na vysup (PortD)
	adiw ZL,1 				; +1 k 16b registru Z
	dec temp				; dostahnuto konce tabulky?	
	breq nacti_prubeh_table   		; pokud ano, nacteni tabulky				
	rjmp sinus 				; loop

;--------------------------------

nacti_prubeh_table:
	ldi ZH,HIGH(2*Sinetable) 		; nacteni tabulky 
	ldi ZL,LOW(2*Sinetable)

	rjmp sinus 				; loop

;__________________________________________________________________

Preruseni:					; zde se obsluhujou tlacitka

	sbic PinB, 0 				; testuje stisk tlacitka 0
	rjmp Obdelnik				; pokud vyhovi jde na Obdelnik

	sbic PinB, 1 				; testuje stisk tlacitka 1
	rjmp Pila 				; pokud vyhovi jde na Pila

	sbic PinB, 2 				; testuje stisk tlacitka 2
	rjmp Sinus 				; pokud vyhovi jde na Sinus

	sbic PinB, 3 				; testuje stisk tlacitka 3
	rjmp zpozdi				; pokud vyhovi jde na Zpozdi
	
	reti

;__________________________________________________________________

cekej:						; zpozdeni
	mov r19,zpozd
cekej1:	
	dec	r19
	brne cekej1
	reti
;__________________________________________________________________

cekej5x:					; pro obelnik
	rcall cekej
	rcall cekej
	rcall cekej
	rcall cekej
	rcall cekej
	reti

;__________________________________________________________________

zpozdi:						; volba periody v 8mi krocich s pretecenim
	cpi zpozd,0x00
	breq nastavzpozd
	rol zpozd
	reti
nastavzpozd:
	ldi	zpozd, 1
	rjmp zpozdi
;__________________________________________________________________

Sinetable:					; tabulka pro sinus 32 vzorku
.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
.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
.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
.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
.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
.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
.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
.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

[editovat] Youtube

Dal jsem video na youtube, jak generátor zatím vypadá: [[2]]

[editovat] Komentáře

zatím nejsou:)

Osobní nástroje