Fórum témák

» Több friss téma
Fórum » PIC - Miértek, hogyanok haladóknak
Lapozás: OK   392 / 1320
(#) delmur82 válasza watt hozzászólására (») Jan 18, 2009 /
 
Viszont szerintem ez alapján van csinálva:
http://www.geocities.com/vsurducan/electro/PIC/math/ds1620.txt

Érdekes itt is BCF CLK - nál olvassa ki. Én sem értem
(#) watt válasza delmur82 hozzászólására (») Jan 19, 2009 /
 
Ha már példálózunk, akkor a gyártó honlapjáról nézzünk példát.
Itt van egy sorrend a kivitelre C-ben:
  1. RST=1;
  2.     for (k=0; k<8; k++)
  3.        {
  4.         CLK=0;
  5.         DQ = (m & b);                                /* Send bit to 1620     */
  6.         CLK=1;
  7.         b=(b<<1);                            /* Setup to send next bit  */
  8.        }

Tehát:
1. Reset H
2. CLK L
3. Adat előkészítése a vonalon.
4. CLK H
Ez eddig okés, akkor nézzük az olvasást.
  1. k=0;
  2. b=1;
  3.     for (j=0; j<10; j++)
  4.        {
  5.         CLK=0;
  6.         if (DQ) k|=b;                                /* Read bit and or if = 1  */
  7.         CLK=1;
  8.         b=(b<<1);                            /* Setup for next read and or */
  9.        }

Nos, neked volt igazad, mert a gyár is a CLK L után olvassa be a bitet. Ezek szerint ezzel nem lehet baj.

Arra gyanakszom, hogy nem vársz elég időt a konverzió elkészüléséig. Ez akár 1sec is lehet, az adatlap szerint. Érdemes lenne a konverziós parancs kiküldése után, annak elkészültét vizsgálni a status bájt beolvasásával. Erre C-ben a példa:
  1. DELAY(.1);
  2. RST=1;
  3. Put1620byte(0xEE);                      /* start temp convert           */
  4. RST=0;
  5.  
  6. do
  7.    {
  8.     RST=1;
  9.     Put1620byte(0xAC);                       /* open status register    */
  10.     k = Get1620byte();                          /* get status byte      */
  11.    RST=0;
  12.    } while ( (k & 0x80) != 0x80 );                /*changed 0x80 to 0x00*/


Az egész kód - Itt - található. Nem PIC-re íródott, de a lényeg ebből is látható.

Javasolnám, hogy Te is tegyél megjegyzéseket a kódba, mert így csupaszon még magad sem biztos, hogy követni tudod, hát még az, aki megérteni próbálja!

Még egy észrevétel. Figyeld meg, hogy minden parancs és a hozzá tartozó beolvasás, ill. kivitel után a Resetet aktiválják. Ez nálad nem így történik. Ezt a menetet is érdemes követni szerintem.
(#) watt válasza watt hozzászólására (») Jan 19, 2009 /
 
Közben nem hagyott nyugodni, hogy miért CLK L után olvassák ki, mikor az adatlapon látszik, hogy a lefutó élnél nincs még kész az adat, de aztán látom, hogy 35ns(tDC) után az adat már él. Ez egy lassú rendszernél nem okoz gondot. Ennek ellenére a CLK H után 150ns ideig(tCCD) még ott az adat, és én első körben biztosan ott olvasnám ki, de ez most mindegy. Valószínű egy gyorsabb renszer esetében vagy várakozni kéne a CLK L után 35ns-et(tDC), vagy a felfutó él után kiolvasni az adatot.
(#) acidum hozzászólása Jan 19, 2009 /
 
Tisztelt kollégák!

A mellékelt programrész megoldására kérek segítséget. Ez lényegében egy megszakításban végezendő rutin. Először ellenőrzi, mennyi is a cnt0 értéke, ennek megfelelően ugrik.Három lépésben kellene neki végigcsinálni mindent.
Az első OK, a második esetben, amikor ezt csinálja:
movfw cnt0
sublw 0x02

a szimultáro szerint az akkuba nem kerül bele a cnt0 értéke (épp ezért nem jo helyre ugrik).
Sőt, a rutin végén lévő tmr0 feltöltést sem végzi el...

A kérdésem az lenne, hogy én bénázok el nagyon vmit, vagy szimulátorhiba lehet?

A PIC egy 16f628a.

ir.asm
    
(#) trudnai válasza acidum hozzászólására (») Jan 19, 2009 /
 
1. Nincs a megszakitas kezeloben context saving - tehat a foprogram kontextusa nagy valosiznuseggel elallitodik - ami ha csak egy ures vegtelen ciklus akkor nyilvan nem gond, de ha ott van ertelmes kod is akkor az nyilvanvaloan problemakhoz vezet...

2. Nem allitod be a bankot, ezert ki tudja hova nyulkalsz. Lehet mikor a megszakitas megtortenik egy egeszen mas bankban vagy eppen...
(#) szilva válasza acidum hozzászólására (») Jan 19, 2009 /
 
Ezzel a kóddal ránézésre több gond is van (amellett, hogy a működés helyességét nem is figyeltem):

- az interrupt elején sehol nem látom a context mentését és a végén ennek párjaként a visszaállítást;

- sehol nem látok bankszelekciós uatsításokat vagy makrókat a változók elérésekor;

- case2-nél van két bcf a status regiszterben, ott illene a kívánt bit nevét használni (adatlap szerint ezek a C és DC bitek - biztos ezt akartad?);

- movfw utasítás nincs, ez egy makró, ami "movf ... ,w" -re fejtődik ki; kicsit zavaró, hogy mindkét formát használod a kódban.
(#) acidum válasza trudnai hozzászólására (») Jan 19, 2009 /
 


Persze, a bank...
Kedves Trudnai, köszönöm a választ!
(#) acidum válasza szilva hozzászólására (») Jan 19, 2009 /
 
Igen, igazad van. A context saving megvan, csak kivettem, hogy rövidebb legyen.
A C, és DC bitek törölgetését csak próbaképp tettem oda, hátha za lesz a baj...de nem az volt.

Köszönöm!
(#) jb3 hozzászólása Jan 19, 2009 /
 
sziasztok,

egy konkrét programozási problémába ütköztem, remélem valaki tud segíteni kicsit..

PIC24F128GB110 chipre írok C-ben programot, egyelőre
még nincs kész a hardver, ezért mindent szimulátorban kell csinálnom.

nem sikerül az EXT_INT2/3 működtetése.

amit csinálok:
  1. // Turn all A/D related pins to digital mode
  2.          AD1PCFGL = 0xFFFF;
  3.          
  4.          UnlockRegister();
  5.          
  6.          //Configuring INT1 - MCTA_ABORT_1
  7.          
  8.          RPINR0bits.INT1R = 14;         //RP14 pin is the INT1 source
  9.          _INT1EP = 0;                           //Posedge detection
  10.          
  11.          
  12.          //Configuring INT2 - MCTA_ABORT_2
  13.          
  14.          RPINR1bits.INT2R = 29;         //RP29 pin is the INT2 source
  15.          _INT2EP = 0;                           //Posedge detection
  16.          
  17.          LockRegister();
  18.          
  19.          //INT1
  20.          //INT2/3
  21.          //INT4, TIMER1 EXTERNAL CLOCK
  22.          //TIMER2/3 EXT CLOCK
  23.          //UART1
  24.          //UART2
  25.          
  26.          // Clear flags and enable interrupts after configuration
  27.          
  28.          _INT1IF = 0; _INT2IF = 0;
  29.          _INT1IE = 1; _INT2IE = 1;


és persze meg van írva az ISR is, benne egy Nop()-on egy breakpoint, piszkálom a megfelelő lábat aszinkron stimulálással, de semmi. Az IFS1 regiszterben nem billen be az interrupt flag.
A periféria mappinges regiszterek beállítódnak, megy az unlock rendesen. A zavaró analóg perifériát rendesen lekapcsoltam, nem ad warning-ot a szimulátor sem.

van valami ötlete valakinek esetleg?
(#) potyo válasza jb3 hozzászólására (») Jan 19, 2009 /
 
Az aszinkron stimulálás hatására az adott PORTx regiszter megfelelő bitje beáll-e?
(#) jb3 hozzászólása Jan 19, 2009 /
 
igen, az szépen be is állítódik. a TRIS regiszterben pedig csupa 1-es van (alapból is) tehát bemenetként van konfigurálva.

van valami CTPLS funkció is az RP14-en még felsorolva, ezzel nem tudom mi a helyzet, de az RP29-nél biztosan ez a legnagyobb prioritás és mégsem működik a dolog...
(#) jb3 hozzászólása Jan 19, 2009 /
 
az a gyanúm, hogy a peripheral pin select nincs megvalósítva a szimulátorban. más fórumon is előjött egy helyen ez a probléma. nem tudná valaki, akinek van hardvere is esetleg kipróbálni?
(#) trudnai válasza jb3 hozzászólására (») Jan 19, 2009 /
 
Akkor lehet, hogy kellene egy stimulus file-t irnod hozza ami regiszter injektalassal bebillenti neked az IF-et.
(#) delmur82 válasza watt hozzászólására (») Jan 19, 2009 /
 
Üdv!

Van valami a dologba. Bevallom hogy az időzítések nem igazán ugyanígy voltak a programba ahonnan koppintottam a rutinokat. A DELAY késleltetést én írtam.

ezek helyett egy ilyesmi volt:
WAIT d'255'

A WAIT utáni szám mindig más volt.

viszont ez a rutin így volt meghíva:
;Include fájlok (a modulok)

#include "C:\Program Files\Microchip\modules\m_wait.asm"

viszont így nem tudom lefordítani a programot nem engedi pedig a modult mellékeltem.
Hibaüzenet:

Error[113] E:\MENTETT\FORUMRA\MODULES\M_WAIT.ASM 84 : Symbol not previously defined (BASE)
Error[118] E:\MENTETT\FORUMRA\PROBA1.ASM 57 : Overwriting previous address contents (0000)

hogy tudnám azt megoldani hogy a modulokkal együtt is le tudjam fordítani?
(#) delmur82 hozzászólása Jan 19, 2009 /
 
Bocsi a modulos probléma megoldódott. Működik lefordította. Viszont még mindig nem ok a kommunikáció.
(#) jb3 hozzászólása Jan 19, 2009 /
 
köszönöm, ez nagyon jó ötletnek bizonyult, most így szépen működik a dolog, aztán remélem majd a kész hardverben is menni fog.
(#) potyo válasza jb3 hozzászólására (») Jan 19, 2009 /
 
Ennek örülünk.

Viszont legközelebb ne az új kérdés felvetése felirattal válaszolj egy hozzászólásra, ha megkérhetünk.
(#) watt válasza delmur82 hozzászólására (») Jan 19, 2009 /
 
Én azt mondom, hogy ne időzíts, hanem vizsgálódj! Legalább rögtön kiderül, hogy egy regisztert ki tudsz- e olvasni belőle! Ha beragad a program a DONE bit vizsgálatába, akkor egyáltalán nincs kommunikáció! Rakd fel légyszi a mostani állapotot, illetve ha rászánod magad az ellenőrzéses megírására, akkor majd azt!
(#) acidum hozzászólása Jan 19, 2009 /
 
Sziasztok!

Ismét segítséget kérnék, egy timer0 interrupt nem akar jol müködni..

[code=c]
org 0x04


bank0
MOVWF W_SAVE ;Először a Work regisztert
MOVFW STATUS ;STATUS-t bele a már lementett Workbe
MOVWF STATUS_SAVE ;Status_save-be beletölti a Worköt
bcf INTCON,T0IF ;bit2 clear timer 0 interrupt flag
movf cnt0, W
sublw 0x03 ; W = CONST-A
btfss STATUS, Z ; Check if zero
goto case2 ; Z=0, A!=0, false cond'n
bsf PORTB,0 ;data
nop
bsf PORTB,1 ;clck
bcf PORTB,0
nop
bcf PORTB,1
movlw szaz
movwf PORTB
decf cnt0,f
goto IB

case2:
bank0
movfw cnt0
nop
sublw 0x02 ; W = CONST-A
btfss STATUS, Z ; Check if zero
goto case3 ; Z=0, A!=0, false cond'n
bsf PORTB,1 ;clck
Dlay 100
bcf PORTB,1
movf cnt0, W
movlw tiz
movwf PORTB
decf cnt0,f
goto IB

case3:
bank0
bsf PORTB,1 ;clck
Dlay 100
bcf PORTB,1
movf cnt0, W
movlw egy
movwf PORTB
movlw d'3'
movwf cnt0
goto IB

IB:

movlw d'100'
movwf TMR0
BANKSEL INTCON ;clear the interrpt control register
bsf INTCON,T0IE
bank0
MOVFW STATUS_SAVE
MOVWF STATUS
MOVFW W_SAVE ; Re-swap to correct back into w (& avoid changing status bits)
retfie

A fenti IR-t egyszer szépen megcsinálja (reset után), de mikor másodszor is letelik a T0, a retfie utasítás után ujra a 0x04 cimre ugrik (azonnal).
Mit rontottam el?
(#) delmur82 válasza watt hozzászólására (») Jan 19, 2009 /
 
Bocsi hogy most írok de volt egy kis dolgom. Most már online maradok estig.
Szoval most itt tartok. Megcsináltam az időzítéseket.
had rakjam már fel azt a programot is amiről koppintottam. A progi hosszú és már az LCD kijelzés is meg van oldva de csak a kommunikációs részt nézd. Ez működik mert már egy kipróbált project.
A forrást mellékelem.
Az oldal címe:
http://www.tar.hu/masterfoxx/pichom.htm
az ipse programjában csináltam egy javítást is. Szerintem elírt egy dolgot:
a ds1620 inicializálásánál a write config parancs nem 0xac, hanem 0x0c. Nem tudom de az adatlapból ez jön ki. Viszont ezzel a változtatással sem jó.
(#) potyo válasza acidum hozzászólására (») Jan 19, 2009 /
 
Idézet:
„Mit rontottam el?”


Azt, hogy te sem követed a fórumot, és nem próbálsz mások hibájából tanulni, hanem az képzeled, hogy mi itt szeretünk minden kérdést naponta újra és újra megválaszolni.

Első: ezerszer el lett mondva, hogy az ilyen Dlay tipusú dolgokat hanyagolni kell, főleg megszakítási rutinba nem szabad tenni. Nálad egyszerűen az van, hogy mire végzett a megszakítás kiszolgálásával, már be is billent újra ugyanaz a megszakítás.

Második: nem így mentjük el a contextet a megszakítási rutin elején és állítjuk vissza a végén. Adatlapban szépen le van írva, context saving during interrupts című fejezetben. Ne csak az ott levő kódot másold ki, hanem olvasd is el az egészet!

Harmadik: minek akarod bekapcsolni a T0IE bitet, amikor az már eleve be van kapcsolva?

Negyedik: a code tag használata is visszatérő dolog itt a témában. Azt is megtanulhatnád már használni!
(#) acidum válasza potyo hozzászólására (») Jan 19, 2009 /
 
Kedves Potyo!

Igazad van, figyelmetlen voltam, elnézést kérek érte.
A választ köszönöm, az általad irt hibákat javítom.
Üdv: acidum.
(#) delmur82 válasza delmur82 hozzászólására (») Jan 19, 2009 /
 
Nos irtam egy rutint a CALL START_CONVERT meg a 4 időzítés után, a CALL READ_TEMPERATURE - t pedig kikapcsoltam:
  1. movlw   0xac
  2.         movwf   KIMENO                ; read config
  3.         bsf             RST
  4.         call    SEND                 ; parancs elküld
  5.         call    RECEIVE           ; elméletileg veszi az adatokat a DS1620 regiszteréből
  6.         bcf             RST
  7.         btfsc   BEJOVO_TEMP,7      ; DONE bit
  8.         bcf             LED
  9.         bsf             LED


ezzel akartam megvizsgálni hogy convertálás után a ds1620 regiszterében a DONE bit mire áll. De sajnos a led állandóan kigyullad mintha immunis lenne a BTFSC feltételre. Az a gond hogy a vizsgálódásom sem működik ha eleve rossz mondjuk a SEND vagy a RECEIVE rész (bármelyik.) Viszont ezek a nagykönyv szerint vannak csinálva. Nagy turpisság van itt.
(#) watt válasza delmur82 hozzászólására (») Jan 19, 2009 /
 
  1. CALL    START_CONVERT
  2.    BSF        LED
  3.         WAIT    D'255'
  4.         WAIT    D'255'
  5.         WAIT    D'255'
  6.         WAIT    D'255' 
  7.         BCF        LED
  8.                 CALL    READ_TEMPERATURE

Nézd meg, hogy ha a LED -et be ki kapcsolod a jelzett pontokon, mennyi ideig világít. 500ms-et elég jól lehet érzékelni, és inkább több időt állíts be, mint kevesebbet.
(#) watt válasza delmur82 hozzászólására (») Jan 19, 2009 /
 
Na akkor amit az imént írtam, (még akkor nem olvastam a tiéd) nem is aktuális, de azért kipróbálhatod, hogy stimmel-e az időzítés.

Amit próbáltál az egy jó lépés. Ilyen módszerekkel ki lehet és ki is kell szűrni a hibákat, legyen az programban, vagy elektronikában.

Sajnos nekem nincs ilyen hőérzékelőm, mert akkor többet tudnék segíteni. A programba nehéz belekötni, mivel az a feltevés, hogy kipróbált és működik, annak ellenére, hogy nem erre a PIC-re íródott, mert nem nagyon van olyan rész benne ami PIC specifikus lenne.
(#) watt válasza delmur82 hozzászólására (») Jan 19, 2009 /
 
Még annyit, hogy a 0xAC(Read Config) esetében az 1SHOT bitnek 1-nek kellene lenni, mivel az elején be van állítva az inicializálásnál. Ha az nem 1, akkor az egész kommunikció nem megy. Bár ha feltételeznénk, hogy az írás megy, akkor csak az olvasás a rossz. Nincs könnyű dolgod, de ne add fel, meglesz a hiba!
(#) delmur82 válasza watt hozzászólására (») Jan 19, 2009 /
 
szemre úgy 800 - 900 ms lehet
(#) watt válasza delmur82 hozzászólására (») Jan 19, 2009 /
 
Az akkor rendben van.
(#) delmur82 válasza watt hozzászólására (») Jan 19, 2009 /
 
Azt nem értem hogy amikor megírtam azt a vizsgálódást akkor miért hagyja figyelmen kívül a BTFSC - t. Szerintem ez lesz a kulcsa a dolognak. A program minden dolgot megcsinál nem akad el sehol. viszont úgy tudom hogy egy kétállapotú bit vagy 0, vagy 1. Tehát a BTFSC - nek reagálnia kéne rá. maga a BEJOVO_TEMP regiszter akármelyik bitje akkor is nulla ha semmi nem történik. Viszont a BTFSC akkor is 1 nek érzi. vagyis azt a részt nem is nézi vagyis a legutolsó parancs hajtódik végre ami abban az esetmóben BSF LED. Tehát ég a led mint az állat. No mindjárt megcserélem
(#) delmur82 válasza delmur82 hozzászólására (») Jan 19, 2009 /
 
igen-igen. mindig a második állapot van ami a BTFSC után áll
Következő: »»   392 / 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