Fórum témák

» Több friss téma
Fórum » PIC kezdőknek
 
Témaindító: Placi84, idő: Okt 3, 2005
Témakörök:
- A PIC ÖSSZES Vdd és Vss (AVdd és AVss) (tápfeszültség) lábát be kell kötni!
- A táplábak mellé a lehető legközelebb 100nF-os KERÁMIA kondenzátorokat kell elhelyezni.
- Az MCLR lábat, 10kohm-mal fel kell húzni a Vdd tápfeszültségre.
- Külső kvarc használatakor 4MHz-ig XT, a fölött pedig HS konfigurációt kell beállítani.
- Stabilizált tápegységet kell használni, a kapcsoló üzemű "telefon töltő" adapterek okozhatnak hibákat.
- Programozáshoz, használj lehetőleg PICKIT2 vagy 3 programozót. Kerülendő a JDM (soros porti) programozó.
- A PIC adatlapja (PDF), tartalmazza a lábak kiosztását és a PIC minden paraméterét. Az adatlap ingyen letölthető!
- Egyes PIC típusoknál az RA4 nyitott nyelőelektródás (Csak lefelé húz L szintre, H szintet nem ad ki!)
- Ha a PGM lábat digitális ki-/bemenetnek használod, az alacsony feszültségű programozási lehetőséget le kell tiltani.
Lapozás: OK   732 / 1210
(#) csdancsi55 válasza Hp41C hozzászólására (») Dec 11, 2015 /
 
Még nincs meg de PIC16F887, PICKit2, vagy annak valamelyik olcsóbb klónja lessz.
(#) Pali79 válasza csdancsi55 hozzászólására (») Dec 11, 2015 /
 
Nem igazán értem. A DIP tokos PIC-nek 2,54mm-es a lábtávolsága, még egy vezetéksávot is át lehet vinni a kettő között, anélkül, hogy összeérnének. Hozzáteszem, hogy nekem sosem jutna eszembe a pic-et forrasztani, mindig foglalatot használok.
(#) Hp41C válasza csdancsi55 hozzászólására (») Dec 11, 2015 /
 
HeStore -ból vegyél univerzális nyák -ot. A PICkit2 -be PIC18F2550 kell.
A hozzászólás módosítva: Dec 11, 2015
(#) KaiserA válasza icserny hozzászólására (») Dec 12, 2015 /
 
Szia!

Köszönöm, egyelőre a How_I_Am se akar menni, már kiprobáltam StartI2C,write.. read.. stop.... kombinációt mindenféle képpen,de 255 kapok..
  1. StartI2C1();
  2.                                         IdleI2C1();
  3.                                         MasterWriteI2C1(0x38);
  4.                                         MasterWriteI2C1(0x0D);         
  5.                                         RestartI2C1();
  6.                                         IdleI2C1();    
  7.                                         MasterWriteI2C1(0x39);
  8.                                         fogadottadat = MasterReadI2C1();
  9.                                         NotAckI2C1();
  10.                                         IdleI2C1();
  11.                                         StopI2C1();
  12.                                         IdleI2C1();
(#) icserny válasza KaiserA hozzászólására (») Dec 12, 2015 /
 
Ha ez az IC ugyanazon az I2C buszon van, amelyen a hőmérődet sikerült működésre bírni, akkor vizsgáld meg a gyorsulásmérő IC-T! Nincs-e elforgatva? Nincs-e zárlat a lábak között? Tápfeszültség, föld eljut hozzá? SA0 mérhetően földön van?

A programban pedig a MasterWriteI2C1() hívások után figyeld a visszatérési kódot, vagy legalább a I2C1STATbits.ACKSTAT állapotát!
A hozzászólás módosítva: Dec 12, 2015
(#) don_peter hozzászólása Dec 12, 2015 /
 
Uraim, PIC-el szeretnék egy motor sebességét, fordulatát mérni.
Beépített HALL szenzoros a motor, így a jelek megvannak.
Egy fordulatra 24 jel érkezik ezt egy külső interrupt figyeli.
Minden lefutó élre egy magszakítás indul, amellyel a kapott adatokat begyűjti majd egy 1mp-es timer-el mérve kiértékeli a sebességet.

A baj, az hogy a HALL szenzor nem csak egy rövid impulzust ad, ezért lassú fordulatnál igen pontatlan lenne a mért és kiértékelt eredmény.
Szélsőséges és elnagyolt példa:
Ha mondjuk egy jel a motor fordulata miatt eltart 1mp-ig, akkor a folyamatos megszakítás miatt teljesen hibás adatot kapok, hiszen ebben a megszakításban növelek egy változót amelynek egy megszakításban csak egyszer szabadna lefutnia.

A kérdésem ezzel kapcsolatban lenne:
Hogyan tudom megoldani, hogy a HALL szenzor csak egy nagyon rövid ideig adná az impulzust, tehát minden impulzus ezzel csak 1 értéket növelne a változón?

Eddig próbálkoztam szoftveres módon történő megoldásokkal, de eddig még nem tudtam eredményes megoldást találni.
A másik ötletem egy kicsi kis elektronika lenne ami, a halszenzor jelét egy röpke kis impulzusként továbbítaná a PIC bemenetére, így elérve, hogy egy több ideig is eltartó HALL szenzoros impulzus is csak egy azonosan rövid ideig tartana a többivel egyformán.
Ha szoftveresen nem lehet megoldani a dolgot, akkor esetleg kérnék segítséget egy ilyen elektronika elkészítésére.

Nem tudom mennyire érthető a kérdésem, ha nem akkor kérdezzetek és megpróbálom kifejteni.
előre is köszi.
(#) Pali79 válasza don_peter hozzászólására (») Dec 12, 2015 /
 
A lefutó él figyelésnek éppen az lenne a lényege, hogy az élt figyelje, nem? Gondolom a hall alapból magas szinten van egy felhúzó ellenállattal, és ha jön a mágnes, alacsonyra húzza. Attól, hogy sokáig van alacsony szinten még nem szabadna több megszakítás generálnia szerintem.
(#) zenetom válasza don_peter hozzászólására (») Dec 12, 2015 /
 
Szia!
Bár még nem foglalkoztam konkrétan ilyen motorral, illetve valami diagram hiányában is kicsit nehezebb elképzelni a dolgot, de ha jól gondolom, akkor 1 fordulat alatt 24 "tüskéd" van.
Ezeknek a tüskéknek a szélessége változik a motor fordulat függvényében.
Ha így van, akkor én csak annyit csinálnék, hogy pl. a lefutó éleket ahogy írtad számolod, és minden 24 után megnézed mennyi idő telt el, majd nullázod a timer-t.
Persze figyelni kell arra, ha túlcsordul a timer, illetve a timerrel léptetett számláló.. attól függ hogy ezt hogy valósítod meg.
Szerk.: most nézem, folyamatos megszakítást írtál. Ezt nem értem, kifejtenéd bővebben?
A hozzászólás módosítva: Dec 12, 2015
(#) fater0827 válasza zenetom hozzászólására (») Dec 12, 2015 /
 
Üdv
Itt Péter Ebike kütyüt akar alkotni , átmérő * fordulat .
Péter figyelem Ebike , nagyon változó a Hall szenzorokra menő fesz ( 5 - 12 Volt lehet ! ) !
A Hall nem 0 Voltra kapcsol ( 0.15 - 0.25 V) .
Védelemre figyelni soros ellenállás + zéner .
Még ajánlom MC33035 egyes vezérlőkben ez az ic van Bővebben: Link , elég sok infó van benne .
Üdv.
A hozzászólás módosítva: Dec 12, 2015
(#) don_peter válasza Pali79 hozzászólására (») Dec 12, 2015 /
 
Sajnos pont ez a bajom, hogy folyamatosan generálja a megszakításokat.
(#) sonajkniz válasza don_peter hozzászólására (») Dec 12, 2015 /
 
Figyeltesd IOC-vel. Az csak állapotváltozásra reagál. Megszakításban ellenőrizd az állapotát, és ha nem a neked kellő állapotban van, ugorj ki a megszakításból.
(#) Bakman válasza don_peter hozzászólására (») Dec 12, 2015 /
 
Konkrétan melyik kontroller? Hasonlóba belefutottam, nem értettem amíg meg nem néztem az Errata c. doksit. A megszakításba kellett egy extra vizsgálat a port állapotáról. Már nagyon nem emlékszem, melyik kontroller volt.
(#) don_peter válasza zenetom hozzászólására (») Dec 12, 2015 /
 
Igen jól érted.
24 tüském van egy körbeforgással.
Igen ebben is igazad, van, hogy ezeknek a tüskéknek változik a hosszúsága.
Majdnem én is így csinálom, ahogyan íród csak fórdítva.
Jönnek a tüskék, ekkor a megszakítás elindul és egy változót megnövel.
1 másodperces timer pedig kiértékeli és nullázza a számlálót.

A gond az, hogy a kerék állásától függően lehet ez a tüske végtelen is, és ekkor folyamatosan generálja egymás után a megszakításokat ami nagy probléma.

Kérésedre kifejtem:
Ha a motor gyorsan forog akkor ez a gond nem jön elő, de ha nagyon mondjuk csak alig forg akkor egy-egy tüske eltarthat akár (hogy érezhető legyen) 1mp-ig is.
Ekkor 1mp-en keresztül folyamatos megszakítást generál, ez alatt az idő alatt kb 30-at, pedig csak 1-et kellene jelentenie.

Kimértem műszerrel a működést.
A jelek 5v-0v közt mozognak.
Azt hiszem 5v alapból megvan és mikor jön a jel, akkor elejti a feszültséget és leesik nullára.
(#) don_peter válasza Bakman hozzászólására (») Dec 12, 2015 /
 
PIC18F46K22 @64MHz
INT0 vagy is B0 bemenet, és felhúzva 10K ellenállással 5v-ra, hogy ne lebegjen.
Próbáltam felhúzó nélkül is..
(#) sonajkniz válasza don_peter hozzászólására (») Dec 12, 2015 /
 
Ha újra és újra beugrik megszakításba, miközben a jel nem változik, akkor egész biztos, hogy nem fel- vagy lefutó élként figyeled. Valami nem jól van beállítva.
(#) cross51 válasza don_peter hozzászólására (») Dec 12, 2015 /
 
Nem nagyon értem a dolgot ha egy tüskke végtelen és INT0-ra van kötve ami élvezérelt akkor amíg nem fut le újra a jel addig nem generálhat újra megszakítást. IF bitek törölve vannak ?
A hozzászólás módosítva: Dec 12, 2015
(#) zenetom válasza don_peter hozzászólására (») Dec 12, 2015 /
 
Miért generálja folyamatosan a megszakítást, ha nincs élváltozás? Milyen megszakítást használsz?
Szerk.: na közben a többiek megelőztek.
A hozzászólás módosítva: Dec 12, 2015
(#) don_peter hozzászólása Dec 12, 2015 /
 
Lehet nem vettem észre valamit vagy nem jól állítottam be:
Mutatom az erre irányuló programrészt és beállítást:

Megszakítás: (B0 == INT0 == Bemenet és felhúzva 5v-ra 10K-ossal)
  1. /*********************************************
  2.         +               INTERRUPT INIT
  3.         +       Kilsı megszakÌt·si kÈrelem be·llÌt·sa
  4.         **********************************************/
  5.        
  6.         RCONbits.IPEN = 1;                      // KÈtszint˚ megszakÌt·si mÛd be·llÌt·sa
  7.     INTCONbits.GIEH = 1;                // A magas priorit·s˙ interrupt engedÈlyezÈse
  8.     INTCONbits.GIEL = 1;                // Az alacsony priorit·s˙ interrupt engedÈlyezÈse
  9.         INTCONbits.INT0IE = 1;
  10.         INTCONbits.INT0IF = 0;
  11.     INTCON2bits.INTEDG0 = 0;

Iterrupt:
  1. void hi_isr (void) {
  2. /* Itt tˆrtÈnik a magas priorit·s˙ megszakÌt·s tÈnyleges kiszolg·l·sa */
  3.         if(INTCONbits.INT0IF){
  4.                 if(HALL<230){
  5.                         HALL++;
  6.                 }else{    // Ha túlcsordul
  7.                         HALL = 0;
  8.                         INTCONbits.INT0IE = 0;
  9.                 }
  10.         }
  11.         INTCONbits.INT0IF = 0;
  12. }

Ezen kívűl még van egy Timer0, de azt nem teszem be, hogy ne zavarjon be és az biztosan jól működik.
Ha esetleg túlcsordulna akkor leállítja a megszakítást, persze ezt kezeltem főprogramban is, de nem volt megoldás és kivettem.
Itt még itt maradt, de az 1mp-es Timer0 úgy sem engedi eddig elszámolni a HALL változót.
Azért a kétszintű megszakítás, mert a Timer0 alacsony szintű interruptot generál.
A hozzászólás módosítva: Dec 12, 2015
(#) cross51 válasza don_peter hozzászólására (») Dec 12, 2015 /
 
Rb0 nem analóg láb ?
(#) don_peter válasza cross51 hozzászólására (») Dec 12, 2015 /
 
Amit lehetett azt beállítottam és remélem jól...
Analog-ot csak 1-et használok többi kikapcsolva.
  1. /*********************************************
  2.         +               Ki / Bemenetek
  3.         **********************************************/
  4.         TRISA = 0x03;   // A0-A1 bemenet
  5.         PORTA = 0;
  6.         TRISD = 0xf0;   // Gombok D4-D7-ig bemenet
  7.         PORTD = 0;     
  8.         TRISB = 0x01;   // B0 bemenet, INT0
  9.         PORTB = 0;
  10.         TRISE = 0;
  11.         PORTE = 0;
  12.         TRISC = 0x18;           // i2c engedÈlyezÈse
  13.         PORTC = 0;
  14.        
  15.         ADCON0 = 0x03;          // ADC A0-A1 enabled
  16.         ADCON1 = 0;
  17.         ADCON2 = 0b10111110;    // Jobbra z·rt 10bit, ACQ time=20TAD, ADC time=Fosc/64 (van idı mindenre)
  18.        
  19.         CM2CON1 = 0;
  20.         CM1CON0 = 0;
  21.         CM2CON0 = 0;
  22.        
  23.         ANSELA = 0;             // Digital input buffer enabled
  24.         ANSELB = 0;
  25.         ANSELC = 0;
  26.         ANSELD = 0;
  27.         ANSELE = 0;
  28.        
  29.         OSCCON = 0;     // Primary Clock-ot haszn·ljuk CONFIG1H be·llÌt·sai szerint
  30.     OSCCON2 = 0x04; // Oscillator drive circuit on
  31.     OSCTUNE = 0x20; // PLL enabled
  32.        
  33.         CCP1CON = 0;    // Coper·torok Ès PWM kikapcsolva
  34.         CCP2CON = 0;
  35.         CCP3CON = 0;
  36.         CCP4CON = 0;
  37.         CCP5CON = 0;

A kommentelés már régi, lehetnek változások.
Amit hirtelen észrevettem azokat javítottam.
A hozzászólás módosítva: Dec 12, 2015
(#) cross51 válasza don_peter hozzászólására (») Dec 12, 2015 /
 
Itt elviekben minden rendben van egy ddolgot próbálj ki vedd le a hall szennzort és tegyél oda egy tactos gombot ha úgy is megállás nélkül megszakkítás történik akkor valami nincs kezelve a szoftverbe.
(#) don_peter válasza cross51 hozzászólására (») Dec 13, 2015 /
 
Holnap utána nézek, ma már pihi mert kicsit kivagyok már agyilag..
Azt hittem ez egy egyszerű dolog lesz, és lám ez fog meg
(#) ktamas66 válasza don_peter hozzászólására (») Dec 13, 2015 /
 
Miért nem számoltatod az impulzusokat simán egy timerrel, amit másodpercenként kiolvasol? Nem tudom mit jelent a "kis" sebesség, de így 2,5 RPM-enként tud mérni. Ha pontosabb kell az impulzusok közötti időt kell mérni és abból számolni.
(#) don_peter válasza ktamas66 hozzászólására (») Dec 13, 2015 /
 
Ugyan az lenne az eredmény amit feljebb leírtam, és a megszakítás biztosabb szerintem.
(#) ktamas66 válasza don_peter hozzászólására (») Dec 13, 2015 /
 
Egyrészt kiderülhet, hogy a hall jelén van-e valami tüske (vagy szkóppal ránézni), vagy a szoftver játszik veled, másrészt hardverből számol és ezért nem kell foglalkozni a konkurens IT-k kezelésével.
(#) Hp41C válasza don_peter hozzászólására (») Dec 13, 2015 /
 
Ha engedélyezett, de kiszoláglatlan kérés van, állandóan a megszakítás kiszolgáló fut.
A hozzászólás módosítva: Dec 13, 2015
(#) zenetom válasza don_peter hozzászólására (») Dec 13, 2015 /
 
Bár valószínűleg nem sok vizet zavar, de azért az interrupt flag bit törlését rakd egy blokkal beljebb:
  1. void hi_isr (void)
  2. {
  3.         if(INTCONbits.INT0IF)
  4.         {
  5.                 if(HALL<230)
  6.                 {
  7.                         HALL++;
  8.                 }else
  9.                 {    // Ha túlcsordul
  10.                         HALL = 0;
  11.                         INTCONbits.INT0IE = 0;
  12.                 }
  13.                 INTCONbits.INT0IF = 0;
  14.         }
  15.        
  16. }

Szerk.: elvileg megszakításban nem ajánlatos megszakítást ki/be kapcsolni, bár ez lehet csak a globális engedélyezésre érvényes, még nem jártam utána.. De lehet hogy ezt a részt inkább ki kéne szervezni a főprogramba:
  1. INTCONbits.INT0IE = 0;
A hozzászólás módosítva: Dec 13, 2015
(#) don_peter válasza zenetom hozzászólására (») Dec 13, 2015 /
 
Ki fogom próbálni, bár szerintem sem lesz sok változás
A megszakítás kikapcsolását már sok esetben használtam így, például a wake up funkciónál, vagy éppen a forrasztóvezérlőmnél.
Eddig nem volt gond vele, nagyon szépen dolgoznak azóta is.
Ennek ellenére, ki fogom venni onnan mert elvileg szükség sincs rá, mivel Timer0 1mp-ént, úgy is törli HALL változót.
(#) Zsora válasza apromax hozzászólására (») Dec 13, 2015 /
 
Az /SS láb vezéreli az SDO kimenetet, tehát ha /SS engedélyezve van, akkor /SS magas állapotában az SDO kimenet nagyóhmos. Ha viszont tiltva van, akkor az SDO állandóan aktív.

Az egyes adatbitek beállítástól függően az SCK jel fel- vagy lefutásánál mintavételeződnek ill. tolódnak ki. 8 vagy 16 adatbit beérkezése után az SPIxRBF magas állapota tudatja hogy a kész adat kiolvasható a vételi tárból.
(#) apromax válasza Zsora hozzászólására (») Dec 14, 2015 /
 
Az SS láb működését értem, sőt használom is az SPI -t.
Kérdésem arra az esetre vonatkozott mikor úgy megy a busz hogy a Slave eszköz nem igényli az SS jelet (Lásd a mellékelt képet) . Ekkor hogyan tudja mikor kapott adatot?
Következő: »»   732 / 1210
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