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   1072 / 1203
(#) eSDi válasza superuser hozzászólására (») Feb 19, 2019 /
 
Ez így nem lesz jó. A high_byte felső 4 bitje a szemét, a végén ÉS-elnie kell 0x0fff-el. Csak szerintem felcserélte a két változó nevét. Ha a high_byte alsó 4 bitje a szemét, akkor be kell kapcsolnia az LSB First bitet az AD-ben.

BenőAladár:

  1. Val12bit = (((unsigned int) high_byte) << 8) | low_byte) & 0x0fff;


Példa:
x : zagyva
high_byte : 0bxxxx1010
low_byte : 0b11001100
(unsigned int) high_byte) << 8) után ez lesz : 0bxxxx101000000000
low_byte-ot VAGY utasítással hozzá adod : 0bxxxx101011001100
ÉS 0x0fff (0b0000111111111111) után ez lesz: 0b0000101011001100
A legfelső 4 bit mindig 0 lesz, mert 0x0fff-el kimaszkoltad.
A hozzászólás módosítva: Feb 19, 2019
(#) frekivalto hozzászólása Feb 21, 2019 /
 
Sziasztok!

Abban kérném segítségeteket, hogy egy 4byte számnál, hogy tudom visszanyerni az eredeti 1byte számokat, mind a négyet?

Bluetooth-n keresztül küldöm ki a számokat, 4db 1 byte számot, egymás után.
A fogadó oldalon pedig 1db 4byte hosszú változóba fogadom.

Ami eddig sikerült, az az 1. és 4. byte visszakódolása. a 2. és 3.-al nem boldogulok.
Ami nem jöhet szóba, az a bit léptetés, shiftelés... ezt nem tudja a program.

Példa:
Küldés: byte1=01 byte2=02 byte3=03 byte4=04 (dec=16843009)
Fogadás: 4databyte=16843009
byte1=remainder of 4databyte/256, így megkapom eredménynek a 01-et.
byte4=quotient of 1databyte/16777216(ez 2 a 24.en), így megkapom eredménynek a 04-et.
byte2 ???
byte3 ???

Amivel meg kellene oldani, az a remainder (maradék) és a quotient (hányados) parancsok, valamint a matematikai műveletek állnak még rendelkezésre.
Amihez szeretném használni, az az app invertor androidos fejlesztő program.
A léptetés jobbra vagy balra nem játszik, sajnos...

Köszönöm előre is ha tudtok segíteni.
Peti
(#) usane válasza frekivalto hozzászólására (») Feb 21, 2019 /
 
Nem egészen értem. Ez egy PIC-es téma. Minden fordító és PIC tud shiftelni. Ha nincs PIC a vevői oldalon akkor nem ide tartozik a kérdés. Mit mihez és hogyan akarsz küldeni, összekötni???
Ha választ is akarsz akor pedig konkretizálj. Az, hogy bluetoothal küldöd nem sok info. Gondolom az egyik oldal telefon.(adó vagy vevő). Mi van a másik oldalon?
A hozzászólás módosítva: Feb 21, 2019
(#) Hp41C válasza frekivalto hozzászólására (») Feb 21, 2019 /
 
Milyen nyelven programozod az adót és a vevőt? Netalán C -ben?
Ha C-ben:
Készíts egy u_n_i_o_n -t (alázúzás nékül, csak a fórum motor üres hozzászólást tesz be, ha nincs aláhúzás benne)
  1. typedef u_n_i_o_n _DWORD_VAL
  2. {
  3.     DWORD Val;
  4.     BYTE v[4];
  5. } DWORD_VAL;


Az adóban:

  1. DWORD_VAL kod;
  2. ...
  3. kod.Val = 16909060; // 0x01020304
  4. ...
  5. send(kod.v[3]); // MS byte fist
  6. send(kod.v[2]);
  7. send(kod.v[1]);
  8. send(kod.v[0]);
  9. ...


A vevőben:
  1. DWORD_VAL kod;
  2. ...
  3. receive(kod.v[3]); // MS byte first
  4. receive(kod.v[2]);
  5. receive(kod.v[1]);
  6. receive(kod.v[0]);
  7. ...
  8. printf("%d",kod.Val);
  9. ...


Avagy:

  1. byte1 = kod & 0xFF;
  2. kod >>= 8;
  3. byte2 = kod & 0xFF;
  4. kod >>= 8;
  5. byte3 = kod & 0xFF;
  6. kod >>= 8;
  7. byte4 = kod & 0xFF;
A hozzászólás módosítva: Feb 21, 2019
(#) Lamprologus válasza frekivalto hozzászólására (») Feb 21, 2019 /
 
Talán így:
osztod 16777216, egész rész=byte4
maradékot osztod, 65536 egész rész=byte3
maradékot osztod 256, egész rész=byte2
maradék=byte1
(#) frekivalto válasza usane hozzászólására (») Feb 21, 2019 /
 
Köszönöm.
Valóban nem PIC-es téma. Csak matematikai...

A vevő oldalon van egy androidos program, amit én írok és a telefonomon futtattatom.
Mivel nincs app invertor fórum (bár lehet, hogy érdemes lenne egyet létrehozni), ezért bátorkodtam itt feltenni a kérdést.

Mivel az app invertorban kötött műveletek vannak, és nincs a szzámoknál shiftelési művelet, így kénytelen vagyok tisztán matematikai műveletekkel megoldani a feladatot.

Lentebb Lamprologus értette a kérdésemet, és meg is válaszolt.
(#) frekivalto válasza Hp41C hozzászólására (») Feb 21, 2019 /
 
Köszönöm fáradozásodat.
Sajnos nem C-ben programozom, ygx ez a lehetősé csak kontrollerben jó, nálam az applikációban nem.
(#) frekivalto válasza Lamprologus hozzászólására (») Feb 21, 2019 /
 
Köszönöm!
Erre gondoltam, ki is próbálom.
(#) frekivalto válasza frekivalto hozzászólására (») Feb 21, 2019 /
 
Köszi- Működik!
Üdv Peti
(#) eSDi hozzászólása Feb 22, 2019 /
 
Még egy ok, hogy hardveren bogármentesítsünk és a szimulátort kerüljük.
16F18857 - ADCC modul. Az átlagoló módot próbálgattam szimulátoron, mert a fene se gondolná, hogy nem jó. Stimulus-al megadtam, hogy az ADRESH:ADRESL egyenlő legyen 1023-al. Az ADFLTR regiszter a kimenetem, de az első lépésnél már 16368 kerül bele, holott oda is 1023 kellene kerüljön, mint ahogy az ADACC-be. A következő ciklussal csökken az értéke, holott növekednie kellene. A végén ezt a számot osztja, hogy megkapjuk az átlagot. De mivel teljesen rossz, ezért az eredmény is az. Már nem is tudom hányszor néztem át a beállításokat és mindig jónak tűnt (mert az is). Kínomban előtúrtam a hardvert, ott érdekes módon jól működik.

  1. void Init_ADCC() {
  2.    
  3.     //Internal Vref = 4096mV.
  4.     FVRCONbits.TSEN = 0;
  5.     FVRCONbits.TSRNG = 0;
  6.     FVRCONbits.CDAFVR = 0b00;
  7.     FVRCONbits.ADFVR = 0b11;
  8.     FVRCONbits.FVREN = 1;
  9.    
  10.     //ADC Enabled | Continuous Operation = OFF | Clock source = Fosc | Right-justified
  11.     ADCON0bits.ADON = 1;
  12.     ADCON0bits.ADCONT = 0;
  13.     ADCON0bits.ADCS = 0;
  14.     ADCON0bits.ADFRM0 = 1;
  15.    
  16.     //Precharge and Double-Sample is not needed, All = OFF
  17.     ADCON1bits.ADPPOL = 0;
  18.     ADCON1bits.ADIPEN = 0;
  19.     ADCON1bits.ADGPOL = 0;
  20.     ADCON1bits.ADDSEN = 0;
  21.    
  22.     //Average mode | Right Shift 4 = Divide by 16
  23.     ADCON2bits.ADPSIS = 0;
  24.     ADCON2bits.ADCRS = 0b100;
  25.     ADCON2bits.ADACLR = 1;
  26.     ADCON2bits.ADMD = 0b010;
  27.    
  28.     //ADC Error Calculation Mode = Average/filtered value vs. setpoint | Interrupt always at end of calculation
  29.     ADCON3bits.ADCALC = 0b101;
  30.     ADCON3bits.ADTMD = 0b111;
  31.    
  32.     //ADC Conversion Clock = Fosc/128
  33.     ADCLKbits.ADCCS = 0b111111;
  34.    
  35.     //VREF- is connected to AVSS. VREF+ is connected to FVR_buffer 1.
  36.     ADREFbits.ADNREF = 0;
  37.     ADREFbits.ADPREF = 0b11;
  38.    
  39.     //ADC Positive Input Channel = ANA6 (PORTA6).
  40.     ADPCHbits.ADPCH = 0b000110;
  41.    
  42.     //Precharge time is not included in the data conversion cycle.
  43.     ADPREbits.ADPRE = 0x00;
  44.    
  45.     //Acquisition time is 64 clocks of the selected ADC clock
  46.     ADACQbits.ADACQ = 0x40;
  47.    
  48.     //No Additional Sample Capacitor Selected.
  49.     ADCAPbits.ADCAP = 0b00000;
  50.    
  51.     //ADC Repeat Threshold = 16
  52.     ADRPTbits.ADRPT = 0x10;
  53.    
  54.     //Auto-Conversion Trigger = External Trigger Disabled
  55.     ADACTbits.ADACT = 0b00000;
  56. }
  57.  
  58. void ReadADCC_ANA6() {
  59.     unsigned char i;
  60.     ADCON2bits.ADACLR = 1; //Clear accumulators
  61.     while (PIR1bits.ADTIF == 0){
  62.         ADCON0bits.ADGO = 1;
  63.         while (PIR1bits.ADIF == 0); //Wait for acquisition done.
  64.         PIR1bits.ADIF = 0;
  65.     }
  66.     PIR1bits.ADTIF = 0;
  67.     ADCC_Result = ((unsigned short)(ADFLTRH << 8) | ADFLTRL);
  68. }
(#) usane hozzászólása Feb 23, 2019 /
 
Üdv!

Egyirányú szintillesztéshez megerősítésre van szükségem, hátha valamit kihagyok.
Mindkét esetben bal oldal a 12V be, jobb oldal az 5V ki. A csatolt BSS 138-at tudom, hogy működik. Kérdések: Ha a bejövő jelem 0 vagy 12V (induktív szenzor) akkor a 12V felhúzást elvileg elhagyhatom. A másik ugyanez a 12V-ról 5V-ra csak P-FET-el. Ennek is működnie kellene. Melyik a jobb megoldás és miért?
(#) cross51 hozzászólása Feb 23, 2019 /
 
Sziasztok!

Mivel még mindig sokszor látom, hogy valaki PICkit 2 klónt akar építeni. Akinek nem lényeg, hogy ő építse esetleg spórolni akar rajta: MPLAB Snap és most még akciós is.

Bár powert nem tud adni csak programozó.
(#) BenőAladár válasza eSDi hozzászólására (») Feb 23, 2019 /
 
Bocsánat, hogy nem tudok azonnal reagálni mindig.

Tovább fejlődtem megértettem amit írtatok és ki is próbáltam:
Az eredmény a következő:
  1. AdCSon();
  2.     __delay_us(10);
  3.    
  4.     spiWrite(0b00001100);
  5.     __delay_us(10);
  6.     uah = spiRead();            //Első 4 bit szemét ahogy írtad is
  7.  
  8.     spiWrite(0b00001100);       //Második 8 bit
  9.     ual = spiRead();
  10.     __delay_us(10);
  11.  
  12.     AdCSoff();//TLC2543 CS-láb H
  13.    
  14.     ua = ((((((unsigned int) uah) << 8) | ual) & 0b0000111111111111));
  15.    
  16.     sprintf(s, "%d", ua);
  17.     Lcd_Set_Cursor(1,7);
  18.     Lcd_Write_String(s);


A maximális értéke 4080-ig megy el az ua változónak és lépésenként 16-ot lép tehát a TLC2543 adatlapja szerint viszont 0.0012V-ként kellene 1-el növekednie.
Erre nem jövök rá egyenlőre még mi okozhatja. A referenciafeszültsége az AD-nek 5,04V.
Körülbelül 0.5V-ként újrakezdődik a számlálás és a maximális 5.04V-nál már megakad a 4080-as értéken..

Valahogy azt akarom elérni, hogy 1-esével számoljon és szépen 0-4095 értékig menjen el.
A hozzászólás módosítva: Feb 23, 2019
(#) Pali79 hozzászólása Feb 23, 2019 /
 
Sziasztok!
PIC18F14K22-vel próbálok összehozni UART kommunikációt. Az alábbi kódrészlet kifogástalanul működik 16F877A-val, de a 18F-re alkalmazva hibás adatokat küld. Már átnyálaztam az adatlapokat és egyszerűen nem látom a különbséget, hogy az egyiken miért működik és a másikon miért nem.
  1. movlw   d'25'                           ;9600 baud @ 4 Mhz Fosc +0.16 err
  2.         movwf   SPBRG
  3.         movlw   b'00100100'                     ;brgh = 1
  4.         movwf   TXSTA                           ;enable Async Transmission, set brgh
  5.         movlw   b'10010000'
  6.         movwf   RCSTA
  7. ....
  8.         movlw   'R'
  9.         movwf   TXREG
  10.         btfss   TXSTA,TRMT
  11.         goto    $-1
  12.  
  13. ....
A hozzászólás módosítva: Feb 23, 2019
(#) Hp41C válasza cross51 hozzászólására (») Feb 23, 2019 /
 
Ajánlom az alábbiakat átnézni a Snap leírásában mielőtt kidobná valaki a PICkit2 -jét.
A résztelet képként is csatolom.
Programmable Vpp: No.
Programable Vdd: No.
A Vpp generátor hiánya miatt a legnépszerűbb típusokat nem kezeli.
MpLabX 5.10 DeviceSupport.htm állomány szerint alig található tesztelt (zöld) típus a Snap sorában.

A Snap csak MpLabX alál kezelhető, forrása nem áll rendelkezésre. A PICkit2 -t fel lehet okositani szinte minden Microchip, Atmel, SST típus kezelésére.

Egyébként a PICkit4 is akciós február 28 -ig.
(#) Hp41C válasza Hp41C hozzászólására (») Feb 23, 2019 /
 
A kép lemaradt sajnos.

Snap.jpg
    
(#) artur60 válasza Hp41C hozzászólására (») Feb 23, 2019 /
 
Szia!

Ez a felokosítás érdekel!
Hol találok erről bővebb leírást, vagy el tudod küldeni emailban (ha magyarul lenne az jó lenne )?
Teljes körűen használható lesz?

Köszi
(#) Hp41C válasza artur60 hozzászólására (») Feb 23, 2019 /
 
Ebben és a PICkit2 továbbfejlesztése topikban is tettem már fel bővített Pk2DeviceFile.dat állományt.

PICkit2 Device File Editor
Vigyázat: Part és Script duplikálás után az állományt menteni és visszatölteni kell, a tömb elemek a visszatöltés után válnak egyedivé.

A PICkit2 firmware és a kezelő program forrása letölthető, módosítható. Nem lesz teljes körű, az MpLab ill. MpLabX programok alól nem lesz kezelhető és a nyomkövetés (debug) sem oldható meg az újonnan felvett típusokra. De firmware letöltés nélkül lehet különböző családok tagjait programozni.
(#) usane válasza Hp41C hozzászólására (») Feb 23, 2019 /
 
Még mindig sok a sárga kocka. Főleg a 8 és 16 biteseknél, de azért csábító.
(#) Hp41C válasza usane hozzászólására (») Feb 23, 2019 /
 
Idézet:
„Még mindig sok a sárga kocka.”

Snap esetében az 5.10 Device Support állományában összesen 14 zöld típus szerepel. A PICkit4 jobban áll (~360). Még mindig a PICkit3 vezet.
(#) Bakman válasza usane hozzászólására (») Feb 23, 2019 /
 
Két ellenállás, mint feszültségosztó nem jó?
(#) eSDi válasza BenőAladár hozzászólására (») Feb 23, 2019 /
 
Meg tudod mondani, hogy mit értesz első 4 bit-en? Én felső 4 bit-et írtam, ami a 7., 6., 5., 4. bit-et jelenti. Lásd kép. Mert ha fordítva van, akkor meg kell fordítanod az adatkiküldési irányt.

Illetve tudsz pár példát írni, hogy mi jön? Pl.: 0V-nál és 5V-nál, meg a felénél mondjuk.

Byte45.png
    
(#) BenőAladár válasza eSDi hozzászólására (») Feb 24, 2019 /
 
Ebből indultam ki tehát egyet beszélünk azt hiszem tehát a felső 4 bit ahogy az órajelen jelöltem.

5.04V-ot kap az AD a referencia bemenetén.

5.04V-nál 4080 a kapott érték decimálisra konvertálva a fent használt sprintf-kódal
327mV-nál ugrál 144-160-176 érték között mozog ebben a három lépésben
(ez az alap egy nyúlásmérő van rákötve egy müv.erősítővel, ebből is látszik, hogy 16-osával ugrik )
1.00V-nál 688-704-720 között ugrál ebben a három lépésben
kb 630mV-ként eléri a 4080-as értéket és kezdi előröl a számolást.
A hozzászólás módosítva: Feb 24, 2019

meas.png
    
(#) rolandgw válasza BenőAladár hozzászólására (») Feb 24, 2019 / 2
 
Így valóban 4080, az elejéről lemaszkolsz 4 értékes bitet, a végére pedig 4 nulla kerül, ergo a max érték 0xFF0. ua-t el kell tolni jobbra 4-el és maszkolni sem kell.
  1. ua = ((((unsigned int) uah) << 8) | ual);
  2.  ua >>= 4;
A hozzászólás módosítva: Feb 24, 2019

crop.PNG
    
(#) eSDi válasza rolandgw hozzászólására (») Feb 24, 2019 / 1
 
Ez lesz a megoldás! Ez az ábra honnan van? Az eredeti adatlapban nem láttam.
Viszont le van írva, amin szépen át is siklottunk. Ha lerajzolták volna, már rég meglenne a megoldás.

Idézet:
„With bits D3 and D2 set to 11, the 16-bit data-length mode is selected, which allows convenient communication with 16-bit serial interfaces. In the 16-bit mode, the result of the current conversion is output as a 16-bit serial data stream during the next I/O cycle with the four LSBs always reset to 0 (pad bits).”
(#) eSDi válasza Pali79 hozzászólására (») Feb 24, 2019 /
 
Jónak tűnik. Biztos 4MHz az az Fosc?
(#) rolandgw válasza eSDi hozzászólására (») Feb 24, 2019 /
 
Idézet:
„már rég meglenne a megoldás”

Ketten is leírtuk már, te mondtad, hogy nem jó.
Bővebben: Link
(#) Pali79 válasza eSDi hozzászólására (») Feb 24, 2019 /
 
Elméletileg igen. Belső óráról jár.
  1. movlw   B'01010110'             ; oszcillátor frekvenciája 4 MHz
  2.         movlw   OSCCON
A hozzászólás módosítva: Feb 24, 2019
(#) eSDi válasza rolandgw hozzászólására (») Feb 24, 2019 /
 
Uppsz! Viszont akkor még nem tudtuk milyen adatok kap a változókba.
Nem kell feltétlenül rám hallgatni. Ki kell próbálni minden javaslatot.
(#) eSDi válasza Pali79 hozzászólására (») Feb 24, 2019 /
 
Még a Config bitek és az OSCCON lehet rosszul beállítva. Engedélyezd az órajel kimenetet, ha azt megméred kiderül mennyin jár.
Következő: »»   1072 / 1203
Bejelentkezés

Belépés

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