Uživatel:Panyrdav

Z MAM wiki

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

Obsah

[editovat] Pomůcka na třídění odporů

[editovat] Zadání

Pomůcka na třídění odporů se kterou lze rychle roztřídit odpory použité během cvičení v kontaktních polích. Odpor se připojí k zařízení a rozsvítí se jedna z 10 LED, která určí, do které krabičky odpor patří.


[editovat] Autoři

Ivo Jokl (joklivo@fel.cvut.cz)   a   David Panýr (panyrdav@fel.cvut.cz)


[editovat] Návrh řešení

Problém je možné řešit pomocí ADC v procesoru ( A/D převodník), nicméně toto řešení je zpracováno uživatelem Kolacia a proto by již nebylo účelné. Z toho důvodu jsme navrhli jiný způsob, který však může být mírně "kontroverzním" avšak originálním. Příbuzné téma je také zpracováno na stránce Kouckajan.

Program by měl být založen na zjišťování neznámého odporu pomocí hladiny "logické 1", kdy se do do odporu bude pomocí pulsně šířkové modulace (PWM) postupně zvyšovat šířku pulzu, který bude mít spolu s odporem a kapacitorem za následek změnu hladiny napětí na vstupu mikroprocesoru ( PB0 ). Při dosažení hladiny "logické 1" (stanoveno na 2,5 V) bude v mikroprocesoru zaznamenána hodnota PWD (šířka pulzu) a podle té se rozsvítí určitá dioda na výstupu, která bude znázorňovat jednu z deseti hodnot odporů. Pokud bude připojený (neznámý) odpor takový, že nedojde k dosažení "logické 1", tj. hodnota napětí na kapacitoru bude < 2.5 V, rozsvítí se LED0, která znázorňuje příliš velký odpor.


Škála odporů, kterou bude možné detekovat:*

Příklad průběhu napětí na kapacitoru C pozorovatelný osciloskopem

    LED1 ---> R = 100 Ohm

    LED2 ---> R = 150 Ohm

    LED3 ---> R = 220 Ohm

    LED4 ---> R = 270 Ohm

    LED5 ---> R = 330 Ohm

    LED6 ---> R = 390 Ohm

    LED7 ---> R = 470 Ohm

    LED8 ---> R = 560 Ohm

    LED9 ---> R = 680 Ohm

    LED10 ---> R = 820 Ohm

    LED0 ---> R > 820 Ohm

          Pozn.: Velikost kapacitoru C se kterým byly napočítány jednotlivé šířky pásma PWD je 220 pF.

         * - tato škála se dá i libovolně měnit v závislosti na použitém kapacitoru C a také na změně šířek pulzun kódu


     Postup práce programu:

Vývojový diagram


* - přerušení programu bude do doby než dojde k výměně odporu (tedy rozpojení obvodu s odporem a změně "log 1" na "log 0")


     Schéma zapojení:

Schéma zapojení


     Použité odkazy:

Čítače a časovače

Popis mikroprocesoru ATmega88



[editovat] Kód programu

Řešení programu je uvedeno v assembleru:

Načtení hlavičky, nastavení přerušení pro mikroprocesor ATmega88

.include "m88def.inc"

.EQU PWM_puls = 128             ; hodnota pro 7,8125 kHz

.org 0x0000
rjmp spusteni 			; po resetovani zacina od casti "Spusteni"
.org 0x0004
rjmp uspani
;.org 0x0009
;rjmp main

ldi r16,high(RAMEND)		; Do registru R16 uložíme vyšší bajt konstanty RAMEND
out SPH,r16 			; Zkopírování R16 do SPH
ldi r16,low(RAMEND)		; Do registru R16 uložíme nižší bajt konstanty RAMEND
out SPL,r16 			; Zkopírování R16 do SPL

Základní nastavení:

; nastaveni portu k detekci napeti rezistoru
	CBI DDRB, 0		; port PB0 se nastavy k naslouchani
	SBI PORTB, 0		; nastavi pull-up rezistor

