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”.
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.
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ů) ale to úplně stačilo.
PS: Dneska bych asi startoval se SOLIDEM ale tenkrát jsem neměl dots informací.
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.
Nasiel som na nete celkom pekne vyzerajuci tutorial pre C.
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.
administrator: přiloženy externí soubory C.pdf (1010 KB)