Fórum témák

» Több friss téma
Fórum » PIC - Miértek, hogyanok haladóknak
Lapozás: OK   690 / 1320
(#) watt válasza Attila86 hozzászólására (») Feb 28, 2010 /
 
Így logikus. Nem néztem mélyebben utána, de így használtam, amikor -ref feszt használtam. Eleve akkor szoktak -ref feszt használni, mikor GND-nél nagyobb. Ekkor elég nehéz lenne GND-hez képest mérni a feszt. Tehát nem biztos, de elég valószínű.
(#) Sztyopa válasza watt hozzászólására (») Feb 28, 2010 /
 
A FET-ek a 2 cellás LiPo-ról mennek közvetlenül tehát 6-8,4 V körül kapnak. A FET driver pedig arról a charge pump ról kapja a tápot ami az aksiról közvetlenül működik tehát valamivel kevesebb mint 12-17 voltal táplálja a FET-drivert. De mondjuk visszatérve a PIC-es témára, a PIC mindkét lába (RE3, RE4) alacsony szinten marad ezt elég egyszerű kimérni, és ez az amit nem értek hogy miért, de tényleg köszönöm a tippeket volt egy-kettő amire nem gondoltam.
(#) watt válasza Sztyopa hozzászólására (») Feb 28, 2010 /
 
Ja értem már, én azt hittem, hogy a nyers fesz magasabb! Így jó lehet! A fura az, hogy ha direktben kapcsolod a kimenetet, akkor jó! Nem hiszem, hogy a ECCP modul belül lenne rossz! HA igen, azt szerintem még a gyárban is kicserélik és kettőt adnak helyette!
(#) szilva válasza watt hozzászólására (») Feb 28, 2010 /
 
Ez egy apróhiányosság, én is láttam, de tulajdonképp a gyárilag ajánlott híd is így néz ki a PIC adatlapban. Ilyenkor az történik, hogy a felső FET-ek source-követőként viselkednek, és a G-S között kialakul az a nyitófeszültség, ami a terhelőáram áteresztéséhez kell a FET-nek. Ez tipikusan pár V szokott lenni, ha megfelelően kis nyitófeszültségű FET-et választunk (pl. IRLZ), akkor elhanyagolható.

Persze az igazán korrekt vagy a FET-meghajtó lenne, vagy "felülre" P-FET-ek beépítése, természetesen ilyenkor az azokat vezérlő kimeneteknek invertáltaknak kell lenniük.
(#) szilva válasza Sztyopa hozzászólására (») Feb 28, 2010 /
 
Én megpróbálnék még egy másik ECCP modult, mirlőtt PIC-et cserélek. Lehet, hogy tényleg silicon-bug lesz, és a cseredarab is ugyanezt fogja csinálni. Mert a kódból, az adatlapból meg az lst-ből kiindulva nagyon úgy tűnik, hogy azt kellene csinálnia, amit Te is elvárnál tőle.

Szerk.: még az jutott eszembe, hogy azokon a kimeneteken nincs-e véletlenül valami alternatív funkció, ami bezavarhat a működésbe? Bocs, de ennek nem néztem utána, csak bevillant, hogy láttunk már ilyet is.
(#) watt válasza szilva hozzászólására (») Feb 28, 2010 /
 
Idézet:
„de tulajdonképp a gyárilag ajánlott híd is így néz ki a PIC adatlapban.”

Az csak egy elnagyolt elvi rajz. Ha a FET nincs redesen kinyitva, túl fog melegedni. Persze apró motornál ez nem történik meg...
(#) Sztyopa válasza szilva hozzászólására (») Feb 28, 2010 /
 
Jó hírem van a probléma megoldódott. Szerintem érdekes hogy hogyan ezért leírom részletesen. Ez a PIC18F66J55 ugyanabba a kontroller családba tartozik ahova a nagyobb testvére a 80 lábas PIC18F86J55. Elvileg a kettő ugyan az de az egyik 80 láb a másik 64. Azonban 80 lábas kontrolleren az ECCP3 (jelen helyzetben nem működő) két lába programozható hogy a H vagy az E portra kerüljön, ugye H portom nekem nincs én a 64 lábút használom. Ugyanakkor az is programozható, hogy egyes lábak külső memória buszt alkossanak-e vagy ne és ez is érinti a két kritikus lábat. Mindezen beállítások a Config bitek állítgatásával érhetőek el. Én nem foglalkoztam ezekkel a dolgokkal tekintve a kontrolleremben az adatlap szerint ezek a funkciók nincsenek benne. Azonban jött az ötlet és a projektet átkonfiguráltam úgy hogy azt higgye az MPLAB és a C fordító, hogy egy PIC18F86J66-ost szeretnék programozni. Ugye itt a kódban a megfelelő config biteket beállítottam (különös tekintettel azokra, amik a 80 lábú problémákkal függenek össze) és felprogramoztam a kontrollert mintha ő egy 80 lábú lenne. A PicKit-2 egy warning –on kívül hiba nélkül felprogramozta a kontrollert. És működött szépen csinálta amit kell. Sőt ezután a projektet visszakonfiguráltam az eredeti kontrollerre, és így ismét rátöltve a progit ismételten működött. Köszönöm még egyszer a beszélgetést watt-nak és szilva-nak kaptam néhány ötletet, ami végül ide vezetett.
(#) watt válasza Sztyopa hozzászólására (») Feb 28, 2010 /
 
Ugye mondtam, hogy nem rossz, a PIC!
Nem semmi történet! Gratulálok a megoldáshoz!

Ja igen! A szimulátor meg eláshatja magát, jelen esetben!
(#) szilva válasza Sztyopa hozzászólására (») Feb 28, 2010 /
 
Gratulálok, hogy sikerült elcsípni a hibát!

Egy kérdésem lenne: a config biteket az MPLAB config editorával állítottad-e vagy a forráskódban vannak benne?
(#) szilva válasza Attila86 hozzászólására (») Feb 28, 2010 /
 
A PIC az A/D átalakítást szukcesszív approximációval oldja meg. Ennek során bitről bitre (a legmagasabb helyi értékűtől a legalacsonyabb felé haladva) előállít egy analóg jelet a belső D/A-jával (kapcsolt ellenálláslétra), és ezzel hasonlítja össze az analóg bemeneten lévő jelet. Az összehasonlítás eredményeképp eldől, hogy az adott ciklusban vizsgált bit magas vagy alacsony lesz-e. Mivel a külső Vref-ek használatával a belső D/A ellenálláslétrájának alsó és felső pontján lévő feszültséget állítod be, így ilyenkor nincs köze az összehasonlításnak a GND-hez.

Ugyan nem próbáltam még külső referenciát használni, de azt kell gondoljam, hogy ilyenkor sokkal kevésbé szabad zajosnak lennie a mérésnek, mint a Vss-Vdd referencia használatánál. Természetesen a Vref- és Vref+ értékekre meg kell nézni az adatlapot, hogy mik között mozoghatsz, sőt, a (Vref+)-(Vref-) érték is adatlapban meghatározott tartományba kell, hogy essen.

Azt hiszem, sokan örülnénk, ha megosztanád itt, ha lesznek gyakorlati tapasztalataid etéren.
(#) Sztyopa válasza szilva hozzászólására (») Feb 28, 2010 /
 
A kódban adtam meg. Ugyanakkor pontosítanám az előző hozzászólásomat. Nem állítottam vissza teljesen a projektet, a C kódban a 86j55-ös header fájlt hagytam benn. Tovább nézegettem, hogy mi lehet és kiderült, hogy a 66j55-ben az elvileg nem implementált config biteket a C fordító 0-nak veszi ha a 66j55 van beállítva a C fordító számára. Azonban ha a 86j55 akkor 1-nek veszi. Megnézve az egyes bitek jelentését 1-be kellene beállítani őket ahhoz hogy jól működjön a 80 lábú. Elvileg jól kéne működni akkor is ha 0-ba vannak állítva a 64 lábú PIC-en, mivel ott nincsenek implementálva ezek a funkciók de mégse működik jól...
(#) potyo válasza Sztyopa hozzászólására (») Feb 28, 2010 /
 
Próbaképp csináld meg a projektet a 18F66J55 header fájljával, majd zárd be a projektet, válaszd ki a 18F86J55-öt a select device alatt, majd import-al olvasd be az előzőleg elkészült hex fájlt, és csak módosítsd az említett, 18F66J55-nél nem létező konfig biteket, és exportáld hex-be, majd írd be a kontrollerbe 18F66J55-ként. Lehet, hogy elvileg nem létezik az a config bit, viszont a hardverben meg mégis benne van?
(#) Attila86 válasza szilva hozzászólására (») Feb 28, 2010 /
 
Úgy lesz majd.
(#) sucuka hozzászólása Feb 28, 2010 /
 
Kedves urak!
Az alább látható mintaprogram a gyakorlásom része, hibátlanul működik szimulálva és élesben próbapanelen is.
A kérésem csak az lenne, hogy "MEO-zzátok le" , és ha láttok olyant amit szerintetek kerülendő, akkor nyilatkozzatok, bármilyen észrevételt szívesen fogadok.
Tehát:
  1. processor       16F628A         ;eszköz definiálása
  2.         #INCLUDE        "P16F628A.INC" 
  3.         __CONFIG        0x332A         
  4.  
  5. ;-------------------------------------
  6.         CBLOCK 0x20
  7.                 A1                              ;késleltető rutinhoz
  8.                 A2                              ;tartozó fájlregiszterek
  9.                 WSAVE                   ;W regiszter "biztonsági mentése"
  10.                 IRANY                   ;irányváltás fájlregisztere
  11.                 PB                              ;PORTB értékénak ideiglenes "tárolója"
  12.         ENDC
  13. ;-------------------------------------
  14.         ORG     0x0000                  ;RESET vektor kezdőcíme
  15.         GOTO    START
  16. ;-------------------------------------
  17.         ORG 0x0004                      ;INTERRUPT vektor kezdőcíme
  18.         BCF             INTCON,RBIF     ;RB interrupt flag törlése
  19.         MOVWF   WSAVE           ;Regisztermentés
  20.         MOVF    IRANY,W         ;IRANY beolvasása
  21.         BTFSS   PORTB,6         ;PORTB 6. bit teszt
  22.         MOVLW   0x00
  23.         BTFSS   PORTB,7         ;PORTB 7. bit teszt
  24.         MOVLW   0x01
  25.         MOVWF   IRANY           ;IRANY tárolása
  26.         MOVF    WSAVE,W         ;regisztermentés visszaállítása
  27.         RETFIE                          ;visszatérés megszakításból
  28. ;-------------------------------------
  29. START:
  30.         BCF             STATUS,RP1              ;bankváltás: BANK1
  31.         BSF             STATUS,RP0
  32.         MOVLW   B'11000000'    
  33.         MOVWF   TRISB                   ;PORTB: RB(7:6) bemenet, RB(5:0) kimenet lesz
  34.         BCF             STATUS,RP0              ;bankváltás: BANK0
  35.         MOVLW   B'00000001'
  36.         MOVWF   PORTB                   ;PORTB alapértéke
  37.         CLRF    IRANY                   ;IRANY alapértékének beállítása
  38.         BSF             INTCON,GIE              ;Megszakítások engedélyezve
  39.         BSF             INTCON,RBIE             ;RB megszakításának engedélyezése
  40.        
  41. VISSZA:
  42.         BTFSS   IRANY,0                 ;IRANY vizsgálata
  43.         GOTO    BALRA
  44. ;-------------------------------------
  45. JOBBRA:
  46.         BTFSS   PORTB,0                 ;RB0 kimenet vizsgálata, ha 0 akkor forgatás
  47.         GOTO    FORGJ
  48.         MOVLW   B'00100000'            
  49.         MOVWF   PORTB                   ;RB5 bekapcsolása
  50.         CALL    DELAY
  51.         GOTO    VISSZA
  52. FORGJ:
  53.         MOVLW   B'00111111'             ;maszkoláshoz szükséges adat a W-be
  54.         ANDWF   PORTB,W                 ;PORTB maszkolása
  55.         MOVWF   PB                              ;és a kapott érték tárolása
  56.         CLRC
  57.         RRF             PB,W                    ;bitforgatás az ideiglenes regiszterben
  58.         MOVWF   PORTB                   ;a forgatott érték kiírása PORTB-re
  59.         CALL    DELAY
  60.         GOTO    VISSZA
  61. ;-------------------------------------
  62. BALRA:
  63.         BTFSS   PORTB,5                 ;RB5 kimenet vizsgálata, ha 0 akkor forgatás
  64.         GOTO    FORGB
  65.         MOVLW   0x01
  66.         MOVWF   PORTB                   ;különben fix érték kiírása
  67.         CALL    DELAY
  68.         GOTO    VISSZA
  69. FORGB:
  70.         CLRC
  71.         RLF             PORTB,F                 ;bitforgatás a PORTB-ben
  72.         CALL    DELAY
  73.         GOTO    VISSZA
  74. ;-------------------------------------
  75. DELAY:
  76.         MOVLW   D'150'
  77.         MOVWF   A1
  78. DEL:
  79.         MOVLW   D'255'
  80.         MOVWF   A2
  81. DEL1:
  82.         NOP
  83.         NOP
  84.         NOP
  85.         NOP
  86.         NOP
  87.         NOP
  88.         NOP
  89.         NOP
  90.         NOP
  91.         NOP
  92.         NOP
  93.         NOP
  94.         NOP
  95.         NOP
  96.         NOP
  97.         NOP
  98.         DECFSZ  A2,F            ;A2 csökkentése, ha elérte a 0-át
  99.         GOTO    DEL1
  100.         DECFSZ  A1,F            ;akkor A1 csökkentése is
  101.         GOTO    DEL
  102.         RETURN                          ;rutinból vissza
  103. ;-------------------------------------
  104.         END

Köszi!
(#) kissi válasza sucuka hozzászólására (») Feb 28, 2010 /
 
Szia!

Ami "megütötte" elsőre a szememet az az A2 feltöltése a GOTO DEL-el! Ha direkt csináltad, akkor OK, de egyébként enélkül is működik, mert 0 után a következő kivonáskor 255 (-1) lesz a tartalma!
A másik: a BANK váltásnál célszerű a BANKSEL makrót használni!

Steve
(#) szilva válasza sucuka hozzászólására (») Feb 28, 2010 / 1
 
A config megadásánál érdemes az inc fileban megtalálható definíciók logikai és kapcsolatával (&) megadni a kívánt konfigurációt, az sokkal beszédesebb, mint egyetlen hexa érték. Másik PIC-re portoláskor is hasznos segítség, mert lehet, hogy hozzá sem kell nyúlni a confighoz, hiába vannak a másik típusnak máshol az adott beállításhoz tartozó config bitjei. Ha mégis hozzá kell nyúlni, akkor is a beszédes nevek alapján sokkal egyszerűbb dolgod lesz.

Az interruptban a context mentés és -visszaállítás nem megfelelő, nézd meg az adatlapot erre vonatkozóan! Szintén ehhez kapcsolódik, hogy a mentésre használt tárhelyeket érdemes bankfüggetlen területen kijelölni.

Egyebekben jól olvasható, átlátható a kód.
(#) sucuka válasza kissi hozzászólására (») Feb 28, 2010 /
 
Ja, elfelejtettem mondani, hogy a késleltető rutin koppintás, de igazad van, nem nagyon néztem át, működött, így használni kezdtem, több gyakorló programomban benne van.
Ezzel a bankváltással kapcsolatban normális dolog, ha a fordító pár warning kíséretéében közli velem, hogy "Register operand not in bank x"? Konkréten BANK0-ra érti.
(#) Hp41C válasza sucuka hozzászólására (») Feb 28, 2010 / 3
 
Szia!

Pokoli nagy szerencséd van: A programodban alig használod a STATUS bitjeit, csak a C értékére van szükséged néha, a megszakítási rutin pedig nem állítja át. Ha bele kellene tenni egy kis módosítást, ami a Z bit értékét is felhasználná, már nem is működne jól....

Csak a továbbfejlesztés és a tiszteséges mentés miatt:

A 13. sor utánra és a 10. sor helyett:
  1. cblock 0x70
  2.     SSAVE
  3.     WSAVE
  4.   endc


Ind.: A 0x70-7F címtartomány minden lapról ugyanazt a 16 regisztert éri el (common bank).
A 20. és a 21. sorok közé:
  1. swapf STATUS,w ; A w -be mentjük a STATUS étékét
  2.   clrf STATUS  ; A 0. bankot fogja használni a megszakítási rutin
  3.   movwf SSAVE ; Elmentjük a STATUS értékét


Ind.: Már egy movf IRANY,w elrontja a Z bit értékét....
A 26. sor utánra:
  1. swapf  STATUS,w ; Visszaállítjuk a STATUS értékét és a kiválasztott bankot.
  2.   movwf STATUS

A 27. sor helyett:
  1. swapf WSAVE,f  ; A movf utasítás elrontaná a nagy nehezen visszaállított Z bit értékét
  2.   swapf WSAVE,w


Ugyanis:
Tegyük fel, hogy a továbbfejleszett programodban a következő rész van:

  1. Banksel  PR2
  2.    movlw 12
  3.    xorwf  PR2,f
  4.    btfss   STATUS,Z
  5.    addlw  6


A megszakítás a xorwf PR2,f utasítás után jut érvényre: A kiválasztott bank az 1. bank, a megszakítási rutinod az 1. bank változóival végez műveletet, nem a 0. bankon definiáltakkal. A movf IRANY,w beállítja a Z bitet, aszerint, hogy az IRANY értéke 0 vagy sem. A visszatéréskor a movf WSAVE,w megint mást állít be a mentett W értéke szerint. A visszatérés után mi szerint döntson a feltételes elágazás.

A megszakítási rutin mentési feladatainál azt kell szem előtt tartani, hogy a bárhol bekövetkező kiszolgálás (a szándékosan végzett adatállításokon kívül) biztosítsa, hogy a megszakítás elötti állapot álljon vissza.

És még szerencse, hogy a 16F628-ban csak 2K programmemória van, a nagytestvérben 16F648A (már 4K) még a PCLATH regisztert is menteni - visszaállítani kell, ha a kód mérete > 2K.

Szia
(#) szilva válasza sucuka hozzászólására (») Feb 28, 2010 /
 
Igen, azzal csak figyelmeztet, hogy az adott regiszter nem a nullás bankban van, és neked kell külön gondoskodni a megfelelő bankról. A fordító nem ismeri fel a program folyását, hogy éppen az adott helyen jó bankot állítottál-e be, így inkább figyelmeztet. (Ezt a figyelmeztetést ki is lehet kapcsolni valahogy, de én lustaságból nem szoktam foglalkozni vele.)
(#) bbalazs_ hozzászólása Feb 28, 2010 /
 
Urak, valoszinuleg en nezek el valamit es nagyon keso is van , de mintha a CAN bus inicializalasa hibas lenne a PIC 18F2580 es 2680 adatlapokban is...

Azt irja, hogy akkor van config modban, ha B'100xxxxx' -t irunk a CANCON regiszterbe, majd a CANSTAT regiszterbol lehet ellenorizni, hogy tenyleg annyi-e.
Az adatlap gyari peldakodja erre:

WaitConfig:
movf CANSTAT, W
andlw '10000000'
tstfsz WREG
bra WaitConfig

Szerintem meg ez a rutin a 7. bit 0 volta eseten fog kiugrani a varakozo ciklusbol, nem?
Vagyis pont az ellenkezojet csinalja, de elgepeles nem lehet, mert tstfsnz utasitas nincs a PIC-ben.
(#) Hp41C válasza bbalazs_ hozzászólására (») Feb 28, 2010 /
 
Szia!

Elgépelés 1. sorral fentebb is lehet : xorlw '10000000'...

Szia
(#) kissi válasza sucuka hozzászólására (») Feb 28, 2010 /
 
A figyelmeztetéseket ki lehet kapcsolni, mert különben mindig írja és a tényleges hibát nagyobb programnál már keresgélni kell a sorok között!
A megszakítást nem néztem, tényleg hibás, ahogy a többiek írták, én az adatlapból szoktam "bekopizni" az idevonatkozó részt és kiegészítem!

A szimulációt ha alaposan végzed, akkor ezek azért kiderülnek !

Steve
(#) bbalazs_ válasza Hp41C hozzászólására (») Feb 28, 2010 /
 
Koszonom, de nem valoszinu, mert a tobbi bit 0 ertekeben nem bizhatunk. Esetleg akkor egy sor kimaradhatott - pont az, amit irtal.
(#) geri12 hozzászólása Feb 28, 2010 /
 
Köszi! A DS1307-nél maradok akkor.

Más:

Srácok lenne egy érdekes kérdésem, ami lehet hülyeség, de hátha van ilyen...

Előfordulhat az hogy egy LPT-s égető hibádzik égetéskor, és egy funkció nem úgy működik ahogy kéne? Persze a verify lefut rendesen.

Ezt azért kérdezem, mert tisztán emlékszem, hogy egy bizonyos óra projektnél volt egy olyan gondom, hogy 23:59-kor nem nullázott, hanem számolt tovább 24-el. (24:01-02-03......) Akkoriban LPT-n keresztül égettem. A forráskódban a "timekeeping"-be pontosítottam, és utána jó lett. És most jön az érdekesség! PICKIT2 clone-al programoztam a mai nap azt az eredeti forráskódot, ami ezt a hibát művelte. (tutira a hibás, eredeti) És láss csodát evvel égetve nem produlkálja azt a hibát.

Létezhet ilyen???
(#) trudnai válasza geri12 hozzászólására (») Márc 1, 2010 /
 
Nem, ilyen nem lehet. Vagy össze kevered a hex file-okat vagy épp nem jött elő a hiba valami oknál fogva. Keresd tovább a hibát és ne pazaroldd az energiad felesleges dolgokra
(#) geri12 hozzászólása Márc 1, 2010 /
 
Én is csodálkoztam volna, ha ez miatt...

Hmmm! Na az van hogy az eredeti tényleg hibázik, de csak akkor ha egy ideje megy az óra. Én tegnap úgy néztem meg hogy bekapcsoláskor 23:59-re állítottam, és akkor még jó volt. Viszont ha eltelik egy kis idő, akkor már nem. Magyarán ha beállítottam 23:30-ra és fél órát vártam, akkor már gond volt. Érdekes egy hiba. Az általam átírt le van egyszerűsítve, amivel működik is rendesen. Nyilván evvel nincs tovább foglalkozni!
(#) Moderátor hozzászólása geri12 hozzászólására (») Márc 1, 2010
 
Geri12!
Használd légyszíves a válasz gombot, hogy tudjuk kinek válaszolsz. Köszi!
(#) sucuka válasza Hp41C hozzászólására (») Márc 1, 2010 /
 
Igazán köszönöm, hasznos levezetés! Amint újra leülök mellé, átrágom magam rajta.
A swapf utasítás eszembe se jutott, nem tudom miért, de majd odafigyelek, hogy igyekezzek a lehető leghatékonyabb módszert alkalmazni.
Hátravan még a Flowcode alkalmazás megismerése, de ami késik, nem múlik.
(#) potyo válasza geri12 hozzászólására (») Márc 1, 2010 /
 
Ez pl. lehet megszakítási rutinban hibás regisztermentéstől is.
(#) Hujikolp hozzászólása Márc 1, 2010 /
 
Üdv!

Olyan problémával találkoztam, hogy a wörkbe teszek egy értéket, majd meghívom a táblát, viszont ott nem a megfelelő sorra ugrik, hanem teljesen máshova. Mplab szimulátorban néztem. A vicc az, hogy ugyan úgy használom a táblát, mint előtte a programban.

CIMKE
ADDWF PCL,F
RETLW 0X01
STB..
...
...
...
cimke2
movlw 0x00
call cimke
...
Az első táblát amikor elkészítettem, hasonló problémám volt, viszont nem tudom, hogy azt, hogyan oldottam meg, egyszer csak ment.
16F887

És ha van valakinek olyan ötlete, hogy hogyan kellene megvalósítani egy lefelé számláló órát, az adhatna egy kis tanácsot, mert nem akar menni ty
Következő: »»   690 / 1320
Bejelentkezés

Belépés

Hirdetés
XDT.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