Uživatel:Anisiele

Z MAM wiki

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

Obsah

[editovat] Informace o mě

Takto si mě můžete představit

Jméno: Bc. Elena Anisimova

Nejvyšší dosažené vzdělání: Bakalářské

Datum narození: 27.9.1988

Vzdělání:

2009: ČVUT v Praze, Fakulta elektrotechnická. V současně době jsem studentkou denní formy magisterského studijního programu "Komunikace, multimédia a elektronika" oboru Multimediální technika

2006 – 2009: ČVUT v Praze, Fakulta elektrotechnická. Obor: Elektronika a sdělovací technika. Studium bylo ukončeno udělením titulu Bc. Téma bakalářské práce: "Vlnková transformace pro zpracování obrazů. Implementace algoritmů pro odstranění šumu z digitálních fotografií v programovém prostředí Matlab". Známka Státní závěrečné zkoušky - A (výborně).

[editovat] Semestrální práce - Regulátor PC ventilátoru

Semestrální práci bych chtěla dělat spolu s kolegy Martinem Aiznerem a Lucii Miklášovou, a byl by to Regulátor PC ventilátoru.

[editovat] Zadání

Napsali bychom program v jazyce Assembler pro řízení PC ventilátoru se zpětnou vazbou ze signálu TACHO. Rychlosti by se měnily tlačítky 1 až 9 z klávesnice, 0 - úplné zastavení ventilátoru, * - nějaká zvláštní funkce. V případě dostatku času: možnost doplnění o LED displej, na kterém se bude zobrazovat rychlost otáčení.

Použili jsme zapojení ze cvičení 4 na této stránce: Regulace_ventilátoru.

[editovat] Rozbor řešení

Porty procesorů AVR pracují s několika registry:

  • datové registry
  • registry pro nastavení funkce portu

[editovat] Datové registry

AVR zná dva datové registry pro práci s porty - PORT(X) a PIN(X).

PORT(X), kde X udává, o který port se jedná (A,B,C,D...). Zápisem do toho registru přiřadíme portu určitou hodnotu, v případě, že je nastaven jako výstupní, a nebo jím nastavíme (případě odstraníme) pull-up rezistory, v případě, že je port nastaven jako vstupní.

PIN(X), kde X udává, o který port se jedná je naplněno hodnotou, která je reálně na portu procesoru. PORT(X) tedy slouží pro zápis na port, PINX(X) slouží pro čtení z portu.

[editovat] Registry pro nastavení portu

Jediným přímým registrem pro nastavení portu je DDR(X), kde X opět znamená označení portu. Registr určuje, zda se port (pin) bude chovat jako vstupní nebo výstupní. Zapsáním log 1 na bit registru se odpovídající pin nastaví jako výstupní. Vynulováním bitu (zápisem log 0) je port (pin) nastaven jako vstupní.

Nastavení portu má tak vliv na to, co ovlivňuje registr PORT(X). Pokud je port nastaven jako vstupní, PORT(X) určuje, zda je připojen pull-up rezistror, je-li port nastaven jako výstupní PORT(X) učuje logický stav samotného portu. Pull-up rezistor je rezistor zapojený mezi napájení a nějaký spínač spojený se zemí.

Pro názornost si to ukážeme v tabulce:

DDR(X) PORT(X) I/O pull-up
0 0 vstup ne
0 1 vstup ano
1 1 výstup ne
1 0 výstup ne

[editovat] Popis některých instrukcí

  • CBI DDRD,6 - instrukce vynuluje v registru DDRD bit 6
  • SBI DDRD,6 - nastaví v registru DDRD bit 6 na log 1

Příklad našeho kódu - inicializace klávesnice:

Zapojení klávesnice jsme realizovali následovně:

propojení SLOUPEC1..4 s PC2..5 a propojení ŘÁDEK1..4 s PD0..3.