; nastaveni portu k vypinaci
	SBI DDRB, 6		; port PB6 nastavy jako vystup
	SBI PORTB, 6		; vystup jako log 1

	CBI DDRC, 0		; port PC0 je nastaven k naslouchani
	SBI PORTC, 0		; nastavi pull-up rezistor

; nastaveni portu LED jako vystupni
	SBI DDRC, 5		; LED1
		CBI PORTC, 5
	SBI DDRC, 4		; LED2
		CBI PORTC, 4
	SBI DDRC, 3		; LED3
		CBI PORTC, 3
	SBI DDRC, 2		; LED4
		CBI PORTC, 2
	SBI DDRC, 1		; LED5
		CBI PORTC, 1
	SBI DDRB, 5		; LED6
		CBI PORTB, 5
	SBI DDRB, 4		; LED7
		CBI PORTB, 4
	SBI DDRB, 3		; LED8
		CBI PORTB, 3
	SBI DDRB, 2		; LED9
		CBI PORTB, 2
	SBI DDRB, 1		; LED10
		CBI PORTB, 1
	SBI DDRC, 6		; LED0 - cervena
		CBI PORTC, 6

Hlavní část programu vyhodnocující 1.-10. hladinu odporu:

main:


	SBIC PINC, 0		; pokud se NEsepne tlacitko
		RJMP uspani



	ldi r16,0b00000001 	; Idle mode usporneho rezimu (preruseni casovacem nebo vytezenim odporu (rozpojeni obvodu))
	out SMCR,r16

	ldi R17, 0b00100011	; Fast PWM mod, výstup na OC0B (PB5), neinvertující
	out TCCR0A, R17		; zapíše hodnotu do registru TCCR0A 
	ldi R17, 0b00001001	; WGM2:1 (Fast PWM), CS2..0:001 (internal clock, prescale=1)
	out TCCR0B, R17		; zapíše hodnotu do registru TCCR0B
	ldi R17, PWM_PULSES	; načte velikost pulsu PWM a uloží do R17
	out OCR0A, R17          ; zapíše hodnotu do registru OCR0A

	sbi DDRD, 5		; nastavi PD5 jako PWM vzstup OC0B



	; nastaveni pwd na hodnotu odporu 1
	ldi R17, 124		
	out OCR0B, R17
	SBIS PINB, 0		; pokud odpor vytvori log1 (pokud se vyhodnoti odpor) rozsviti se prislusna LED
		RJMP LED1
	SBIS PINB, 0		; a procesor se uspi
		RJMP uspani

	; nastaveni pwd na hodnotu odporu 2
	ldi R17, 122
	out TCCR0B, R17
	SBIS PINB, 0		; pokud odpor vytvori log1 (pokud se vyhodnoti odpor) rozsviti se prislusna LED
		RJMP LED2
	SBIS PINB, 0		; a procesor se uspi
		RJMP uspani

	; nastaveni pwd na hodnotu odporu 3
	ldi R17, 119
	out TCCR0B, R17
	SBIS PINB, 0		; pokud odpor vytvori log1 (pokud se vyhodnoti odpor) rozsviti se prislusna LED
		RJMP LED3
	SBIS PINB, 0		; a procesor se uspi
		RJMP uspani

	; nastaveni pwd na hodnotu odporu 4
	ldi R17, 117
	out TCCR0B, R17
	SBIS PINB, 0		; pokud odpor vytvori log1 (pokud se vyhodnoti odpor) rozsviti se prislusna LED
		RJMP LED4
	SBIS PINB, 0		; a procesor se uspi
		RJMP uspani

	; nastaveni pwd na hodnotu odporu 5
	ldi R17, 114
	out TCCR0B, R17
	SBIS PINB, 0		; pokud odpor vytvori log1 (pokud se vyhodnoti odpor) rozsviti se prislusna LED
		RJMP LED5
	SBIS PINB, 0		; a procesor se uspi
		RJMP uspani

	; nastaveni pwd na hodnotu odporu 6
	ldi R17, 112
	out TCCR0B, R17
	SBIS PINB, 0		; pokud odpor vytvori log1 (pokud se vyhodnoti odpor) rozsviti se prislusna LED
		RJMP LED6
	SBIS PINB, 0		; a procesor se uspi
		RJMP uspani

	; nastaveni pwd na hodnotu odporu 7
	ldi R17, 109
	out TCCR0B, R17
	SBIS PINB, 0		; pokud odpor vytvori log1 (pokud se vyhodnoti odpor) rozsviti se prislusna LED
		RJMP LED7
	SBIS PINB, 0		; a procesor se uspi
		RJMP uspani

	; nastaveni pwd na hodnotu odporu 8
	ldi R17, 106
	out TCCR0B, R17
	SBIS PINB, 0		; pokud odpor vytvori log1 (pokud se vyhodnoti odpor) rozsviti se prislusna LED
		RJMP LED8
	SBIS PINB, 0		; a procesor se uspi
		RJMP uspani

	; nastaveni pwd na hodnotu odporu 9
	ldi R17, 102
	out TCCR0B, R17
	SBIS PINB, 0		; pokud odpor vytvori log1 (pokud se vyhodnoti odpor) rozsviti se prislusna LED
		RJMP LED9
	SBIS PINB, 0		; a procesor se uspi
		RJMP uspani

	; nastaveni pwd na hodnotu odporu 10
	ldi R17, 98
	out TCCR0B, R17
	SBIS PINB, 0		; pokud odpor vytvori log1 (pokud se vyhodnoti odpor) rozsviti se prislusna LED
		RJMP LED10
	SBIS PINB, 0		; a procesor se uspi
		RJMP uspani

	; ostatni pripady odporu
	SBIC PINB, 0		; pokud odpor vytvori log1 (pokud se vyhodnoti odpor) rozsviti se prislusna LED
		RJMP LED0
				;; mozned dodelat citac, ktery by to po X cyklech prestal zkouset
	RJMP main		; pokud se nedetekuje odpor, bude to stale zkouset

Program v úsporném režimu, reakce na přerušení (vytažení odporu):

uspani:
	sleep 			; uspani procesoru
	RJMP uspani 		; nekonecna smycka, cekajici na vytazeni odporu

vytazeni_odporu:
	RJMP main

Část rozsvěcující příslušnou LEDku:

LED1:				; rozsviti LED1
	SBI PORTC, 5		; LED1
		CBI PORTC, 4	; LED2
		CBI PORTC, 3	; LED3
		CBI PORTC, 2	; LED4
		CBI PORTC, 1	; LED5
		CBI PORTB, 5	; LED6
		CBI PORTB, 4	; LED7
		CBI PORTB, 3	; LED8
		CBI PORTB, 2	; LED9
		CBI PORTB, 1	; LED10
		CBI PORTC, 6	; LED0 - cervena
	RJMP uspani

LED2:				; rozsviti LED2
		CBI PORTC, 5	; LED1
	SBI PORTC, 4		; LED2
		CBI PORTC, 3	; LED3
		CBI PORTC, 2	; LED4
		CBI PORTC, 1	; LED5
		CBI PORTB, 5	; LED6
		CBI PORTB, 4	; LED7
		CBI PORTB, 3	; LED8
		CBI PORTB, 2	; LED9
		CBI PORTB, 1	; LED10
		CBI PORTC, 6	; LED0 - cervena
	RJMP uspani
LED3:				; rozsviti LED3
		CBI PORTC, 5	; LED1
		CBI PORTC, 4	; LED2
	SBI PORTC, 3		; LED3
		CBI PORTC, 2	; LED4
		CBI PORTC, 1	; LED5
		CBI PORTB, 5	; LED6
		CBI PORTB, 4	; LED7
		CBI PORTB, 3	; LED8
		CBI PORTB, 2	; LED9
		CBI PORTB, 1	; LED10
		CBI PORTC, 6	; LED0 - cervena
	RJMP uspani

LED4:				; rozsviti LED4
		CBI PORTC, 5	; LED1
		CBI PORTC, 4	; LED2
		CBI PORTC, 3	; LED3
	SBI PORTC, 2		; LED4
		CBI PORTC, 1	; LED5
		CBI PORTB, 5	; LED6
		CBI PORTB, 4	; LED7
		CBI PORTB, 3	; LED8
		CBI PORTB, 2	; LED9
		CBI PORTB, 1	; LED10
		CBI PORTC, 6	; LED0 - cervena
	RJMP uspani

