Fórum témák
» Több friss téma |
WinAVR / GCC alapszabályok: 1. Ha ISR-ben használsz globális változót, az legyen "volatile" 2. Soha ne érjen véget a main() függvény 3. UART/USART hibák 99,9% a rossz órajel miatt van 4. Kerüld el a -O0 optimalizációs beállítást minden áron 5. Ha nem jó a _delay időzítése, akkor túllépted a 65ms-et, vagy rossz az optimalizációs beállítás 6. Ha a PORTC-n nem működik valami, kapcsold ki a JTAG-et Bővebben: AVR-libc FAQ
A google-t ismered? http://www.google.hu/search?client=opera&rls=hu&q=fpga&sourceid=ope...uggest Egyébként amiket felsoroltál fényévekre vannak egymástól. De ez itt már OFF.
Sziasztok.
Elakadtam, hogyan lehet egyik AVR böl értéket átadni egy másiknak? mármint pl: Első AVR elindul elszámol 5-ig majd kiküldi a jelet a második AVR nek,hogy kapcsolja be a ledet. Neten nem találtam semmit és épp a Multiplex-ess megoldást keresgélem a neten mert sikerült beszereznem egy 2 x 7 Szegmenses kijelzőt amin 12 láb van de nem tudom hogy kéne megírni a kódot hogy 9 utána 10 jelenitse meg mert 9 ig eltudom számoltatni.
Ehhez SPI-t vagy I2C-t, vagy UART-ot kell hasznalnod.
SPI: http://www.ermicro.com/blog/?p=1050 I2C: http://www.ermicro.com/blog/?p=1239 Az egyik AVR lesz a Master, a masik a Slave.
Akkor ezek szerint a MOSI-MISO kel használnom? (bár az USBASP én MOSO van nem tudom miért lehet elírták.) úgynézki az SPI lesz amit alkalmazni fogok. Igazából nekem csak az kéne, hogy PLB1 et megnyitom egy pillanyatni jelet adok neki amit a Slave érzékel és elindít egy számlálót. PB1 -> PB4 es a Slave ben megadnam hogy a PB4 en kap jelet akkor induljon el. Ekkor is kell a MOSI-MISO? (mert SI es SO Slave In es Slave Out nincs külön)
Ezekkel most ne bajlódj, örülj ha EGYETLEN AVR-t szóra tudsz bírni - de látom ez sem megy igazán.
De most tényleg. Egyetlen IC-vel is meg lehet oldani, miért akarod tovább bonyolítani? Sokkal egyszerűbb ha mindent az ATTiny2313 csinál! Ha kettővel viaskodsz, nemhogy előre nem jutsz vele, félő, hogy beleunsz az egészbe és más hobbi után nézel... I2C, SPI, UART: Ezekkel sem jó úgy kezdeni hogy két AVR között próbálod ki: ha hiba van bármelyik AVR programjában, semmi sem fog működni és elég lehangoló tud lenni ha az ember még azt se tudja hogy melyik a hibás. Ha ezeket meg akarod tanulni(de inkább vársz vele fél évet), cél IC-t kell venni, az biztos működik: I2C: PCF8574 SPI: 74HC595 UART: MAX232 és egy PC A hozzászólás módosítva: Szept 8, 2012
Ez ilyen formában nem igaz. Attiny45 és a Attiny2313 is működő képes. És ellátja a funkcióját de lehet igazadvan, hogy az Attiny2313 eltudja látni mert van annyi lába. De érdekel a közti kommunikáció is de akkor ezt most elhalasztom. UI:perpil 1 IC vel nem tudom megoldani mivel a Multiplexet nem nagyon értem.Ha meg 2 db 7 Szegmentest kötök rá akkor már nincs helyem a 2312 on vagy ha mégis akkor szűkösen.
Egyébként nem én találtam ki, ezek közül lehet választani de mindegy.
Nem kell erteni, masok mar leprogramoztak helyetted. Viszont zombeenak igaza van, eloszor egy menjen.
De hiába programozták le ha nem értem a felé pitését.Meg elég kezdő vagyok a C nyelvben.
UI: Akkor is Multiplexer kell ha alapból a 7 Szegmentes 2 böl al? mármint nem én rakom egymás melle?Mármint Kód szempontjából másabb lesz? vagy lehet egyszerűbben is megírni? A hozzászólás módosítva: Szept 8, 2012
Kezdetnek a 132. sorbol vedd ki a return-t, mert mikrokontrolleren a main-bol sosem terunk vissza, ugyanis nincs hova (PC-n a parancsertelmezohoz vissza lehet). Ez okozza a gondot es valojaban nem a 100 alatti erteknel nem csipog, hanem a 79 alattiaknal.
A 7szegmens vezerlokodjat neked megszakitasba kene raknod, mivel a fohurokban sokfele van blokkolo idozites.
Értem köszönöm.Ezt a megszakítást, hogy érted? Előbb még hozzá írtam a Hozászolásomhoz nem tudom,hogy láttad-e arra tudsz válaszolni?
- A megszakitasok olyan esemenyek, amikor valamilyen kivalto ok miatt a program futasa megszakad, a processzor allapota elmentesre kerul, majd meghiv egy az adott megszakitashoz tartozo fuggvenyt. Majd ha ennek a fuggvenynek vege, akkor visszallitja a processzor allapotat es folytatodik tovabb a program futasa.
AVR-nel peldaul ilyen esemeny egy szamlalo tulcsordulasa lehet. - Nem lattam. - Ha egybe van tokozva gyarilag tobb, akkor kizarolag multiplexelve tudod hasznalni. A hozzászólás módosítva: Szept 8, 2012
-Értem akkor multiplex lesz a kódot lehet egyszerübben megírni? mert a neten nagyon hosszú :/
- A megszakításra a IF eket érted? mert beteszem a végére az IF et akkor végre hajtódik mikor eléri a 100 at és vissza számol de nem csipog :/ oda is bekéne raknom a csipogást? úgyérzem túl bonyolítom az egész kódot pedig egyszerű lehetne. Idézet: „a Multiplexet nem nagyon értem” Egy kis segitseg: http://extremeelectronics.co.in/avr-tutorials/multiplexed-seven-seg...plays/ http://extremeelectronics.co.in/avr-tutorials/multiplexed-seven-seg...rt-ii/
Lehet kiröhögsz és szánalmasnak fogsz tartani.De ezeket énis meg találtam és maga a Kódot nem nagyon értem.Plusz az én Csipogásom és a Piezóm hova tehetném be.
Hétfőn lesz nálam a Tranzisztor ami kell a Multiplexhez most sima 7 Segmentel kísérletezem. nálam az időzítés a fontos bár lehet a Multiplexel könnyebb mert ott 45 röl kel számolnom és nem kel pepecselnem hogy 9 MP töl számoljon és IF . Lehet hétfő délutánig elnapolom ezt a kérdést és befejezem most a fejlesztést. Köszönöm az eddig válaszokat addig is átolvasom a netet a Multiplex el kapcsolatban hátha találok egy jó leírást ami egyszerű.
Nagyon konnyu.
Az IF az mas(elagazas es nem megszakitas). Ezt nezd meg: http://www.google.hu/url?sa=t&rct=j&q=&esrc=s&source=web&cd=25&ved=...QHSZPA A hozzászólás módosítva: Szept 8, 2012
Elolvastam kb azt írja le amit én használtam az int el hogy eltároltam egy értéket amiböl kivonta-hozzáadtam-kiolvastam. de nekem aza gond,hogy a kijelzőt a többitől függetlenül kéne hogy működjön (most speciel a timertől kéne hogy függjön) 90 MP töl számoljon ami (timer = 90)
félek a multiplexertől mert a neten a kódok nagyon bonyolultak.Számomra ez az átadásos módszer lenne a jo pl: PB1 töl egy jelet adok ami a attiny2313 on az egyik lábon bemegy és a IC észleli és elindítja a timert és kész.
Sziasztok!
A programom kiegészítettem órával és dátummal. A TIMER1_OVF_vect megszakítást használom. Ugye a nagykönyv azt mondja, hogy megszakításban a lehető legszükségesebb kód legyen. Itt most az óra,perc,másodperc,év,hónap,nap számítása zajlik és LCD-re történő kiírása. Az utóbbi maradhat a megszakításban vagy jobb lenne átteni a főprogramba? A másik, hogy időponthoz kötött eseményeket szeretnék később végrehajtani. Gondolom ezeknek is jobb helye lenne a főprogramban mint a megszakításban. Szeretném, ha nem kellene havonta állítgatni az órát és a program futása is megfelelő lenne.
Lehet, hogy azt irja le, de teljesen mashogy mukodik es ez a lenyeg. A massag reszben abban merul ki, hogy fuggetlenul megy a tobbi kodtol.
A multiplexertol nem kell felni, az elv egyszeru. Bonyolult kodot mindenhez lehet irni, attol meg nem biztos, hogy bonyolult. Ha egy darab hetszegmenses kijelzot leprogramoztad, akkor a multiplexelt kijelzes 90%-at megcsinaltad. A kulonbseg annyi, hogy ha ket I/O labat hasznalsz a ket kijelzo kivalasztasara, akkor felvaltva ki kell oket valasztani es az eredeti kiiro fuggvenyeddel kiirni a hozza tartozo erteket. Ha ezt rovid idokozonkent megteszed, akkor ugy latod, mintha egyszerre mind a ketton megjelenne a hozzajuk tartozo ertekek.
Ha biztositod, hogy a foprogramban vagy mas megszakitasban levo LCD kezelest es/vagy LCD interfesz kezelest nem szakitja meg az idozitodben levo LCD kezeles, akkor alapvetoen nem okozhat nagy gondot. Ekkor egyedul csak arra kell figyelned, hogy a megszakitas periodusidejenel rovidebb legyen a megszakitas vegrehajtasi ideje. A maradek ido forditodik a foprogramodra.
A kesobbi vegrehajtast is gond nelkul meg tudod oldani. Egyedul arra vigyazzal, hogy azokat a valtozokat, amelyeket egyarant hasznalsz a foprogramban es a megszakitasban, volatile-kent deklarald. Valamint ha egy valtozo nagyobb mint a szomeret(azaz itt 8 bit), akkor amig muveletet vegzel vele tiltsad le a megszakitasokat.
Értem
erről a megszakítorol hol tudok példát nézni? Értem igazából akkor úgy megy mint a LED nél h megadom az alap értéket egy változóban. KB igy portb1 disp1: 1 portb2 disp2:2 es akkor ez kirakja hogy 12 ekkor ha hozzáadok egyet akkor disp2:3 ? (kb ez az elmélete?) de ha én megadom neki a 12 öt minden láb oda van rá kötve. Honnan tudja a kimenet hogy neki az 1 est kell és nem pedig a kettest? mert egybe vannak kötve a lábak kivéve az Anodok. az Anod amin az 5V van. az nem csinál semmit.
Igen.
Onnan tudja, hogy ki kell valasztani azt a negy bitet a valtozobol, amelyik a kivalasztott szegmens-csoporthoz tartozik. Peldaul igy: ha a kijelzot 1-tol szamozzuk:
ha a kijelzot 0-tol szamozzuk:
Ekkor a szegmenseket kivalaszto fuggvenynek, ha mondjuk az 1. sz.-cs.-ra szeretnel kiirni, a kivalaszt(1,adat) erteket kell atadni. A hozzászólás módosítva: Szept 8, 2012
Jelenleg három esetre használok megszakításokat.
RS232 kommunikáció, Nyomógombok kezelése, Óra. Nem értem, hogy tiltsam le a megszakítást. Ha a timer-t letiltom akkor nem lesz pontos. Az USART-ot se tilthatom mert nem lesz kommunikáció a PC-vel. A nyomógomb kezelés még problémás mert öt gombot kezelek. Főleg az LCD menü vezérlésre. Timer óra kvarcot használ TOSC1/TOSC2 lábon. Nem tudom ez mennyit javít a helyzeten.
Huuuuu na most ez engem jol meg fogott. Szóval nemértem nem tudom feldolgozni, hogy most mi hova megy. Szóval Kiválasztáshoz meg a Disp1 vagy Disp2 ugye? vagy a Kijelzőre? a kiírandó aza 8bit sor 00000011 ugye?
és a megszakításhoz példát hol találok? Bocsánatot kérek, hogy ennyire béna vagyok .
Csak addig tiltsad le, amig az adott valtozot irod, vagy olvasod. Tehat ha mondjuk van egy "valami" nevu, uint8_t tipusu valtozod, amit foprogramban es megszakitasban is hasznalsz, akkor igy kell megoldani a hasznalatat:
Peldaul ki szeretned irni, mondjuk a 0x13 erteket a kijelzore. Ehhez a bal oldali kijelzore az 1-et kell kikuldeni, a jobb oldali a 3-mat. A bal oldali kijelzo legyen a kettes sorszamu, a jobb oldali az egyes sorszamu.
Namost a 0x13 binarisan 0b00010011. Ebbol is latszik, hogy a felso 4 bit erteke 0b0001, azaz 0x1, amire nekunk szuksegunk van a bal oldali kijelzonel. Az also 4 bit erteke 0b0011, azaz 0x3, amire a jobb oldali kijelzonel van szuksegunk. Tehat jol lathato, hogy ha a kettes kijelzore szeretnenk kikuldeni az adatot, akkor "es" muvelettel az also 4 bitet kell megtartani. Ha a bal oldali kijelzore szeretnenk kikuldeni, akkor a felso 4 bitet kell megtartani, viszont ha es muvelettel toroljuk az also negy bitet, akkor 0b00010000, azaz 0x10 fog eloallni. Tehat ezt nekunk jobbra kell tolni 4 bittel. Ekkor mar 0b0001, azaz 0x1 marad. Tehat osszegezve, ha a kivalasztott kijelzo 1, akkor 0 bittel kell eltolni(azaz nem toljuk el), ha a kivalasztott kijelzo 2, akkor 4 bittel kell eltolni. Azaz az eltolas erteke (kijelzo-1)*4 lesz. Ha eloszor az eltolast hajtjuk vegre eloszor es a maszkolast masodjara, akkor minden esetben csak az also 4 bitet kell megtartani. Igy adodik az elozo kommentemben irt muvelet. define helyett fuggvennyel megvalositva:
A hozzászólás módosítva: Szept 8, 2012
Őszintén szólva még ilyet nem nagyon láttam. Amikor módosítok egy olyan változót amit megszakítás is használ természetesen tiltom a hozzá tartozó megszakítást.
De túlnyomórészt ellenőrzést végzek ezekkel a változókkal. Pl.: adott óra:perc esetén kapcsolok egy kimenetet. Ha RS232 csatlakozás él akkor minden adat megy a PC-re is. Van adatáramlás ilyenkor, de arra figyeltem, hogy ne nagy csomagok menjenek.
Huuu most még jobban meg kavartál. Már kezdem érteni . de önmagában ez a kód nem müxik vagy tévedek? Hogy adom meg hogy pl: portb1? vagy a kijelző helyére?
Télleg bocsánat, hogy zaklatlak vele csak meg szeretném érteni . Másik, hogy tudok 2 folyamatot végeztetni?vagy az IC nem tud ilyesmi fajta dolgot? pl:led-piezó és a számlálót mellé kapcsolja külön ágon. mert most akkor kéne bekapcsolni mikor 9Másodperc van hátra (most még a Multiplex nem kell az csak hétfőn). de köszönöm, hogy segítesz a Multiplexben csak most igy nem tudom probálni mig nincs meg a tranzisztorom. |
Bejelentkezés
Hirdetés |