AD převodník: využití dalších pinů stejného portu pro output

Mám ATmega48 a využil jsem všechny piny. napadala mě jedna věc. Když pin C0 používám jako AD převodník, doufám, že můžu piny C1-C5 jako výstupy. C6 nechávám na pokoji, jelikož je to reset.

Mám ten dojem, že tyto piny lze v tu samou chvíli použít jak
pro AD konverzi, tak i jako digitální vstupy.
Tedy pokud ty digitální vstupy nezakážeš v registru DIDR0.
To se dělá pro omezení rušení.

Ještě bych podotkl, že pokud probíhá AD převod, tak jsem někde četl, že se nedoporučuje změna stavu zbývajících AD pinů.

Jsem docela v časové tísni, a na zásadní rekonstrukci není čas, jelikož toto je určeno pro semafor pro synovce pod vánoční stromeček. DPS už mám hotovou. Porty, o které se jedná ovládají jednotlivé segmenty displeje, jenž ukazují dobu, po kterou má být sepnuta zelená a zmíněný ad převodník používám na volbu času potenciometrem, jenž se následně zobrazí na 2 místném led segmentovce. Zmíněný port ovládá první číslovku. Potřeboval bych nějaké řešení v bascomu, v němž mám program napsaný. Napadá mě jen nepříliš vhodný řešení a to ad převodník v okamžiku změny displeje zastavit a pak ho opět nahodit. V nouzi bych indikoval jen jednou číslovkou, jenž není napojena na port s ad převodníkem.

Ahoj.
Nastav si AD prevodnik ne na samostatne pracujici (ADATE) ale na vyvolavani na pozadavek.
Nastavis nejprve ADMUX a v ADCSRA pouze ADPS a ADEN kdyz budes chtit prevod tak nastavis ADSC a cekas dokud ADSC neni nula.

Pote program bude postaveny takto
Spust AD prevod
cekej dokud AD prevod neni hotov
uloz hodnotu do promenne,
obsluha 1. displaye
obsluha 2. displaye
cyklus odznova

Problém je v tom, že jak jsem uvedl, tak toto dělám v Bascomu. A budu se muset podívat, zda něco takového umí. Zatím mě napadá jen:

[code]start adc
x=getadc(0)
stop adc

zobrazení načtený hodnoty[/code][/code]

Nebo by měnějaká dobrá duše vložila pořebný kousek kódu v asembleru, jenž lze do bascomu vložit.

Tohle jsem nasel na foru
bradlylewis.com/bascom_avr/adc_mega168.php

[code]
Config Adc = Single , Prescaler = Auto
Start Adc

begin_here:
Channel = 0
reading = Getadc(channel)
print "Reading = " ; reading
waitms 500
goto begin_here:[/code]
Mozna to pomuze, misto waitms 500 budes pokracovat svym kodem pro obsluhu displayu

Měl bych ještě jeden dost možná blbý dotaz. ATmega zpracovává příkazy postupně a nebo může dokončovat časově náročnější příkaz (např. odečet měření ad převodníku) a současně začít dělat něco jiného (třeba změnit hodnotu na výstupu pinu). Nebo vždy změří a pak změní hodnotu na pinu? Vůbec netuším, ale spíš bych hádal, že multitasking ATmega nepodporuje. takže vyjma si jen přerušení zpracovává vše hezky v řadě, jak to jde za sebou.

Atmegy a ostatni osmibity jsou jednojadrove procesory, nelze tudiz zpracovavat dva procesy v jednom case.
Pro tvou aplikaci semaforu to ani neni nutne, nebot prepinani 3 svetel na cas je casove nenarocna aplikace, vetsinu casu “spotrebuje” cekani az budes moci prepnout svetla.
Nejaky prepocet z analogove hodnoty na realnou vubec nepocitis, takze bych se tim nezabyval.
Menit cas behem prepinani se sice nedela, ale proc ne kdyz chces.
Program bude asi fungovat nasledovne:

Cti hodnotu analogu (1x)
prepocti na cas pro delay
zapni zelene svetlo
vypni cervene svetlo
cekej tak dlouho jak je nastaveno delay (tohle bych asi udelal pres preruseni casovace, ktery by mi nastavil bit kdyz je dopocitano a v zde v hlavnim programu bych behem toho cekani mel smycku ovlivnenou tim bitem
Cti hodnotu analogu (1x)
zobraz na displayi)

Pokud dopocitano vyskoc ze smycky