LED5:				; rozsviti LED5
		CBI PORTC, 5	; LED1
		CBI PORTC, 4	; LED2
		CBI PORTC, 3	; LED3
		CBI PORTC, 2	; LED4
	SBI PORTC, 1		; LED5
		CBI PORTB, 5	; LED6
		CBI PORTB, 4	; LED7
		CBI PORTB, 3	; LED8
		CBI PORTB, 2	; LED9
		CBI PORTB, 1	; LED10
		CBI PORTC, 6	; LED0 - cervena
	RJMP uspani

LED6:				; rozsviti LED6
		CBI PORTC, 5	; LED1
		CBI PORTC, 4	; LED2
		CBI PORTC, 3	; LED3
		CBI PORTC, 2	; LED4
		CBI PORTC, 1	; LED5
	SBI PORTB, 5		; LED6
		CBI PORTB, 4	; LED7
		CBI PORTB, 3	; LED8
		CBI PORTB, 2	; LED9
		CBI PORTB, 1	; LED10
		CBI PORTC, 6	; LED0 - cervena
	RJMP uspani

LED7:				; rozsviti LED7
		CBI PORTC, 5	; LED1
		CBI PORTC, 4	; LED2
		CBI PORTC, 3	; LED3
		CBI PORTC, 2	; LED4
		CBI PORTC, 1	; LED5
		CBI PORTB, 5	; LED6
	SBI PORTB, 4		; LED7
		CBI PORTB, 3	; LED8
		CBI PORTB, 2	; LED9
		CBI PORTB, 1	; LED10
		CBI PORTC, 6	; LED0 - cervena
	RJMP uspani

LED8:				; rozsviti LED8
		CBI PORTC, 5	; LED1
		CBI PORTC, 4	; LED2
		CBI PORTC, 3	; LED3
		CBI PORTC, 2	; LED4
		CBI PORTC, 1	; LED5
		CBI PORTB, 5	; LED6
		CBI PORTB, 4	; LED7
	SBI PORTB, 3		; LED8
		CBI PORTB, 2	; LED9
		CBI PORTB, 1	; LED10
		CBI PORTC, 6	; LED0 - cervena
	RJMP uspani

LED9:				; rozsviti LED9
		CBI PORTC, 5	; LED1
		CBI PORTC, 4	; LED2
		CBI PORTC, 3	; LED3
		CBI PORTC, 2	; LED4
		CBI PORTC, 1	; LED5
		CBI PORTB, 5	; LED6
		CBI PORTB, 4	; LED7
		CBI PORTB, 3	; LED8
	SBI PORTB, 2		; LED9
		CBI PORTB, 1	; LED10
		CBI PORTC, 6	; LED0 - cervena
	RJMP uspani

LED10:				; rozsviti LED10
		CBI PORTC, 5	; LED1
		CBI PORTC, 4	; LED2
		CBI PORTC, 3	; LED3
		CBI PORTC, 2	; LED4
		CBI PORTC, 1	; LED5
		CBI PORTB, 5	; LED6
		CBI PORTB, 4	; LED7
		CBI PORTB, 3	; LED8
		CBI PORTB, 2	; LED9
	SBI PORTB, 1		; LED10
		CBI PORTC, 6	; LED0 - cervena
	RJMP uspani

LED0:				; rozsviti LED0 - cervena
		CBI PORTC, 5	; LED1
		CBI PORTC, 4	; LED2
		CBI PORTC, 3	; LED3
		CBI PORTC, 2	; LED4
		CBI PORTC, 1	; LED5
		CBI PORTB, 5	; LED6
		CBI PORTB, 4	; LED7
		CBI PORTB, 3	; LED8
		CBI PORTB, 2	; LED9
		CBI PORTB, 1	; LED10
	SBI PORTC, 6		; LED0 - cervena
	RJMP uspani


[editovat] Poznámky

Program by bylo možné změnit, aby jednotlivé LED-ky ukazovaly přibližnou hodnotu v binární kódu

Osobní nástroje