Zdravim,
me zadani prace je takove:
Mam udelat casomiru s obvodem atmega8, pouzit externich preruseni (vystupy IR zavor), projeti jednou zavorou - start, projeti druhou zavorou - cil. Vystup na 7 segmentovku a PC (zatim 7seg.)
Chtel jsem se zkusenych poptat na programove reseni.
Projel jsem datasheet, ruzne navody a podobne, mam postavene opticke zavory, nakreslene schema k atmega8 ale ten program mi zatim moc nerika.
Ovladani 7 segmentovky by nemel byt proglem. Pouziji multiplex. ovladani. Problem mi spis dela casovani a vnejsi preruseni jak vyresit.
Byl bych rad za jakoukoliv radu ci klidne odkaz na nejake reseni casovani a preruseni, rad si to projdu. Ale potreboval bych to v jazyce C.
Tak já to nahodím jen tak teoreticky. Dělal jsem totiž zkusmo něco podobného. Místo optozávor jsem měl na bastldesce pouze DIP spínač, hodnoty jsem vypisoval na LCD 2 x 16 znaků, ale chodilo to.
Nastavil jsem čítač a počítal pulsy hodin (Atmega 16 s 16MHz krystalem). Po dosažení určité hodnoty čítače (teď z hlavy nevím kolik) jsem vygeneroval přerušení a zvýšil hodnotu času.
Čas jsem počítal tak, že jsem měl proměnné jednotky_s, desítky_s, jednotky_m, desítky_m, jednotky_h a v přerušení od čítače jsem tyto proměnné navyšoval.
Procesor pak celou dobu mimo přerušení nedělal nic jiného, než že stále dokola zobrazoval hodnoty na LCD a kontroloval vstupy.
Ahoj, pouzivam AVR studio (neni problem nainstalovat neco jineho). Kdyby sis udelal cas, byl bych ti moc vdecny, at na to mrknu .) (ani komentarema nepohrdnu).
Jinak, sedmisegmentovku v multiplex. rezimu mi neprijde tezke ovladat, proto bych s ni chtel zacit, ale i na PC jiste dojde.
Jde mi spis hlavne o ty citace a externi preruseni.
Dekuji Vasek
Jeste me tak napadlo, s tim internim oscilatorem to neni nijak extra presne, kdyby jsi chtel neco presnejsiho, poves si na timer2 hodinkovy krystal, pak si myslim ze ta presnost uz bude slusna. Ale zrejme to mas do skoly a pujde jen o princip.
Zdar,
globální zakazování přerušení na začátku a povolování na konci není třeba, avr to dělá automaticky. To “#asm(“clv”)” má nějaký zvláštní význam?
Globální proměnné, se kterými pracuješ v přerušení, by měly být deklarovány s klíčovým slovem “volatile”. Nevím jak CodeVision, ale ve winavr by bez toho optimalizace kód pravděpodobně znefunkčnily.
myslim ze nulovani toho priznaku #asm(“clv”) je tam zbytecne, stejne tak jsi psal to povolovani, funguje to i bez toho, ale ja to tam obcas davam, zacinal jsem na knize od vani a ten to tam daval vzdy, tak me to asi zustalo. S tim volatile si codevision poradi a kod funguje, ale dik za pripominku a pro jistotu to zacnu pouzivat. Rad se priucim, dik za pripominky.
Dekuji moc za ochotu, zitra to v klidu projedu a kdyztak se budu ptat a to ze asi budu. Samozrejmne, s krystalem pocitam, je to do skoly, ale ma to byt i jako funkcni aplikace kterou bych pak chtel pouzit na zavodech (pokud se teda podari dat vse dohromady).
Jeste jednou dekuji, zitra si to prelozim a upravim do avr studia a kdyztak se poptam na pripadne nejasnosti…
Tak jsem to projel a par otazek, vim ze budou asi dost hloupe, ale zacinam, proto budu rad pokud poradite…
16b citac je pouzit proc…?? Kvuli tomu ze mam hod, min, sec a tisic…??
Kdybych mel na stopkach pouze min, sec a tisic, stacil by 8b citac…??
(nebo jsem pouziti citacu spatne pochopil?)
Komparator je pouzit proc…?? Kvuli porovnavani citanych pulsu…?? Aby nedoslo k preteceni…??
Jinak pouziju externi krystal o frekvenci 8MHz, chtel jsem se zeptat jak jsi zjistil hodnutu 7 813 pulzů (vrchol) - to je podle frekvence vnitrniho RC clanku…??
A snad posledni otazka, co jaky registr dela vim, ale jaky bity nastavit pro jakou cinnost moc netusim, mas na to nejaky prehled v cestine nebo pouzivas pouze datasheet…??
Není to kvůli tomu co píšeš. 16bit. čítač jsem použil protože můžeš napočítat jednu sekundu aniž bys musel pak něco dopočítávat. (8-bit. by ti i při max. dělícím poměru přetekl cca 30x za sekundu, 16bit jen jednou( v tomto pripadě nepřetéká ale porovnáva). Je to to nejjednodušší řešení, ale jde použít i 8bit. Použitá komparace se mě zdá lepší řešení než použít přetečení. Rozdíl je pouze minimální.
př. při přetečení v obslužné rutine nastavis do TCNT1 57723 a jedeš dál
při komparaci v obslužné rutině TCNT1 pouze vynuluješ, hodnotu 7813 mam jiz nastavenou v OCR1A
- žádný velký rozdíl
Ještě poznámka, těch 7813Hz (8000000Hz / 1024 = 7812,5, 8000000Hz /256 = 31250Hz) bude nepřesnější než 31250Hz. Tímto jsem myslím odpověděl na tvou další otázku. Mega má dělení oscilátoru u timerů -1,8,64,256,1024 proto při max. dělícím poměru je to těch 7813Hz, to znamená načítaných pulsů za sekundu.
Samozřejmě nejlepší je použít datasheet. Já osobně používám codewizard v codevision, tam si to jenom naklikám a on mě pak automaticky vyplivne nastavení registrů. Tady na foru je sekce download, viděl jsem tam nějake knihy v češtine, ale jestli tam je nejaka s popisem registru tak to nevim, zkus se podivat.