Fórum témák

» Több friss téma
Fórum » PIC - Miértek, hogyanok haladóknak
Lapozás: OK   242 / 1318
(#) potyo válasza gtk hozzászólására (») Júl 11, 2008 /
 
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.
(#) trudnai válasza Sendi hozzászólására (») Júl 11, 2008 /
 
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
  1. CBLOCK 12
  2.     elso            ; erteke 12, novekmenye 1
  3.     masodik:1       ; erteke 13, novekmenye 1
  4.     harmadik:3      ; erteke 14, novekmenye 3
  5.     negyedik:0      ; erteke 17, novekmenye 0
  6.     otodik          ; erteke 17, novekmenye 1
  7.     ENDC

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:
  1. elso        res     1
  2. masodik     res     1
  3. harmadik    res     3
  4. negyedik    res     0 ; ezt nem tudom legalis-e
  5. otodik      res     1


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.
(#) mazso1988 válasza gtk hozzászólására (») Júl 11, 2008 /
 
Szia
serial portos égető nem jó neked?
Üdv
(#) Sendi válasza trudnai hozzászólására (») Júl 12, 2008 /
 
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.
(#) Doncso hozzászólása Júl 12, 2008 /
 
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
(#) watt válasza Doncso hozzászólására (») Júl 12, 2008 /
 
Mind a kettőt tudja égetni a PK2 a saját programjával.
(#) Norberto válasza Doncso hozzászólására (») Júl 12, 2008 /
 
Idézet:
„a PIC16F628-asnál, mit jelent a végén az A jelzés?”


Javított, továbbfejlesztett verzió.
(#) Doncso hozzászólása Júl 12, 2008 /
 
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
(#) szilva válasza Doncso hozzászólására (») Júl 12, 2008 /
 
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
(#) Doncso válasza szilva hozzászólására (») Júl 13, 2008 /
 
Köszi szépen, 1000 hála
(#) Sendi hozzászólása Júl 13, 2008 /
 
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
(#) trudnai válasza Sendi hozzászólására (») Júl 13, 2008 /
 
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.>>>>
(#) Sendi válasza trudnai hozzászólására (») Júl 13, 2008 /
 
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
(#) trudnai válasza Sendi hozzászólására (») Júl 13, 2008 /
 
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.
(#) Sendi válasza trudnai hozzászólására (») Júl 13, 2008 /
 
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
(#) Sendi válasza Sendi hozzászólására (») Júl 13, 2008 /
 
Helló Trudnai.

Lehet hogy ez a három?

add PCL,F
retlw B' ' ; az aktuális
goto NextForwardChar

Köszönettel.
(#) cpumaster hozzászólása Júl 13, 2008 /
 
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.
(#) trudnai válasza Sendi hozzászólására (») Júl 13, 2008 /
 
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.
(#) potyo válasza cpumaster hozzászólására (») Júl 13, 2008 /
 
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ó?
(#) Sendi válasza trudnai hozzászólására (») Júl 13, 2008 /
 
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.
(#) trudnai válasza Sendi hozzászólására (») Júl 14, 2008 /
 
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.
(#) cpumaster válasza potyo hozzászólására (») Júl 14, 2008 /
 
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?
(#) potyo válasza cpumaster hozzászólására (») Júl 14, 2008 /
 
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.
(#) trudnai válasza potyo hozzászólására (») Júl 14, 2008 /
 
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.
(#) proli007 válasza potyo hozzászólására (») Júl 14, 2008 /
 
Hello!

TIMER1

üdv proli007

Timer1.jpg
    
(#) cpumaster válasza potyo hozzászólására (») Júl 14, 2008 /
 
É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?
(#) potyo válasza cpumaster hozzászólására (») Júl 14, 2008 /
 
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.
  1. unsigned char szamlalo=0;
  2. ...
  3. while (1)
  4. {
  5.         if (tmr1flag)
  6.         {
  7.                 tmr1flag=0;
  8.                 szamlalo++;
  9.                 if (szamlalo==59)
  10.                 {
  11.                         rele_be;
  12.                 }
  13.                 if (szamlalo==60)
  14.                 {
  15.                         szamlalo=0;
  16.                         rele_ki;
  17.                 }
  18.         }
  19. }
(#) cpumaster válasza potyo hozzászólására (») Júl 14, 2008 /
 
Köszönöm szépen! Ez így sokat segített. Remélem menni fog bár a fele már ittvan .
(#) Sendi válasza trudnai hozzászólására (») Júl 14, 2008 /
 
Helló Trudnai.

Köszönöm:
(#) teodor hozzászólása Júl 15, 2008 /
 
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
Következő: »»   242 / 1318
Bejelentkezés

Belépés

Hirdetés
Lapoda.hu     XDT.hu     HEStore.hu
Az oldalon sütiket használunk a helyes működéshez. Bővebb információt az adatvédelmi szabályzatban olvashatsz. Megértettem