Učím se s AD převodníkem

[code];AVCC propojit s VCC
;portb = data dispalye
;portd = ovládání dispu
;vstup akcelerometr ADC0(PC0)
;vstup vypínač diplaye pc5 připojit na gnd

.include "m8def.inc"

.def ceka=r22
.def cekb=r23
.def inkrement=r24
.def w=r16
.def min=r20
.def max=r21
.def tmp=r17

.equ DD=portb	;D0-7 na display
.equ vyp=portc,5
.equ RS=portd,0
.equ RW=portd,1
.equ EN=portd,2

rjmp main

main: LDI W,$FF ;jedničky do W

out DDRB,w	;učinit portb výstupním (dispdata) 

out DDRD,w	;učinit portD výstupním (ovládání dispu)
LDI W,$00
out DDRC,w	Port C vstupní



LDI w,$80

out min,w 	;nastavit počíteční honodty min 
out max,w 	;nastavit počíteční honodty max





LDI W,LOW(ramend) ;natáhnout konec ram

out SPL,W	;vložit adresu do stackpointeru

LDI W,HIGH(ramend)

out SPH,W

LDI inkrement,$01

;–init ADC

ldi w,$20
out ADCMUX,w 	;reference připojena na AVCC 01 vysledek zarovnán do leva 1 vybrat kanál převodníku ADC0 0000 čili 01100000
ldi w,0b01100000	;11100100 povolit|začít|freerunning mode|?|zakázat přerušení|dělička 16 62,5kHz čili e4
out ADCSRA,w

mereni: SBIS vyp ;přeskočí řádek není li sepnutý vypínač
rjmp display ;sepnutý vypínač - zobrazíme

SBIS ADCSRA,4 	;přeskočí další řádek jeli změřeno
rjmp mereni	;neni zmereno - cyklíme dál.

in w,ADCH	;načíst honotu napětí
mov tmp,w

sub w,max 	;napětí - max
brpl Uprmax	;kladný výsledek - upravit max

mov w,tmp
sub w,min	;napětí - min
brmi Uprmin	;výsledek je záporný - uprav min

rjmp mereni	;návrat zpátky

Uprmax: mov max,tmp
rjmp mereni ;návrat zpátky
Uprmin: mov min,tmp
rjmp mereni ;návrat zpátky

;–Zobrazení-------------

display: SBI EN ;Nastav enable bit na jedna
CBI RW
CBI RS
LDI w,0b00111000

;počkat >40ms
RCALL cekej ;No tak počkáme 1/4s

OUT DD,w 
CBI EN	;první init 	
SBI EN	

;-----------------------------
LDI w,0b00001110

;počkat >4,1ms
RCALL cekej ;No tak počkáme 1/4s

OUT DD,w
CBI EN	;zapnutí nastavení kurzoru	
SBI EN

LDI w,0b00000110
OUT DD,w
CBI EN	;init zápisu

;-----------------------------
SBI EN

;počkat >100us
RCALL cekej ;No tak počkáme 1/4s

SBI RS
;Tady budem psat znaky	

;-----------------------------
LDI inkrement $02 ;urychlíme kapátko čekání

mov tmp,max
LDI ceka,$07	

vypis1: SBRC tmp,7 ;pokud není nula >
LDI w,0b00110001 ;vypsat jedničku
SBRS tmp,7 ;pokud není jedna >
LDI w,0b00110000 ;vypsat nulu
LSL tmp
out DD,w
CBI EN ;zapsáno
DEC ceka
RCALL cekej ;počkat
BRPL vypis1

mov tmp,min
LDI ceka,$07	

vypis2: SBRC tmp,7 ;pokud není nula >
LDI w,0b00110001 ;vypsat jedničku
SBRS tmp,7 ;pokud není jedna >
LDI w,0b00110000 ;vypsat nulu
LSL tmp
out DD,w
CBI EN ;zapsáno
DEC ceka
RCALL cekej ;počkat
BRPL vypis2

LDI inkrement $01

brzda: sbis vyp ;přeskočí řádek není li sepnutý vypínač vyp=1
rjmp brzda ;zacyklit dokavaď není vypínač rozepnut
rjmp mereni ;začít měřit

;======== čekací smyčka cca čtvrt sekundy při 1MHZ a inkrementu 1========

cekej: CLR ceka

CLR cekb	;nastavit na nulu

wait: add cekb,inkrement ;přičteme 1

nop

nop

nop

brcc wait	;skočí je li carry v nule





add ceka,inkrement ;jedničku k béčku

brcc wait

ret		;návrat z podprogramu

;======== [/code]

No jestli toť toto pojede tak se asi ožeru…
už zbývá jenom poladit pojmenování pinů portu a zitra koupit konektor na display…

.equ vyp=portc,5 .equ RS=portd,0 .equ RW=portd,1 .equ EN=portd,2

No tak ADC s vnitřním zadrtování reference mně nefungoval s vnějším už je to lepší ale co mně zaráží je že pokud chci aby mega spolehlivě pracovala tak by se napětí na vstupu ADC mělo pohybovat zhruba 0,7-0,3 reference
jinak mi to začne dělat kraviny.
Konkrétně v registru MAX se mi objeví hodnoty měnší než 128 a vregistru MIN zase větší. k tomu by nemělo dojít.

Program je zde paste.jabbim.cz/2452

Pouzivam ADC na mega velmi velmi casto. A nemam s nou najmensie problemy. Ani so stabilitou nameranej hodnoty a ani s tym, ze by mega nepracovala spravne, ak je ADvst mimo rozsah 0.3-0.7 Uref. Odkial si prisiel na tento rozsah? A ze by mimo neho nemala mega spravne pracovat?
Ako “nespravne” pracuje procesor mimo tento rozsah? Znamena to, ze ak na ADvstup privedies iba GND, tak ti procesor blbne?

Nestalo sa mi, ze by nefungovala interna referencia. Ani externa a ani referencia z Ucc. Co to znamena, ze vnejsi reference je lepsi?
TEn zdrojak luskat nebudem, v ASM nepracujem. Ale ak su MIN a MAX tvoje registre, ktore plnis na zaklade porovnania z hodnotou z AD a mas tam nezmysly, potom su asi dane programom a nie vysledkami AD prevodu. Ale mozno sa mylim.

Martin

Už jsem to s nim vyřešil… PRoblém byl trochu jinde :slight_smile:

Zdravím vás.
Potřeboval bych připojit v AD převodníku fotodiodu na snímání okolního osvětlení. Stačilo by mi klidně přesnost na 2bity (hodně světla venku, mín, podvečer, večer). O programování mi teď nejde - jde mi o hardwarovou stránku věci. Doporučíte mi nějakou fotodiodu (nebo snad fotorezistor?) a taky jak to připojit k ATmega32. Bude to na PA2, ale nevím co s AREF, AVCC a AGND
Moc díky za nějaky nápady.

Fototranzistor není moc vhodný. Rozsah osvětlení přes den je obrovský a fototranzistor velice snadno dostaneš do saturace.
dioda.GIF

jankop: bylo by možné s touto fotodiodou snímat otáčky modelářské vrtule za denního osvětlení ?

Na to nelze jednoznačně odpovědět. Rychlostně naprosto bez problémů, je to PIN dioda. Záleží na tom, jaký poměr jasů bude k dispozici. Ale je to reálné. Ovšem v tomto případě by to jednoznačně chtělo střídavý zesilovač, aby se člověk zbavil té převažující stejnosměrné složky.

Díky za info, budu hledat dál něco co je vyzkoušené.