Náhled maticové klávesnice
 cbi DDRC, 2 ; nastavení vstupů pro klávesnici (sloupec 1 - 3)
 cbi DDRC, 3
 cbi DDRC, 4 

 sbi PORTC, 2 ; nastavení pull-upů
 sbi PORTC, 3
 sbi PORTC, 4

 sbi DDRD, 0 ; nastavení výstupů pro klávesnici (řádek 1 - 4)
 sbi DDRD, 1 
 sbi DDRD, 2
 sbi DDRD, 3

 cbi PORTD, 0	; nastavení log. nuly na všech řádcích
 cbi PORTD, 1
 cbi PORTD, 2
 cbi PORTD, 3
  • LDI R16,5 - instrukce slouží k přímému uložení čísla do registru. V tomto případě tedy do registru R16 vloží číslo 5. V semestrální práci jsme používali registr R16 pro ukládání aktuálně zmáčknuté klávesy, pomocí které se následně řídily otáčky větráku.
  • RJMP PROC - bezpodmínečně skočí na proceduru PROC
  • SBIC PINC, 3 - kontroluje jestli na pinu 3 je log 0, pokud není - přeskočí následující instrukci

Následně si popišme princip inicializace zmáčknuté klávesy:

Například pro řádek 1 (port D0): Nastavíme log 0 na řádek 1 a na ostatní řádky log 1. Pak příkazem sbic testujeme, jestli na příslušném sloupci (např. pro číslo 1 je to port C2) je tále nula (tlačítko je stisknuto) nebo není (tlačítko nebylo stisknuto). Pokud je tam nula, přeskočí se následující instrukce (rjmp KEY2 - skok na testování další klávesy) a do registru R16 se zapíše číslo tlačítka (v tomto případě je to 1). S tímto údajem pokračujeme do procedury, která simuluje činnost PWM (Pulzně šířková modulace).

Pokud by tlačítko nebylo stisknuto, provede se skok na následující řádek (rjmp KEY2) a začne se testovat další tlačítko.

Nastavování log 1 a log 0 před testováním stisku se děje v jednotlivých řádcích (ne u každého vyhodnocování stitku), tzn. že nastavení je stejné pro čísla 1,2,3 (jsou na jednom řádku), pro 4,5,6 a 7,8,9.

KEY1:
	cbi 	PORTD, 0	;log. nula na prvním řádku (1 2 3 A)
	sbi 	PORTD, 1	;log. jednička na ostatních řádcích
	sbi 	PORTD, 2
	sbi 	PORTD, 3	
	sbic	PINC, 2         ; pokud je na prvním sloupci (1 4 7 *) nula, přeskoč následující instrukci
	rjmp	KEY2            ; pokračuj na KL2 (testuj, jestli je zmáčknutá 2)
	ldi	R16, 1		;zapiš do R16, že byla stisknuta 1
	rjmp	KEYRET          ; pokračuj na část KEYRET
KEY2:
	sbic	PINC, 3
	rjmp	KEY3
	ldi	R16, 2
	rjmp	KEYRET
KEY3:
	sbic	PINC, 4
	rjmp	KEY4
	ldi	R16, 3
	rjmp	KEYRET

Procedura KEYRET vrací program do hlavní procedury START a začíná se provádět PWM.

Procedura PWM (Pulzně šířková modulace): pomocí ní ovládáme otáčky podle zmáčknuté číslice na klávesnici. Funguje to tak, že procedura PWM_ON na nějakou dobu pošle na řídící výstup log 1 (doba závísí na stisknuté klávese: 1-krátký jedničkový impuls, 2 - delší atd.). A potom pro regulaci rychlosti otáček procedurou PWM_OFF řídící výstup vynulujeme a během této doby se ventilátor netočí.

Na následujících obrázcích jsou uvedeny průběhy napětí na řídícím výstupu procesoru (PB2) pro stisknuté klávesy 1,3,5,8 a 9:

     
stisknuta 1         stisknuta 3         stisknuta 5         stisknuta 8         stisknuta 9

Ukázka kódu PWM:

PWM:
	MOV 	R17, R16
	INC		R17
	LDI		R18, 0xF0
	OR		R18, R16
PWM_ON:                               ; tato část řídí nastavení log.jedničky na výstupu
	DEC		R17
	BREQ	PWM_OFF
	SBI		PORTB, FAN    ; na port B2 se pošle log. jednička
	RCALL 	VERYSMALLWAIT
	RJMP	PWM_ON
