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

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:

Tak tak, s C si to užiješ. S BASCOMem to bude trápení. (nainstaloval jsem to a… zase odinstaloval :slight_smile:

To Atlan: Proč si myslíš, že se nedávaj 5 letým klukům řidičáky na silnou motorku? S C bych dopadnul nejspíš stejně. Neřízená střela, co způsobí víc škody než užitku.

To Radius: Když léta děláš v C, tak se ti nedivím. Teď si představ, že by jsi musel začít pracovat s 3D cadem Solid Edge. Já v něm dělám roky, ale ty pro svůj DITY projet taky nejspíš nepoužil a nakreslil by sis potřebný věci ve 2D Autocadu i když ten můj cad je na to výrazně lepší.

TO Kolbaba71: Budeš se divit ale stalo se mi že jsem musel doslova přes noc začít dělat 3D návrh. Vybral jsem si na práci AUTOCAD 2006. Já jsem asi tak dobrej strojař jako ty programátor a přesto si myslím že kdybych si vybral nějaký výrazně slabší návrhový prostředek tak bych asi pohořel.
K C můžu poznamenat jen tolik že osoba která rutinně neprogramuje a C viděla prvně v životě, byla shopná do připravené kostry programu shopná doprogramovat zbytek už za den seznamování se s tímto jazykem. (použila asi 5 příkazů) :slight_smile: ale to úplně stačilo.

PS: Dneska bych asi startoval se SOLIDEM ale tenkrát jsem neměl dots informací.

To Kolbaba71:
Podle mě bys měl nejdřív ochutnat (zkusit) a pak soudit.

To Kolbaba71:
Na mohutnu pracu v C-cku (GCC) Ti staci vediet 31 nasledovnych prikazov a prvkov:


//

/*
*/

int8_t
uint8_t
int16_t
uint16_t
int16_t
uint16_t

( )
{ }
 ]
=
+
-
*
/
>>
<<
&&
||
==
!=
&
|
^
~


int main (void)
{
}

unit16_t funkcia(parameter1, parameter2, ..., parameterX); // deklaracia funkcie

unit16_t funkcia(parameter1, parameter2, ..., parameterX) {
} // definicia funkcie s prenosom parametov


if (podmieka) {

}
else {

}

while (podmienka) {

}

for(;;) { 
} // tento prikaz sa da vzdy nahradit pomocou while()

switch() {
}// tento prikaz sa da vzdy nahradit pomocou viacerych if()

na ukazatele a linkovanie viacerych zdrojovych suborov atd atd mas dost casu. Male veci - tak do 100-2000riadkov - vystacia s tymito konstruktami.
Prenasanie parametrov cez ukazatele na zaciatku hravo zvladnes pouzitim globalnych premennych v ramci jedneho *.c suboru.
Co je vsak dolezitejsie, na NETe najdes omnoho omnoho viac prikladov v C-cku a skor Ti niekto poradi ako s Bascom-om.

Podla mojho nazoru su skusenosti s Bascom-om viac menej zbytocne, tak by som to neporovnaval s bicyklom a motorkou.

Najvacsi problem asi maju zaciatocnici zo zdanliveho mora velmi podobnych zatvoriek, ktore zaciatocnikovi zneprehladnuju text, ale po dvoch -troch tyzdnoch si z toho vonku. :slight_smile:

Nasiel som na nete celkom pekne vyzerajuci tutorial pre C.

rirs.iedu.sk/Dokumenty/Ucebn … elan/C.pdf

AK chces v C programovat jednocipaky, neuc sa C-cko na PC, poznam viacerych, ktorych to skor odradzovalo (naco “Hello world”, ja chcem blikat LEDkou) a maju pravdu. Programovat v C treba zacat hned priamo na jednocipaku. Drzim palce.

:arrow_right: administrator: přiloženy externí soubory
C.pdf (1010 KB)