Uživatel:Kolacmar

Z MAM wiki

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

Obsah

[editovat] Samostatná práce

[editovat] Úvod

zadání: Pomůcka na třídění odporů

základní myšlenka: Využití ADC v procesoru. Je možné použít dělič - jeden odpor známý, druhý který se bude vyhodnocovat.

[editovat] Napájení vnějšího odporového děliče

  • použití napájecí napětí procesoru - zvoleno v rámci zjednodušení řešení
  • použít externí zdroj - pravděpodobně stabilnější řešení, ale vzhledem k rozlišovacím schopnostem přístroje nepodstatné

[editovat] kdy probíha vyhodnocování

  • po stisku tlačítka - zbytek času může procesor spát a ADC jednotka poběží minimálně
  • vyhodnocování periodicky

[editovat] Velikost tříděných odporů

  • odpory v rozmezí 100[Ω] - 1[MΩ]. Program vyhodnocuje 10 úrovní, které odpovídají následujícím velikostem odporů
Velikost odporu [Ω] Binární hodnota
< 80 < 2
80 - 500 2 - 12
500 - 900 12 - 21
900 - 5k 21 - 85
5k - 9k5 85 - 124
9k5 - 50k 124 - 213
50k - 95k 213 - 231
95k - 500k 231 - 250
500k - 1M 250 - 253
> 1M > 253


[editovat] Referenční odpor

K pokrytí celého rozsahu 100Ω - 1MΩ je třeba vhodně zvolit referenční odpor Rref. Dokumentace procesoru (str. 250, kap 23.6.1) uvádí, že vzhledem k rychlosti nabíjení konenzátoru je dobré pokud je výstupní impedance menší 10kΩ. Jako první hodnotu Rref proto volím právě 10k a výše zmíněná podmínka by měla být splněna(pokud bude testovací odpor větší než referenční impedance se bude blížit 10kΩ, pokud bude testovací menší bude celkévá impedance blížit testovanému odporu)

[editovat] Schéma

Soubor:Kolacmar_schema_semestralka.PNG

[editovat] Použité jednotky procesoru a nastavení řídících registrů

[editovat] Řídící registry přerušení a nastavení režimu spánku

SMCR

Soubor:SMCR.PNG

 *SM - režim spánku
 *SE - povolení režimu spánku

PCICR

Soubor:PCICR.PNG

 *PCIE - povolení přerušení od jednotlivých bran


PCMSK1

Soubor:PCMSK1.PNG

*PCINT - povolení přerušení od bitů 0..6 Portu C 


[editovat] ADC převodník

10bitový převodník, 8 kanálů jako alternativní funkce portu C.

(Podrobné informace na str. 243 - kapitola 23)

ADMUX

Soubor:ADMUX_registr.PNG

 *REFS - určení zdroje referenčního napětí
 *ADLAR - řízení zápisu do výstupního registru (zápis zleva/zprava)
 *MUX - určení pracovního kanálu AD převodníku

ADCSRA

Soubor:ADCSRA_registr.PNG

 *ADEN - zapínání/vypínání převodníku. možnost vypnout i za běhu převodu
 *ADSC - start konverze, vypíná se automaticky po dokončení převodu
 *ADIF - příznak přerušení
 *ADIE - povolení obsluhy přerušení po dokončení konverze
 *ADPS - dělička kmitočtu ADC vzhledem k systémovému kmitočtu

ADC - datový registr ve kterém je uložen výsledek AD převodu

Soubor:ADC_L_H_registr.PNG

 * Zápis do registru ADC je dán řídícím bitem ADLAR
 * Jako další 8bit registry sdružené do 16bitového registru má ADC definovaný způsob čtení hodnot.
    Pokud chceme číst hodnotu z registru ADC, je nutné napřed číst dolní byte a až poté horní.


[editovat] Navržený program

.INCLUDE "m88def.inc"
.org 0x0000 ;hlavni program/preruseni RESET
	rjmp main
.org 0x0004	; preruseni od stisknuteho tlacitka
	rjmp tlacitko
.org 0x0015 ;preruseni ADC conversion complete
	rjmp vyhodnoceni
;////INICIALIZACE PROCESORU////;
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
; povoleni vystupu vsech diod
	Ldi R16, 0xFF
	OUT DDRB, R16
	sbi DDRD, 6
	sbi DDRD, 7
	Ldi R16, 0
	OUT PortB, R16
	cbi PortD, 6
	cbi PortD, 7

 ;nastaveni ADC
 ;viz. datasheet str.254,...
;aktivni ADC bude ADC5,  na pinu PORTC5 
	clr R27
	LDI R26, ADMUX
	LDI R17, 0b01100101 
; aktivni ADC5, napajeni Vcc + je potreba pripojit kapacitor na pin AVCC (pin 20)
	st X,R17
	ldi R26, ADCSRA
	ldi R27, 0
	ldi R16, 0b00001000
	ST X, R16

 ;nastaveni sleep modu
  	ldi r16,0b00000011 ; Idle mode 
	;ADC noisre reduction
	out SMCR,r16 ; Sleep mode set

;povoleni preruseni od portu C
	ldi r26, PCICR
	clr r27
	ldi r16,0b00000010
	st X, r16
;preruseni povoleno od bitu 1, portu C
	ldi r26, PCMSK1
	clr r27
	ldi r16,0b00000010;povoleni preruseni od pinu 1 portu C
	st X, r16
	cbi DDRC, 1 	;pin C.1 nastaven jako vstupni s urovni "1"
	sbi PortC, 1

	sei; interrupt enable
	rjmp spanek
;////HLAVNI PROGRAM////;
spanek: 
	sleep
	nop
	rjmp spanek
;////OBSLUHY PRERUSENI////;
tlacitko:
	rcall wait
;zapnuti konverze ADC
	ldi R26, ADCSRA
	ldi R27, 0
	LD R16, X
	ldi R17, 0b11000000
	OR R16, R17
	ST X, R16
	reti

vyhodnoceni:
	ldi R26, ADCH
	ldi R27, 0
	LD R20, X ;hodnota konverze je uložena do registru R20
;vypnuti ADC
	ldi R26, ADCSRA
	ldi R27, 0
	LD R16, X
	ldi R17, 0b01111111
	AND R16, R17
	ST X, R16

;rozhodnuti o velikosti vlozeneho odporu a jemu odpovidajici binarni hodnote prevodu
;L     (2)
;80 500 (12)
;500 900 (21)
;900 5k (85)
;5k 9k5 (124)
;9k5 50k (213)
;50k 95k (231)
;95k 500k (250)
;500k 1M (253)
;H 

	ldi R21, 0
	ldi R22, 0

	 cpi R20, 2
	 brcc dd1
	 ;LOW stav(R<80)
	 LDI R22, 0b01000000
	 rjmp ddend
dd1: CPI R20, 12
	 brcc dd2
	 ;(80ohm - 500ohm)
	 LDI R21, 0b00000001 
	 rjmp ddend
dd2: CPI R20, 21
	 brcc dd3
	 ;(500ohm - 900ohm)
	 LDI R21, 0b00000010 
	 rjmp ddend
dd3: CPI R20, 85
	 brcc dd4
	 ;(900ohm - 5kohm)
	 LDI R21, 0b00000100
	 rjmp ddend
dd4: CPI R20, 124
	 brcc dd5
	 ;(5kohm - 9,5kohm)
	 LDI R21, 0b00001000
	 rjmp ddend
dd5: CPI R20, 213
	 brcc dd6
	 ;(9,5kohm - 50kohm)
	 LDI R21, 0b00010000
	 rjmp ddend
dd6: CPI R20, 231
	 brcc dd7
	 ;(50kohm - 95kohm)
	 LDI R21, 0b00100000
	 rjmp ddend
dd7: CPI R20, 250
	 brcc dd8
	 ;(95kohm - 500kohm)
	 LDI R21, 0b01000000
	 rjmp ddend
dd8: CPI R20, 253
	 brcc dd9
	 ;(500kohm - 1Mohm)
	 LDI R21, 0b10000000
	 rjmp ddend
dd9: ;HIGH stav (>1Mohm)
	LDI R22, 0b10000000
ddend: 
;zobrazeni vysledku na porty
;presunout vysledky na porty B a D(6,7)
;port D = R22  - LOW, HIGH stavy
;port B = R21  - hodnoty rezistoru
	OUT PORTB, R21
	OUT PORTD, R22
	reti
;////POMOCNE PROCEDURY////;
;generovani zpozdeni po stisku tlacitka
WAIT:
	LDI	R16, 4
WAIT1:	INC	R1
	BRNE	WAIT1
	INC	R2
	BRNE	WAIT1
	DEC	R16
	BRNE	WAIT1
	RET
Osobní nástroje