Fórum témák
» Több friss téma |
Fórum » PIC - Miértek, hogyanok haladóknak
Bocsánat nem úgy értettem írni olvasni tudom csak a konfig biteket nem tudom állítani vele.
Ja ok. A PICkit2-ben is tudod állítani a config biteket, csak nem túl kényelmes módon, hexában vagy bitenként (most nincs előttem). Ehhez elő kell venni az adatlapot és az alapján billegtetni a biteket, de valóban kényelmesebb az MPLAB-ból megtenni ezt.
Értem de ez a megoldás még nem menne nekem
Hello!
Segítségre volna szükségem PIC C programozással kapcsolatban. A Microchip C18 fordítóját használom egy 18F4550-es PIC-hez. Kezdő vagyok még, nem ismerem minden csínját bínját a C-nek, így legyetek elnézőek! A problémám az volna, hogy szeretnék létrehozni egy olyan "makrót, vagy hivatkozást", amivel hivatkozni tudok egy port bizonyos bitjére. Azért kellene ez, mert pl. a LATAbits.LATA1 kifejezés egyrészt hosszú, másrészt beírom ezt a programban 20 különböző helyre és holnap a fent említett lábról a rákötött ledet a szomszédos lábra rakom, és akkor elég legyen az első sorban átírni a makrónál, hogy változás van, és ne kelljen az egész programot átbogarászni, hogy minden helyen módosítsam a láb nevét, mert abból csak baj van. Eddig azzal próbálkoztam hogy:
Amikor azt próbáltam csak hogy: [code=c]#define led LATD led = 1;[code=c], az szépen ment. Gondolom a struktúrák miatt van valami gond, de nem tudom hogy oldjam meg. Az volna a lényeg, hogy a port egyes bitjeire egyenként tudjak hivatkozni. Próbáltam mutatót is használni, de azzal fordítási hibát kaptam, míg az előző verzió legalább lefordult. Remélem Ti tudjátok mi lehet a megoldás és eláruljátok. Köszi! Idézet: „Eddig azzal próbálkoztam hogy:
,de ez nem jött be.” Pedig ennek mennie kell -- mi volt a hibauzenet? UI: amugy makro neveket konvencionalisan csupa nagy betuvel irunk, hogy konyen lehessen latni a kodban, hogy az makro es nem valami mas...
Nem kaptam hibaüzenetet, hanem az MPLAB SIM simulátorral tesztelem a programot, és ahogy nézem a watch ablakban a regiszterek értékeit, nem íródik felül az értékadás után a hivatkozás, amire a makró mutatna.
Az inkább ezek egyikétől szokott lenni: Link
Szia!
Sajnos nincs tangóm, ha lehetne egyszerű képet tegyél fel...
Lehet, hogy az A portot nem jól állítottad be.
Köszönöm mindnekinek a segítő hozzászólásokat! Valóban a PortA beállításával lehet a probléma, mert ha a PortD-re írom át a kódot, akkor működik. Még átnézem a beállításokat, és az inicializálást, ott kell lennie a hibának.
Szia!
sikerült átállítani végre és elindult a program és az áramkör is a kijelző csatlakozóinál volt zárat. Köszönöm a segítséget. Idézet: Akkor "ajánlom magamat", azaz a PICCOLO projekt honlapját.„A Microchip C18 fordítóját használom egy 18F4550-es PIC-hez.” Idézet: Pontosan így csinálja a Microchip is az USB keretrendszerének mintaprogramjaiban. Mindenesetre a PIC18F4550 esetében érdemes PORTA lábait meghagyni az esetleges későbbi fejlesztésekhez szükséges analóg bemeneteknek, mert ennél a mikrovezérlőnél csak AN0-tól kezdődően, szigorúan sorban engedélyezhetők. „Eddig azzal próbálkoztam hogy:
Köszi az infókat és a honlapcímedet! Nagyon igényes és tartalmas oldal, még biztosan visszanézek rá, főleg az USB-s dolgok miatt.
Egyébként valóban az A portot állítottam be rosszul, és azóta jól működik a program a szimulációban is.
Valaki foglalkozott már PIC32 mikrovezérlőkkel? 12MHz-en futó 8051-es számára kellene külső programmemóriát emulálni (32 esetleg 64kB), ami azt jelenti, hogy egy külső megszakításlábon megjelenő megszakításra kellene reagálni úgy 150ns-on belül, de hogy ne legyen kicentizve, inkább 125ns-tól nem kellene hosszabb idő. Ha jól olvasom az adatlapokat, akkor meg lehet oldani, hogy megszakításnál ne kelljen az aktuális környezetet menteni (vagy legalábbis minimális dolgokat kelljen menteni), és így a 80MHz-en futó PIC32-nek 10 utasításciklusa van, hogy beolvassa egy port értékét, azzal indexelje a saját kód vagy adatmemóriáját, majd onnan kidobja az adatot egy másik portra. Szerintem kivitelezhető, de azért jó lenne, ha valaki, aki járatosabb a dologban, megerősítene, mielőtt bevásárolok.
Nem kéne nyitni egy külön PIC32-es témát?
Mennyi az interrupt latency, azaz hány utasításciklus telik el az interrupt flag bebillenésétől az interrupt kiszolgáló rutinba való belépésig? S mennyi a visszatérési idő? Mintha már lett volna róla szó, hogy a polling gyorsabb lehet...
Én is pollingoznék, ha más fontos dolog nincs, csak memória emu. Vagy van?
Sziaszt
Pic 16f877, 4Mhz Q, T1OSO es T1OSI labakon egy 32768Hz-es orabol kiszedett rezonator ket 33.pf kondival a fold fele. es a programresz Oshon fele basic
a T1OSO labon kimertem 32Khz-et es az C5 labon egy led van ami kb 16Sec-enkent valt allapotot! A leiras szerint amibol a programresz szarmazik 1Sec-enkent kellene valtson. Mi lehet a problema? a prescaller beallitasa?
Ha a timer1-et csak "szabadonfutó" módban használod interrupt-generálásra (azaz nem töltöd az értékét újra a megszakításban), akkor 65536 lépésenként fog bekövetkezni a megszakítás. Ez 32768Hz-es órakvarcnál 2 másodperc, ha nincs előosztó a timer1-en. A kód szerint viszont 8-as előosztót használsz, azaz teljesen jogos, hogy 8x2=16 másodpercenként fog a megszakítási rutinra ráugrani.
Idézet: Közben usb-re is rá lenne dugva, és ugyan kommunikáció emulálás közben nem lenne, de ki tudja, mikor jut eszébe a windows-nak, hogy valamit lekérdezzen. Bár tapasztalatom szerint nem csinál semmit a windows sem, maximum a SIE intézi a dolgot, és a kontroller processzorának nem kell foglalkoznia semmivel. „Én is pollingoznék, ha más fontos dolog nincs, csak memória emu. Vagy van?”
Ezt ki kéne próbálni. Szimulátorban próbáltad milyen időt ad a megszakítással lekezelt műveletre? A 32-eseket nem ismerem annyira, de úgy tudom, hogy a műveleti idő nem egyértelmű, függhet a műveletek végrehajtási sorrendjétől, vagy mi... ?
Nameg mi van akkor, ha pont egy USB-s megszakítást szakítasz meg(prioritásos megszakítás), mondván a memóriakiszolgálás fontosabb? Ha a kettő nincs egy időben, akkor nem lehet ezt különválasztani(üzemmód kapcsoló)? Idézet: „Mennyi az interrupt latency, azaz hány utasításciklus telik el az interrupt flag bebillenésétől az interrupt kiszolgáló rutinba való belépésig? S mennyi a visszatérési idő?” Na ezaz, ezért kérdeztem a dolgot, hogy valaki aki foglalkozott vele, meg tudja-e mondani. Én csak adatlapokat bányásztam eddig, nemis láttam még élőben PIC32-t. Ezen doksi Example 8-9 alapján az interrupt belépés 12 utasítás. Namost a kérdés, hogy ebből mi az, amit esetleg ki lehetne hagyni? Mert nekem itt stack-ra nincs szükségen, talán a status regisztert sem rontanám el, egyetlen indirekt címzés regiszter kell, amivel tudok olvasni a memóriából és utána kitenni a tartalmát egy portra. A megszakítások 500ns időnként követik egymást, tehát a lényeg, hogy a megszakítás beesésétől számítva 120-130ns-on belül ott legyen az adat a kimeneten, és ott maradjon 170-180ns-ig (a megszakítás beesésétől számítva) a maradék időben bármit csinálhat a kontroller.
Úgy vettem észre, hogy az USB az enumeráció után már nem kényes a válaszidőre. Volt, hogy megállítottam ICD2-vel a futást, 25-30 másodperc után indítottam el újra, és simán működött tovább.
Szimulációra ma fog sor kerülni. Már én is ezen gondolkozok, hogy üzemmód kapcsoló kellene, ha máshogy nem valósítható meg a dolog.
Nálam a CDC-s próbálkozásokkor ha nem pollingoltam elégszer megszakításból a PC-s USB kéréseket, akkor szétszakadt a kapcsolat.
CDC-t csak kipróbáltam, de nem használtam sosem. Viszont el tudom képzelni, hogy a drivere folyamatosan kérdezgeti le, hogy van-e új adat, és ha nem jön válasz, akkor leválasztja. HID-et használtam olyan célra, mint ahogy itt is lenne, annál simán meg lehetett állítani. Biztos ha más célra lenne, akkor itt is lenne gond, de ennél pont nem, amire nekem kell.
De nemis ez a lényeg, hanem hogy meg lehet-e a megadott időn belül oldani az interrupt kiszolgálást? Nem értem, hogy ha 18F-nél a magas prioritásnál megoldották, hogy néhány kritikus regisztert hardverből mentsen, akkor itt a PIC32-nél miért írnak 12 utasításos bevezetőt és utána hét utasításos kivezetőt...
Koszi a valaszt szilva!
Teljesen logikus... 16bites a tmr1 szamlaloja... vegigolvastam adatlapot csak nem ertettem meg... Ha kikapcsolom az eloosztast kapok egy 2Hz-jelet... a megszakitas akkor kovetkezik be ha a 16bites szamlalo tulcsordul... tulcsordulaskor TMR1H=0 es TMR1L=0, ha en a megszakitasban TMR1H.7 erteket 1 be allitom akkor 65536 helyett 32768 lepesenkent fog bekovetkezni a megszakitas? (ha igy van akkor meg egy kerdes, a 16f877 adatlapjaban nem talaltam de mas tiposoknal igaz a TMR0 irasakor 2 utasitascuklusig tiltva van a szamlalo... ugye itt ilyen nincs?)
Azt hiszem azért, mert másképp működik a parancsok végrehajtása, meg talán azért, mert mindegy, hogy hardverből, vagy szoftverből van lekezelve, ugyanannyi idő.
Ha üzemmódos lenne, akkor nem kéne megszakítás. Mert mi van, ha memória kezelés alatt dugja rá valaki...
Igen, elméletileg úgy kellene lennie, ahogy írod az 1 másodperces megszakítást. Ám a gyakorlatban a TMR1 regiszterek írása után elképzelhető, hogy egy órajelet ki fog hagyni a számolásból. Erről az adott típus errata-ját kellene elolvasnod, illetve mintha lenne "timer1 errata" dokumentum is a Microchipnél.
|
Bejelentkezés
Hirdetés |