Fórum témák
» Több friss téma |
Fórum » Bascom-AVR
Igazábol nem is értem hogy mit akarsz így megoldani. Beállítod a portC-t 255-re,és hogy azt írja ki az lcd ? Ha meg input, akkor valahogyan vezérelni kéne, hogy láss valami változást. Szóval ezt így nem tudom hogy akarod.
Ha van egy potid szerin próbálgasd az ad átalakítót, annak az értékét kiteszed az lcd-re és akkor látod ahogy változik.
Amikor a PORTC re kiküldtem 255 - öt azalatt azt értettem hogy bekapcsolom a felhúzóellenállásokat.
Egyébként tényleg a PINC kellett olvasni így már működött. Kösz nektek!
Sziasztok!
egy projekt kapcsán úgy gondoltam, hogy belevágok a digitális elektronikába. Ezen belül is az AVR mellett döntöttem. Átrágtam már magam az avr.tavir.hu weboldalon hogy mit is kell tudni az AVR-ekről, hogyan is működik stb. Viszont basic nyelvről nem nagyon találtam magyar könyvet. Ebben szeretném a segítségeteket kérni. Bár igaz hogy találtam egy könyvet, QBASIC címmel (írta Csík Tibor) de véleményem szerint ez inkább pc-hez érdemesebb használni mint AVR-hez köszi előre is a segítségeteket
Igen azzal a könyvel én is találkoztam, de én sem tudtam hasznosítani ebben a témában. Sajnos nincs túl sok könyv az avr-ekről és a qbasic-ről sem, de szerintem ha a taviros bascom könyvet elolvasod, már nagyjából mindent tudsz ami akár komolyabb projektekhez kell.
Szerintem a legjobban akkor tudod megtanulni a mikrovezérlő kezelést, ha elkezdesz valamit megvalósítani PL: ledvillogo, gomb beolvasásá, lcd kezelés, hang kezelés, A/D átalakító használta, pwm használata. Ha ezeket kipróbálod és megy, akkor már majdnem mindent meg tudsz valósítani. Szerintem... Több helyen, itt az oldalon is, találsz mintaprogramokat, de ha nem, és valami konkrét témában kell, írj és megpróbálok segíteni. Üdv: Peti
Rendben
köszönöm a segítségedet végigolvastam amit a weboldalon írtak, bár tesztelgetés közben LCD-re való szöveg kiírásakor, mégis előjöttek hibák. Pl. Az első sort ha beállítom, igazítom a szöveget, megcsinálom a másodikat is, és ott a pozíció után mindent szétcsúsztat (még az első sort is)
Fölteszek pár mintaprogramot.
Itt az első: Led villogtató program B portra, do-loop végtelen ciklussal, mega8 hoz.
LCD kezelés:
mega8 szintén, 2*24-es lcd ( bár most csak az 1. sor használva ):
Gomb kezelés: ( nem megszakítással )
(pinD.4 -re van a gomb kötve), ha nyomod a gombot akkor pinB.0 =1 ha nem akkor pinB.0 =0
Ha tudsz, akkor tehetnél fel sok-sok minta példát a megszakításokra, mert egyszerűen nem értem a megszakítások használatát. Ha lehetséges sok-sok kis megjegyzéssel. A minta példákkal talán jobban meg tudnám érteni. Szerintem sok kezdőt is érdekelné ez a téma. Előre is, köszi.
hali
hogy sértsd a megszakítást puli122 nekem is a következőt javasolta: építsd meg a próbapanelt és azon gyakorolj/kísérletezz
Akkor rövid infó a megszakításokról, csak konyhanyelven, példaprogram később.
Szóval. Tegyük fel hogy egy gomb megnyomását akarod figyelni az avr-eddel ( vagy pic ). Ezt egyszerűen úgy lehet megtenni ahogyan az előző példában van, tehát:
De ezzel van egy-két probléma. Például ha valami időigényes feladatot végez a vezérlő, ( éppen kiíratsz valamit lcd-re vagy zenél vagy akármi ) akkor abban a pillanatban mikor megnyomod a gombot, nem fog történni semmi, mert egyszerűen máshol jár a program, nem figyeli az if-es feltételedet, csak mikor odaér, de addigra már elengedted, vagy épp újra megnyomtad. Ezt küszöböli ki a megszakítás. Minden vezérlőnek van un. megszakítás lába (pl: INT0), ha erre kötsz egy gombot, és ezt használod a programban is, akkor mikor megnyomod, a vezérlő abbahagyja az éppen végzett feladatot, "kiugrik" egy általad előre megadott helyre, ott végrehajtja az ott lévő utasítást, majd visszatér a főprogramba, és ott folytatja ahol abbahagyja. Természetesen a kiugrás célszerűen olyan rövid idő, hogy nem veszed észre, a fő program futása közben, de ez biztosítja, hogy pontosan érzékeld a gombot. Megszakítást még egy csomó dolog okozhat, pl timer ( bizonyos időnként megszakítás és ott valami feladat, jellemzően időmérés ), vagy külső impulzusok sorozata, pl frekvencia mérés, és hasonlók.
építettem már próbapanelt atmega8-hoz, de a megszakítás használata nem tiszta sajna
Ez tiszta, és érthető leírás! Várom a folytatást.
Egyszerű megszakításos gombkezelő program:
Int0 lábra kell a gombot kötni. A C portra bárhova pedig egy led-et ( előtét ellenállással persze ). A program a c portot kapcsolgatja föl-le. Amikor elindítjuk a led világítani fog, mert a le-föl kapcsolgatás idejét a megnyomások száma adja, az pedig kezdetben nulla. Ha egyszer megnyomjuk a gombot, hozzáad 100-at, ez pedig 100ms-ot jelent, így a led villogni fog. Ha megint megnyomjuk még 100-at hozzáad, agy már 200ms lesz a várakozás a kapcsolgatások között, tehát lassabban villog.
Eddig úgy látszik értem, és írtam az Int0, és Int1 használatára egy kis kiegészítést. Mint látszik, Int0 csökkenti a villogások számát, még az Int1 növeli a sebességet. Ha ez így jó, akkor a többi megszakításra is szeretnék kapni egy kis minta programot, mert így apránként könnyebb tanulni. Arra gondoltam, hogy van a Timer megszakítás, és azt szeretném most megérteni.
'--- alapadatok --- $regfile = "m8def.dat" $crystal = 8000000 Config Portc.3 = Output Config Portd.2 = Input Config Portd.3 = Input Config Int0 = Falling Config Int1 = Falling On Int0 Gomb On Int1 Gomb1 Dim Ido As Word Dim Ido1 As Word Enable Interrupts Enable Int0 Enable Int1 Ido = 0 Do Portc.3 = 1 Waitms Ido Portc.3 = 0 Waitms Ido Loop Gomb: Ido = Ido + 100 Return Gomb1: Ido = Ido - 100 Return End
Ez jónak tűnik így ránézésre ( máskor azért használd a "Kód" gombot )
Írok majd még minta programot, a többi megszakításra is.
Eszembe jutott egy megszakítási ötlet. Van ez a két nyomógomb, és egy led. Azt hogyan kell megszakításokkal megoldani, hogy ha benyomom mind a két nyomógombot, akkor világít csak a led, és erre van, mondjuk 2mp idő. Ha ezt tovább bonyolítjuk, akkor ne lehessen azt kijátszani, hogy az egyiket folyamatosan nyomom és elég csak a másikat nyomkodni, hogy a led világítson. Ezt meglehet csinálni megszakításokkal, és timerekkel?
Így első ránézésre én a következő képpen csinálnám:
Mind a két gomb ugyanabba a megszakításba ugrasztja be a vezérlőt, ott lekérdezed a gombok állapotát az IF -es módszerrel, betehetsz időzítést is. Úgy írod meg hogy a feltételed csak akkor igaz, ha mind a két gomb nyomva van, a többi esetben nem. Betehetsz várakozási időt is, hogy ne kelljen pont ugyan abban az ezredmásodpercben megnyomni, mert az lehetetlen. Ha a feltételed igaz, a program átbillent egy változót ( pl: A=1 ) és a fő programban azt nézed, hogy ha A=1 akkor világít.
Hát elméletben én is ilyenre gondoltam, de nem tudom megírni.
A megszakítást már tudod, az if -es lekérdezés egyszerű, és gyakorlatilag más nem is kell hozzá. Mi nem megy ? Próbáld megírni, és ha elakadsz, írd meg hogy konkrétan mi a probléma.
Szia!
Eddig jutottam el, de azt nem tudom megcsinálni, hogy mindegyik nyomógomb csak egyszer működjön, tehát ha folyamatosan nyomom az egyiket, akkor ne induljon újra, vagyis ne lehessen, mondjuk kitámasztani az egyiket. Másképpen nem tudom elmondani. De a timert hol kell itt használni? [code=c] '--- alapadatok --- $regfile = "m8def.dat" $crystal = 8000000 Config Portc.1 = Output 'gomb1-led Config Portc.2 = Output 'gomb2-led Config Portc.3 = Output 'ki-led Config Portd.2 = Input 'gomb Config Portd.3 = Input 'gomb1 Config Int0 = Falling Config Int1 = Falling On Int0 Gomb On Int1 Gomb1 Dim Ido As Word Dim Ido1 As Word Enable Interrupts Enable Int0 Enable Int1 Do If Portc.1 = 1 And Portc.2 = 1 Then Set Portc.3 Wait 2 Reset Portc.1 Reset Portc.2 Reset Portc.3 End If Loop Gomb: Waitms 100 Set Portc.1 Return Gomb1: Waitms 100 Set Portc.2 Return End
hali
sajna még nem értek hozzá, de a Do és a Loop közötti részt a program folyamatosan ismétli végtelenszer.
Ha a csak Do és Loop között vannak a dolgok, akkor azt végtelenszer ismétni. Ez lehet mondjuk a főprogram.
Lehet viszont feltételes ciklust is írni.
Ebben az esetben a ciklus addíg ismétlődik, amíg a 'kilépés' helyén álló változó (pl jelzőbit) értéke adott értékre nem változik. Ezután a program a loop until sor utáni sorokkal folytatódik.
Igen, ezt régebben már leírtam valahova de most nem talállom.
2 féle ciklus van alapvetően. Az elsö:
Ezt végtelen ciklusnak is nevezzük mert a kontroller végtelenszer ismétli a benne lévő dolgot ( alap esetben ). Persze több módszerrel is ki lehet lépni a ciklusból: If-es feltétellen, goto-val. A másik:
Ezt a ciklust jelen esetben 10 szer hajtja végre, majd továbblép. Más téma: a feltételekről egyszerűen:
Szia!
A programod azért nem működik, mert ez
nem jó. Egy portbit kiolvasása mindig a Pinx.y-al történik. A te esetedben
Ha azt szeretnéd megoldani, hogy egy nyomógomb megnyomásával valami csak egyszer hajtódjon végre, akkor azt a következőképpen teheted meg:
A működésének elve: 10k felhúzóellenállással a B portod 0. lábát felkötöd az 5V-ra. Azért ezt a megoldást javaslom, mert így a nyomógombod a GND-t kapcsolgatja a bemenetre és azt kezeled a programban, hogy 0 lett-e az értéke. Célszerű így csinálni, mert ha a tápot kapcsolgatod, akkor megeshet, hogy véletlenül nem az 5V-os tápot, hanem pl a 12V-os körödről kapcsolsz neki és akkor vége mindennek Tehát célszerű nem a VCC-t kapcsolni és azt figyelni, hanem a GND-t kapcsolni. (Hiszen a 12V-os kör GND-je ugyanúgy null potenciál, mint az 5V-os köré.) Tehát ennek fényében, ha a bemenetedre 0 szint érkezett és az 'a' változó értéke 0, akkor belép az IF ágba és megcsinálja amit szeretnél, végül az 'a' változót '1'-be állítja. A ciklusod újra lefut és megvizsgálja mégegyszer a feltételt, de ezesetben mivel a gombot még nem engedted el, az 'a' változód értéke még nem változott át '0'-ra, tehát nem csinálja meg mégegyszer ami a feltételben szerepel. És ez egészen addíg így is marad, amíg a gombot el nem engeded. Akkor ugyanis a felhúzó ellenállat miatt a pinb.0 értéke '1'-re vált, és nullázza az 'a' változódat. Így a következő gombnyomáskor újra végrehajtódhat a feltételed. Persze csak egyszer, amíg el nem engeded a gombot.
Lehet kérdezni
Így talán átláthatóbb
Én sokszor alkalmaztam már a bitwait utasítást nyomógombnál. Addig biztos nem fut tovább a program amíg fel nem engedem a gombot elé egy 25 us várakoztatást, hogy a prellt kiküszöböljük. Hátránya, hogy addig áll a program amíg el nem engedem a gombot, de egy menüvezérléses programban tökéletesen működik.
|
Bejelentkezés
Hirdetés |