Fórum témák
» Több friss téma |
Fórum » PIC - Miértek, hogyanok haladóknak
A kapcsolási rajzok alapján látnod kell, hogy melyek azok az alkatrészek watt nyákján, amit nem kell beépíteni ahhoz, hogy az oshon oldalán levő kapcsolást kapd. Ettől egyszerűbb, megbízható égető nem létezik.
Na igen, akkor valoszinuleg program cimkenek vette a fordito ezert nem reklamalt
![]() Amugy lehet automata elhelyezest is kerni, de nem abszolut modban, hanem relokativ modban abszolut mod mikor te adod meg minden egyes valtozora, hogy hol szerepel a memoriaban, pl EQU vagy #define segitsegevel vagy meg rosszabb modszerrel mikor kozvetlen szamot adnak (MOVF 0x2C,0 - es ezt bogozza ki az ember mit miert es hogyan). Abszolut mod az CBLOCK is. Az valojaban nem valtozo definialasra lett kitalalva, de kivaloan alkalmas ra. Az egy felsorolo tipust hoz letre, amit constansnak mond, ezert a 'C'block. Magyaran CBLOCK utan megadod a felsorolas kezdo erteket, majd egymas ala a neveket amikhez ertekeket rendel novekvo sorrendben. A novekmenyt pedig kettosponttal lehet megadni... de ha ez hianyzik akkor a novekmeny 1 lesz. Magyaran a
Magyaran ez kivaloan alkalmas arra, hogy valtozokat definialjon az ember kulonbozo merettel, pl 16 bites valtozonak 2-es novekmenyt adunk meg stb.. De ettol fuggetlen ez az egesz meg abszolut kodu programozasnal hasznalatos csak. Relokativnel van egy linker script ami pontosan leirja a memoria terkepet, es ezek hasznalatat szabalyozott modon lehet megadni - ram eseteben a 'res' kulcsszoval. Ez az igazi automata valtozo definicio, a valtozo vegleges helyet meg a fordito sem ismeri, azt a linker fogja kijelolni a linkeles alkalmaval. Ugyanaz a valtozo definialas ennel a modszernel:
A lenyegi kulonbseg tobbek kozott, hogy amig az abszolut programozasnal a valtozo helye szabalyozatlanul kerul kijelolesre, a relokativ modban szabalyozottan. Ez azt jelenti, hogy a memoria blokk kezdete es merete a linker scriptben meg van hatarozva, ha ezt tul lepne a valtozok ossz merete akkor hibaval leallna a linkeles - azaz lehet tudni, hogy baj van. Azonkivul a valtozo atfedesek is kiderulnek - abszolut modban annyi CBLOCK lehet annyi kezdo ertekkel amennyit csak akarsz, keverve EQU-s vagy mas valtozo definiciokkal, szoval ott elofordulhatnak balesetek egy nagyobb project eseteben.
Szia
serial portos égető nem jó neked? Üdv
Helló Trudnai.
Köszönöm a 'TÁV OKTATÁST' Lassan de gyűlnek az anyagaid. Ezeket mindig kimásolom, és témánként rendszerezve egy .txt file-ben elteszem. És ha kell előveszem, és olvasom, olvasom, olvasom. ![]() Köszönöm, jó hétvégét.
Sziasztok, nekem az lenne a kérdésem, hogy a PIC16F628-asnál, mit jelent a végén az A jelzés? azért kérdem csak mert az A nélkülit nem tudja égetni a pickit2 az A jelüt pedig igen az mplab szerint.
Üdv: Doncso
Mind a kettőt tudja égetni a PK2 a saját programjával.
Köszönöm urak!
![]() Csak azért gondoltam ,hogy nem tudja égetni mert leszedtem az MPLAB v8.10-et, a Configure -- Select device fület megnyitva kiválasztottam az égetni kivánt PIC-et, nevezetesen a 628-ast, és nem zöldült be a PICKIT2 melletti állapotjelző csak az A jelzésű 628-asnál, ezért gondoltam ,hogy nem tudja, egyébként mit jelent pontosan az ,hogy a saját programjával? A pickit2 nek van saját progija is? Mert akkor szeretném megkérdezni a nevét. Üdv: Doncso
Meglepő módon PICkit 2 a progi neve
![]() Ezen az oldalon vannak a PICkit2 cuccai: Bővebben: Link Ez pedig a link a telepítőre: Bővebben: Link
Helló Trudnai.
A következő a kérdésem: Ez a program rész többször előfordul az én kis programomban. movlw HIGH ForwardString ; load high pclath betöltjük a PCLATH movwf PCLATH movfw charF ; set W = 3 * charF ; addwf charF, W ; / addwf charF, W ; / addwf PCL, F lehet e ebből subrutint, vagy bármit írni , hogy memóriát sporoljak. A gondom az, hogy van amikor végig megy, van amikor kiugrik belőle. (0 vagy attól eltérő a w) Szerintem az "csúnya dolog" egy subrutinból kiugrani. Gondolom Én. Köszönettel
Szia Sendi,
Eloszor is nekem ez nem stimmel igy, ugyanis ha PCL tulcsordul, akkor PCLATH nem inkrementalodik. Tehat valami ilyesmi kellene inkabb: movlw HIGH ForwardString ; load high pclath betöltjük a PCLATH movwf PCLATH movfw charF ; set W = 3 * charF ; addwf charF, W ; / addwf charF, W ; / addwf PCL, W ; <-- Meg nem ugrunk el! btfsc STATUS,C ; ha tulcsordult PCL incf PCLATH ; <-- akkor itt noveljuk a PCLATH-ot... movwf PCL ; na most mar ugralhatunk... Masik, hogy icipicit lehet ezen nyomni, a 3* szorzason lehet 1 utasitast optimalizalni: rlf charF, W ; set W = 2 * charF ; addwf charF, W ; set W = 3 * charF ; Ugye az rlf-el shiftelessel beszorozzuk 2-vel a charF-et es az eredmenyt a W-be taroljuk el, aztan megint hozza adjuk a charF-et a W-hez... A masik, hogy igen, szubritunbol kiugrani nemcsak csunya, de hibakhoz is vezeto lehet. A PIC0nek szemben a PCs Neumann felepitessel Hardward architekturat alkalmaz. Roviden a kulonbseg, hogy a program memoria, a ram es a stack ezek elkulonulnek, aminek van elonye is meg hatranya is. Az elonye hogy biztonsagosabb a rendszer (ugye nehezebb hackelni a programot, ill stack manipulacio nem lehetseges illegalis parameterek megadasaval), a masik, hogy igy senki sem tud hackelest csinalni, tehat mikor CALL-al ugrasz akkor a visszateresi cim beirodik a verembe es RETURN/RETLW -vel kiolvasodik, de az eredeti PIC-ben nincs mas lehetoseg a stack manipulalasara (18F-eknel van). Szoval CALL-lal hivogatod a rutinod es nem tersz vissze RETURN-el akkor szepen betelik a verem es beallitas kerdese ez hibanak szamit-e - de ha nem tersz vissza akkor nyilvan erdemesebb GOTO-val menni oda mar eleve. Szoval a GOTO elott el kellene tarolni akkor a PCL-t egy seged valtozoba, es akkor az ADDWF PCL helyett a segedvaltozot kellene a W-hez hozza adni - kb ilyen egyszeru. Azonban akkor mar nem is kell PCL-t tarolgatni, eleg ha kozvetlen a tabla cimet teszed el, tehat: Ezt sajnos nem lehet meguszni ha altalanos rutint akar az ember (goto-val egyutt ugye 5 utasitas): movlw HIGH ForwardString ; load high pclath betöltjük a PCLATH movwf PCLATH movlw LOW ForwardString movwf TABLACIM goto RELATIV_GOTO ... ... .... RELATIV_GOTO rlf charF, W ; set W = 2 * charF ; addwf charF, W ; set W = 3 * charF ; addwf TABLACIM, W ; <-- Meg nem ugrunk el! btfsc STATUS,C ; ha tulcsordult PCL incf PCLATH ; <-- akkor itt noveljuk a PCLATH-ot... movwf PCL ; na most mar ugralhatunk... Kerdes mi eri meg mert igy az eredeti 6 utasitasos megoldasod ha kijavitjuk hogy a PCLATH is jol kezelodjon le ugye akkor felmegy 10-re, az egyetlen optimalizalassal 9-re, ehelyett 5 utasitas az elokeszites es utana meg a 6 utasitas maga a relativ goto rutin (ami ugye igy kozos), szoval ki kell szamolni mennyit nyersz, de igy ugy hiszem korrekt lenne a program. Ha idozitest kell szamolni akkor ugye a GOTO az 2 ciklus ugyanugy a MOVWF PCL is, tehat 6+7 ciklus egy ugras.>>>>
Helló TRudnai.
Köszönöm a válaszodat. Igen, én is így éreztem, hogy nem tudok rövidíteni. De, hogy én mit gondolok, az nem sokat számít. Azt meg tudnád nekem mondani, hogy mire jó az a 3-mal szorzás? Köszönettel
A 3-al szorzas az nyilvan az amiatt van mert az elemek merete 3 a tombben. Tehat ha pl stringet tarolsz akkor az elemek szama 1 mert elfernek a karakterek 1 program szoban:
string DT "szovegecske" amibol ugye retlw 's' retlw 'z' retlw 'o' retlw 'v' ... ... lesz. De lehetnek kisebb rutinok is egyszeru tablazat helyett, pl: movlw 3 ; PCL+0 addwf szam1 return .. movlw 5 ; PCL+3 addwf szam2 return .. movlw 18 ; PCL+6 addwf szam3 return stb... ez 3 programszo meretu tomb ugye.
Helló Trudnai.
Amit leírtál, értem, köszönöm. De az én programomban mi a három? movlw HIGH ForwardString movwf PCLATH incf PCLATH movfw charF ; set W = 3 * charF addwf charF, W ; / addwf charF, W ; / addwf PCL, F ; szöveg_1 JumpToChar rowF, FORWARD_M JumpToChar rowF, FORWARD_E JumpToChar rowF, FORWARD_G . . . ; valahol lejjebb FORWARD_M addwf PCL, F retlw B'11111111' retlw B'00000010' retlw B'00000100' retlw B'00001000' retlw B'00000100' retlw B'00000010' retlw B'11111111' goto NextForwardChar FORWARD_E . . . FORWARD_G Köszönettel
Helló Trudnai.
Lehet hogy ez a három? add PCL,F retlw B' ' ; az aktuális goto NextForwardChar Köszönettel.
Watt, MPi-c és Trudnai!
Köszönöm a TIMER0-val kapcsolatos segítséget! Mostmár mindent értek! Watt-tól pedig külön elnézést hogy figyelmetlen voltam. Belerágtátok a számba... ![]() Azt meg tudnátok még mondani hogy miként lehet +1 külső kvarcot egy int lábhoz kapcsolni ami küldené be a jelet. Nem találtam ilyen rajzot a neten. úgy mehet hogy egy tranyát hajt a kvarc és az meg a bemenetre van küldve? most attól eltekintve hogy H vagy L szintet figyeljen az interrupt. Idézet: „JumpToChar rowF, FORWARD_M JumpToChar rowF, FORWARD_E JumpToChar rowF, FORWARD_G” Nyilvan ez a 'JumpToChar' egy makro, es epp 3 utasitasbol all.
Elvileg ha a kvarcot meghajtó kimenetet rákötnéd az int bemenetre, akkor az már elég lenne.
De nem értem, hogy ez miért lesz jó?
Helló TRudnai.
Igen az egy makró. És tényleg 3 utasításból áll. JumpToChar macro row, char movfw row ; put the proper row offset in W incf row, F ; increment the row goto char ; jump to the character endm ![]() Köszönettel.
Szia Sendi,
Na akkor megvan ![]() Valahol az MPLAB View menuben kell lennie egy Disassembly lising-nek, abban lehet megnezni milyen kodot generalt az assembler, es pl MPSIM -mel egeszen jol lehet az ilyen dolgokat nyomon kovetni (Debug menu / Select tool / MPLAB SIM), F7 ill F8-cal lehet lepesenkent nezni mit muvel a kod. Debug menuben a hasznalhato billentyuk le vannak irva. Lehet benne torespontokat is elhelyezni es futtatni F9-cel pl, vagy F6-tal resetalni a "chipet". Utana View menu / Special file register - ablakban lathatod a WREG, FSR, STATUS stb registereket, illetve View / File register -ben kell latnod a sajatjaidat, vagy ugyanott watch ablakban is lehet figyelni azokat amiket kivalasztasz figyelesre. Hasznos eszkoz foleg tanulni de algoritmusok belovesenel is nagyon sokszor jol jon.
Szia! Valahol olvastam hogy abból (32,768Khz) könnyű kivenni az 1s-t és nagyon pontos órákhoz, számlálókhoz ezt a megoldást javasolják. Azért mondjuk lehetne egy 3,768Mhz-s kvarcot is először ugye 4-gyel mivel ez akkor nem külső jelgenerátor hanem a pic-t hajtja. Majd 256 előosztás TMR0. Akkor 125-öt kapok ami aztjelenti hogy ehhez kellene igazítani a ciklust is. 125 léptetés után kapnám meg az 1s-t ha jó a gondolatmenetem. Bár aztsem tudom még hogy milyen ciklust kellene alkalmazzak vagy milyen fügvényeket de arra gondoltam hogy minden 1s-os megszakításnál egy váltózó értékét növelném 1-egyel. És ezt a váltózót kellene minden megszakításnál ellenőrizni hogy mennyi az értéke, ezalapján lenne 60s-ig zárva a relay 1s-ig nyitva majd újra mindez. A Timer1 az 16bites tudtommal. Az meddig számolgat alapesetben ha TMR0 256-ig?
Jó a gondolatmenet, csak egy tizedezvesszőnyit tévedtél. 3,2768MHz-es kvarcról 1:128 arányú előosztót kell választani, és akkor másodpercenként 25 megszakítás keletkezik.
Fejből nem tudom melyik timer az, de van olyan, amelyikre direktben rákötheted a 32768Hz-es kvarcot, és akkor az hajtja a timert. A processzor meg eközben mehet belső oszcillátorról is. Azt hiszem a 12F675 is tud ilyen mutatványt csinálni, de a nagyobbak mind tudják. A 16 bites timer alapesetben 2^16=65536 ciklus után csordul túl. A kilohertz jele kHz, a megahertz jele pedig MHz.
Timer1 az amelyik sok PIC-nel tamogatja az un LP modot, magyaran egy alacsony energiaszuksegletu oscillatort lehet megvalositani a 32768Hz kristallyal - a szapsegihaba ahogy mondod, hogy 16 bites es ezt a kristalyt 15-tel kellene osztani hog 1s-t kapjunk - sajnos jobb lenne egy 8 bites szamlalo 128-as eloosztoval
![]() Ezt ketfelekepp lehet feloldani: Vagy van egy masik timer amit indig szinkronizal az ember ehhez es az adja a masodpercenkenti vagy akar gyorsabb megszakitasokat, vagy pedig a timer1 regiszter minden megszakitas alkalmaval egy adott ertekkel fel kell tolteni (pl a legfelso bitet bebillenteni mindig hogy 1s megszakitast kapjunk. De ez utobbi esetben figyelembe kell venni, hogy bebillenteskor ha jol emlekszem ket ciklus kimarad. Azt hiszem szilva kiserletezte ki az orajan hogy nem mindegy mikor tortenik ez az inicializalgatas es van egy pont a megszakitasban ahol ha elvegzi az ember eleg pontos orat lehet kapni. A 3,2768MHz kristallyal meg sohasem dolgoztam, de ugy szamolom hogy 65536-tal kellene osztani, hogy 50 megszakitast kapjunk masodpercenkent.
És szerinted az én esetemben milyen ciklus vagy figyelés lenne jó a váltózó értékhez. Esetleg egy végtelen ciklusba beleágyazni 2db for ciklust? vagy while? Netán sima if?
Végülis meg lehet csinálni for-ral és while-al is, de egyszerűbb if-el egy végtelen ciklusban. Valami ilyesmi kell, ha a timer1 flag másodpercenként egyszer billen be. Ha többször, akkor ahányszor bebillen, annyiszorosát kell az 59 és a 60 helyére írni.
Köszönöm szépen! Ez így sokat segített. Remélem menni fog bár a fele már ittvan
![]()
Kezdőknek a "PIC" vonalon gondolom nagy segitség lesz ez az oldal , ma találtam. Ha ismeritek akkor bocsi.
http://t-t.freeweb.hu/elokep/pic/felhkk.htm |
Bejelentkezés
Hirdetés |