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   745 / 1210
(#) Bakman válasza Melphi hozzászólására (») Jan 29, 2016 /
 
Milyen listában? Nekem viszi gond nélkül.
(#) Johnny0004 válasza Melphi hozzászólására (») Jan 29, 2016 /
 
Ott van az.
(#) Melphi válasza Johnny0004 hozzászólására (») Jan 29, 2016 /
 
Megvan, csak kicsit elbujt.
(#) kistee válasza Melphi hozzászólására (») Jan 29, 2016 /
 
Naugye...
(#) don_peter hozzászólása Jan 30, 2016 /
 
Uraim, amikor a PIC beállításainál megadom a SPBRG regiszternek a kiszámolt számot az azt jelenti, hogy az USART vagy is a sebessége 9600 Baud Rate lesz?

18F442 + 10MHz kristály + PLL == elvileg 40MHz
  1. //Baud rate kiszámolása
  2.         /*((FOSC/Desired Baud Rate)/64) – 1
  3.         = ((40000000/9600)/64) – 1
  4.         = 64*/
  5.         SPBRG = 64;

A kérdés azért született meg bennem mert olyan mint ha valami nem stimmelne a beállításaimmal.
A mostani projektemnél, USART-on keresztül küldenék adatokat a PIC-nek, de egy 16Kb-os adattal elkínlódik 21mp-ig.
És akkor ezt már egy nagyon sok kísérletezés eredménye ként sikerült kicsikarnom, úgy, ogy extra műveleteket a PIC nem is végez közben.
A hozzászólás módosítva: Jan 30, 2016
(#) icserny válasza don_peter hozzászólására (») Jan 30, 2016 /
 
Ideális esetben is 17 s lenne, ha jól számolom. A 9600 bit/s az legfeljebb 960 byte/s a keretezés miatt.
(#) don_peter válasza icserny hozzászólására (») Jan 30, 2016 /
 
Akkor egy 8Mbit-es chipet elég kellemetlen lesz feltölteni, legalább is az idő szempontjából..
USB-s kapcsolattal ez gyorsabb lenne?
Gondolok itt arra, hogy mondjuk egy 18F4550-el kísérleteznék, és byte-onként küldeném az adatot?
(#) nedudgi válasza don_peter hozzászólására (») Jan 30, 2016 /
 
Mi az akadálya a nagyobb sebességnek?
(#) don_peter válasza nedudgi hozzászólására (») Jan 30, 2016 /
 
Egyelőre nem tudom mi az akadálya, de csak ennyire képes most.
PIC18F442 a PIC amire fejlesztek és a nyák elvileg most már legyártás alatt van, így az fix.
Az adatküldés folyamata a következő képen működik.
PC-és progit írtam ami USART-on küldi byte-onként az adatot PIC-nek:
1. PC adat küldés PIC-nek
2. PIC adat fogadásának vissza igazolása (adat küldés PC-nek)
3. PIC feldolgozza az adatot
4. PC várakozik PIC visszaigazoló adatra
5. Ismétlés az elejétől.

Ezzel egy 16356 byte-os adatot 21mp-alatt dolgoz fel a PIC ami baromi sok ahhoz képest, hogy mondjuk egy 8Mbit-es adatot kellene feltölteni.
Vagy valamit rosszul csinálok.

dptpsmfd2.JPG
    
(#) Hp41C válasza don_peter hozzászólására (») Jan 30, 2016 / 1
 
115200 Baud -dal 12 -szer gyorsabban menne...
40MHz, BRGH = 1, SPBRG = 20
(#) nedudgi válasza don_peter hozzászólására (») Jan 30, 2016 /
 
Nem jól kérdeztem, bocsánat. Az szerettem volna megkérdezni, hogy mi az akadálya a 9600Bd feletti sebességnek.
(#) Balagemann2031 hozzászólása Jan 30, 2016 /
 
Sziasztok! Szeretném beállítani egy pic24hj128gp502-es UART BRG-jét. Nem is ez a probléma, hanem hogy nem tudom milyen frekin megy a pic akkor ha bekapcsolom a PLL-jét. Alap esetben PLL nélkül 7,37Mhz es belső órajellel számolva, kijön a BRG érték és hibátlanul küldi UART-on az adatot. Ha bekapcsolom a PLL-t és alap állapotban hagyok minden oszcillátor beállítást akkor 1,84Mhz jön ki számításaimból. ("M" szorzó:2 "N1xN2" osztó:8). Viszont valami nem stimmel, mert ha a kapott frekvenciából kiszámolom a BRG-t akkor a UART fals adatokat küld. A kérdésem az lenne, hogy hogyan tudom megállapítani a pontos frekvenciát ha PLL-t is használok? Adatlapot már rongyosra böngésztem, de nem vagyok benne biztos, hogy nem kerülte el valami a figyelmem. Köszönet előre is!
(#) don_peter válasza Hp41C hozzászólására (») Jan 30, 2016 /
 
Szimulátorban ezt már nem lehet emulálni, mert sajnos zagyvaságokat ír csak.
Jó a beállításom?
  1. TRISC = 0b11000000;   // RX/TX bemenet
  2. TXSTA = 0b00100100;    // Transmit enabled, BRGH | Asynchronous mode | High speed
  3. RCSTA = 0b00010000;    // CREN | Continuous Receive Enable bit | Enables receiver
  4. SPBRG = 20;
  5. RCSTAbits.SPEN = 1;


nedudgi: mert nem tudtam, hogy lehet emelni a sebességen..
A hozzászólás módosítva: Jan 30, 2016
(#) Balagemann2031 válasza don_peter hozzászólására (») Jan 30, 2016 / 1
 
Szia! Bocs, hogy beleszólok, de ahogy átfutottam a kódot beleakadt a szemem abba, hogy TX et is bemenetnek konfigurálod. Ne tedd.
A hozzászólás módosítva: Jan 30, 2016
(#) don_peter válasza Balagemann2031 hozzászólására (») Jan 30, 2016 /
 
Köszi, egyelőre gondot nem okozott, de köszi.
Több szem többet lát.
(#) kissi válasza don_peter hozzászólására (») Jan 30, 2016 /
 
Miért nem méred meg az analizátorral ?!
(#) don_peter válasza kissi hozzászólására (») Jan 30, 2016 /
 
Mit mérjek ki analizátorral?
Hogy helyes adatokat küld e a szimulátor?
Egyelőre csak abban tudom tesztelni az USART beállításokat és adatküldést.
Éles teszt, talán a jövőhéten vagy azután lehet.
9600-at még jól szimulálja, de felette már nem tudtam beállítani és nem tudom, hogy csak a szimulátor korlátozza, vagy nem jó a beállításom.
(#) don_peter hozzászólása Jan 30, 2016 /
 
Köszönöm, sikerült beállítani.
Működik ezen a sebességen a szimulátor is.
Tesztelem..
(#) benjami válasza don_peter hozzászólására (») Jan 30, 2016 / 1
 
Én a fordítóra szoktam bízni a regiszterek értékeinek kiszámítását:
  1. #define SystemClock 40000000
  2. // Soros port kívánt sebessége
  3. #define BAUDRATE      9600
  4.  
  5. #define BAUDDIV (SystemClock/BAUDRATE)
  6.  
  7. #if BAUDDIV < (65536*4)
  8. #define BRG_DIV          4
  9. #define CLKSEL           1
  10. #elif BAUDDIV < (65536*16)
  11. #define BRG_DIV         16
  12. #define CLKSEL           0
  13. #else
  14. #error "ez a BAUDRATE nem előállítható"
  15. #endif // BAUDDIV
  16.  
  17. #define BAUDRATEREG ((SystemClock+((BRG_DIV/2)*BAUDRATE))/BRG_DIV/BAUDRATE-1)
  18. SPBRG = BAUDRATEREG;                  // alsó byte;
  19. SPBRGH = BAUDRATEREG >> 8;            // felső byte
  20. TXSTAbits.BRGH = CLKSEL;              // lo/hi speed
(#) don_peter hozzászólása Jan 30, 2016 /
 
Uraim, had kérdezzem meg, hogy ti milyen megoldással oldanátok meg a PC és PIC közötti USART folyamatos adatáramlást a legoptimálisabban és leggyorsabban?
C18-ban programozok.

Jelenleg, így működne:
1. PC küld egy adatot PIC-nek és vár
2. PIC egy while ciklusban pörög és egy feltételben figyeli DataRdyUSART() függvényt, hogy érkezik e adat. Ha igen, akkor elvégzi az adat rögzítését
3. PIC kiküld egy adatot PC-nek amivel jelzi, hogy kész és várja a következő adatot
4. PC megkapja az adatot
5. PC az adat tömb végéig ismétli az adatküldést

Ami gondot okoz, hogy a PIC nem érzékeli sok esetben az adatot amit PC küld, pedig az kiküldi.
Mutatom a figyelő részt.:
  1. upload = 1;
  2. while(upload){
  3.                                                
  4.         if(DataRdyUSART()){    // Ha érkezik adat
  5.                                                
  6.             result = read_uart();    // Kiolvassuk az érkező adatot
  7.             Adat_feldolgozo = result;    // Adatot feldolgozzuk
  8.        
  9.             LED = !LED;    // Jelezzük LED-el is a folyamatot
  10.             Wait = 0;        // Folyamatban lévő adatküldés nullázza kilépés mérését
  11.             x++;               // Számoljuk a byte-ok számát egyeztetés miatt
  12.             write_uart(0x01); // Nyugtázunk bármilyen adattal (ezt várja a PC)
  13.         }else{
  14.             Wait++;
  15.         }
  16.         if(Wait>60000){ upload = 0; }   // Kilép                              
  17. }//while


A gond, hogy sok esetben nem fut le a feltétel mert olyan mint ha nem kapna adatot, pedig kap.
A hozzászólás módosítva: Jan 30, 2016
(#) bbalazs_ válasza don_peter hozzászólására (») Jan 30, 2016 /
 
egyszeruen a PIC oldalon tedd megszakitasba a read-et. Igy ha adat jott , mindenkeppen elugrik az adatkezelohoz, azt gyorsan kiolvassa (pufferbe teszi pl. darabszamlalot noveli) es mar vissza is adja a vezerlest a foproginak, ami meg a darabszamot figyeli, amit mar mi noveltunk.
En ilyen esetben baudrate-beallitasi problemara gyanakodnek elsosorban. Szkoppal nezd meg, mekkora a PIC oldali ADAS sebessege (FF-eket a TX regiszterbe folyamatosan). Na, ilyen sebesseggel VESZI is az adast.
(#) don_peter válasza bbalazs_ hozzászólására (») Jan 30, 2016 /
 
De a ciklusban is érzékelnie kell, hogy van adat, különbem a megszakítás sem működne.

Idézet:
„En ilyen esetben baudrate-beallitasi problemara gyanakodnek elsosorban.”

Ez hogy csináljam?
PC-s programból folyamatosan küldjek 0xFF-eket PIC-nek?
(#) Bakman hozzászólása Jan 30, 2016 /
 
Sziasztok!

16F690, kültérbe szánt kapcsolás. Melyik a jobb választás? Belső órajel vagy külső kvarc? Nem probléma az sem, ha +- 10 %-ot elmászik az órajel frekvenciája. Adatlap szerint -40 °C-ig bírja (árnyékban lesz mindig, max. 40 °C).
(#) cassis hozzászólása Jan 30, 2016 /
 
A processzor munkaregiszterébe szeretnék tenni közvetlenül egy C nyelvbeli változót. (Most tömb kezdőcímet)
Találtam is szintaktikai ajánlást, de persze triviálisan nem működik.
Így néz ki:

  1. int InBuff[16];          //input buffer
  2.  
  3. void main(){
  4.  
  5.   W0 = &InBuff;          //W0 points to the first element of input buffer (InBuff)


Hogyan lehetne ezt megoldani?
A hozzászólás módosítva: Jan 30, 2016
(#) bbalazs_ válasza don_peter hozzászólására (») Jan 30, 2016 / 1
 
Nem, hanem a PIC-bol a PC fele es a TX labra teszed a szkopfejet. Ekkor tudod a PIC baudrate-jet ellenorizni. A masik irany sem haszontalan, de a PC oldalon altalaban kisebb a tevesztes beallitasi lehetosege.

Pl. en mindig a ROOT-ot szivom meg, ha hex-re van allitva, akkor egy jonak tuno decimalis szam (pl. 12) hexaban ertelmezodik, ami 18-nak mar nem jo. Ezert atalltam a 0x56 alakra es DEC-ben hagyom a ROOT-ot.

Ja a megszakitas csak otlet volt, mert az hardveres, tehat ha befejezte a bitek betolteset, akkor mindig general megszakitast hardverbol. A pollingot pl. megszakithatja egy masik megszakitas, ami kihagyashoz vezetHET.
A hozzászólás módosítva: Jan 30, 2016
(#) don_peter válasza bbalazs_ hozzászólására (») Jan 30, 2016 /
 
Amit most csatoltam az megy PIC-ből a PC-s program felé.
Ekkor tökéletesen működik, de ha PC-ről küldöm az adatot PIC-nek és ezzel a kódrésszel fogadom majd nyugtázom:
  1. while(1){
  2.                         while(PIR1bits.RCIF);
  3.             RCSTAbits.CREN = 1;
  4.                         while(!PIR1bits.RCIF);
  5.                         result = RCREG;
  6.                         TXREG = 0xff;
  7.                         while(!PIR1bits.TXIF);
  8.                 }

Akkor pár jel után megszakad a folyamat.
PC csak akkor küld jelet, ha PIC is küld neki és persze ez fordítva is.
Azt hiszem a PIC téveszt, de nem tudom miért.
PC-és programból így néz ki:
  1. byte[] buffer = new byte[1];
  2.                     buffer[0] = 0xff;
  3.                     while (a < 1) {
  4.  
  5.                         serialPort1.Write(buffer, 0, 1);    // PC küldi az adatot
  6.                         serialPort1.Read(buffer, 0, 1);    // Vár PIC-re hogy jöjjön az adat
  7.                     }

Hardveresen, hogy tudom beállítani, hogy okozzon megszakítást ha érkezik jel?
Tudnál ebben segíteni?
Kipróbálnám ezt is, hátha megoldja a gondot.
A hozzászólás módosítva: Jan 30, 2016
(#) cassis válasza cassis hozzászólására (») Jan 30, 2016 /
 
Megtaláltam a megoldást a header file ban. A munkaregisztert WREG0 nak kell hívni, nem W0 nak.
Azonban felmerült egy másik kérdés közben. Az alábbi sor nem tudom értelmezni, túl bonyolultnak tűnik számomra.
Így néz ki W re:
Idézet:
„extern volatile unsigned int WREG0 __attribute__((__sfr__,__deprecated__,__unsafe__));”

és így valamely más SRF re:
Idézet:
„extern volatile unsigned int SPLIM __attribute__((__sfr__));”

Valaki el tudná magyarázni hogyan kell olvasni?
(#) Pali79 válasza Bakman hozzászólására (») Jan 31, 2016 /
 
Ha nem számít a pontosság akkor inkább belső.
(#) bbalazs_ válasza don_peter hozzászólására (») Jan 31, 2016 / 1
 
Adatlap. Idezem:

3. If interrupts are desired, set enable bit RCIE.
5. Enable the reception by setting bit CREN.
6. Flag bit RCIF will be set when reception is complete
and an interrupt will be generated if enable
bit RCIE was set.

Te nem ebbol dolgozol?
C-ben nem tudok segiteni, de ahogy latom nincs torolve az IF (interrupt flag), amit szerintem meg kellene tenni.
(#) Hp41C válasza don_peter hozzászólására (») Jan 31, 2016 / 1
 
Sokszor leírtam már:
Vétel: Folyamatos vétel, RC megszakítást beállítani, vételi hibát lekezelni, a vett adatot egy vételi bufferbe írni. Adás: A TX megszakíáts az adási bufferből veszi ki a soron következő adatot és beírja a TXREG -be. Ha nincs adat a TX megszakítást tiltja.
A fő program a vételi buffert figyeli, ha ven benne adat kiveszi és feldolgozza, a választ az adási bufferbe írja és engedélyezi a TX megszakítást.
Melyik szimulátort használod?

bbalász: Az RCIF és a TXIF automatikusan törlődik (náhány utasítással később) a RCGER kiolvasása ill. a TXREG írása után.
A hozzászólás módosítva: Jan 31, 2016
Következő: »»   745 / 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