Fórum témák
» Több friss téma |
Fórum » CCS PIC Compiler
Helló!
Ezt az órajelnyújtást nem kéne automatikusan elvégeznie a fordítónak?
A fordítónak nem, nincs köze hozzá. A gyári függvényben benne lehet, de ha nem publikus a forrás, akkor csak a visszafordított kód silabizálásból derül ki.
Valóban lent tartotta a slave az SCL lábat. A CKP bitet írás után 1-re állítva valóban nem következik be blokkolás, de csak egy bizonyos sebességig.
Az sajnos továbbra is előfordul, hogy néha-néha hibás adatot kapok. 40kHz 25 cm-es vezetéken soknak számít?
Sajnos ki kell javítanom magamat: A blokkolás továbbra sem szűnik meg. 50kHz-től nagyon durván elkezd hibázni, és rövid időn belül blokkolódik a busz. Itt most 2 byte-ot olvasok ki folyamatosan. Lezajlik pár ilyen ciklus, majd blokkolódik. A slave lent tartja mindkét szálat.
A helyes értékek a 111 és a 222.
El kene, ha nem mondtad volna neki hogy ne csinalja:
Ezt már kivettem azóta. Ettől függetlenül lent tartja és ezzel blokkol.
Helló mindenki!
Vettem egy PIC12f509 est. Csináltam hozzá egy ilyen hello world szerü progit teszteléshez:
Valamiért nem hajlandó a kódban szereplő kimenetet felkapcsolni. Nem értem miért. Ha jól értelmezem az adatlapot, akkor az MCLR láb kivételével mindegyik ki és bemenet egyaránt. Az MCLR meg csak bemenetnek használható. Vagy rosszul értelmezem? Valaki felvilágosítana? Előre is köszi!
Nezd meg elobb szimulatorban (MPLAB) mit csinal. Ott latni kell a lab valtozasat. Utana a hurokba tegyel egy "delay_ms(500); " sort. Mert ugye a kimenetet olyan gyorsan valtogatja, hogy nem lehet eszlelni. ja meg egy:
Jó érzékkel megint beleválasztottál egy spéci tulajdonságokkal rendelkező lábba.
![]() Ha bármelyik másik, kimenetnek alkalmas lábat választottál volna, akkor simán működik a programod. Ez nem csak egy egyszerű I/O láb, hanem a TIMER0 külső órabemenete is (T0CKI). A TIMER0-t fel kell húzni, hogy NE használja ebben az üzemmódban ezt a lábat. A PIC12F509 adatlap 25. oldalán van az OPTION REGISTER leírása, ebben lehet látni, hogy melyik bit mit állít a TIMER0 üzemmódján. A bitek táblázatos felsorolása felett pedig az látható, hogy irható/olvasható a bit és a legfontosabb, hogy reset után milyen értékre áll be. Itt az látható, hogy W-1. Ez azt jelenti, hogy ezt a bitet, csak írni lehet és reset után 1 az értéke. Ez pedig azt jelenti, hogy a PIN_B2 a TIMER0 orabemenete lesz. Még oda is írták a funkció leírása mögé, hogy a TRIS regisztert sajnos felülírja ez a beállítás (overrides TRIS on the T0CKI pin). Tehát, a megoldás, hogy a TIMER0-t felkonfigurálod és az utasításban legalább azt beleírod, hogy köszönjük, nem kérjük a külső órajel funkciót, helyette a belső órajelet szertnénk használni. (T0CS bit 0) Ezáltal a programod ilyenre módosúl:
Árulja el már valaki nekem, hogy miért nem látszanak a tabulátorok a kódban? Mit kell írni helyette? Így nagyon csúnya behúzások nélkül.
Nem akarja váltogatni a kimenetet, csak egyszerűen magasba akarja kapcsolni.
A #use utasítás szerintem teljesen korrekt, mert több formátumban is meg lehet adni az órajelet. pl. 20MHz esetén így is lehetne írni: #use delay (crystal=20000000) #use delay (xtal=20,000,000) #use delay(crystal=20Mhz) #use delay(clock=20M, crystal)
Köszi a helpet. Tényleg a Timer0 volt a gond. Viszont ezt kell megadni ,hogy leforduljon:
setup_timer_0(RTCC_INTERNAL);
Akkor valószínűleg régi a fordítód, ha nem érti a T0_INTERNAL kifejezést. Mi a verziója?
Meglett a hibás adatok oka: Valahol a kód mélyén engedélyezve lett egy timer megszakítás.
Azt letiltva nem küld hibás adatokat. Viszont mivel időszakosan végre kell hajtani egy mérést, ami a timer2 megszakításakor kell azonnal elvégezni ezért nem tudom elkerülni ezt a megszakítást. Hiába tiltom le a timer2 megszakításokat a kommunikáció idejére, valamiért mindig bezavar az átvitelbe ha azt bárhol bármilyen módon engedélyezem. Ti hogy oldanátok meg ezt úgy hogy ne zavarjon be a kommunikációba a mérés? Fagyások néha előfordulnak továbbra is. Ilyenkor a slave mindkét adatvonalat lent tartja és sem a CKP bit piszkálásával, sem egyéb flag bitek állításával sem sikerül rávenni, hogy elengedje őket.
Sziasztok!
Egy kezdő kérdésem lenne. Az "output_x(value)" parancs értékének csak hexa-ban lehet megadni az értéket? Pl. ha binárisként adom meg az értéket azt felismeri? Köszi.
Szia!
A dokumentációban Bővebben: Link a 37. oldalon írnak erről.
Szia!
Idézet: „Ti hogy oldanátok meg ezt úgy hogy ne zavarjon be a kommunikációba a mérés?” Ha az órajelet letiltod, az adatot előbb írod be az SSPBUF regiszterbe, aztán engeded az órajelet változni, akkor a műveletek között lefuthat a megszakítás kiszolgálás is, mégis jó lesz a kommunikáció. Ha a megszakítás kiszolgálás ideje összemérhető egy adat vételével az I2C buszon, akkor nem tudod biztosan beállítani az órajel nyújtást. Egyszerűen, ha a vétel vége felé jön a megszakítás kérés, a visszatéréskor már késő az órajel nyújtáshoz. Ha az utóbbi a helyzet, akkor a megszakítás kiszolgáló rutin futási idejét kellene csökkenteni. A mérést csak indítsa el, nem várja meg a végét... Az MSSI -t is lehet megszakításosan kezelni.
Szia!
Nem sikerült kibogozni a választ a kérdésemre az említett oldal segítségével sem ![]()
Mindegy neki, milyen számrendszerben írod be....
Köszönöm szépen.
Idézet: de jelölnöd kell a számrendszert !„Mindegy neki, milyen számrendszerben írod be....” Steve
Sziasztok!
PIC16F877-el kísérlezgetek CCS C nyelven és az analóg bemenetet szeretném használni, már több példaprogramot megnéztem, többek között a ccs c honlapján is, de valami miatt nem akar elfogadni egy sort a fordító: setup_adc_ports(sAN0|sAN1); Próbáltam már azt is, hogy csak egy bemenetet használnék, de akkor is azt állítja, hogy nem ismeri az sAN0-t és semmilyen sANx-et. Mit hagytam ki a programból ami miatt nem hajlandó ezt felismerni? A válaszokat köszönöm!
Ezt teszteld:
Kösz a segítséget!
Utánna még próbálkoztam és végül elfogadta azt is, hogy PIN_A1 és így tovább, csak hiányzott a programom elejéről ez a sor: #device adc=10, gondolom ez azt mondja meg, hogy hány analóg bemenetet akarok használni... Majdnem elfelejtettem, Azt még megtudod mondani, hogy ennél a parancsnál " set_adc_channel ()" a port számát adjam meg? Kösz Még egyszer köszönöm!
Ez nekem is működött, ott van a probléma, amikor több bemenetet is szeretnék monitorozni, egyelőre 2 poti van a bemeneteken és az egyik beleszól a másik mérési eredményébe. Bocs a zavarásért, de nemrég kezdtem el foglalkozni a PIC-ekkel, és a mai tananyag az analóg bemenetek kezelése...
Az lcd_putnum ()-ot még én írtam bele az LCD.c fájlba, hogy könnyebben tudjak számokat kiiratni. Ilyenkor ha az egyik potit teljesen feltekerem és a másikat hagyom, akkor az egyik változó 128-at vesz fel, mí a másik 70-et.
Az analóg bemenetek zavart is szednek össze. Tegyél rá 100nF-os hidegítést és kicsit ritkábban mérj rá. (Hagyj egy kis időt.) A másik, hogy ne terheld le 2.5Kohm-nál kisebb ellenállással az analóg bemeneteket. Ha így sem jó, akkor marad a mintavételezés és az átlagolás. (Illetve, próbáld ki, hogy unsigned int változót használsz).
Az a baj, hogy a csatornaváltás után rögtön olvasni próbálsz, majd ezután vársz 10ms-ot. Fordítva kéne: csatornaváltás, várakozás, olvasás. De legalábbis a váltás és az olvasás közé mindenképpen kell valami várakozás (a data sheet tartalmazza az A/D belső kapacitását, a belső ellenállást, ill. tudod a bemenetre kapcsolt ellenállást, valamint a max. várható feszültséget is - ezekből kiszámolható, hogy a kondi mennyi idő alatt tud feltöltődni reálisan - na minimum ennyit kell várni a kapcsolás és az olvasás között).
Lehet, hogy bennem van a hiba, vagy a PIC-ben, de nem akarja az igazat, a programkódban azért maradt bent egy i változó és 2 temp, mert az átlagolással kezdtem, vettem 64 mintát és átlagot számoltam. Kipróbáltam amit mondtál, beraktam egy 27Kohm-os ellenállást az analóg bemenet elé, tetem hidegítést is 470nF formájában, ritkábban mértem rá (200ms) de semmi hatása sincs, ugyan úgy megmaradt az "áthallás" a két analóg bemenet között. Most tartok egy kis szünetet aztán majd meglátjuk.
Azért köszönöm a segítséget! |
Bejelentkezés
Hirdetés |