Fórum témák
» Több friss téma |
Fórum » PIC - Miértek, hogyanok haladóknak
Idézet: „Mennyire működőképes az a dolog, hogy a program futása alatt dugom rá a készülékre az I2C-n kommunikáló eepromot és másolom rá az adatokat? Persze valami masszív csatlakozón keresztül... Lehetséges ez, vagy megfagy az egész?” Lehetséges szerintem, csak megfelelően le kell kezelni az adott helyzetet. Tehát ha véletlenül olyan részre fut a program, ahol az I2C eszközzel kommunikálnia kellene a PIC-nek, akkor ezt a helyzetet valahogy érzékelni kell, tehát hogy ne várjon a PIC a külső eszköz elérésére/válaszára végtelen ideig. Idézet: „Mennyire működőképes az a dolog, hogy a program futása alatt dugom rá a készülékre az I2C-n kommunikáló eepromot és másolom rá az adatokat?” Működőképes, amennyiben a kontrollerben futó program képes rá. Hogy az képes-e rá, az már rajtad múlik. Idézet: „Valamint azt is szeretném megkérdezni, hogy mekkora a maximum sebesség, amivel kommunikálhat a p18f4520-as RS232-őn a PC-vel? Most 9600 baudon megy, és én nem láttam sehol a datasheet-ben korlátot. Ez azt jelenti, hogy nyugodtan emelhetem?” A legtöbb PC oldali vevő szabványos sebességeken hajlandó csak kommunikálni. Ha be tudod állítani a pic-ben úgy, hogy 2-3% pontossággal egyezzen a szabványos sebességgel, akkor mehet annyin. Idézet: „Mekkora a maximum, amin még érdemes kommunikálni?” A lehető legkisebb, ami még elég a feladathoz. Nem kell csak azért 115200bps sebességet használni, mert lehet, ha a feladathoz elég a 9600bps is.
És a Pickit2 programmal is be lehes égeni a .HEX és .ASM fájlokat? Egyébként melyik mi (.ASM, .HEX)? Azthiszem a .HEX az a program. A .ASM az valamilyen programnyelven megírt program amit .HEX-é fordítanak le haxa kódba?
Idézet: „És a Pickit2 programmal is be lehes égeni a .HEX és .ASM fájlokat?” Mivel arra van kitalálva... Idézet: „Egyébként melyik mi (.ASM, .HEX)?” A .hex fájl a lefordított program, ami a kontrollerbe kerül. A .asm az a forráskód asm nyelven, ebből csinál a fordító hex fájlt.
Potyo megelőzött, de a lényeget leírta. Az asm emberi nyelven van, azért, hogy a programozó könnyebben megértse, mit csinál (forráskódnak is hívható, kommenteket tartalmazhat). A hex állomány a forráskód fordítása gép kódra; ezt a kódot a processzor a saját logikája szerint értelmezi, és végrehajtja, emberi értelmezésre nem igazán alkalmas. Ebből következően beégetni csak a hex kódot tudod, amit az asm-ből a fordítóprogram (pl. MPASMWIN) hoz létre.
Egy példa 16F-hez: asm-ben azt írod, BCF STATUS, C; ennek a hexa megfelelője 0x10 0x03 lesz, persze 14 biten ábrázolva.
Nagyjából értem, de ezt nagyon nem értem "Egy példa 16F-hez: asm-ben azt írod, BCF STATUS, C; ennek a hexa megfelelője 0x10 0x03 lesz, persze 14 biten ábrázolva." Igaz hogy kb félig ismerek 3-4 programozási nyelvet, de ezt nem értem.
Melyik reszet nem erted? Azt gondolom erted, hogy egy elektronikai alkatresz, legyen az CPU vagy MCU vagy ASIC vagy barmi az nem fogja neked megerteni mire gondoltal, ezert egy szamara ertheto formatumban, binaris szamokban kell megmondani mit csinaljon?
Amugy Szilvat kerdezd meg, epp ma fejtette ki, hogy igazi programozo .HEX-ben programozik Idézet: „Amugy Szilvat kerdezd meg, epp ma fejtette ki, hogy igazi programozo .HEX-ben programozik” Ez engem is érdekel. Hol fejtette ki?
Lapozz fel egy adatlapot, az utasításkészletet összefoglaló táblázatot keresd. Minden utasításnak ott a bináris "leírója", a bitpozíciók magyarázatával.
Az előbbi példánál maradva: BCF f, b --> 01 00bb bfff ffff, ahol b a bitet, f a regisztert címzi meg. A regisztereknél visszakeresve STATUS címe a 0x03 (bár mindegyik bankban megvan, de a fordító ezt szokta behelyettesíteni), a C bit a 0. bitje, innen a parancs: 01 0000 0000 0011 binárisan. Idézet: „Ez engem is érdekel. Hol fejtette ki?” MSN-en, benti gepemen el van mentve az utokor szamara , de ne egy magas szintu tudomanys fejtegetest kepzelj el, csak hulyeskedtunk, meg vissza sirta a Z80-ast mikor meg hexaban programozott meg en is a 6502-t hasonlo okokbol.
Helló Mindenkinek.
Nagyon primitiv kérdésem van, de órák óta nem tudom a választ. Irtam egy egyszerű multiplexelős programocskát tanulás céljából. De a PORTB-t nem kezeli. Most teljesen leegyszerűsítettem a programot, és csak 1-ket akarok kiírni a B és D portokra. A D-re kiírja a B-re nem. És nem jövök rá hogy miért nem. MPLAB-t használok. Bocs a primitiv kérdésért. Köszönettel
ANSELH-t is inicializalni kell hogy digitalis legyen, masik meg hogy a program vegen nincs semmi igy ujra es ujra elindul a programod... kellene ode egy vegtelen ciklus hogy lasd az eredmenyt normalisan...
Hiányzik a végéről a végtelen ciklus, a többit jónak nézem:
Illetve az ANSELH regiszter alapján az RB0-RB5 lábak analóg bemenetként vannak indulás után beállítva, de ezek elvileg nem számítanak, ha a TRISB regiszterben átváltod kimenetté a lábat. De azért töröld az ANSELH regisztert is, hogy a későbbiekben amikor csak a PORTB egyes bitjeit akarod változtatni, akkor az RMW problémát megelőzd.
En is ezt olvasom a datasheeten, de erdekes modon ha szimulatorban kiprobalom akkor a bitek nem allnak be magasba a PORTB-n...
Errataban sem talaltam utalast arra vonatkozoan, hogy ez rosszu szerepel a doksiban, es most nincs keznel 887-em, hogy leteszteljem, de ha Sendinek igy viselkedik valosagban(?) akkor a szimulacio jo. Sendi, szimulatoron probaltad csak vagy a valosagban is?
OFF
Hát igen, annak idején 8085-tel kezdtem, majd jöttek a Z80-nal szerelt gépek. Mivel akkoriban nem volt túl egyszerű assemblerhez jutni, internet meg még egyáltalán nem létezett, kénytelen voltam papírokból megtanulni a proci programozását. Később került valahonnan egy Z80 információs kártya, ami rendkívül népszerű lett, szinte kötelező segédeszközévé vált minden programozással foglalkozó embernek. A Z80 teljes utasításkészle rajta volt táblázatosan, meg mindenféle hasonló jók. Kb. egy A4-es méret volt, de 3 felé hajtva harmonikaszerűen, talán láttak mások is ilyet akkoriban. Szóval én elég sokáig vidáman programoztam hexában Z80 alapú gépeket, ha kellene, kis gyakorlás után még ma is menne. PC-s procikat meg Atmeleket, PIC-eket már nem tudnék hexában programozni, de még nem késő megtanulni ON
Pill. úgy tűnik, hogy egy nagyon egyszerü megoldás van a "leállásra"
eredeti: DS_FF: ;várj mig FF-től elt‚rő jön call dsread addlw 0x1 btfsc STATUS,Z goto DS_FF return változat: DS_FF: ;várj mig FF-től elt‚rő jön movf Tcs,w ;ha a Tcs=0 megszakitásból jött - adatforgalomhiba!! btfsc STATUS,Z return call dsread addlw 0x1 btfsc STATUS,Z goto DS_FF return Tudom, ez így nem szép, de hibakereséshez jó. Ezzel még nem sikerült lefagyasztani a rendszert. A kábelem 4 eres lapos telefonkábel és a jelvezeték a föld és a táp között megy, szerintem ezért lehet viszonylag zavarvédett. A hosszú vezetéken történő adattovábbitásről van egy feltevésemjól gondolom???): Mivel egyszerre csak 1 irányba van adattovábbitás a vezeték hullámellenálása miatt jelkésleltetés kialakul ugyan, de ennek ilyen sebességek mellett nincs hatása. Mivel mellette nincs másik jelvezeték ami rászórhatna nem okoz problémát. Gondolatébresztőnek: sima telefonvezetéken 10Mbit/s több km hosszan.
Most nincs előttem 887 doksi, mert nem a saját gépemnél ülök, de abban nincs valami konfigbit, ami bizonyos portbitek indulási állapotát állítja be? Vagy ilyesmi csak 18F-esekben van?
A lényeg az, hogy ne ragadjon bele egy adatra várva, a szépség nem számít. Ha jól értem egy Timer megszakítást indítasz ami ha lejár az adat beérkezte előtt, akkor törli a Tcs változót? Ide elég lenne egy bit is, de a lényeg megvan most is..
Helló Trudnai
Igen a szimulátoron próbálom (PicKIt2 és 16F887) Csináltam egy multiplexert, szépen végig megy az adatokon, ki is írja őket a PORTD-re (a watch ablakban) de a tranzisztor vezérlő PORTB-n semmi változás. Ha a PORTB-t átírom PORTC-re akkor mutatja a digitléptetést. CSak szerettem volna tudni, hogy C-vel miért megy, és B-vel meg miért nem. Hiszen tanulni szeretnék. És a PORTB-t az előző kis programban sem tudom írni. (mintha nem is látná) Köszönöm az ötleteket, és ha megtaláljátok a megoldást akkor azt is. Köszönettel.
Szoval a
BANKSEL ANSELH CLRF ANSELH nem segit?
Ez fut:
ANSELH törlése nélkül nem ment. Idézet: „Gondolatébresztőnek: sima telefonvezetéken 10Mbit/s több km hosszan.” De az szimmetrikus jelvezeték és csavart érpár.
Helló trudnai
Megcsináltam amit javasoltatok. Ha PORTB vel futtatom semmi nem történik (nem írható) Ha átírom PORTC re akkor tökéletes.
Helló kobold
Ez valóban működik, köszönöm. Megint tanultam. És elnézést az "egyszerű" kérdéseimért. Köszönettel.
Szia Sendi,
Hat igen, a BANKSEL nem art ha ott van Amugy elmeletileg portot ugy kell inicializalni, hogy meg mielott a TRISx-t piszkalod a megfelelo portot beallitod alapallapotra - ez legtobbszor 0. Ez azert kell, mert mikor kiadod a TRISx inicializalast akkor a PORTx azonnal beall arra az allapotra ami a latch registereben eppen van, ha ez csupa 1 akkor magasra valt, majd te leteszed 0-ra de egy tuske azert megjelenik egy pillanatra ami nem biztos, hogy kivanatos. Van olyan modszer amugy amikor nem is a PORTx regsztereket hanem a TRISx-eket piszkalva all elo a kivant kimenetet. Tehat esetedben a CLRF PORTB es CLRF PORTD a TRISB ill TRISD beallitasok elott kellene legyen nem pedig utana - termeszetesen a megfelelo BANKSEL-ekkel ugyelve, hogy mielott a PORTx-et piszkalod BANKSEL PORTx legyen ill mielott TRISx akkor BANKSEL TRISx, majd mielott megint PORTx-et irsz ujfent BANKSEL PORTx...
Helló trudnai
Köszönöm. Lassan de haladok. Mint a mondás szerint: Szerencse, hogy lassan megyek, mert nem tudom, hogy jó irányba-e. Köszönettel.
helló!
Kezdő PICes vagyok és megpróbálkoztam az időzíttésel, de nem akar működni a program a próbapanelon. ledeket kellene neki bekapcsolnia 1sec időzítéssel majd 3 mulva megint.ha segíteni udna valaki megköszöszönném. íme a program: list p=pic16f84, r=dec, l=0 include "p16f84.inc" ;***** CONFIG ************************************************************ __CONFIG _XT_OSC&_CP_OFF&_WDT_OFF ;Kvarc oszcillátor, kódvédelem ki, wdt ki ;***** DEFINES ************************************************************ INTCON_VAL EQU B'10100000' OPTION_VAL EQU B'10000111' ORG 0 GOTO START ORG 4 CBLOCK 0X0C TAR OVF ENDC START BANKSEL TRISA ;Váltsunk a TRISA MOVLW B'11111111' MOVWF TRISA ;PORTA INPUT LESZ MOVLW B'00000000' MOVWF TRISB ;PORTA OUTPUT LESZ BANKSEL PORTB ;Váltsunk a PORTB BCF STATUS,RP0 movlw INTCON_VAL movwf INTCON ; set INTCON BSF STATUS,RP0 movlw OPTION_VAL movwf OPTION_REG ; set OPTION_REG REAL CALL ZOLD CALL PIROS GOTO REAL ZOLD MOVLW B'01010101' MOVWF PORTB movlw .15 ;a 1 mp-hez 1tulcsorulas ;eloszor W-be movwf TAR ;majd W-t a tar-be CALL VAR ;most hivom meg a varakozo rutint PIROS MOVLW B'10101010' MOVWF PORTB movlw .45 ;a 3 mp-hez 45 movwf TAR ;majd W-t a tar-be CALL VAR VAR btfss INTCON,T0IF ;TMR0 tulcsordult-e ? goto VAR ; ha nem akkor var-ra bcf INTCON,T0IF ; ha igen torolni kell a T0IF incf OVF,F ; ovf novelese minden ;tulcsordulasnal, ovf regiszterbe movf TAR,W ;varakozas addig, mig ovf-tar=0 subwf OVF,W btfss STATUS,Z ;a zero-flag akkor 1, ha x ovf-tar=0 goto VAR ; meg nem tar-szor csordult tul (tar<>ovf) clrf VAR ; (most tar=ovf) ovf torlese a kovetkezo idoziteshez RETURN ; vege, letelt az idozites END
Sziasztok!
Kérdezni szeretném hogyan lehet megoldani hogy egy adott címen lévő programrészt többször futtasson le a mikrovezérlő? Mintha láttam volna valahol hogy GOTO "X" §3 vagy valami ilyesmit. De lehet hogy rosszul emlékszem. Vagy írjam meg rutinban és hívjam meg (CALL) "X" szer? Hogyan lehet ezt megoldani?
Egy regiszterben megadhatod a végrehajtási számot, a programrészt szubrutinba teszed, és nulláig leszámolgatva hívogatod. Pl.:
|
Bejelentkezés
Hirdetés |