Fórum témák
» Több friss téma |
Fórum » PIC - Miértek, hogyanok haladóknak
Ha jól sejtem, még a 18F sem jött számításba, nem a 24FJ, 16F-el akarja megoldani FAT kezelés nélkül, valamilyen milyen módon PC-re juttatva a tárolt adatokat.
Csak mi kezdtünk itt bonyolódni azzal, hogy FAT kezelés nélkül is lehet egy fájl tartalmát módosítani úgy, hogy utána PC-vel ki lehessen olvasni a tartalmát kártyaolvasóval.
Köszönöm a válaszod !
Neked is kösz, a segítségért !
Kérdés, hogy át lehet-e gyúrni egy ilyet, hogy 18F-en fusson? Ahogy néztem a Microchip csomagjában, nem tűnik nagy problémának átírni 18F-re, csak kevés fájlt kell módosítani hozzá
Kösz, de webszerver van a Microchip csomagjában, azzal már építkeztem. Az 5.20-as csomagban van egy TCPIP MDD Demo App nevű cucc, ami egyelőre csak C30-ra van elkészítve, én abból akarok C18-ra kódot gyártani.
Hali,
Azt szeretném megoldani, hogy ha az usart megszakitást generál, akkor a megszakitás kerüljön kiszolgálásra és utánna a vett bájtot dolgozza fel, ha nincs megszakitás akkor Sleep -be menjen a pic. A Sleep parancs kiadása előtt kell valamit még beállitani? if (jelzo == 0) { #pragma IDLEN = 1; Sleep(); } if (jelzes != 0x01) // nem lett beállitva, vagyis nincs megszakitás { #pragma IDLEN = 1; Sleep(); } // Ha van megszakítás akkor annak kiszolgálása usart_isr(); //vet bájt feldolgozása... Még egy kérdés: wdt(PIC18F45J10): Tegyük fel, hogy a wdtps nél 1111-t állitok be. Ekkor ezzel 1:32,768 -as osztást állitok be, ami kb. 4ms. Akkor ezt azt jelentené, hogy a CLRWDT-t 4 ms-nként kéne kiadni? Vagy van valami más módszer arra, hogy mikor és hányszor kell kiadni??
Sleep elott meg kell gyozodnod rola, hogy az osszes olyan kulso aramkort lekapcsolod aminek nem kell/szabad mennie alvas alatt.
Altalaban amugy ha csak ezt az egy dolgot kezeli le az ember, hogy bejon egy megszakitas, csinalni valamit majd elaludni, akkor azt ugy szoktak megcsinalni, hogy a fo ciklus nem csinal mas, csak elalszik:
Ha azonban varsz bejovo adatokat, akkor a megszakitas kezeloben beallitasz egy flag-et, amit ebben a fo ciklusban figyelsz:
(A nop() azert kell, mert felebredes utan meg egy utasitast vegre hajt mielott a megszakitasi rutint meghivna...) Idézet: „....... a CLRWDT-t 4 ms-nként kéne kiadni? Vagy van valami más módszer arra, hogy mikor és hányszor kell kiadni??” Nem egeszen. Ez azt jelenti, hogy 4ms all rendelkezesedre, hogy a WDT szamlalojat torold. Azt torolheted akar 1us-kent is... Viszont ha altatod a PIC-et, akkor ugye nem torlod a szamlalot es emiatt 4ms mulva fel fog ebredni (sleep szinten torli a szamlalot). Ekkor beallitastol fuggoen vagy csak felebred, vagy resetet is ad, de akkor a reset vektoron le kell kezelned, hogy nem a szokasos bekapcsolas miatt kerult oda a vezerles (POR - Power On Reset), hanem a WDT miatt (WDT Reset during Sleep)
Még nem teljesen tiszta. A jelzés beállitást így érted?
És az a megoldás nem jó, ha az usart megszakitás flegjét figyelem? void usart_isr (void) { id == USART_vetel(); jelzo = 1; } void main (void) { for(; { sleep(); nop(); if ( 1 == jelzes ) { ...... } }
Szia!
Idézet: „És az a megoldás nem jó, ha az usart megszakitás flegjét figyelem?” Az azért nem jó, mert az RCIF flaget csak olvasni lehet, írni nem. Tehát, ha kiolvassuk az RCREG regisztert, akkor a flag hardveresen törlődni fog, így a főprogramban már nem lesz látható a jelzés. A megoldás, hogy egy változót beállítunk az IT rutinban, és a főprogramban pedig azt figyeljük és töröljük. Üdv Szerk: Amúgy sem szabad engedélyezett IT mellett a flaget a főprogramban törölni, azt az IT kiszolgáló rutinban kell megtenni.
Üdv!
Még csak most ismerkedem a C nyelvvel, a Microchip USB framework programjait irkálom át, és közben igyekszem leszűrni a tanulságot. Ha a következő függvénnyel stringet küldök virtuális soros porton a Pc-nek: Idézet: „ putrsUSBUSART("Microchip Technology Inc., 2007\r\n"); ” Akkor a string utolsó karakterét ami ugye NUL, azt is elküldi, így a terminálban nem túl szép,hogy a következő sorba betesz egy <0> értéket. A kérdésem az lenne, hogy hogyan lehet C úgy elküldeni egy stringet, hogy a számunkra lényegtelen (tudom, a C számára lényeges) utolsó NUL karaktert ne küldjük el? Köszönöm előre is a válasz(oka)t. Márk.
Én egy másfajta megközelítést használok, melynek részleteit itt találod meg. Ennek lényege az, hogy putc(), puts(), getc() mintájára csináltam olyan blokkoló típusú fv-eket, amelyek várakozás közben hivogatják a ProcessIO függvényt, ezáltal kezelik az USB CDC tamagocsit. Így a főprogramban bárhol, bármennyit írogathatok, vagy várhatok bejövő karakterekre.
Én is hasonló megoldást választottam, csak Timer megszakítást állítottam rá erre, mert nekem sokszor megszakadt a kapcsolat, ha nem maceráltam a vonalat rendszeresen.
Idézet: „Még nem teljesen tiszta. A jelzés beállitást így érted? És az a megoldás nem jó, ha az usart megszakitás flegjét figyelem? void usart_isr (void) { id == USART_vetel(); jelzo = 1; } ” Nem egeszen. Egyreszt lehet felre ertettem mit szeretnel, masreszt a megszakitas jelzot torolnod kell az ISR-ben. Tehat en ugy ertettem veszel adatokat, es mikor a megfelelo adat bejon akkor kell valamit csinalnod. Pl. egy speci byte jon be, ekkor:
Tehat hex 34-re varsz, es ha bejon beallitod a flag-et. Vagy egy stringet kell beolvasnod:
Tehat mikor bejon a stringet lezaro 0 akkor jelzed, amugy meg ugye a fo programban nem tortenik semmi ameddig az egesz string be nem jott... Ha azonban mindig minden karakternel kell valamit csinalni, akkor ha belefer lehet bele lehet preselni az ISR-be -- de most igy atgondolva ha nem fer bele akkor sem tudsz majd mit kezdeni a tobbi bejovo karakterrel, tehat akkor mar baj van, mindenkeppen fel kellene allitanod egy buffert es a string kezeleshez hasonlo modon feldolgozni.
Az USBDeviceTasks(); periodikus hivogatása a timer interrupt kiszolgálásból csak az egyik fele a dolognak. Az nálam is interrupton zajlik.
A dolog másik fele az USB buffereket kezelése, ami a getsUSBUSART(), putUSBUSART(), s a CDCTxService() hívásával történik. Ezt végzi a ProcessIO() minden ki/bemeneti várakozáskor. Ez utóbbit is interruptra tetted?
Már nem emlékszem, nincs előttem, majd megnézem, de lehet, hogy félre értettem valamit.
Idézet: „Már nem emlékszem, nincs előttem” Ne aggódj, a Fórum keresőjének kitűnő a memóriája. A korábbi beírásodból úgy tűnik, hogy nálad is az időkritikus USBTasks(); megy interrupton, a többit meg a főprogramban egy végtelen ciklusban hivogatod. Nálam annyi a különbség, hogy a főprogram végtelen ciklusa blokkolódhat, ezért be kellett iktatni egy-egy belső tamagocsi ciklust a karakterbeolvasásra és kiírásra történő várakozásnál.
Sziasztok!
Keresek egy kompakt alfanumerikus LCD programot C-ben írva, 16-os sorozathoz, mely nem időzítést használ, hanem olvassa a busy flag-et. Merre találok ilyen előre megírt programokat, melyeket csak konfigurálni kell egy adott pic lábkiosztásához? Assemblyhez vannak ilyen oldalak, gondolom C-hez is, viszont még nem találtam rá.
Sziasztok! Óriási segítségre van szükségem, mert három este óta nem bírok egy dologgal Hi_Tech C-ben...és lassan megőrülök. Mondom amit kellene tudni a programnak és nekem sehogy sem jön össze. Se haverok,se Google nem tudott segíteni...
Kellene egy ilyesmi saját parancs, amit bármikor fel tudok használni programozás közben: PrintMe("ide max. 21 karakter", 3,6); és ez egy olyan függvényt hívjon meg, ahol a két idézőjel közé tett char tömb (vagy string) egyes karaktereinek az ascii értékét egy változóba (pl. i-be) tegye át, hogy utána már tudjak vele dolgozni. A fenti esetben mondjuk az első karakterről tudja meg, hogy annak a decimális kódja: 105, a másidokról: 100, stb... Nagyon szépen kérem aki tud az írjon nekem egy függvényt erre! Köszönöm!
Igen-igen, már értem mi a helyzet nálad. Elsőre másképp értettem.
Egy egyszerű robotot tervezek, melyet PIC16F877A vezérelne.
Két kerekét egy-egy kefés egyenáramú motor hajtaná. A két azonos motor üresjáratban 0,14 A, teljesen lefogva 0,66 A áramerősséget vesz fel. A rotor három tekercsének ellenállása 3,1 Ohm (a motoron sajnos nicsen semmilyen jelzés, hogy katalógusban megkereshessem az adatait). A játék, amelyből kiszedtem a motort, 2 db 1,5 V-os, sorbakötött elemmel működik. Kipróbáltam 2db, sorbakötött 1.2V-os akkumulátorral is. A motorok forgási sebességét, és forgási irányát vezérelném. Egy infravörös érzékelője (GP2D12) is lenne a robotnak, akadályok elkerülésére. 4 db, sorbakötött, újratölthető akkumulátor lenne az áramforrása. A kapcsolási rajzon egyenlőre csak a motorok, és az érzékelő csatlakoztatása van meg. Van-e a kapcsolási rajzon hiba? Hogyan oldjam meg az áramellátást a roboton? Az a probléma, hogy egyrészt a PIC, a GP2D12 és a L293, másrészt meg a motor más áramforrásból kell, hogy táplálkozzon, igaz? Erre energiatakarékosság miatt van szükség, mert L293D adatlapján olvastam: Idézet: „On the L293, external high-speed output clamp diodes should be used for inductive transient suppression. A VCC1 terminal, separate from VCC2, is provided for the logic inputs to minimize device power dissipation.” L239-nek min. 4,5V kell, ami azt jelenti, hogy 4 db, sorbakötött 1,2V-os akku elég lesz neki. PIC16F877A adatlapján ovasom, hogy: Idézet: azaz jó lesz neki is a 4,8V, úgyszintén GP2D12-nek is. Csak a motornak kell max. 3.2V. Hogyan oldjam ezt meg?„Wide operating voltage range: 2.0V to 5.5V” Igen, a SES5001 dióda azért kell, hogy elfojtsa a motor indukcójának zavaró hatását. Esetleg, ha éppen nincs ilyen, akkor milyen diódát ajánlotok? Ha meglesz minden alkatrész, a programozás már gyerekjáték lesz a számomra. Assembly nyelven írom majd meg a vezérlő programot. Minden építő jellegű hozzászólást megbecsülök! Olvasd el mégegyszer, hogy melyik az a típus, amelyikre ez igaz! Idézet: „Olvasd el mégegyszer, hogy melyik az a típus, amelyikre ez igaz!” Az igaz, hogy sietségemben nem a PIC16F87XA, hanem a PIC16F877 adatlapját olvastam el, de most megnéztem mindkettőt. A PIC16F877 adatlapban ez áll: Idézet: „Microcontroller Core Features: Devices Included in this Data Sheet: • PIC16F873 • PIC16F876 • PIC16F874 • PIC16F877 ... Wide operating voltage range: 2.0V to 5.5V ” A PIC16F87XA adatlapban ez áll: Idézet: „Devices IncIuded in this Data Sheet: * PIC16F873A * PIC16F876A * PIC16F874A * PIC16F877A ... CMOS TechnoIogy: ... * Wide 0perating voItage range (2.0V ta 5.5V)” Nos, ha jól értem, akkor a PIC16F877A dolgozik 2V-5,5V feszültségtartományban, nem? Írd már ide légyszíves, hogy Te hol olvasod a helyes értéket!
Az adatlap vége felé az Electrical characteristics (azthiszem) második oldalán vannak diagramok, azokat is nézd meg.
Tényleg félreérthető, nem is kicsit, én sem értem miért így van ez letéve.
Nézd meg az ELECTRICAL CHARACTERISTICS résznél(az én adatlapomban a 15. fejezet) a feszültség és típus adatokat. Keresd az LF típusjelzést(16LF877), illetve a sima F-est. Van ott frekitérkép is. |
Bejelentkezés
Hirdetés |