Fórum témák
» Több friss téma |
Sziasztok.
Elakadtam egy kissebb programban. A CCPR1L regisztert, 0-ról növelem, 160-ig, 10-esével, és minden lépés között a TMR0 túlcsordulását figyelem.
A gondom az, hogy valamiért a túlcsordulási ciklus csak egyszer fut le, ígyhát a CCPR1L regiszter csak 10-ig jut el. Amikor másodszorra hívja meg a TMR0 szubrutint a program, a túlcsordulás figyelésnél leáll, tehát nem csordul túl, de nem tudom mitöl.
Egyik lába GND-re (Vss) a másik meg a +tápra (Vdd). Ezt minél közelebb a kontroller táplábai közé.
A kontrollerhez közel? És egyébként miért kell oda? nem értem a logikáját :S
Villogtatná a LED-et, de nemműködik. Az előbb azért működött mert rossz PIC et raktam bele.
WÍÍÍÍÍÍÍÍÍÍ MÉGIS működik csak az a baj, hogy nagyon ritkán villog, átírom a programot és kész
Ha bővebben érdekel, keress rá a PIC-es témákban, rengetegszer le lett már írva.
Hali!
Miért dobja a fordító ezt a hibaüzenetet, amikor a project beállításoknál hozzáadom az interrupt makrót: [quote]C:\Program Files\Microchip\MCC18\h" "main.c" -fo="main.o" -DUSE_INTERRUPT -Ou- -Ot- -Ob- -Op- -Or- -Od- -Opa- Error [1034] previous definition of macro 'USE_INTERRUPT' does not agree
Ebből a részletből nem derül ki, hogy a pwm_szam változóba beírod-e újra a kezdőértéket.
A hibajelzésből úgy tűnik, hogy egynél több helyen definiálod az USE_INTERRUPT makrót.
Köszi. Közben megoldottam, az agyammal volt a probléma. Elég rosszul írtam meg a hsz.-t, mert a PIC típusát (PIC16f628) se írtam meg. Egyébként nem az értékadás volt a probléma, hanem a flag-et úra törölni kellett.
Van egy másik problémám is (igazából kettő). A pwm konfigurálás után, ha a CCPR1L regiszterbe 0-t írok, akkor is megjelenik, egy minimális pwm jel. Ez mitől lehet?
A másik problémám, hogy a CCPR1L regiszterbe nem tudok dec.120-nál többet írni.
Ha még mindig nem sikerült akkor mutass már egy kapcsolási rajzot.
- A 10 bites PWM kitöltési érték úgy áll elő, hogy a CCPRxL regiszter kiegészül a CCPxCON 5..4 bitjeivel. Az alacsony helyiértékű 2 bit jön a CCPxCON regiszterből. Az inicializáláskor b'11' -et állítasz be ezeken a biteken...
Köszönöm, közben rájöttem. Mondom, hogy az agyammal van baj. Viszont azt nem tudom, hogy mért bolondul meg a CCPR1L reg. ha eléri a decimális 120-at. A szimulátor, (ISIS) és a scop (probapanelen) is azt mutatja, ha a 120-hoz hozzáad 10-et, akkor az eredmény -126 lesz, és onnan számol tovább 10-esével.(-116....)
Definiáld unsigned-nek a változót ( illetve, lehet, hogy csak a szimulátort kell átállítanod!) !
Steve
Nem a szimulátorral a hunyó, mert próbapanelen is ugyanetz csinálja. Elindul a pwm jel, a beállított időközönkét ugik a kitöltés (dec.10) és folyamatosan megy fel-le, holtott ha eléri a dec 160-at meg kéne álljon.
Megkeresem a téves definiálást, köszönöm az infót.
Nézd meg a piccolo_config.h-ban, hátha ott már definiálva van! Akkor fölösleges mégegyszer megadni a Project/Build options-ban ...
- Az OPTION_REG T0CS bitjét törölni kell timer0 a belső órajel használatához.
- Ugyan nem tudom mit csinál a program a jvar_1 cimke után, de feltételezem, hogy nem törli a CCPR1L regisztert. Ekkor ugyan vizgálod, hogy a CCPR1L növelésével elérte már a .160 -at, de a regiszter értéke megmarad... A következő növelés ezt az értéket növeli meg... - Működik az alábbi is:
Ekkor a CCPR1L -ben keletkezik az eredmény...
Én mondjuk azt sem értem, hogy ha a megszakítást használod, miért nem megszakításból fut a program?
Az OPTION_REG jól van beállítva, törölve van, 1:64 osztás van beállítva, de az a része már megy rendesen.
Idézet: „Ugyan nem tudom mit csinál a program a jvar_1 cimke után” Még semmit, mert egyszerűen nem jutok túl a CCPR1L reg írásán. Lásd előzöleg (bár lehet hogy érthetetlenül írtam le a problémát). Röviden a programnak az kellene csinálnia, hogy ha megnyomok, egy gombot autómatokusan elkezdi növelni a PWM kitöltést, 95%-ig, ott marad egész addig míg nem kap egy ujjabb jelet, ekkor leveszi a PWM-et 0-ra. Amúgy köszönöm szépen, hogy válaszoltál, az "addwf adat,f" ki is ment a fejemből, bár már nem látok az idektől, hogy miért nem tudom írni a CCPR1L reg.-et.
Nem megszakítást használok, hanem csak a TMR0 túlcsordulását figyelem. Ezzel állítom be az időzítést, nem pedig szubrutinnal.
Ott Én is, sőt ott beírja a dec. 130-at is és számol tovább ahogy a program meg van írva, de valóságban és az ISIS-ben nem. Berakom a progit, hátha.. Az értékeket már átírtam mérgembe 120-ra.
Egy billentyűzetet már szétvertem, pedig nem vagyok ideges típus. Ennél sokkal bonyolultabb problémákat oldottam már meg, és ez meg itt szivat engem. ![]()
Ez véletlenül kimaradt az előzö hsz.-ből. A 120-hoz hozzáadott a program 10-et. Az eredmény -126. (ahogy a képeken)
![]()
Már írták Neked, hogy az eredmény teljesen jó (0x78+ 0x0A = 0x82), de a számábrázolást nem előjelesre (unsigned) kellene állítani...
Az én problémám a következő van egy digitális órám ami szépen ketyeg de szeretnék egy gombra megszakítást csinálni ami egy "Beállítás menü lesz" akódoma következő
Ettől szépen világít is a led azaz a megszakítás megfelelően működik
Hova kellene tennem egy olyat hogy ha gomb nyomás történt akkor szakítsa meg az óra vagy hőmársáklet kiírását és az lcd-t törölje és egy beállítás felirat jelenjen meg mindaddig míg mondjuk a gombnyomás nem éri el az 5-öt?
Nem lesz így könnyű... Fordítsd meg a gondolatvilágot:
- Az órát elég másodpercenként kiírni, - A gomb(ok) figyelését is elegendő kb. 0.02 .. 0.1 másodpercenként elvégezni. A megszakítási rutinban ne legyen várakozás. Kell egy alkalmasan választott idejű timert létrehozni, a megszakítás rutin pedig csak a változásokat jelezze a főprogramnak: a kijelzőt frissítei kell, a gomb / egy gomb le van nyomva, hőmérsékletet kell frissíteni... A főprogramba egy állapot változó hozz létre: mi látható a kijelzőn. A kijelző frissítése e változó alapján történjen. A jelzésekből a főprogram állítsa, hogy mi legyen a kijelzőn. A feldolgozás után törölje a jelzéseket. Ha ezt betartod, még számtalan feladatot rábízhatsz a kontrollerre... |
Bejelentkezés
Hirdetés |