Fórum témák

» Több friss téma
Fórum » CCS PIC Compiler
 
Témaindító: (Felhasználó 1542), idő: Ápr 3, 2006
Lapozás: OK   15 / 118
(#) potyo válasza source2 hozzászólására (») Okt 11, 2008 /
 
Watchdog-al mi a helyzet?
(#) source2 válasza potyo hozzászólására (») Okt 12, 2008 /
 
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.
(#) potyo válasza source2 hozzászólására (») Okt 12, 2008 /
 
Az nem megoldás, hogy kikapcsolod a stack under/overflow resetet. Valahol hibás a programod, azt javítsd ki!
(#) pepe33 hozzászólása Okt 12, 2008 /
 
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 ?
(#) icserny válasza pepe33 hozzászólására (») Okt 12, 2008 /
 
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!
(#) szigetivan hozzászólása Okt 13, 2008 /
 
Sziasztok!

Tudna nekem valaki abban segíteni,h.hogyan lehet a PIC16F690-esemet szoftveresen resetelni?
(#) potyo válasza szigetivan hozzászólására (») Okt 13, 2008 /
 
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:
  1. (*(void(*)())0)();
(#) szigetivan válasza potyo hozzászólására (») Okt 13, 2008 /
 
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.
(#) potyo válasza szigetivan hozzászólására (») Okt 13, 2008 /
 
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.
(#) szigetivan válasza potyo hozzászólására (») Okt 13, 2008 /
 
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.
(#) potyo válasza szigetivan hozzászólására (») Okt 13, 2008 /
 
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.
(#) szigetivan válasza potyo hozzászólására (») Okt 13, 2008 /
 
köszi. és indításkor kell valami rutin mit le kell futtatni a PIC-en,h.jó legyen a mérés?
(#) potyo válasza szigetivan hozzászólására (») Okt 13, 2008 /
 
Ugyanazt kell lefuttathatod, amit menet közben is félóránként lefuttatsz.
(#) szigetivan válasza potyo hozzászólására (») Okt 13, 2008 /
 
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?
(#) potyo válasza szigetivan hozzászólására (») Okt 13, 2008 /
 
Minden szenzor adatlapjában benne van, hogy hogyan történik a mérés elindítása, kiolvasása, stb. Azt kell leprogramoznod.
(#) szigetivan válasza potyo hozzászólására (») Okt 13, 2008 /
 
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?
(#) potyo válasza szigetivan hozzászólására (») Okt 13, 2008 /
 
Minden amit tudni kell, az benne van a szenzor adatlapjában.
(#) pepe33 válasza icserny hozzászólására (») Okt 18, 2008 /
 
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 !

main.c
    
(#) icserny válasza pepe33 hozzászólására (») Okt 19, 2008 /
 
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!


  1. <ol>
  2. <li>#USE RS232(BAUD=9600, XMIT=PIN_B0, RCV=PIN_B1, STREAM=COM_A)
  3. <li>#USE RS232(BAUD=9600, XMIT=PIN_B2, RCV=PIN_B3, STREAM=COM_B)
  4. <li>   main() {
  5. <li>      char c;
  6. <li>      fprintf(COM_A,"Online\n\r");
  7. <li>      fprintf(COM_B,"Online\n\r");
  8. <li>      while(TRUE) {
  9. <li>        c = fgetc(COM_A);
  10. <li>        fputc(c, COM_A);
  11. <li>        fputc(c, COM_B);
  12. <li>      }
  13. <li>    }
  14. </ol>


(#) pepe33 válasza pepe33 hozzászólására (») Okt 19, 2008 /
 
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.
(#) potyo válasza pepe33 hozzászólására (») Okt 19, 2008 /
 
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...
(#) icserny válasza pepe33 hozzászólására (») Okt 20, 2008 /
 
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).
(#) sysy válasza potyo hozzászólására (») Okt 20, 2008 /
 
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
(#) potyo válasza sysy hozzászólására (») Okt 20, 2008 /
 
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.
(#) Akoska hozzászólása Okt 20, 2008 /
 
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
(#) icserny válasza Akoska hozzászólására (») Okt 20, 2008 /
 
Gondolom kiíráskor:

  1. write_eeprom(0,PORTA);
  2. write_eeprom(1,PORTB);

Beolvasáskor meg:

  1. PORTA=read_eeprom(0);
  2. PORTB=read_eeprom(1);




A cím egyébként 0..127 lehet, ittcsak 0..1 kellett.
(#) Akoska válasza icserny hozzászólására (») Okt 20, 2008 /
 
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?

code_01.txt
    
(#) Moderátor hozzászólása Akoska hozzászólására (») Okt 20, 2008
 
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.
(#) Akoska válasza (») Okt 20, 2008 /
 
Elnézést kérek! Majd figyelek.
(#) icserny válasza Akoska hozzászólására (») Okt 20, 2008 /
 
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.


ledek.c
    
Következő: »»   15 / 118
Bejelentkezés

Belépés

Hirdetés
XDT.hu
Az oldalon sütiket használunk a helyes működéshez. Bővebb információt az adatvédelmi szabályzatban olvashatsz. Megértettem