Fórum témák
» Több friss téma |
Fórum » PIC - Miértek, hogyanok haladóknak
Sziasztok!
Mint kezdő programozó írtam egy progit. Ezt szeretném itt közzétenni. A progi teszt alatt van, és kíváncsi vagyok a visszajelzésekre.
Nem rossz, hasznos dolog! Egy ilyen kellet volna nekem, amikor stoppert írtam!
Ez nagyon tuti! Nem teszteltem még, de az 5let kiváló, és köszönet érte, hogy közzétetted! A megvalósítás pedig tetszik (nekem)!
Én egy kezdő vagyok és nem naon értem hogy hogy kell valamit "beleégetni" a picbe???
légyszi válaszoljatok
Ha megvan az ASM kiterjesztésű fájl, akkor van egy MPLAB levű progi, amit elindítasz, és beállítod a PIC típusát, és megnyitod az ASM filet, és átkonvertálja HEX file-ba. Utánna ezt a HEX filet megynyitod az ICPROG nevű programba, és ott is kiválasztod a PIC típusát, majd beégeted...
beégetés=felprogramozás
mivel a pic alapból "üres" nem jó semmire, kell egy program amit végre hajt, ezt kell rá át tölteni. Ezt a programot te írhatod meg olyanra amilyenre akarod, ha kell egy ledet villogtat ha kell multifunkciós robotot vezérel, a beleégetett programnak megfelelően. Miután megírtad ezt a programot a megfelelő fejlesztőkörnyzetben (pl. MPLAB, PIC Basic stb.) ezt lefordíttatood egy HEX kiterjesztésű fájlra amit a PIC végre tud hajtani miután beleégetted. Beleégetni az Ic-prog nevű progival (is) lehet. Ez annyiból áll, hogy összekötöd a picet a programozó áramkörödddel és Ic-prog -ban kiválasztod a picbe égetni kívánt fájlt (ami a programot tartalmazza, ez a .hex fájll) kiválasztod a pic tipusát (pl. 16F628) és katt a "programozás" gombra. Áttöltödik a progi, és a pic máris készen áll a feladatra a cél áramkörben.
lenne egy kérdésem nekem is: van egy 16F690-em EUSART-tal, adatokat (~40bájt 1*re) akarok neki küldeni pc sorosportról, de csak úgy müxik hogy ha hagyok kis időt (~35ms) az elküldött karakterek között, ami nekem nagyon nem jó, mert a meglévő program (nem én írtam, komoly progi) nem úgy küldi az adatokat. mit lehet tenni ilyenkor? köszi!:worship:
kicsit javult a helyzet, azaz rájöttem, hogy csak az első elküldött karakter után kell a szünet, utána már jó folyamatosan. na most már csak ezt a szünetet kéne kiiktatni. A hiba gondolom az interruptal lehet kapcsolatba, mert ugye akkor interruptol mikor betelt a puffer. Interruptol, odaugrik a interrupt rutinhoz kiolvassa a puffert, de mire ezt megcsinálja már jönne a többi adat, és annyi az egésznek, "megfagy" (vagyis gondolom várja a stop bitet csak az már nem a megfelő helyre esik mert csúszott az egész mivel a pufferbe nem fért bele pár bit...gondolom én...) mit tudok tennni, mert hiába csinálom úgy, hogy interrupt után azonnal olvassa (minden feltétel nélkül) a puffert, üríti, és utána veszi (azaz venné) a többi bájtot, de azokat már nem tudja venni....
Úgy kéne megoldani az interruptot hogy mielőtt betelne a puffer interruptolna, asszem akkor jó lenne. asszem van p icben ilyen port változásra interrupt... na megnézem...
az usart lábán nincs, de nem is lehetne használni ha lenne. szerintetek kössem a vezetéket egy olyan lábra IS amin van "interrupt-on-pin change" ??? és akkor az okozná az interrruptot,
Más, hogy csinálja, hogy kéne csinálni, nem hiszem hogy ez a legjobb megoldás. plíz valaki:no:
Hanyas kvarcot használsz? Mert ha több bájtot akarsz egymás után fogadni, akkor lényeges, hogy pontos legyen a pic usart-jának az órajele. 2% eltérés már a második bájtnál hibás fogadást eredményezhet. Keress egy olyan kvarcot, aminél nagyon kicsire jön ki a hiba a képlet alapján. Pl. ha 4MHz-en jár, akkor használj inkább 3.6864-es kvarcot, és akkor a hiba 0 lesz.
A puffer betelése nemhiszem, hogy bekövetkezne, hiszen 56kbps-on 4MHz-en le tud futni kb. 200 utasítás, mire megérkezik a következő bájt. Ennyi idő csak elegendő, hogy kiolvasd az RCREG-ből, és eltárold valahol. Az RCIF akkor jelenik meg, amikor a pic már fogadta a stop bitet is. Úgy írd meg a megszakításokat kiszolgáló részeket, hogy ne legyenek túl hosszúak. A nem időkritikus dolgokat a megszakítás kiszolgáláson kívül helyezd el.
A start és a stop bit mire való?
Szerintem arra, hogy ezzel szinkonizáljon. Ha van az átvitelben időcsúszásból fakadó hiba akkor is a start és a stop bitek a helyükre húzzák a dolgokat. - szerintem. Én 30 byte-t 4Mhz kavicssal, megszakitásos módszerrel, 19200 bauddal simán tudtam venni. (pic 16F870, 16f876A) Báddzsó: Szerintem nézd meg a soros port inicializálós részét. Régebben nekem is hasonló gondjaim voltak, de aztán megoldodott. Van valami bit arra, hogy sok byte-t akarsz venni és nem pedig egyet. Pic 16f876A esetében RCSTA,CREN bit volt.
kvarc: 18,432MHz, spbrg=9 : 0% hiba 115200bit/secnél...
úgy használom, (próbálom) Idézet: de a kritikus rész az az interruptnál van, mert megtelik a puffer ekkor lesz interrupt, ilyenkor már jön a következő bájt első néhány bitje, de a puffer még nem üres hiszen az "interruptolás" is idő.„puffer betelése nemhiszem, hogy bekövetkezne, hiszen 56kbps-on 4MHz-en le tud futni kb. 200 utasítás, mire megérkezik a következő bájt. Ennyi idő csak elegendő, hogy kiolvasd az RCREG-ből, és eltárold valahol.” Idézet: csak annyi van az interrupt részben, hogy mentse le az első bájtot azonnal, tehát semmi nincs előtte vizsgálgatás meg ilynek.... „Úgy írd meg a megszakításokat kiszolgáló részeket, hogy ne legyenek túl hosszúak. A nem időkritikus dolgokat a megszakítás kiszolgáláson kívül helyezd el.”
be van állítva a folyamatos vevés... continues receive enable bit =ez a CREN, értéke 1, azér köszi nektek...még próbálkozom..
A picben a soros fogadás nem ilyen egyszerűen történik (hardver szinten).
A bejövő bitek egy soros léptetőregiszterbe (RSR) kerülnek először, amit a pic a baudrate sebességével léptet. Amikor megjön a stop bit, akkor a beérkezett adatot áttölti az RCREG regiszterbe, és beállítja az RCIF flaget. Maga az RCREG is két bájtot tud tárolni, amiket a beérkezés sorrendjében lehet kiolvasni. Tehát akár két bájt is várakozhat feldolgozásra, miközben folyamatban van egy harmadik bájt fogadása. A gond akkor áll elő, ha a harmadik bájt stop bitje előbb érkezik be, mint ahogy az RCREG-ből kiolvassuk az első bájtot. Tehát ez nem lehet a hiba forrása. Javaslom az adatlap ezen részének alapos áttanulmányozását. A megszakításoknál nem csak a soros port megszakítására gondoltam, hanem az összesre. Ha tudod, nézd meg, hogy kisebb sebességen megy-e rendesen a dolog, illetve jó lenne látni a kódnak legalább azt a részletét, ami a soros port beállítását és a megszakítás kiszolgálását végzi.
A probléma a basic miatt van , abban szenvedem össze a progit, megenéztem a manualját, benne is van, hogy nem igazán jó ilyen esetben, és assemblys interrupt kezelés kell...
Azért köszi a segítséget mind2töknek! egyébként: Idézet: ezt kizártnak tartom, mivel az rcreg egy 1 bájtos regiszter...„RCREG is két bájtot tud tárolni,” Idézet: „A bejövő bitek egy soros léptetőregiszterbe (RSR) kerülnek először,” Ez viszont igaz, tehát mikor a rcreg tele akkor a rsr-be mennek a bitek, 1 bájt után nálam sincs probléma...
Akkor csak a megszakításkezelés a ludas.
Idézet: „ezt kizártnak tartom, mivel az rcreg egy 1 bájtos regiszter” Az RCREG egy két bájtos FIFO (First In First out) puffer. Az adatlap 12.1.2 részében le van írva, és a Figure 12-2 blokkrajzon is látható, hogy az RCREG, az FERR és az RX9D kettőzve van.
érdekes , nekem nincs is olyan rész az adtlapban, minek az adatlapját nézed? 16f690??
ehh leszedtem az adatlapot megint, abban már van 12.1.2. És tényleg van FIFO, úgyhogy igazad volt...
még lenne egy kérdésem, hoyg ahoyg néztem az ADC jét nekem úgy tűnik, hogy bírja az ~1MHz-et, ez elképzelhető?
A 17-16 táblázat alapján min. 1.5us az A/D átalakító órajel periódusa, ha a Vref>2.5V.
HElló
Szerintetek jó-e a kapcsolás???? Igazából azt nem tudom hogy az /MCLR/VPP lábal mit kell csinálni, hogy kell beállítani?? Ja és a T0CKI láb mit csinál azt is be kell kötni? Előre is köszi a válaszokat!
A T0CKI láb a külső órajel-bemenet. Adatlap szerint:
Idézet: „if not in use, to reduce current consumption.” Az MCLR-t javaslom, húzd fel a + tápra, egy 1K-s ellenálláson át.
Helló
MEgtaláltam az adatlapjában hogy hogy kell beállítani a reset lábat! De többféle megoldás is van... mellékeltem, mert németül tudok csak, angolul nem! Egyébként azon gondolkoztam, hogy ez a reset azt csinálja ha mi bekapcsoljuk a mikrokontrollert akkor a program előlről kezdjen el futni??? Válaszokat előre is köszi!
[off] a "C" -s az csak írható nem?
:nemtudom: üdv
Hali
Ja, igazad van! De van egy ami még nem volt használva! Írva sem!
csak azért kérdem, ha rontod a pic égetését akkor sztem kuka a pic..
"az ördög nem alszik, azért karikás a szeme" üdv minden jót! :yes:
Helló
Hát ja, ennyi kockázatot sajna vállalni kell! De nem tudodod, vagy tudja valaki, hogy hogyan működnek a PIC-es frekvenciamérők??? A legelejétől kezdve, onnantól hogy a bementre adjuk a mérendő jelet. Nagyon érdekelne hogy hogy működnek, és hogyan tud némelyik megmérni 1 Hz-t, kevesebb mint 1 másodperc alatt??? Előre is köszi a válaszokat
HElló
LEnne itt egy programrészlet! de nem tudom hogy jó-e, ezért kérem ki a ti segítségeteket! LIST P=16F84 #INCLUDE "P16C57.INC" __CONFIG _XT_OSC&_CP_OFF&_WDT_OFF CBLOCK 0X0C T1 T2 T3 ENDC ORG 0 START BSF STATUS,RP0 MOVLW B'00011111' MOVWF TRISA MOVLW B'00000000' MOVWF TRISB BCF STATUS,RP0 Itt nem arról van szó hogy beállítjuk, hogy melyik port milyen irányú forgalamt bonyolítson? szóval itt most az A port INPUT, a B port OUTPUT, igaz?? MOVLW B'00000000' MOVWF TRISA Akkor itt most ugye, az A port is kimenet lesz igaz? ÉS ha ezt írom be: MOVLW B'11111111' MOVWF TRISB Akkor a B port pedig bemenet lesz? És pontosan mit csinálnak a TRISA, és TRISB utasítások? És mit jelent ez a két sor? BSF STATUS,RP0 . . . BCF STATUS,RP0 Előre is köszi a válaszokat!
Olvasgasd ezt a leírást, pont a 16f84-ről szól.
[link=http://www.freeweb.hu/majki/elektro/pic/base/pic.zip]http://www.freeweb.hu/majki/elektro/pic/base/pic.zip[/link]
Szia!
1. A programrészletek helyesek. 2. Az adatforgalom iránya pontosan úgy van, ahogy leírtad. 3. TRISA és TRISB nem utasítások, hanem regiszterek. Ezek tárolják a portok funkcióját (bemenet/kimenet). 4. BSF STATUS,RP0 . . . BCF STATUS,RP0 A BSF egy adott regiszter x. bitjét bekapcsolja, a BCF pedig ki. Tehát a STATUS regiszter RP0 bitjét bekapcsoltuk, aztán pedig ki. Ez azért kellett, mert amíg be volt kapcsolva, addig a 0. regiszterbankban lévő regisztereket tudtuk elérni. Ha az RP1-et kapcsolnánk be, akkor az 1. regiszterbankkal dolgozhatnánk. |
Bejelentkezés
Hirdetés |