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   782 / 1210
(#) Bell válasza don_peter hozzászólására (») Ápr 30, 2016 /
 
Ha az eredeti konstrukció kiforrott, az utángyártott holmikkal nincs sok gond.
A postaköltséggel együtt anyagár alatt vásárolt elektronikus kütyükkel kapcsolatban jók a tapasztalataim.
Ha netán nem működik, visszakérem a pénzt.
(#) cross51 válasza don_peter hozzászólására (») Ápr 30, 2016 /
 
Vagy most jutott eszembe, nekem van egy ismerősöm akinek Pk3 klónja van, ha gondolod megkérdezem ő melyiket vette.
(#) don_peter válasza cross51 hozzászólására (») Ápr 30, 2016 /
 
Azt megköszönném.
Írtam amúgy egy durván hosszút, de lejárt a szerkesztési idő és elveszett.
Nem gépelem be újra
Projektemmel és PIC-el kapcsolatos ok fejtsem volt
(#) diablo válasza don_peter hozzászólására (») Ápr 30, 2016 /
 
Ha klón kell, de vagánykodni akarsz, hogy neked eredeti van: Bővebben: Link
Nekem is ilyen van, és talán pont tőle vettem, csak azóta már frissítette a hirdetést így nincsenek értékelések.
Jól működik, túlélt már egy Vdd túlfeszültséget is.
Egyébként sok különbség nincs a klónok között. Rendeltem már másfajtát is, de csak azt vettem észre, hogy amit a Microchip feliratos Pk3 programozott külső tápfesz nélkül, addig a másik, felirat nélküli klón azt csak alacsonyabb Vdd beállítás mellett volt hajlandó megtenni. De ez függött még a PIC típusától is.
A hozzászólás módosítva: Ápr 30, 2016
(#) icserny válasza diablo hozzászólására (») Ápr 30, 2016 /
 
Mindenesetre amíg a PICkit3 megjön, addig is lehet PICki2-vel próbálkozni, Szergej Vakuleno PIC32prog programjával. Egyszer próbáltam Windows alatt, akkor működni látszott, de nagyon nem mélyedtem el benne.

SREX vagy HEX formátumú programokat lehet beéígetni vele. Az ELF binárisból így csinál SREC-et:
objcopy -O srec firmware.elf firmware.srec
(#) pajti2 hozzászólása Ápr 30, 2016 /
 
Pic-hez köthető nand flash memóriákat nézegettem, és a kapacitásuk valami extrém low. Egy emmc kártyában is már benne van 32 giga, a forrasztható cuccok meg ilyen 128mega / 256mega környékén mozognak. Mi a fene? Hol vannak a normális cuccok?
(#) apromax hozzászólása Ápr 30, 2016 /
 
Változó típusátalakításban kérnék segítséget.
Van egy hőmérőm, ami 2 byte -on szolgáltat mérési adatot.
A gondom az, hogy velük matematikai műveleteket kell végezni, majd az eredményt további felhasználáshoz 1 byte ba megjeleníteni, természetesen 0...255 között és csak egész számokkal. Ami biztosra vehető hogy túlcsordulás nem lesz, mert a 0...255 tartományt nem lépjük a méréssel túl.
Én így oldottam meg a problémát, de nem működik korrektül. Bizonyára nem szereti a visszafele történő a típuskényszerítést, amiben igaza is van.

  1. unsigned char  Temperature_High;  // Teperetaure High Nyte
  2. unsigned char  Temperature_Low ;  // Teperetaure Low Nyte
  3. unsigned int Temp;
  4. float Teperature_Korr;   // korrigált érték
  5. unsigned char  Temperature_8     // Temperetaure 1 byton
  6.  
  7.  
  8.         Temp = (Temperature_High << 8) + Temperature_Low;
  9.         Teperature_Korr = ((float) Temp / 16382) * 110 - 40;    // Korrekció
  10.         Temperature_8 = (char) Teperature_Korr;


Tudtok ennél egy jobb megoldást?
(#) Bell válasza apromax hozzászólására (») Ápr 30, 2016 /
 
Szerintem pontosabb és gyorsabb lenne, ha a 9-es sor így néz ki:
  1. Teperature_Korr = (float) (Temp / 148.92727) - 40;    // Korrekció
(#) apromax válasza Bell hozzászólására (») Ápr 30, 2016 /
 
Teljesen jogos, csak bemásoltam az előírt összefüggést. Egyébként a sebesség nem kritikus ezért nem is optimalizáltam. Viszont a kérdés továbbra is nyitott.
(#) pajti2 válasza apromax hozzászólására (») Ápr 30, 2016 /
 
  1. union __attribute__((__packed__)) convert_struct {
  2.   unsigned char b[4];
  3.   unsigned u; };
  4.  
  5. union convert_struct s1;
  6. s1.b[0]= Temperature_Low;
  7. s1.b[1]= Temperature_High;
  8. s1.b[2]= 0;
  9. s1.b[3]= 0;
  10. s1.u*= 110;
  11. s1.u/= 16382;
  12. s1.u-= 40;
  13. //s1.b[0]-ban van a 8 bites vegeredmeny


Kérdés: az a 16382 tuti biztos pont 16382? Nem inkább 16384? Egyszerűbb tudna úgy lenni a kód.
A hozzászólás módosítva: Ápr 30, 2016
(#) apromax válasza pajti2 hozzászólására (») Ápr 30, 2016 /
 
Egy kis segítség még jól jönne.
Kipróbáltam de mintha rosszul számolna.
Elmondod hogy működik, nekem bizonyos részletek még magasak.
Gondolom egy speciális uniont deklarálunk az elején. benne u taggal.
Majd s1 tömbben végzünk számításokat, de ott is kérnék magyarázatot különösen u ra.

Igen az osztó nem hatványa 2 nek, és 16382. De ha rotációval osztunk mintha az lenne, akkor nagy hibát nem követünk el. Szóval a kódnak ez a része jó lesz.
(#) gabilow hozzászólása Ápr 30, 2016 /
 
Szép Napot!
Átalakítottam néhány oldallal ezelőtti peltier vezérlőt DS18b20-as hőmérőre.
Szeretném, ha a tized fokot is kijelezné. Mit kell írni a "getal3 = ???? " sorba, vagy mást is át kell írni?
Most ismerkedem a 7szegmenses kijelzőkkel.
Köszi a segítséget.


  1. Device              16F628A
  2.  Reminders = off
  3.     Config WDT_OFF, PWRTE_ON, MCLRE_OFF, INTRC_OSC_NOCLKOUT, LVP_off
  4.  Reminders = On  
  5.     All_Digital         = true
  6.      
  7. '****************************************************************    
  8.    Symbol  digit1   = PORTA.0
  9.    Symbol  digit2   = PORTA.1
  10.    Symbol  digit3   = PORTA.2
  11.    Symbol  digitA   = PORTB.0
  12.    Symbol  digitB   = PORTB.1
  13.    Symbol  digitC   = PORTB.2
  14.    Symbol  digitD   = PORTB.3
  15.    Symbol  digitE   = PORTB.4
  16.    Symbol  digitF   = PORTB.5
  17.    Symbol  digitG   = PORTA.6
  18.    Symbol  DQ       = PORTA.7
  19.    'Symbol  peltier  = PORTB.0
  20.    
  21.    
  22.     Dim Temp         As Word  
  23.     Dim TempIND      As Word
  24.     Dim     getal1   As Byte
  25.     Dim     getal2   As Byte
  26.     Dim     getal3   As Byte                            
  27.     Dim     getal    As Byte
  28.     Dim     index    As Byte
  29.     Dim     fok      As Byte
  30.     Dim R_Temp       As Word    
  31.        
  32.    
  33.  
  34. '****************************************************************
  35. main:
  36.    While 1 = 1
  37.        GoSub sensorIn
  38.      
  39.        getal1 =  TempIND / 10
  40.        getal2 =  (TempIND - (getal1 * 10))      
  41.        getal3 =  ??????????????????????????
  42.      
  43.        GoSub dispUit
  44.        
  45.        
  46.    Wend
  47.  
  48.  
  49. '****************************************************************      
  50. sensorIn:
  51.     OWrite DQ, 1, [$CC,$44]    
  52.     OWrite DQ, 1, [$CC,$BE]
  53.     ORead DQ, 2, [R_Temp.LowByte, R_Temp.HighByte]
  54.     Temp = R_Temp
  55.     TempIND = Temp /16
  56.     'If R_Temp > 64654 Then TempIND = Temp / 16 - 4096
  57. Return
  58. '****************************************************************    
  59. dispUit:
  60.     '    A
  61.    '  F   B
  62.     '    G
  63.    '  E   C
  64.     '    D
  65.    For index = 0 To 2
  66.        If index = 0 Then
  67.            getal = getal1  
  68.            High digit1
  69.        EndIf
  70.        If index = 1 Then  
  71.            getal = getal2                  
  72.            High digit2  
  73.        EndIf
  74.        If index = 2 Then  
  75.            getal = getal3
  76.            High digit3
  77.              
  78.        EndIf    
  79.        Select getal
  80.            Case 0    
  81.                High digitA
  82.                High digitB
  83.                High digitC
  84.                High digitD
  85.                High digitE
  86.                High digitF
  87.                Low  digitG            
  88.            Case 1
  89.                Low  digitA
  90.                High digitB
  91.                High digitC
  92.                Low  digitD
  93.                Low  digitE
  94.                Low  digitF
  95.                Low  digitG        
  96.            Case 2
  97.                High digitA
  98.                High digitB
  99.                Low  digitC
  100.                High digitD
  101.                High digitE
  102.                Low  digitF
  103.                High digitG        
  104.            Case 3
  105.                High digitA
  106.                High digitB
  107.                High digitC
  108.                High digitD
  109.                Low  digitE
  110.                Low  digitF
  111.                High digitG        
  112.            Case 4
  113.                Low  digitA
  114.                High digitB
  115.                High digitC
  116.                Low  digitD
  117.                Low  digitE
  118.                High digitF
  119.                High digitG        
  120.            Case 5
  121.                High digitA
  122.                Low  digitB
  123.                High digitC
  124.                High digitD
  125.                Low  digitE
  126.                High digitF
  127.                High digitG        
  128.            Case 6
  129.                High digitA
  130.                Low  digitB
  131.                High digitC
  132.                High digitD
  133.                High digitE
  134.                High digitF
  135.                High digitG        
  136.            Case 7
  137.                High digitA
  138.                High digitB
  139.                High digitC
  140.                Low  digitD
  141.                Low  digitE
  142.                Low  digitF
  143.                Low  digitG        
  144.            Case 8
  145.                High digitA
  146.                High digitB
  147.                High digitC
  148.                High digitD
  149.                High digitE
  150.                High digitF
  151.                High digitG
  152.            Case 9
  153.                High digitA
  154.                High digitB
  155.                High digitC
  156.                High digitD
  157.                Low  digitE
  158.                High digitF
  159.                High digitG
  160.            Case fok
  161.                 High digitA
  162.                 High digitB
  163.                 Low  digitC
  164.                 Low  digitD
  165.                 Low  digitE
  166.                 High digitF
  167.                 High digitG          
  168.        EndSelect
  169.          DelayMS 2  
  170.          Low digitA
  171.          Low digitB
  172.          Low digitC
  173.          Low digitD
  174.          Low digitE
  175.          Low digitF
  176.          Low digitG
  177.          Low digit1
  178.          Low digit2
  179.          Low digit3
  180.    Next  
  181. Return
  182.  
  183. '****************************************************************  
  184. End
(#) don_peter válasza pajti2 hozzászólására (») Ápr 30, 2016 /
 
Ez a kérdés már benne is nem egyszer felmerült..
(#) pajti2 válasza apromax hozzászólására (») Ápr 30, 2016 /
 
Az union annyit csinál, hogy egymásra állítja a változók memória címét. A példában egy byte tömb, és egy 4 byte-os egész van egymásra lapozva, és amikor eredmény keletkezik az egyik változóban, az már eleve benne van a másikban. A pic little endian tárolja az eredményeket, byte-ok alacsony helyiérték .. magas helyiérték sorrendben a növekvő címek felé. Ami hibát véthettem a példával, hogy feltételeztem a fordítódról, hogy az "unsigned" 4 byte-os egész, pedig valójában nem biztos. Milyen fordítót használsz?
(#) diablo válasza pajti2 hozzászólására (») Ápr 30, 2016 /
 
Engem meg ez a sor érdekelne:
  1. __attribute__((__packed__))

Sokszor látok hasonlókat PIC-re írt C kódokban, de nem tudom hová tenni az ilyeneket. Olyan mintha C++ lenne, de sima C kódban is láttam már hasonlót.
(#) apromax válasza pajti2 hozzászólására (») Ápr 30, 2016 /
 
C30 at használok.
Az union -t ismerem, de néhány kérdés felmerül.
Elsőként a __packed__ attributom nekem idegen, arról jó volna ha elmondanád u tagja miként definiálódik, tekintve típus nélküli.
Másik kérdésem a kódból hogy annak utolsó három sora hogyan használja u és u* ot. Ez utóbbi gondolom mutató, de ettől jó volna ha többel is kiegészítenéd.
(#) diablo válasza apromax hozzászólására (») Ápr 30, 2016 /
 
Nem mutató az, csak szorzás. Az s1 union u változóját beszorozza 110-zel és az eredményt saját magában tárolja, azaz u-ban. Ugyanígy csinálja az osztást és kivonást is.
  1. s1.u = s1.u * 110;
  2. s1.u = s1.u / 16382;
  3. s1.u = s1.u - 40;
A hozzászólás módosítva: Ápr 30, 2016
(#) apromax válasza diablo hozzászólására (») Ápr 30, 2016 /
 
Szorzás igen, ez most már nyilvánvaló.
A többit értettem, ezt nem is tudom miért akartam mindenképpen mutatóként értelmezni.
Akkor már csak annyi kérdésem maradt a kóddal kapcsolatosan hogy az union definiálásakor
  1. union __attribute__((__packed__)) convert_struct {
  2.   unsigned char b[4];
  3.   unsigned u; };


miért nem kapott változótípust az u és mi az a _packed__ attributom? Látszólag "sima" union is ugyanígy viselkedne.
(#) Hp41C válasza diablo hozzászólására (») Ápr 30, 2016 /
 
packed:
A 16 és kérőbb a 32 (majd 64, 128, ki tudja hány) bites gépeknél a változók helyfoglalásánál előjöhet probláma. Egyes típusok nem tudnak egyszerűen, gyorsan kezelni olyan esetket, amikor a szavas (16 bit) változó páratlan byte címen, dupla szó (32 bit) nem 4 -gyel osztható, stb. címen kezdődik. Ilyenkor a változót részeiben kell kezelniük, ami lassabb működést eredményez. A változókat az egyes típusokra készült fordítók sebessége optimalizálva foglal(hat)ják le, de ebben az esetben kimaradhat tároló rekesz a változók között.
Pl. Egy 32 bites gépen, ameinek a 8 bites és a 4 -gyel osztható címen kezdődő 32 bites adat kezelése megy könnyen, foglaljuk le a következő változókat:
byte a;
word w;
long l;
Tegyük fel, hogy az a változó 4-gyel osztható cimre kerül. Ekkor a l változó már 4-gyel osztva 3 maradékot adó címre kerülne. Egyes fordítók ezért az l változót 4-gyel osztható címre teszik. Hasonlóan a w váltózót is tehetik páros vagy esetleg 4-gyel osztható címre. Nem törődnek a kihagyott területekkel.
A __packed__ megadásával kényszeríthetjük a fordítót, hogy ne hagyjon ki területet a foglalások között. Egy union megadásánál fontos, hogy az egymásra helyezett típusok egyes mezőinek elhelyezkedése a megadott módon történjen.
(#) don_peter hozzászólása Ápr 30, 2016 /
 
Uraim a kiszemelt PIC32MX795F512L bootloader-es?
Vagy ez általánosan igaz az USB-s PIC-ekkre?
(#) Hp41C válasza don_peter hozzászólására (») Ápr 30, 2016 /
 
Mit értesz a "bootloader-es" alatt? Írhatsz rá bootloader -t, tudja írni a saját program memóriáját....
A hozzászólás módosítva: Ápr 30, 2016
(#) diablo válasza Hp41C hozzászólására (») Ápr 30, 2016 /
 
De pont union-nál nem felesleges? Értem ezalatt, hogy az union-nak pont az a dolga, hogy "egymásra pakolja" a benne foglalt változókat.
PIC-eknél szükség van erre? Gondolok itt arra, hogy a PIC-ek a változókat mindig egymás után helyezik el a memóriában, nem?
Továbbá ha olyan fordítónk van ami így helyezi el az adatokat ahogy írtad, akkor nem az lenne a célszerű, hogy minden változót így deklarálunk?

Még valami:
Van valami ajánlott magyar irodalom az ilyen "egzotikus" kódokhoz?
A hozzászólás módosítva: Ápr 30, 2016
(#) cross51 válasza diablo hozzászólására (») Ápr 30, 2016 /
 
Igen a PIC-ek "mindig egymás után" helyezik/helyezhetik el a változót, de ne felejtsd el, hogy C-ben írod a programot ami ha az alapjaitól indulunk szerintem nem egy hardware közeli nyelv "mindent(jobb esetben) megcsinál helyettünk" tehát ő pakolja a változókat ahogyan megírták a fordítót.
A packed azért kell, mert megint fordítótól függ, honnan tudod, hogy a te fordítót a struct/union elemeit milyen címre rakja ezért, ha neked fontos akkor felszólíthadtod, hogy "egymás alá" pakolja.
(#) Hp41C válasza diablo hozzászólására (») Ápr 30, 2016 /
 
A 8 (adat) bites világban nincs ilyen probláma, hiszen minden byte ugyan olyan gyorsan kezelhető. Csak nagyobb adatszó szélességnél kell vele foglalkozni: PIC24xx, dsPIC30xx, dsPIC33xx, PIC32Mxxx.
(#) apromax válasza Hp41C hozzászólására (») Ápr 30, 2016 /
 
Nos még mindig maradnék az alapproblémánál.
  1. union __attribute__((__packed__)) convert_struct {
  2.   unsigned char b[4];
  3.   unsigned u; };

1. A válaszod alapján itt nem kellett volna feltétlen használni __packed__ attributomot, mert csak egy foglalás volt. Jól értem? Milyen gyakorlati alkalmazásban fontos hogy a fordító a memóriában egymás alá, sorba rakja az unionokat?
2. u tagot alapvetően 4 byte osra várnám (szinkronban char b[4]; -el) de szimulátor szerint csak 2 byte os lett. Ugyan nem adtunk neki típust, a fordító mégis így döntött? Milyen logika alapján?
3. A kód nem számol szerintem jól sajnos.
Legyen itt egy példa:
Temperature_High = 0x34;
Temperature_Low = 0x5B;
  1. s1.b[0]= Temperature_Low;   //  s1.b[0] = 0x5B
  2. s1.b[1]= Temperature_High;  //  s1.b[1] = 0x34
  3. s1.b[2]= 0;                             //  s1.b[2] = 0x00
  4. s1.b[3]= 0;                             //  s1.b[3] = 0x00
  5.  s1.u = s1.u * 110;          //   s1.u = 0x345B * dec(110) = 0x167F1A ---> Felső byte elveszik.
  6.                                         //        u tagban a 2 byte os 0x7F1A marad.   Ez OK.
  7. s1.u = s1.u / 16382;        //  itt viszont 0x0001 lesz u ban, lényegében elkövetve
  8.                                         //         durva kerekítési hibát    
  9. s1.u = s1.u - 40;              //  
  10. //s1.b[0]-ban van a 8 bites vegeredmeny

A fentiek alapján szerintem a kód nem adja vissza a helyes eredményt. Én gondolok valamit rosszul?
Persze a többi kérdés is érdekelne.
A hozzászólás módosítva: Ápr 30, 2016
(#) cross51 válasza apromax hozzászólására (») Ápr 30, 2016 /
 
Az hogy az unsigned mennyi az is a fordítótól függ az XC8-nál és XC16 szerintem 16bit az XC32-nél tudom, hogy 32-bit az unsigned.


Szerk.:
De nem egyszerűbb, ha unsigned long u lenne és akkor biztos 4 byte-os lenne.
A hozzászólás módosítva: Ápr 30, 2016
(#) Hp41C válasza apromax hozzászólására (») Ápr 30, 2016 /
 
1. Nem tudhatod minden esetben, hogy a tömb elemeit hogyan kezeli. Megteheti azt is, hogy 4*2 vagy 4*4 byte -ot foglal le a 4 elemű byte tömbnek. Ha jól láttam 16 bites vezérlővel foglalkozol, a 4*2 byte fordulhat elő.
2. Ahogy előttem írták unsigned long -nak kell megadni. ekkor tényleg 4 byte -os lesz. Aki az ötletet adta 32 -bites kontrollerre gondolt...
3. unsigned long -gal jól fog számolni.

Elrettentésnek:
Más - más lehet a #pragma pack alapértelmezése egyes platformokon.
QNX 4.x re fordított, azon jól működő programomat át kellettt fordítani QNX RTP (QNX 6.xx) -alá. Teljesen össze-vissza mőködött. Volt benne néhány union amiben byte[] -ra struktúrákat helyeztem. A QNX 4.0 alatt a pakolás alapértelmezése byte -os (tömör, __packed__) volt, a QNX 6.xx alatt 32 bites. Azaz a QNX 6.xx a byte[] minden elemének 4 byte -ot foglalt. Eltelt egy kis idő, mire rájöttem, hogy csak egy #pragma pack 1 sort kell beírnom.
Aki ajánlotta a módszert, biztosan megjárta már valahol...
A hozzászólás módosítva: Ápr 30, 2016
(#) pajti2 válasza Hp41C hozzászólására (») Ápr 30, 2016 /
 
Hát bizony megjártam, pic < - > pc kommunikáció etherneten, volt ám olyan és hogy ihaj. Szerencsére én gyorsabban tanulok, mint azok, akik blogolnak róla, hogy jaj de a fordító olyankor olyan kódot generál, hogy byte-onként pakolgat mindent, és szegény cpu.. aki a saját idegeit akarja roncsolni pár usec cpu időért, nyugodtan hagyja csak ki a __packed__-et, és kellemes szórakozást neki is

3. Természetesen 4 byte-osra gondoltam az unsigned-et, mint fentebb meg is jegyeztem, és az kell ahhoz, hogy a kód jól működjön. Köszönöm az addig is javasolt tippet, az unsigned long-al lesz jobb 16 bites fordító alatt. Én már hosszú évek óta csak 32 bit alatt vagyok, sznob lettem, ez van
(#) pajti2 válasza diablo hozzászólására (») Ápr 30, 2016 /
 
Nincsen abban semmi exotikum, a packed-et a C-ből örökölte a C++, egyáltalán nem C++ sajátosságról van szó.
(#) pajti2 válasza don_peter hozzászólására (») Ápr 30, 2016 /
 
Az összes 32mx / 32mz pic bootloaderes, kivétel nélkül mindegyik.
Következő: »»   782 / 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