PWM_OFF:                              ; tato část řídí nastavení log.nuly na výstupu
	INC		R18
	BREQ	PWM_RET
	CBI		PORTB, FAN    ; na port B2 se pošle log. nula
	RCALL 	VERYSMALLWAIT
	RJMP	PWM_OFF
PWM_RET:
	RET	

Vidíme, že PWM používá proceduru VERYSMALLWAIT, která má za úkol nastavit dobu trvání log 1 nebo log 0.

VERYSMALLWAIT:
	LDI R20, 0xEC
	MOV R1, R20
SMALLWAIT:          ; podsekce procedury VERYSMALLWAIT
	INC	R1
	BRNE	SMALLWAIT
	RET

[editovat] Závěr

V rámci semestrální práce se nám podařilo na kontaktním nepájivém poli propojit procesor ATmega168 s klávesnici a větrákem. Využili jsme dále programátor AVR Dragon, který nám umožňoval krokovat vytvořený program přímo v reálném mikroprocesoru. Přitom jsme se mohli podívat na obsah paměti a registrů. Vytvořený kód je napsaný v jazyce Assembler.

Samotný postup naší práce bychom mohli rozdělit na dílčí části. Nejdříve jsme museli vyřešit načítání stisknuté klávesy z maticové klávesnice. Poté ovládání výstupu PWM podle stisknuté klávesy. To jsme si mohli ověřit připojením osciloskopu, kde jsme sledovali průběhy impulsů ze řídícího výstupu procesoru. Navíc jsme mohli vizuálně a podle poslechu sledovat, že se otáčky ventilátoru mění (buď se zrychlují nebo zpomalují podle čísla zmáčknuté klávesy).

V poslední části jsme si zkusili měřit počet otáček pomocí signálu TACHO. Pro připojení jsme museli použít odporový dělič složený ze 3 stejných odporů,aby jsme zabránili příchodu až 12V na mikroprocesor. Nestihli jsme bohužel realizovat řízení otáček pomocí signálu TACHO, ale sledovali jsme ho na osciloskopu a ověřili jsme skutečnost, že jsou to pulsy, které ukazují jak rychle se ventilátor točí.

[editovat] Přílohy

[editovat] Zapojení

Zapojení úlohy












[editovat] Kód

; 
; example fan program for ATmega168
;
; P4 CPU fan Ucc pin is supposed to be connected 
; to +15 V, GND pin is supposed to be connected 
; to FET Drain, Source on GND, Gate on 
; pin 16 (PB2, FAN). Fan runs when FAN is 1.
;  DIREKTIVY - nějakému názvu, symbolu přiřadí nějakou hodnotu
;  zde přiřazujeme registru DDRB hodnotu 4 - jde o jeho adresu


	.EQU DDRB = $04 ; $04=číslo 4 v šestnáctkové soustavě = 100 binárně
	.EQU PORTB = $05 ; $05=číslo 5 v šestnáctkové soustavě = 101 binárně

	.EQU FAN = 2 ; definice adresy řídícího výstupu - PB2

	.EQU DDRC = $07
	.EQU PORTC = $08
	.EQU PINC = $06

	.EQU DDRD = $0A
	.EQU PORTD = $0B
	.EQU PIND = $09


; Natavení pinu PB2 jako řádácá výstup:

	SBI	DDRB, FAN

; Inicializace klávesnice:

	cbi DDRC, 2 ; nastavení vstupů pro klávesnici (sloupec 1 - 3)
	cbi DDRC, 3
	cbi DDRC, 4

	sbi PORTC, 2 ; nastavení pull-upů
	sbi PORTC, 3
	sbi PORTC, 4

	sbi DDRD, 0 ; nastavení výstupů pro klávesnici (řádek 1 - 4)
	sbi DDRD, 1 
	sbi DDRD, 2
	sbi DDRD, 3

	cbi PORTD, 0	; lnastavení log. nuly na všech řádcích
	cbi PORTD, 1
	cbi PORTD, 2
	cbi PORTD, 3

