Fórum témák
» Több friss téma |
Fórum » PIC - Miértek, hogyanok haladóknak
Közvetlenül portlábra nem illik kondit tenni, főleg elkót. Amikor bekapcsolod a portbitet, akkora áramot ránt megába, hogy valszeg még a tápfesz is megcsuklik, aztán attól vagy resetel a PIC (ha be van kapcsolva a védelme), vagy meghülyül.
A LED halványításához egyébként nem kell kondenzátor. A PWM kimenetet egy soros ellenálláson keresztül a LED-re kell kötni, aztán valami nem látható frekvencián "villogtatni" a LED-et. A kitöltési tényezővel lehet beállítani a fényerőt. Arra figyelj majd, hogy az érzékelt fényerő közel sem arányos a kitöltési tényezővel, valószínűleg célszerű egy táblázatot felépíteni ahhoz, hogy nagyjából egyenletesnek érzékeld a fényerőcsökkenést-erősödést.
Ugye nem szoftveresen akarsz PWM-et megvalósítani, hanem a PIC beépített modulját használod?
A PIC16F887-emre megcsináltam ezt a PWM dolgot. Azt az apróságot kifelejtettem, hogy csak a CCP1 (RC2) lábon működik a dolog De végülis működik. Megosztom, hátha jó lesz 877-re is. Megjegyzem egy led életébe került
A ledet az RC2 és GND közé kell kötni, ellenállással persze.
Működik, csak az első pá sort (config-ig végéig) kellett kicserélni.
Köszi, bár nekem több porton is kéne ezt tudni, meg vannak benne érdekes számok, csatra angol tudásommal megpróbálom kisilabizálni a leírásokból mi mire való, a késleltetéssel már sikerült jól lelassítani most még meg is kell majd fordítani a folyamatot, de kiindulásnak jó. Köszi szépen.
Az angolt a dokumentációból másoltam a szöveget. Az volt még benne, hogy össz 2 ilyen kimenet van. A CCP2-t is ugyan úgy lehet aktiválni elvileg. Ki is próbálom
Ment is, csak ahol 1 van, oda 2-t kell írni, és a TRISC-nél nem csak az 2, hanem az 1 bitet is írogatni kell.
A baj az, hogy nekem kéne vagy 8 ilyen.
Viszont megírtam az elhalványítást meg a teljesen kialszikhoz tettem még egy kis várakozást, így már egyészen pofás. A ledet körbenyomtam ragasztópisztollyal, mehet a lufiba, aztán a jégbe, azután ráérek még a többi port birizgálásával.
Ha 8 ilyen kéne, azt nem tudom hogy lehetne, mivel 2 ilyen kimenetet látok.. Szoftveresen talán? Vagy külső alkatrészekkel? Elektronikához annyira nem értek, valakinek van erre ötlete?
8 az bajos lesz. Nekem 4 kellett volna feszültségkimenetként, egy DC-vezérelt hangerő-hangszínszabályozóhoz (TDA1524), és az lett a megoldás, hogy csináltam 12F683-akból (DIP8 tok, van benne PWM modul) 4db egycsatornás, paranccsal vezérelt PWM "kockát", amiket egy soros buszra felfűztem, és egy ötödik PIC-kel küldtem ki a parancsokat nekik. Ez az ötödik PIC adja a kezelői felületet is.
Az a kérdés, hogy egymástól függetlenül kell-e a ledeknak halványodni/erősödni? Mert ha egyidőben kell halványodni/erősödni, akkor elég egy pwm láb, a többi lábbal meg csak ki-be kapcsolgatjuk azokat a ledeket, amelyek kell, hogy produkálják az átmenetet az adott időszakban.
Végül is amikor az egyik halványodik a másiknak erősödni kell, és két port van, tehát így elég lehet. Gondolom a kapcsolgatásra tranyók a földre a megoldás, és a ccp1-ccp2-őn lévő ledeket így lehet külön kapcsolni.
Nekem tudna abban valaki segíteni hogy MPLab 8-al (Vagy végülis akármelyikkel) hogyan tudok meglévő lefordított fájlt (HEX) beégetni? Odáig én is eljutok hogy forrásból (ASM, C) le tudom fordítani és beégetni. De mi a tehendő ha csak a HEX file van meg?
A Select Device-nál a megfelelő chipet kiválasztod, majd File-->Import-al beolvasod a hex fájlt. Ezután Programmer-->Program.
Egy nagyon érdekes, számomra felfoghatalan problémával szembesültem minap. Illetve szembesülök folyamatosan már két napja:
Írtam C-ben (PICC) egy pár függvényt karakteres LCD modul kezelésére. Egy PIC18F4520-on, de egy 16F877A-n is TÖKÉLETESEN működik. 4-bites módot használok, van bőven delay mindenhol, nagyon stabil. Ezt 1 az 1-ben átültetve a Microchip C30-ba (dsPIC-ekhez) sikeresen lefordul, van itt is bőven delay, részletek működnek, az LCD-t letörli, de egyszerűen nem ír ki rá semmit. Egy dsPIC30F4013-asom van. 1 teljes napot (24 órát) szórakoztam már vele. Megvizsgáltam az LCD-t, többel is ezt csinálja. Az LCD-t kötöttem más PIN-re is, megnéztem ott is, de ott se ment. Megmértem és meg is néztem egy LED-del a PIN-ek egyenáramú tulajdonságait, tudnak elég áramot szolgáltatni, mindegyik PIN tud fel és lehúzni (sink & source). Egyszerűen eldobom az agyam, mert már majdnem kivágtam az LCD-t, egy normál 18-as vagy 16-os PIC-kel megy, ezzel meg nem. Pedig levettem a frekit, egy 4 MHz-es kvarc van, PLL deaktiválva. Csatoltom a PIC18F4520-ra írt libraryt (PICC: LCD.c) és a dsPIC30F4013-ra (C30: lcd_4bit). Kérem aki dolgozott már dsPIC-ekkel segítsen egy kicsit. Mi szerepe van a LATx és PORTx registereknek _írás_-nál? Köszönettel: deguss Megj. Csak írok az LCD-re, R/W testen van.
Nézted már, hogy azok a lábak, amiket használsz milyen más funkciókra vannak még felkészítve? Lehet, hogy valamelyik lehetőség nem lett letíltva. (tudom, hogy más lábakon is próbáltad, ez csak egy ötlet)
Egyenáramilag mindegyik tud testet és tápot kiadni, megmértem.
Nem tudom, csak egy tipp: az elején, az init-nél a HD44780 adatlapjában nem ez a szekvencia van megadva, amit a c progidban látok. Ott 2-szer vagy 3-szor van elég nagy időzítésekkel kiküldve mód parancs, és a legvégén ez a 4-bites, ami a tiedben is. Lehet, érdemes lenne végigpróbálni az ajánlott szekvenciát. De persze könnyen lehet, hogy nem ez a gond.
Topi adott tippet a szinkron kiírásról, vagy valami ilyesmi. Erről hallotta valaki valamit? buffer_flush?
Értem. Pedig amikor úgy tűnik, minden rendben, és még sem működik valami, akkor nekem ilyen doglok szoktak bekavarni. Lehet, hogy valamelyik belső periféria(milyen paradoxon! ) valami okból belekutyul a jelbe. Mert egyszerűen nehéz elhinni, hogy a jelek rendben vannak, mert akkor működne.
Ha az egész portot írjuk egyben, akkor elvileg mindegy, hogy LATx vagy PORTx regiszterbe írunk, de egyetlen bit módosításánál csak a LATx regisztert szabad használni. Legjobb, ha megszokjuk, hogyha a portot olvassuk, akkor PORTx, ha írjuk, akkor LATx, és akkor biztosan nem lesz gond.
Nem biztos, hogy ez a megoldás, de a #define soroknál cseréld ki, hogy az illetékes bitek a LATx regiszterekre mutassanak. Gondolom _RB9 helyett _LATB9, stb.
PORTB|=mask; //OR mask
Ebben nem vagyok biztos, hogy jól működik, bár igaz, hogy előtte ott van az and-os kimaszkolása a portbiteknek. Tisztábbnak érezném, ha egy belső változóban állítanád elő a kiküldendő tartalmat. Valahogy így gondoltam: int mask; mask = ((0x000F & n)<<9) | (PORTB&0xE1FF); PORTB=mask; >>
Potyó, Istenítelek!
Ez eddig nem jutott eszembe, mert simán mentek a dolgok, mikor az egész portot módosítottam (maszkolással), csak nem néztem meg, hogy kifejezetten mi történik, ha az E = 1; utasítás végrehajtódik, (PORTxbits-ként deklarálva). De tényleg az lehetett, hogy RS-et is "felrántotta", és az LCD adatként értelmezte. Mindenkinek aki egyszer ilyen helyzetbe kerül: Jól nézzétek meg, hogy mit is kapcsoltok, PORTA vagy LATA, vagy MIA fenét, mert nem mindegy! LATEbits.LATE1 -ként már működik! Köszönet. Nekem 200 pontot is megért a segítséged, de csak 50-et tudok adni. Köszönöm!
Kösz
Mondjuk ugyanez az elv érvényes a 18F sorozatnál is, valószínűleg a fordító ott másként fordította, és azért működött.
Sziasztok
18f4550 procinál az a portok nem akarnak menni digitális bementnek. beállítottam pedig digitálisnak, bemenetnek is. Ennek ellenére ha ráadom a magasat, max két bementen meg jelenik, de a többin nem. AN0- tól AN7 ig tartó lábakról van szó. Ötlet? István
Mindkét regisztert beállítottad?
Ebbe én is belefutottam egyszer, és a legbosszantóbb az volt hogy lépésenként debuggolva jól müködött, csak rendesen futtatva nem (ott ugye volt ideje a kimeneti lábnak átállni).
A LATx-et használva aztán persze jó lett, csak hát addig .....
Hogy is van ez a Latx -es dolog? Mert sajnos nem működik jelenleg.
C-ben igy próbálom: #define ERZ1 PORTAbits.RA0 #define ERZ2 PORTAbits.RA1 #define ERZ3 PORTAbits.RA2 #define ERZ4 PORTAbits.RA3 #define ERZ5 PORTAbits.RA4 #define ERZ6 PORTAbits.RA5 #define ERZ7 PORTEbits.RE0 #define ERZ8 PORTEbits.RE1 #define ERZ9 PORTEbits.RE2 a portokat itt írjam át lat-ra? |
Bejelentkezés
Hirdetés |