Cti hodnotu analogu (1x)
prepocti na cas pro delay
vypni zelene svetlo
zapni cervene svetlo
cekej tak dlouho jak je nastaveno delay (tohle bych asi udelal pres preruseni casovace, ktery by mi nastavil bit kdyz je dopocitano a v zde v hlavnim programu bych behem toho cekani mel smycku ovlivnenou tim bitem

Opakuj furt dokola

Mě jde především o rušení jenž by teoreticky mohlo nastat při čtení hodnoty z AD převodníku a následného případného přepnutí hodnoty na displeji, jenž jenž je ovládán přímo piny na stejném portu co je ad převodník. Proto uvažuji

ADC start x = adc(0) ADC stop zpracování hodnoty měření

Jde mě o to, pokud použiju tento způsob, abych měřil x = adc(0) již při naběhlém AD převodníku a ADC stop neutnul “rozpracované” měření bez toho, aby se do “x” uložila patřičná hodnota.

Program mám již víceméně napsaný. Jen při rozbíhání budu přidávat jednotlivé fuknkční bloky a po jejich ověření přidám další.

[code]Všude svítí červená
Oranžová - zelená v jednom směru
čeká dle nastavené hodnoty načtené z ad převodníku
Oranžová - červená v prvním směru
Všude svítí červená
Oranžová - zelená v druhém směru
čeká dle nastavené hodnoty načtené z ad převodníku
Oranžová - červená v druhém směru
A pořád dokola

Přerušení (zatím váhám jak často) 30x-100x za sekundu
vyčti hodnotu z AD převodníku
nastav podle hodnoty dobu čekání
nastav hodnotu na displeji[/code]

Zatím jsem se nijak zvlášť podrobně nezamýšlel, jak ošetřit přechodový stavy. Kdy vlivem nepřesnosti měření bude hodnota oscilovat například mezi 10 a 11. Hodnota zobrazovaná na dvoumístném displeji bude čas v sekundách, po kterou bude v jednom směru zelená. ve finále bych chtěl, aby pokud se nastaví čas pod 5 sekund, tak by blikala ve všech směrech oranžová. Pokud by se čas zvýšil nad 4 sekundy, začal by opět cyklus bodem “červená všude”.

Zkus trosku nacerpat ze zde:
[forum.mcontrollers.com/t/nacteni-a-vypocet-hodnot-napeti-s-adc-v-bascom/1178/5)
Z toho jsem vycetl, ze se nepouziva ADC(0) ale GETADC(0) a kdyz ten prikaz skonci, tak uz mas v promenne hodnotu z funkce
tedy neco takoveho

Dim An_Val As Integer
Config Adc = Single , Prescaler = Auto , Reference = Avcc 
Start Adc 

An_Val=GetAdc(0)  // V teto chvili je analogove cteni ukonceno

Osetrni dalsi hodnoty potenciometru+cekani+zobrazeni hodnoty


A furt dokola


Omlouvám se, ten příkaz jsem psal z hlavy a nepodíval jsem se do manuálu. Teď mám problém asi se zapojením. Zapojil jsem to dle schematu. Potenciometr se docela rozžhavil a vzal do křemíkovýho nebe AT mega. Když jsem připojil přímo trimr na +5V, zem a jezdec na pin, tak to fungovalo, ale tady mám něco špatně. Co to je? Nechci odpálit další. Neměl by být mezi jezcem a pinem ATmega nějaký odpor?

hmm no vo vseobecnosti nieje vhodne pustat plnu stavu do uP. DAj tam nejaky odpor napr 10k to obmedzi prud do procesor ak ten pin nahodou bude ako vystupny… navyse by som medzi pin a zem dal este 100n pre odstranenie neakych rusivych vplyvov ktore by zmiatli prevodnik … tj daj tam rc clen ochrani to pin z zaroven odrusi spicky z potaku… inak neviem ake dlhe mas privody ale pouvazuj ci by vsetky vstupy co tam mas nemali byt osetreene RC clenom.

Myslim si ze je take spatne zapojeny pin AREF. V pripade ze pouzivas interni referenci ma tam byt kondenzator, jinak tam musi byt nejaka externi reference ve forme zenerovy diody pres prislusny odpor, nebo externi reference.

Já betu referenci z pinu 21. Jen si teď nejsem jistý, zda je možný zapojit Vcc, AVc a Aref natvrdo na +5V, a Agnd a GND přímo na zem,jak jsem to udělal. Tam v tom je možná ta chyba.

Pro zapojení napájení,AREF a GND bych se inspiroval:
mongi.cz/Joomla/images/stori … Schema.png

:arrow_right: administrator: přiloženy externí soubory

Díky, něco takovýho jsem hledal.

Tusim je najvyssi cas prejst na Ccko.

Jo. :smiley: Naučil jsem se šlapat na kole, proto mě sundali balanční kolečka, takže je nejvyšší čas přesednout na půlitra motorku. :open_mouth:

No tam to totiz pojede samo bez tlacenia a.sliapania :smiley: