Fórum témák
» Több friss téma |
Fórum » CCS PIC Compiler
Nos úgynézki megy, majd megnézem folyamatos üzemben, -nem a wacsdog volt-, hanem a stack under/overflow reset- kiszedtem, és nem indul újra, legalábbis olyan gyakran mint előtte, habár azt nem tudom ez mért okozhat hibát, de MPlabbal szimulálva az is kiírja ezt.
Az nem megoldás, hogy kikapcsolod a stack under/overflow resetet. Valahol hibás a programod, azt javítsd ki!
2 sorosportot szeretnék kezelni egyszerre.
18F2550-et használok, a beépitett már müködik rendesen. Van-e megoldás a CCS -el hogy legyen még egy sorosportom , vagy keresnem kell olyan PIC-et amiben 2 HARDWERES van már alapból ? (18F26J11) Elég lenne 9800bps-el müködnie, nem kell hogy gyorsabb legyen. Ha van megoldás softweresen akkor azt hogyan lehet megoldani ?
Elvileg lehet. Az #use rs232 opciói között a FORCE_SW pl. szoftveres kezelést ír elő. Kell egy stream=nev opció is, hogy meg tudd különböztetni a két soros vonalat az írásnál.
Idézet: „Elég lenne 9800bps-el müködnie” 9600 lesz az!
Sziasztok!
Tudna nekem valaki abban segíteni,h.hogyan lehet a PIC16F690-esemet szoftveresen resetelni?
Reset alatt mit értesz? Pl. bekapcsolhatod a WDT-t, és ha nem nullázod, akkor a túlcsordulása után (kb. 10ms múlva) reseteli a chipet. Vagy az kellene, hogy ugorjon a programmemória elejére? Mert akkor szúrd be ezt a kódot:
arra gondoltam,h.egy billenőkapcsolóval fesz alá helyezem a PIC által vezérelt eszközt amire rá lesznek kötve érzékelők, melyeknek az értékeit beolvassa és kiküldi egy másik eszközenek soros porton. és hogy mindig elvégezze a mérést mikor azt kérem tőle(amit a WDT-vel szeretném periódikusan megoldani), ezért gondoltam a memóriának a törlésére,h.nem ugyanazokat az adatokat küldje ki.
A reset nem törli a felhasználói memóriát, érintetlenül hagyja azt.
A WDT nem időzítésre való, időzítésre a Timerek valók. De egy olyan mondatot írtál, aminek nemigazán van értelme. Én meg nem vagyok hajlandó azt analizálni, hogy mit akarhattál valójában írni. Ha majd tisztességesen leírod, hogy mit akarsz csinálni, és nem csak úgy idehánysz valamit, akkor talán foglalkozok a kérdéssel.
oksa, bocs az előbbi fogalmazásért, remélem ez jobban sikerül
Azt szeretném elsőre megoldani,h. a PIC valamilyen előre beállított időnként elvégezze a hozzá kapcsolódó szenzorokkal a méréseket az RC0, RC1, RC2 lábain.(pl: 30 percenként mér hőmérsékletet és fényerősséget..) Ezt hogyan tudnám megvalósítani, normálisan időzíteni, elvégeztetni vele az adatok bekérését, átalakítást, majd egy változóba gyűjtését?? Csatolom a kapcs rajzot, talán úgy jobban látható mit szeretnék.
Na ez így már valami.
Beállítod a Timer1-et 1:4-es prescalerrel. Ez 1048576 órajelciklus után megszakítást okoz, vagyis 4MHz-es kvarc esetén 1,048576 másodperc után. Ez igénytől függően akár vehetjük egy másodpercnek is. De ha nem elég pontos, akkor lehet még pontosítani rajta. Vagy használj 4,194304MHz-es kvarcot, akkor pontosan egy másodpercre jön ki. Mivel ez még csak 1 másodperc, neked meg 1800 kell, ezért amikor a Timer1 túlcsordult, akkor egy segédváltozót megnövelsz 1-el (arra figyelj, hogy a segédváltozó int16 tipusú legyen). Ha a segédváltozó elért 1800-ra, akkor nullázod a segédváltozót, és elvégezed a méréseket, a szükséges átalakítást, adatok kiküldését, amit kell.
köszi. és indításkor kell valami rutin mit le kell futtatni a PIC-en,h.jó legyen a mérés?
Ugyanazt kell lefuttathatod, amit menet közben is félóránként lefuttatsz.
rendben. és a mérést hogy lenne célszerű elindítani?van erre valami parancs,h.ezekre a lábakra olyan parancsot adjak ki,h.lekérje a szenzorok által mért értékeket?
Minden szenzor adatlapjában benne van, hogy hogyan történik a mérés elindítása, kiolvasása, stb. Azt kell leprogramoznod.
igen az megvan,h.hogy konvertálom át majd számomra megfelelő értékké, de egy szenzor mérésének elindításához nem kell még v.mi amit tudnom kéne?
Minden amit tudni kell, az benne van a szenzor adatlapjában.
Próbáltam megcsinálni a második sorosport kezelését szoftveresen, de hogy a 2 egyszerre müködjön rendesen sehogy sem sikerült elérnem.
A hardweressel semmi gond nincs ha csak az megy, az rakja ki a kijelzőre az adatokat rendesen, de ha a softwerest is belerakom akkor csak akkor jelenik meg néha valami ha 2. portra küldök adatot , természetesen igy az első HW portrol már semmi nem jelenik meg. Mellékelem a programot hátha csak rosszul használom a szoftweres opciót. Előre is köszönök minden segitséget !
A stream-ek kezeléséhez légy szíves az fgetc, fputc, fprinf függvényeket használni - az alábbi példa szerint . Mindjárt áttekinthetőbb lesz a program, s a fordító sem zavarodik meg, hogy most melyik csatornához forduljon.
Bővebben lásd a CCS helpjének "How can I use two or more RS-232 ports on one PIC?" c. tárgykörében!
Közben rájöttem mi okozhatja a problémát.
Én a SW sorosport kiolvasását betetem az #INT_RDA részbe. buffer_gsm[next_in_gsm]=fgetc(GSM); t_gsm=next_in_gsm; next_in_gsm=(next_in_gsm+1) % BUFFER_SIZE; if(next_in_gsm==next_out_gsm) next_in_gsm=t_gsm; // Buffer _gsm full !! Vagyis ki akartam olvasni az SW sorosportot, de ha ott épp nem volt fogadott adat akkor a program épp megált addig amig nem jött valami. Hogy lehetne megoldani hogy az SW sorosportra ha érkezik adat akkor okozzon megszíkaitást amibe beilleszthetném az SW sorosport bufferkezelő részét. Persze ha egyáltalán jó a gondolatmenetem.
Sehogy. Többek között attól hardveres egy port, hogy bele van építve a megszakítás okozása a hardverbe. A szoftveres soros port meg olyan kontroller számára, mint egy led ki-bekapcsolása vagy két szám összeadása. Tehát nem lehet megszakítást okoztatni vele, csak a rutinja jelezheti, hogy jött valami adat.
Pontosan ezek azok a dolgok, amiket a magasszintű nyelvek (főleg a CCS) elrejt...
Jó lenne végiggondolni a program logikáját: mit, mikor, honnan, hová? Enélkül csak céltalanul bolyongunk a CCS technikai rejtelmei közt.
Az SW portkezelés természetesen nem okoz interruptot, - ha csak egy "port change" típusú interrupt nem rendelhető hozzá. De erről a programtervezés jelenlegi fázisában szeretnélek lebeszélni. Az SW port kezelését tehát ne interrupt szintre tedd! Az fgetc (mert ahogy korábban írtam, a stream kezelés miatt ezt kell használni!) hívása előtt meg kell vizsgálni egy kbhit(stream) hívással, hogy jött-e adat, s akkor nem lesz elakadás. ('stream' helyére az adott csatorna neve kell).
Khmmm...
Én nem értek ezzel egyet. Én néhány programomban több soros portot is használok egyszerre a legnagyobb megelégedésemre. Pl. GSM telefont kezelek a HW porttal, GPS-t olvasok az egyik SW porttal és egy másik SW porton a BlueTooth-al kummunikál a PIC és egy másikon a PC lóg. Gondoljátok, hogy ebbe a problémába mások nem futottak bele, csak az ammateur barátunk? Van egy nagyon hasznos utasítás a CCS-ben. Ez: value = kbhit (stream) alakú. Ezt fel lelehet használni arra, hogy megvárunk egy beérkező karaktart az adott stream-en. Pl. while(!kbhit(valamelyik_stream); Ezután mehet a getc(). Ezzel elég kényelmesen lehet dolgozni. Ellenkező esetben bizony beleragad a program a meg nem érkezett karakter kiolvasásába. Ez bizony a programozó feladata és nem a fordítóé. sysy Idézet: „Ez bizony a programozó feladata és nem a fordítóé.” Ez igaz, és épp ezért nem kellene a kezdőknek magas szintű nyelven tanulniuk a kontrollereket. Ha nem tudod, hogy mi történik a háttérben, akkor gyakran futsz rá ilyen dolgokra. És a CCS nagyon elrejti ezeket a dolgokat.
Sziasztok
Írtam egy jó kis progot 16F628-ra. Működik is szépen. Azt szeretném megcsinálni, hogy a kimeneteken lévő ledek állapotát nézze meg a prog és mentse az eepromba. Bekapcsoláskor meg olvassa az eeprom tartalmát és állitsa be a kimenetek a mentett állapotra. Tudom, hogy READ_EEPROM() és WRITE_EEPROM()-ot kéne használni, de nem jövök rá hogy hogyan. Szépen kérem, hogy valaki írjon 1 rövid kódrészt erre hogy rájöjjek mit is kéne csinálnom. Köszönöm a segitséget! Akoska
Gondolom kiíráskor:
Beolvasáskor meg:
A cím egyébként 0..127 lehet, ittcsak 0..1 kellett.
Szia
Eddig próbálgattam de nem jön össze. Valószinüleg az a gond, hogy bájtot írna, olvasna de most akkor konvertálnom kell vagy mit?
Legközelebb ha ilyen hosszú kódot írsz be, akkor próbáld meg fájlmellékletként feltölteni, mert értelmetlen, hogy 300 km hosszúra nyúlik miatta az adott oldal.
Idézet: „Valószinüleg az a gond, hogy bájtot írna, olvasna de most akkor konvertálnom kell vagy mit?” Nem nagyon kell konvertálni (bár eki lehetne char típusú). Mindenesetre én úgy csinálnám, hogy a négy led állapotát menteném el (vagy hol kap értéket az eki változód?). Beolvasás után pedig az egyes biteket írnám ki a megfelelő lábakra, a feltételvizsgálatok bonyodalmai nélkül. |
Bejelentkezés
Hirdetés |