;	ldi  R16, 0 ; na začátku je na výstupu nula

START:

	RCALL   STISK
	RCALL	PWM
	RJMP	START


;;;
;;;
;;; P R O C E D U R E S
;;;
;;;

STISK:
KEY0:
	sbi 	PORTD, 0        ;nastavení jedničky pro první řádek
	sbi 	PORTD, 1        ;nastavení jedničky pro druhý řádek
	sbi 	PORTD, 2        ;nastavení jedničky pro třetí řádek
	cbi 	PORTD, 3	;nastavení nuly pro čtvrtý řádek ( *, 0, #, D)	
	sbic	PINC, 3         ;pokud je na druhém sloupci (2 5 8 0) nula, přeskoč následující instrukci
	rjmp	KEY1            ;pokračuj na KEY1 (testuj, jestli je zmáčknutá 1)
	ldi	R16, 0		;zapiš do registru R16, že byla stisknuta 0
	rjmp	KEYRET          ;pokud byla zmáčknuta 0 jdi na KEYRET
KEY1:
	cbi 	PORTD, 0	;log. nula na prvním řádku (1 2 3 A)
	sbi 	PORTD, 1	;log. jednička na ostatních řádcích
	sbi 	PORTD, 2
	sbi 	PORTD, 3	
	sbic	PINC, 2         ;pokud je na prvním sloupci (1 4 7 *) nula, přeskoč následující instrukci
	rjmp	KEY2            ;pokračuj na KEY2 (testuj, jestli je zmáčknutá 2)
	ldi	R16, 1		;zapiš do R16, že byla stisknuta 1
	rjmp	KEYRET
KEY2:
	sbic	PINC, 3         ; pokud je na druhém sloupci (2 5 8 0) nula, přeskoč následující instrukci
	rjmp	KEY3            ;pokračuj na KEY3 (testuj, jestli je zmáčknutá 3)
	ldi	R16, 2          ; zapiš do R16, že byla stisknuta 2
	rjmp	KEYRET          
KEY3:                           ; atd.
	sbic	PINC, 4
	rjmp	KEY4
	ldi	R16, 3
	rjmp	KEYRET

KEY4:
	sbi 	PORTD, 0
	cbi 	PORTD, 1	;log. nula na druhém řádku (4 5 6 B)
	sbi 	PORTD, 2
	sbi 	PORTD, 3	
	sbic	PINC, 2
	rjmp	KEY5
	ldi	R16, 4		
	rjmp	KEYRET
KEY5:
	sbic	PINC, 3
	rjmp	KEY6
	ldi	R16, 5
	rjmp	KEYRET
KEY6:
	sbic	PINC, 4
	rjmp	KEY7
	ldi	R16, 6
	rjmp	KEYRET

KEY7:
	sbi 	PORTD, 0
	sbi 	PORTD, 1
	cbi 	PORTD, 2	;log. nula na třetím řádku (7 8 9 C)
	sbi 	PORTD, 3	
	sbic	PINC, 2
	rjmp	KEY8
	ldi	R16, 7		
	rjmp	KEYRET
KEY8:
	sbic	PINC, 3
	rjmp	KEY9
	ldi	R16, 8
	rjmp	KEYRET
KEY9:
	sbic	PINC, 4
	rjmp	KEYRET
	ldi	R16, 9

KEYRET:
        ret

PWM:
	MOV 	R17, R16
	INC		R17
	LDI		R18, 0xF0
	OR		R18, R16
PWM_ON:
	DEC		R17
	BREQ	PWM_OFF
	SBI		PORTB, FAN
	RCALL 	VERYSMALLWAIT
	RJMP	PWM_ON
PWM_OFF:
	INC		R18
	BREQ	PWM_RET
	CBI		PORTB, FAN
	RCALL 	VERYSMALLWAIT
	RJMP	PWM_OFF
PWM_RET:
	RET	


VERYSMALLWAIT:
	LDI R20, 0xEC
	MOV R1, R20
SMALLWAIT:
	INC	R1
	BRNE	SMALLWAIT
	RET

[editovat] Zajímavé odkazy

Osobní nástroje