Fórum témák
» Több friss téma |
Használd az MpLab szimulátorát. Tegyél töréspontot a megszakítási rutin kezdetére, kövesd nyomon a működést. Az UART vizsgálatához stimulust kell készíteni.
Rákötöttem a GPS modul 3 darab lábát közvetlen a PICKIT3-ba, Vdd-t a 2.,GND-t a 3., GPS TX lábát a Pickit 4. lábára. De a szoftverben az Uart tool... csak szürkén világít, nem tudok rákattintani, nem tudom megnézni közvetlen a GPS-t. Nagyon zavaró. Ezt hogy lehetne megoldani?
A program a PICkit3 önálló kezelő programja? Ha jól emlékszem az uart tool nem működött benne. Használj PICkit2 -t vagy 3.3 V -os USB/SERIAL átalakítót.
A GPS valószínűleg működik. A vétel során a programban keletkezhetnek vételi hibák, azokat kellene lekezelni. Van más megszakítás felhasználva? A kiszolgálásuknál a kérő azonosítása megtörténik? A kérést a kiszolgálás után törlöd? (TXIE nincs véletlenül engedélyezve?)
PICkit3 letöltőm van. Először elég volt csak az MPLAB letöltőjét használnom, most valahogy nem engedi csak lefordítani a programot, és a PICkit3 letöltőprogramjával letölteni a progit, de ez igazából nem jelent semmilyen gondot. Használok 3 különböző megszakítást, egy Timer0-t, egyet a kapcsolónak, egyet pedig az UART-nak.
az initben ez van írva:
Az RA5-re egy segéd ledet tettem. ezt tudom kapcsolgatni a teljes program futásakor a GPS keresése közben is, tehát nem fagy le a progi, de a GPS órákon keresztül is csak világít, a kijelző meg sötét.
Kiforrasztottam a GPS-t és így is sötét maradt a kijelző. Kivettem a GPSHivo() függvényt, a programból, és így már jó a kijelző csak épp a GPS nélkül, ami nagyon fontos.
Milyen kijelzőről van szó? Hátha közelebb visz a megoldáshoz.
Nem egészséges dolog berakni a főhurokba egy olyan függvényhívást, ami tele van blokkoló várakozásokkal.
Talán bölcsebb lenne a beérkező karakterek fogadását külön választani az adatfeldolgozástól és gondolni kellene a hibalehetőségekre is (karakter ráfutás vagy keretezési hiba, hiányos vagy téves üzenetsor stb.)
Nem nézek utána, milyen GPS modult használsz, milyen beállításokkal.
Ha 1Hz a modul, és 4800 Bd adatátviteli sebességgel működik, első menetben az adott karakterek vételét kellene ellenőrizni. Ami bejön a PIC-be, gondolkodás nélkül írd ki a kijelzőre. Ha semmi nem jelenik meg, az adás/vétel vezetéket cseréld fel. Folyt. köv.
Egy led-mátrixos kijelzőt csináltam. 7 sor van és 24 oszlop, összesen 168 darab led. A sorokat a PORTC-re kötöttem. Az oszlopokat 3 kivezetéssel vezérlem 3 darab sorba kötött léptető regiszterrel. Úgy működik a kijelző mint egy TV, hogy előszőr az első oszlopot villantja fel, aztán lép a következő oszlopra, és így tovább.
Tudni kell, hogy a GPS nem vár, másodpercenként elküldi a tervezett NMEA mondatokat. Ebből kell kihámoznod a lényeget: "$" és "lf" (0x0A karakterek közötti részt. Az is feltétel, hogy egy másodpercen belül minden megérkezzen.
Valószínűleg több ilyen mondat is beérkezik, ebből kell kiválogatni a megfelelőt.
Potosan mit írjak be a progiba? Az a fura, hogy pár évvel ezelőtt amikor először csináltam az órát, akkor még működött a progi, azóta csak hardveres változást csináltam, és kisebb szoftvetres átalakítást is, semmi lényeges változást nem csináltam.
Ha csak hardver változtatás történt, akkor a programhoz ne nyúlj.
Egy LED, ellenálláson keresztül a PIC UART bemenetére (GPS adás kimenet) megmutatja, működik-e a bekötés.
Tettem oda ledet, szagatottan villog, akkor gondolom van adat (ahogy másodpercenként beérkezik az adatcsomag).
Muszáj volt hozzányúlnom a programhoz, mert csak töredékek maradtak meg az egészből (új számítógép. Amit feltettem internetre programot, az meg az én hibámból hiányos volt), ráadásul a hardver változás is megkövetel egy kis progi átalakítást, és még picit alakítottam is a progin, a kijelzés miatt.
Ebben a programnyelvben nem tudok segíteni.
Igazábol azért nem kapsz tuti választ, mert konkrétan mi sem tudjuk, mi a gond, csak tippelgetünk.
Ha a mátrix kijelzőt megszakításból hajtod (nagy valószínűséggel igen), akkor az viszonylag sok erőforrást lefog, sokszor megy a kontroller abba a megszakításba. Könnyen lehet, hogy eközben veszik el a gyerek. Próbáld meg úgy kezelni a vett adatot, hogy azonnal mented egy változóba, még a megszakítási rutinban. Vagy. Mivel a GPS modulod GND lábán van egy kapcsolótranzisztor, lehet, hogy az UART kapcsolat 'L' szintje túl magas, a kontroller nem érzékeli azt 'L' szintnek. Ha a GPS modul kimenetén a 'H' szint csak 3.3 V, az is okozhat galibát. Annyival tudsz magadnak segíteni, hogy elöröl kezded nulláról az egészet és szakaszonként teszteled a programot, ahogy készülget. Ha máshogy nem, egy szabad lábbal LED-et kapcsolgatsz, így láthatóvá válik, hol tart a program. Idézet: „if (RCIE && RCIF) { getchar_active = true; //RCIF=0; RCREG; }” helyett
Idézet: „char getch() { getchar_active = true; while (getchar_active) continue; return RCREG; }” helyett
Köszönöm, nagyon jó ez a közösség, igazán segítőkész. Köszönöm a megírt programrészletet is. Sajnos még nem oldódott meg a problémám. Tényleg az lesz, hogy előlről kezdem a progit a nulláról. Itt az uartnál akadtam el. Ezt kell kiveséznem. Közben megtaláltam az eredeti programot is. Kicseréltem a Gps-t is. Átforrasztottam direkt földre, kihagyva a bc337-et. És még mindig semmi.
Amúgy nem megszakításból megy a kijelzőm, de azt is ki fogom forrasztani, csak egy led marad.
Nagyszerű!Most már működik a GPS a régi Timer0 megszakítás nélkül, most szeretném Timer0 megszakítással is vezérelni. Az első vett karaktert ( gpstime[0]-t ) akarom kiíratni vele, de csak egy nullát ír ki(pedig 2-esre vártam volna, mert már este van), és még egy végtelen ciklusba is tettem, hogy ha változna a vett karakter akkor is ki tudja írni.
Remek! Tulajdonképpen mire kell a Timer0? Késik az RTC és időnként rádobsz egy-egy percet, ezzel kompenzálva az RTC pontatlanságát?
Arra gondoltam, hogy könnyebben be lehet állítani a pontos másodpercet, ha időzítővel csinálom, és még hasznosan is programozhatok az időzítő alatt, de azért elgondolkozok, egy sima számláló növelése alatt is.
Ne haragudj, de nem látom át a koncepciót.
A kijelző miatt gondolom nem elemről akarod járatni az órát. Ha már dugasztápról megy, nem lenne egyszerűbb RTC helyett a GPS vevőt használni, mint a pontos idő forrását? Nem kellene sem beállítani, sem időnként pontosítani. Teszel bele egy kapcsolót, amivel választhatsz a téli/nyári időszámítás között és készen is van. Igaz, lehet éppen most válik okafogyottá ezen opció...
Pontosan mire gondolsz?Nekem egy neo-6m gps modulom van.
Eszembe jutott egy kérdés. Mondjuk deklarálok egy változót, pl char x, és növelem az x-et egyesével, pl x++.Van valami flag, ami jelzi a túlcsordulást, amit lekérdezhetek?
A GPS modul másodpercenként küld adatot, kb. ilyet:
A GPRMC mondatban benne van a pontos idő és a dátum is. Tudtommal nem lehet biztosan detektálni a túlcsordulást, legalábbis C nyelvben. Aztán ki tudja, lehet, hogy nem jól tudom.
Megtettszett a pic-programozás. Először egy olcsó, egyszerű faliórát szerettem volna csinálni anyunak, de aztán rájöttem, hogy annyira nem is olcsó, és elég sok energiát felemészt, de már nem tudom elengedni, befejezem, amit elkezdtem.
Idézet: „Van valami flag, ami jelzi a túlcsordulást, amit lekérdezhetek?” Hogyne lenne. Minden egyes növelés végén lekérdezed a Status regiszter carry bitjét. Ha 1, akkor túlcsordult.
A carry bit csak összeadás - kivonás - decrementálás - incrementálás esetén működik.
Szerintem a kérdezőnek pont ezek kellenek.
Ott csak egy példa szerepel, de ha már lúd, legyen kövér. Szorzásnál nem működik?
Idézet: „Ott csak egy példa szerepel” Nem tudom, milyen példára gondolsz. A C-hez fikarcnyit sem értek, a PIC18-ban pedig csak olyan szorzó rutin van, ami 2 byteot tud összeszorozni, aminek az eredménye PRODH-ba és PRODL-be kerül. Azaz 8bit x 8bit, ami sosem lesz több 16 bitnél, azaz túl sem csordul. |
Bejelentkezés
Hirdetés |