Fórum témák

» Több friss téma
Fórum » PIC - Miértek, hogyanok haladóknak
Lapozás: OK   1107 / 1320
(#) benjami válasza agressiv hozzászólására (») Dec 25, 2012 /
 
Valahogy így:
  1. //* This program will read a rotary encoder connected to pins rb6 and rb7.
  2.  
  3. #include<16F877.H>                     //Using the PIC 16F877
  4.                        //Set ADC to 10 bit
  5. #fuses HS,NOWDT,NOPROTECT,BROWNOUT,NOPUT   //Configuration Fuses
  6. #use delay(clock=20000000)               //20Mhz Clock
  7. #use I2C(master,sda=PIN_C4,scl=PIN_C3)
  8.                      //Reserve Memory for Bootloader
  9.  
  10. signed int16 current_position;
  11.  
  12.  
  13.    static int old;
  14.    static int new;
  15.    static int value;
  16.           int matek,egyes,tizes,data;
  17.  
  18.  
  19. #int_rb
  20.  
  21.  
  22. void  RB_isr(void)
  23. {
  24.    new=input_b();
  25.    value=new^old;
  26.    //'value', now has the bit set, which has changed
  27.    if (value & 0b01000000) {
  28.       //Here the low bit has changed
  29.       if (new & 0b01000000) {
  30.          //Here a rising edge on A
  31.          if (new & 0b10000000)
  32.          {
  33.             matek=matek-1;
  34.          }
  35.            
  36.          else matek=matek+1;
  37.          
  38.       }
  39.       else {
  40.          //Here a falling edge on A
  41.          if (new & 0b10000000)  
  42.          {
  43.          matek=matek+1;
  44.          }
  45.          
  46.           else matek=matek-1;
  47.          }
  48.    }
  49.    else {
  50.       //Here the high bit (B) must have changed
  51.       if (new & 0b10000000) {
  52.          //Here a rising edge on B
  53.          if (new & 0b01000000) { }
  54.          else --current_position;
  55.          
  56.       }
  57.       else {
  58.          //Here a falling edge on B
  59.          if (new & 0b01000000) { }
  60.          else ++current_position;
  61.       }
  62.    }
  63.    old=new;
  64.    
  65.    data=1;
  66.    
  67.    
  68.                if(matek>79)
  69.             {
  70.                matek=79;
  71.             }
  72.            
  73.                         if(matek<1)
  74.             {
  75.                matek=1;
  76.             }
  77.  
  78.   }
  79.    
  80. void main() {
  81. PORT_B_PULLUPS(True);
  82. enable_interrupts(int_rb);
  83. enable_interrupts(global);
  84.  
  85. old=input_b();
  86.  
  87. current_position = 0;
  88. delay_ms(250);
  89.    i2c_start();
  90.    i2c_write(0b10001000);
  91.    i2c_write(0b11000000);
  92.    i2c_stop();
  93.    matek=(30);
  94.  
  95. for(;;)
  96. {  
  97.    while(data==1)
  98.    {
  99.    disable_interrupts(int_rb);
  100.    tizes=matek/10;
  101.    egyes=matek%10;
  102.    enable_interrupts(int_rb);
  103.        
  104.    i2c_start();
  105.    i2c_write(0b10001000);
  106.    i2c_write(0b11010000+tizes);
  107.    i2c_write(0b11100000+egyes);
  108.    i2c_stop();
  109.    data=0;
  110.    }
  111.    }
  112. }
A hozzászólás módosítva: Dec 25, 2012
(#) vicsys válasza agressiv hozzászólására (») Dec 25, 2012 /
 
Pedig a main-ben ott van az engedélyezése.
enable_interrupts(int_rb);
Ha le akarod tiltani, másold arra a helyre, ahol tiltani kell a B port megszakítás engedélyezését:
disable_interrupts(int_rb);
Persze, utána újra engedélyezned kell, hogy a következőnél már reagáljon.
(#) agressiv válasza vicsys hozzászólására (») Dec 25, 2012 /
 
És tényleg ott van, de nagy vakló vagyok. No eddig úgy néz ki elmúlt a hangosodásos jelenség.

Viszont a pattogás nem, szóval ott ténylég más gond lesz. Az I2C értékek között küld egy ack bitet az IC, viszont ez nincs megvárva, vagy ilyesmi, ez nem lehet gond? Egy busz órajelciklus alacsony szint, azt hiszem az ack.

Benjami köszi.
A hozzászólás módosítva: Dec 25, 2012
(#) agressiv válasza agressiv hozzászólására (») Dec 25, 2012 /
 
No a megszakítás letiltva az összevisszaság teljesen megszűnt, késleltetést 100us-re állítottam, de az adatküldés után, mivel túl gyorsan nem kaphatja az adatot az IC, persze, ha valaki tudja, hogy pontosan milyen gyakran kpahat új infót az IC megallgatom . A rotary-nál volt még kis probléma, mert, ha egy állapot sem volt jelen (túl gyorsan tekertem) akkor össevissza állítgatta a hangerőt, függetlenül attól, hogy melyik irányba tekertem.

Most bármilyen gyorsan tekerem, bármerre, mindíg veszi a lapot nem hangosodik összevissza, lehet gyepálni, mint a gyárit.

Most van kész a program, köszi a segítséget mindenkinek.

A pattogással pedig megyek az erősítős topikba csak, hogy watt is nyugodtan aludhasson.
(#) benjami válasza agressiv hozzászólására (») Dec 25, 2012 /
 
Azt hogy milyen sűrűn frissítheted a hangerőértéket könnyű letesztelni. A főprogramhurok végére (a data=0 után) tegyél be várakozási időt, akár 100msec-et is. Ekkor ritkábban fogja a hangerőt állítgatni. Az encoder-be ez nem szól bele, mert az úgy is megszakításból történik.
A megszakításba viszont továbbra sem tennék várakozást.
(#) agressiv válasza benjami hozzászólására (») Dec 25, 2012 /
 
Most már ott van a várakozás, a megszakításból kivettem, igazad volt, most minden teljesen normálisan reagál, működik (happy vagyok :jump A 100ms nagyon sok, mert gyors hangerőcsökkentéskor túl lassú. a 100us-el most kb realtime-nak érezni a dolgot és még nem bolondul meg az ic. Ha túl gyorsan megy az adat, akkor csattok kattog, eleinte pedig nem volt benne a data=0-1 megoldás és folyamatosan küldte, ahogy bírta a pic, na akkor durva hangja volt. Viszont a mostani recsegésnek is ugyanolyan hangja van, nem a szokásos hangerőváltozásos IC-s huppanás, hanem ilyen digitális hangú tüske, emiatt gondolok az adatküldés pontatlanságára..
(#) agressiv hozzászólása Dec 26, 2012 /
 
Olyan dolog történt, hogy alacsonyra állítottam az SDA, SCL kimeneteket, tehát csak adatküldéskor van magas szinten, így most jelentősen csökkent a pattogás, de még mindíg előfordul.

Szóval a programban van a hiba az biztos.. Ötlet, javaslat?

(#) mateakos válasza agressiv hozzászólására (») Dec 26, 2012 /
 
Szia.
Nekem még nem volt szükségem szoftveres I2C-re, de az alapállapotnak szabvány szerint nem magas szintnek kell lennie?
(#) agressiv válasza mateakos hozzászólására (») Dec 26, 2012 /
 
Elméletileg igen, de gyári eszközt méregetek referenciának és ott is low-on van alapban. Most is bevált valamennyire,de még mindíg nem az igazi.
(#) nem hozzászólása Dec 28, 2012 /
 
Sziasztok!
Kérdezni szeretnék.

Adott a csatolt kapcsolás-részlet. A step-up-al csak egy grafikus LCD lenne meghajtva, 1mA-es fogyasztással (muszály neki az elem fogyástól független fix táp, hogy a kontraszt állandó maradjon), tehát maga a step-up elmegy simán PIC-lábról, és így teljesen lekapcsolható, amikor nem szükséges. Magyarul az "LCD_VCC_SHD" és az "LCC_VCC_3" is a PIC32MX-nek 1-1 IO lába. Működik is így a kapcsolás, de felmerült bennem, hogy a bemeneti 68µF-os kondi (C31), gondot okozhat.

Belül korlátozva van a PIC IO lábainak árama és emiatt nem lesz gond?
Vagy
Elbírja rövid ideig a túláramot, amíg feltölt a kondi és utána nincs gáz?
Vagy
Csak a szerencsén múlt, hogy eddig nem füstölt el?

Mit javasoltok? Soros ellenállás? Mondjuk egy 150 Ohm-os ellenállás (VDDmax=3V esetén) lekorlátozná 20mA-re az áramot. (Nem tudom, hogy befolyásolná a működést).

Köszönöm!

DCDC.PNG
    
(#) _vl_ válasza nem hozzászólására (») Dec 28, 2012 /
 
Idézet:
„Csak a szerencsén múlt, hogy eddig nem füstölt el?”

Leginkább. Már pár nF-ot sem javasolt direktbe rákötni egy PIC kimenetére, 68µF-ot meg pláne nem.
Nem értem, hogy miért nem közvetlenül kötöd a tápra az áramkör bemenetét. Elég lenne a Shutdown lábat vezérelni a PIC lábáról.
(#) nem válasza _vl_ hozzászólására (») Dec 28, 2012 /
 
Sajnos nem, mivel a PMEG3005AEA átengedi a delejt akkor is, ha a MAX856 ki van kapcsolva... sajnos az előző panelen ebbe már belefutottam. De akkor egy 150 Ohm-os sorba kötve a problémát orvosolja, nem?
(#) _vl_ válasza nem hozzászólására (») Dec 28, 2012 /
 
Ja, persze, minden step-up ilyen.
Leginkább egy Logic-level P MOSFET vagy egy PNP tranzisztor orvosolná a dolgot.

Az ellenállás "megoldja" ugyan a PIC problémáját, de kérdés, hogy mennyivel csökken miatta le a feszültség a bemeneten, és ez mennyivel rontja az áramkör hatásfokát. Egy próbát megér.
A hozzászólás módosítva: Dec 28, 2012
(#) nem válasza _vl_ hozzászólására (») Dec 28, 2012 /
 
Hát jó kérdés, hogy mekkora lehet az ekvivalens ellenállása a kapcsolásnak, amivel a korlátozó ellenállás feszültségosztót alkot. Illetve ugyanez a probléma ez esetben más PIC láb esetén is. Egy másik PIC lábbal 2 műveleti erősítőt hajtok meg, rajtuk 100nF-osokkal. Oda is be lehet tenni éppen egy soros ellenállást, de akkor az feszültségosztó lesz és a műveleti erősítőkre kisebb feszültség jut. Vajon mennyivel? Mekkora "belső" ellenállással lehet számolni egy műveleti esősítő tápja és földje közt? FET-es kapcsolás már nem nagyon férne el a panelen, mert csumig van pakolva... tulajdonképp már kész is van a NYÁK-terv csak még nem adtam le gyártásra... egy ellenállást még be tudok zsúfolni, de mást már igen nehezen...
A hozzászólás módosítva: Dec 28, 2012
(#) _vl_ válasza nem hozzászólására (») Dec 28, 2012 /
 
Idézet:
„Mekkora "belső" ellenállással lehet számolni egy műveleti esősítő tápja és földje közt?”

Ez az áramfelvétele alapján dől el. Ha éppen 1mA a fogyasztása, és 3V-ot adsz neki, akkor 3kohm-nak megfelelő "belső" ellenállása van éppen.
Ha valami elemes eszközökbe szánt, ultra low-power, uA-eket zabáló cucc, akkor röhögve kéne így működnie. Ha egy standard, több mA-es IC-t használsz, akkor gondok lehetnek a működéssel.

Idézet:
„FET-es kapcsolás már nem nagyon férne el a panelen, mert csumig van pakolva...”

Két 0603-es ellenállás meg egy SOT23-as FET azért csak beférne valahova...
A hozzászólás módosítva: Dec 28, 2012
(#) nem válasza _vl_ hozzászólására (») Dec 28, 2012 /
 
Ezek vannak a vonalon (nem is két, hanem 3 OPAMP):
INA126, ha jól értem az adatlapot, max 200uA
TL971, ez 2-3 mA
MCP601, ez pedig 300uA

Ez más sok, igaz? Mi lenne, ha egy PIC lábról 150Ohm-os ellenálláson keresztül kapcsolnám be ezeket a fogyasztókat, majd, egy kis idő múltán egy másik PIC lábról kapná meg a "fogyasztási" áramot, amin már nincs ellenállás, hanem közvetlenül megy az adott tápvonalra? Mint egy lágyindítás... vagy van jobb ötleted esetleg?
A hozzászólás módosítva: Dec 28, 2012
(#) Moderátor hozzászólása nem hozzászólására (») Dec 28, 2012
 
Használd légyszives a LINK gombot a válaszablakban!
(#) nem válasza _vl_ hozzászólására (») Dec 28, 2012 /
 
Ha látnád a a panelt... De mondjuk elképzelhető, hogy be tudom préselni... mint ahogy egy 0805-ös ellenállást is kínlódva, de be tudnék tenni valahová valószínűleg.... Csak szívesebben mennék a legegyszerűbb megoldás irányába, mert olyan szinten zsúfolt a panel, hogy így is fél órás meló lesz ellenállásonként kb.
(#) BlackStar hozzászólása Dec 30, 2012 /
 
Sziasztok!
Találkoztatok olyan problémával, mikor az adatlap egy utasítás végrehajtási idejét 1cyc adja meg, de valójában 2cyc ideig tart neki?
Egy PIC24EP64GP202 lenne szó. /FOSC=100MHz, FCY=50Mhz , 1cyc(20ns)/
Az adatlap szerint a BSET, BCLR, NOP utasítások 1cyc ideig tartanak.
Oszcilloszkópon megmérve a BSET, BCLR 2cyc ideig a NOP 1cyc ideig tart.

A mellékelt képekhez az alábbi utasítások tartoztak.

Kep1:
asm("BSET 0xE15, #7");
asm("BCLR 0xE15, #7");

Kep2:
asm("BSET 0xE15, #7");
asm("BSET 0xE15, #7");
asm("BCLR 0xE15, #7");

Kep3:
asm("BSET 0xE15, #7");
asm("nop");
asm("BCLR 0xE15, #7");
(#) _vl_ válasza BlackStar hozzászólására (») Dec 30, 2012 /
 
Az SFR bit operation 2 ciklusos utasítás.

Ha 1 ciklus eltéréssel kéne változtatni a bit értékét, akkor megpróbálhatod nem bit művelettel változtatni a bit értékét (ez ugyanis két buszművelet), hanem eltárolod egy-egy CPU regiszterbe az adott memóriacím tartalmának két verzióját (bit = 0 és bit = 1), és a megfelelő regiszter tartalmát írod be oda.
A hozzászólás módosítva: Dec 30, 2012

x.png
    
(#) BlackStar válasza _vl_ hozzászólására (») Dec 30, 2012 /
 
Köszönöm válaszod.
A PIC18 családnál egy PORT lábát 1cyc időre be lehetett kapcsolni.
Az mplab xc16 fordítóban az asm utasítások integrációja nem a legjobb (lehet hogy csak a free miatt). Gyakorlatilag nem tudom megoldani, hogy egy portláb aktív H idejét 1cyc lépésekben tudjam állítani.
Egy 70MIPS PIC-nél max100ns pulzus szélességet a portlábon 7 lépésben tudnám állítani de mivel 2cyc így csak 3 lépés.
(#) _vl_ válasza BlackStar hozzászólására (») Dec 30, 2012 /
 
Idézet:
„Gyakorlatilag nem tudom megoldani, hogy egy portláb aktív H idejét 1cyc lépésekben tudjam állítani.”

PIC32-nél ez működik: (mondjuk ott vannak jobb megoldások is, pl. LATASET, LATACLR)
  1. unsigned portup = LATA | (1 << n);
  2. unsigned portdown = portup & ~(1 << n);
  3.  
  4. LATA = portdown;
  5. LATA = portup;
  6. LATA = portdown;

Szerintem ez a módszer itt is menne, a "beírás" művelet 1 ciklus alatt végrehajtható, ha a portup/portdown regiszterben van, akkor simán lehet így 1 ciklus hosszú magas jelet kiadni.
(#) BlackStar válasza _vl_ hozzászólására (») Dec 31, 2012 /
 
Köszönöm ismét a segítséget.
Első ránézésre meglepődtem a kódon, amit írtál.
Ha jól értelmezem a W14,W15-be tárolja el a fáj regiszter címét amiben a két érték van.
  1. 39:                unsigned portup = LATB | (1 << 15);
  2. 0003D4  8070A1     MOV LATB, W1
  3. 0003D6  280000     MOV #0x8000, W0
  4. 0003D8  708F00     IOR W1, W0, [W14]
  5. 40:                unsigned portdown = portup & ~(1 << 15);
  6. 0003DA  27FFF0     MOV #0x7FFF, W0
  7. 0003DC  60001E     AND W0, [W14], W0
  8. 0003DE  980710     MOV W0, [W14+2]


Nálam két művelet a portup/portdown

  1. 58:                LATB = portup;
  2. 0003E2  78001E     MOV [W14], W0
  3. 0003E4  8870A0     MOV W0, LATB
  4. 59:                LATB = portdown;
  5. 0003E6  90001E     MOV [W14+2], W0
  6. 0003E8  8870A0     MOV W0, LATB


Viszont a fordító optimalizálási szintjét 0-ról 1-re állítom, akkor 1 ciklus alatt végrehajtja.

  1. 58:                LATB = portup;
  2. 00038E  8870AA     MOV W10, LATB
  3. 59:                LATB = portdown;
  4. 000390  8870AB     MOV W11, LATB


Így már működik az 1 ciklus hosszú magas jel.
Azért a free fordító sokszor megtréfálja az embert. Örülnék egy pro változatnak
A lényeg hogy működik a megoldásod, amit nagyon köszönök.
(#) nem válasza nem hozzászólására (») Jan 2, 2013 /
 
Ne haragudj _vl_, semmiképpen nem szeretnék "erőszakoskodni", csak azt hiszem, az egyik felvetésem elkerülte a figyelmed, ezért ideírom újra.

Lehet, hogy hülyeség, de:
Idézet:
„Mi lenne, ha egy PIC lábról 150Ohm-os ellenálláson keresztül kapcsolnám be ezeket a fogyasztókat, majd, egy kis idő múltán egy másik PIC lábról kapná meg a "fogyasztási" áramot, amin már nincs ellenállás, hanem közvetlenül megy az adott tápvonalra? Mint egy lágyindítás...”


A stepup és az egyik szenzor IC esetében nem lesz gond, mert a szenzor IC 1.8Vig üzemképes és amúgy is 1 mA-t eszik, a stepup meg 1.2V-ig képes előállítani a 3.3V-ot, de azért mindjárt kipróbálom őket. Már "csak" az analóg rész maradt, ahol a fentebbi izédet szerint gondolnék eljárni. Sajnos ott tényleg nincs hely FETnek, csak nagy munka árán.
(#) _vl_ válasza nem hozzászólására (») Jan 2, 2013 /
 
Nem tudom, hogy az ötleted mennyire jó gondolat. Így elsőre nem látok benne kivetnivalót, meg kell próbálni.
(#) Dempsey hozzászólása Jan 7, 2013 /
 
Sziasztok!
Azzal a problémával fordulok hozzátok, hogy a Pickit3-amat elrontottam mert véletlenül lehúztam a gépről miközben töltötte be a TARGET-hez tartozó firmware-t. Most annyit ír az MPLAB hogy "Not Pickit Connected", és mindhárom LED világít, a Status pirosan. Magyarul jól elcseszerintettem. Hogyan tudnám orvosolni a problémát? Előre is köszönöm a segítséget.
Üdv: Dempsey.
(#) nedudgi válasza Dempsey hozzászólására (») Jan 7, 2013 /
 
A számítógépet újraindítottad azóta?
(#) _vl_ válasza Dempsey hozzászólására (») Jan 7, 2013 /
 
Három esetet tudok:
- működik még rajta a bootloader, és azon keresztül rá tudod tölteni a firmware-t,
- nem működik rajta a bootloader, szétbontod a fedelét (szerintem ez nem visszafordítható művelet lesz), és az ICSP lábakon keresztül egy másik Pickittel felprogramozod,
- a supportot megkeresed, mivel hallottam már olyat, hogy a nem működő Pickit3-at ingyen kicserélté...álónak.
(#) Dempsey hozzászólása Jan 7, 2013 /
 
a bootloader-es megoldást le tudnád írni, hogy hogyan kell?
(#) _vl_ válasza Dempsey hozzászólására (») Jan 7, 2013 /
 
Indulásból meg kéne nézni, hogy milyen USB eszköznek látszik (látszik-e egyáltalán) a készülék.
Control panel/System/Device manager alatt megvan-e, ha megvan, akkor milyen USB ID szerepel a Details tab alatt. Ha Linuxot használsz, akkor egy lsusb kell neki.
A hozzászólás módosítva: Jan 7, 2013
Következő: »»   1107 / 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