Fórum témák

» Több friss téma
Fórum » PIC - Miértek, hogyanok haladóknak
Lapozás: OK   1183 / 1320
(#) kissi válasza pajti2 hozzászólására (») Aug 27, 2014 /
 
Idézet:
„A kvarcot berezegtetni semmi egyéb nem kell, mint egy schmitt trigger”

Nem erre gondoltam, hanem valószínűleg újabb technológiát alkalmaznak a gyorsabb/nagyobb kontrollereknél és lehet, hogy a "belső EMC-vel" nem tudnak megbírkózni!
(#) pajti2 válasza kissi hozzászólására (») Aug 27, 2014 /
 
4-8 mhz-es kvarcok meghajtásáról beszélünk? Mit keresne ott az emc?
(#) watt válasza pajti2 hozzászólására (») Aug 27, 2014 /
 
Lehet olyan is, amire kissi céloz, hogy egy adott áramköri csoport, mint pl. az oszci, rossz helyre lett tervezve, ezért ha fut, akkor a mellette lévő más részeket bezavarja. Ezt áttenni azért nem olyan egyszerű, mert egy kis négyzetbe belezsúfolni mindent, hogy még jól is működjön, nem egyszerű játék. Szerintem a Microchip jóval le van maradva más nagy nevű gyártóktól(Intel, AMD) technológiában, ezért jönnek ezek a dolgok a nagyobb sebességeknél, gondolom.
De lehet, hogy olyan gond van, amit te említesz...
A hozzászólás módosítva: Aug 27, 2014
(#) Hp41C válasza watt hozzászólására (») Aug 28, 2014 /
 
Pl. A belső mag nem 3.3V -on jár, de a külvilággal 3.3V -os illesztőkön keresztül tartja a kapcsolatot. Az oszcillátor lábak digitális ki/bemenetek, átprogramozható funkciójú lábak. Egy megbonyolítja a kivezetések áramkörét.
Ha azt nézzük, hogy a 32MZ bejelentése kb 1.5 .. 2 éve törént és már a 4. verziónál tartanak, akkor feltételehzetően volt jó néhány jelentősebb problémájuk, amit mindenképen ki kellett javítani a forgalomba hozatal előtt. Sokan mozdultak rá a családra, készítettek már teméket (már gyártásban van, de még mindig nincs megfelelő típus hozzá). A piac kikövetete, hogy valamit kiadjanak, hogy lehessen tesztelni a programozókat, fejlesztőket, programokat.
(#) watt válasza Hp41C hozzászólására (») Aug 28, 2014 /
 
Szerintem is a piac miatt jelent meg. Nem tudom milyen nehéz változtatni egy magon, de biztosan nem könnyű, ha ezt még nem javították ki. Persze lehet mondani, hogy nem nagy dolog egy külső órajelet rákötni, és talán igaz is, de midenesetre fura, hogy ilyen amatőrnek látszó hibát el tudnak követni. Ez olyan, mint ha egy autónak csak mankó kerekei lennének, vagy csak tréleren lehetne szállítani...
A hozzászólás módosítva: Aug 28, 2014
(#) cmdnetwizard hozzászólása Aug 28, 2014 /
 
Sziasztok!

Igaz, máshova már felraktam ezt a kérdést, de ott javasolták, hogy inkább ide kellene felrakni, valamint a moderátorok szíves elnézését kérném, a "XVIII. Csak egy helyen kérdezz!" szabály megsértése miatt.

Segítséget szeretnék kérni, hogy hogyan induljak el a feladatom megoldásához.
A feladatom a következő: Adott egy PIC32(mx440f512h), ami bizonyos feladatokat lát el. Adott egy PC, aminek értékeket kellene kiolvasni az eszközből, illetve értékeket beírni. Mivel az eszköznek hordozhatónak kell lennie (pontosabban PC függetlennek, maximum illesztőprogram szükséges), ezért én az USB-s kommunikációt tartom a célnak megfelelőnek.

Tehát a kérdésem volna, hogy a feladat megoldásához milyen anyagokat nézzek meg, minek olvassak utána, mikre lesz még szükségem?

Mellékes információként még elmondanám, hogy a PC oldali vezérlő programot én C# nyelven szeretném megírni, illetve a PIC-et pedig valamilyen C nyelven, jelenleg az MPLAB X (XC32-vel) és a mikroC PRO for PIC32 áll rendelkezésemre. Az USB sebesség az nem fontos, illetve az eszköznek működnie kell ha nincs USB kapcsolat, viszont a kapcsolat alatt nem árt a működés.

szerk.: Elvileg keddre kellene kész lennie a cuccnak...

Szerk. 2: Amit eddig találtam Gugli barátunk segítségével, az a libUSB a PIC-hez és LibUsbDotNet a PC-hez, bár tutorialokat, meg példakódokat nemigen találtam hozzá, de remélem ez jó kiindulási alapnak.

Szerk. 3: Esetleg ha valaki venné a fáradozást, és tudna engem korrepetálni egy kicsit ebben a témában, azt nagyon-nagyon megköszönném
(#) tamasati hozzászólása Aug 29, 2014 /
 
Sziasztok!

Belefutottam a MODBUS kommunikációs protokollba, és van néhány dolog amit nem értek. Ha valaki tudna segíteni nagyon megköszönném.
A protokollt értem, azonban azzal van problémám, hogy az adatok, amiket később ezen a kommunikáción keresztül szeretnék átvinni, hogyan, és hova kerülnek a pic-be. Az még rendbe lenne, hogy a pillanatnyi állapotokat kiovasom, de a modbus-ban van valami olyan, hogy "regiszterekből" olvassa ki az adatokat. Gondolom ezek sima memóriacímek. Na ezt nem értem, hogy milyen adatokat, és minek kell elmenteni? Úgy feltételezem, hogy két féle kiolvasási mód lehetséges, egy pillanatnyi állapot, és egy mentett állapot. Minek?
(#) kissi válasza tamasati hozzászólására (») Aug 29, 2014 /
 
Szia!
Nem vagyok szakértő, de használtam már PIC-el... Nem igazán értem a kérdésedet, mert a MODBUS egy protokoll, le van írva, hogy milyen sorrendben kell küldened és hogyan az adatokat: azt, hogy mit és miért, azt Neked kell tudni ( ill. ha van egy gép, akkor az ezzel a protokollal az általad kért adatot küldi, ha meg Te csinálod a programot, akkor a kérdés értelmezése után a megfelelő byte-okat kell az adatfolyamba beillesztened !) !?
(#) watt válasza tamasati hozzászólására (») Aug 29, 2014 /
 
Kicsit fura, hogy azt írod, a protokollt érted, aztán felteszel pár kérdést, amiből kiderül, hogy nem.
Természetesen az adatok mindig memóriában vannak és onnan jönnek-mennek. Tehát a vett adatokat az adat memóriába teszed(bár néha ez lehet EEPROM, vagy akár flash, illetve bármilyen memória típus, ha létezik a fogadó áramkörben). Viszont a modbusz regiszterek címei nem egyeznek meg a PIC memória címekkel, azt neked kell lekezelned, neked kell meghatároznod, hogy egy MODBUS regiszer, vagy regiszter mező mit tartalmaz és milyen címre hivatkozva éred el.
(#) Hp41C válasza kissi hozzászólására (») Aug 29, 2014 /
 
A MODBUS egy protokol, amit PLC -khez fejleszettek ki. Egy PLC -ben többféle típusú adat is lehetséges. MODBUS típusok szerint: Coil - digitális kimenetek állapota; Input status - digitális bemenet állapota; Input regiszter: több bites periféria állapota (pl. A/D átalakító, eseményszámláló); Holding regiszter: a PLC belső regisztere (számított értékek tárolására - üzemóra).
A különböző adattípusokat a nekik megfelelő táviratokkal lehet kiolvasni ill (amelyiknél lehet) az értékeket beállítani.
A hozzászólás módosítva: Aug 29, 2014
(#) kissi válasza Hp41C hozzászólására (») Aug 29, 2014 /
 
Idézet:
„hogyan, és hova kerülnek a pic-be.”
Ezt írta és OK, hogy PLC-re fejlesztették ki, de ma már sok periféria ismeri ezt a protokollt, így neki kell tudni, hogy milyen módon és mit akar/tud elérni, ill. leprogramozni ( és a PIC-eket is meg lehet tanítani rá ! ) !
(#) Hp41C válasza kissi hozzászólására (») Aug 29, 2014 /
 
Bocsánat, elnéztem a hozzászólást. tamasati -nak szólt volna.
(#) icserny válasza cmdnetwizard hozzászólására (») Aug 29, 2014 /
 
További kérdéseidet majd a PIC - USB - PC témakörbe tedd be! A C# mintaalkalmazásra ott már találsz is egy általam berakott linket (én magam nem próbáltam, én a Visual C++ 2008 Express-ben írt Microchip demókkal szoktam szerencsétlenkedni, azokat írom át céljaimnak megfelelően).

A Microchip Libraries for Applications mintapéldáival érdemes kezdeni. Ha a 64 bájt/1ms sebességnél nem kell több, akkor a Device - HID - custom demos mintapéldát ajánlom.
(#) kissi válasza Hp41C hozzászólására (») Aug 29, 2014 /
 
Semmi gond !
A hozzászólás módosítva: Aug 29, 2014
(#) cmdnetwizard válasza icserny hozzászólására (») Aug 29, 2014 /
 
Koszonom a segitseget, vegig fogom oket nezni
(#) pajti2 válasza tamasati hozzászólására (») Aug 29, 2014 /
 
tamasati:

A MODBUS-nak van néhány layer-1-es fejlesztése, van pld modbus via ethernet, de a legáltalánosabban használt protokol a modbus rtu, ami layer-1-en egy sima rs485 half duplex uzemmódban, és az minősül reset event-nek, ha 3 millisec ideig nincsen kommunikáció. Reset után adat csomag kezdődik fejléccel, és mezei soros portos adatfolyammal a header + data megcímez neked egy regisztert, és írja, mit szeretne oda berakni, vagy éppen azt a regisztert kéri tőled vissza. Veszed a csomagot, és kielemzed, mit tegyél, aztán megteszed. Általános protokol szerint half duplexen a master egyszer kérdez, és utána addig vár, míg a megcímzett slave el nem küldi neki az adatokat. Ha 3 millisec ideig nem küldte el, akkor már ne is küldje, time out error state van. De ezeket mind ming megtalálod a modbus.org sire doksijaiban. Rá kell szánni az időt és rendesen végig olvasni legalább egyszer mindent. Ha kutyafutta holnapra működjön, inkább felejtsd el. Túl sok mindenről kell ott gondoskodni, és ha végig olvastad, kicsit emészteni is kell a gondolatot, hogyan is építs áramkört ahhoz, hogy azzal a kommunikációval jó legyen.


cmdnetwizard:

Talán a modik ezért még nem tépik szét a koponyacsontomat Frissen küzdöttem meg hasonlóval. Tippek: töltsd le az mc 2013 febr 15-ös libet, abból a lib generic device demo-t használd, pc oldalon pedig libusbdotnet teljesen tuti c#-hez, a site-ján példaprogramokat is találsz. Elméletben 64 byte*19 / 1 msec, de az csak dma-val tud meglenni. Ha win7 alól tolod programozottan, és mindig várnod kell a protokollod szerint oda-vissza válaszra, a libusb0 driver 128 / 1 sec sebességgel fog oda-vissza válaszolni (64 byte / 8 millisec lesz a sávszélességed). A régebbi "normális" ( ) mplab-ot használd fordításhoz, vagy írj magadnak fordítóscriptet. A demo nagyon egyszerű, rászánsz pár napot figyelmesen, nem lehet vele problémád, olajozott a cucc.


Más. Pic32mx kérdés.

Valamiért az spi-re azt írja, 20-25 mhz-ig üzemképes, és nem nagyon tudok rájönni, miért. Ahogy nézegetem az oszcillátor blokkot, pic32mx1/2 esetében is, meg mx3..7 esetében is fel lehet programozni azt a baudrate generator-t 40 mhz-re, és elvileg dma-val tudhatja a gyakorlatban is megtáplálni a kimenetet akkora sebességgel. Próbálta már valaki maxig kihúzni a 32mx-ek spi-jét? Csak külső áramköri parazita-jelenség probléma a probléma, hogy gyenge lenne a meghajtás vagy ilyesmi, vagy van valami belső proci mag gyengeség is, amit adatlapból nem sikerült kinyomoznom?
A hozzászólás módosítva: Aug 29, 2014
(#) roleez hozzászólása Szept 1, 2014 /
 
Sziasztok!
A kérdésem elsősorban arra irányul, hogy jól gondolom-e a következőt:
Adott egy PIC18F46K80-as eszköz, megszakításban soros, spi, can, és 3 timer szalad. Ez utóbbiban van [1 msec-es] analóg jelek digitalizálása. Külső szemlélőként teljesen véletlenszerűen az analóg értékek beolvasása jócskán eltér az előző ciklusban beolvasott-tól. Pl. n. ciklusban 100 a konvertált érték, az n+1. ciklusban már 500.
Az előfordulhat, hogy az analóg mintavételezést, ill konvertálást megszakítja egy másik interrupt (ez természetes) és közben az adc már nem lesz megfelelő érték, ahogy visszakapja a vezérlést
a timer0? (ebben van az adc read). Tiltsam le az adc_read-ben a megszakításokat?
Minden mikroC-ben. Minden megszakítás alacsony prioritású, egyszintű.

Köszönöm,
Roland
(#) Hp41C válasza roleez hozzászólására (») Szept 1, 2014 /
 
Idézet:
„Minden megszakítás alacsony prioritású, egyszintű.”

Idézet:
„Az előfordulhat, hogy az analóg mintavételezést, ill konvertálást megszakítja egy másik interrupt...”

Csak akkor, ha a GIE bitet a megszakítási rutinban állítod. Nem szabad állítani, a retfie utasítás megoldja.
(#) watt válasza roleez hozzászólására (») Szept 1, 2014 /
 
Először próbáld meg,hogy letiltasz mindent, csak az AD fusson és az is sokkal lassaban. Állíts elő megbízható feszültség forrást, pl. elem leosztásával, majd vizsgáld a kapott értékeket. Ha ekkor jó lenne, akkor vizsgáld a valós forrást. Ha ekkor is jó, akkor gyorsítsd fel 1k-ra a Timert. Ha ekkor is jó, akkor egyenként indítsd el a megszakításokat. Ki fog derülni hamar (szerintem az első pár lépésben), hogy mi a baj. Nem hinném, hogy a megszakítások miatt van...
A hozzászólás módosítva: Szept 1, 2014
(#) ktamas66 válasza roleez hozzászólására (») Szept 1, 2014 /
 
Én is inkább az az akvizíciós idők és az A/D órajel beállításai körül néznék szét. Az IT nem szólhat bele, az átalakítás akkor is lezajlik, hogy az eredményt mikor olvasod ki, ettől független.
(#) proba válasza ktamas66 hozzászólására (») Szept 1, 2014 /
 
Az átalakítás indítása mikor történik az is befolyásolhatja.Amikor indulnia kellene , akkor van megszakításban valami miatt az sem igazán jó.A következő kérdés , milyen frekvenciájú jelet milyen időtartamonként digizel. A szinusz egyes részei igen meredekek.
(#) ktamas66 válasza proba hozzászólására (») Szept 1, 2014 /
 
Persze ez így van. Több azonos szintű megszakításnál úgysem lehet pontos időzítést csinálni. Arra gondoltam, itt inkább az lehet a probléma, hogy a csatornaváltások között nincs kivárva a megfelelő idő a mintavevő kondi töltésére/kisütésére. Az A/D a GO bit bebillentése után 1 ciklussal leválasztja a kondit, innen 14 TAD-ra megszületik az eredmény. Hogy a proci mit csinál közben, az mindegy, az eredményt nem befolyásolja.
(#) roleez válasza Hp41C hozzászólására (») Szept 1, 2014 /
 
Nem állítom a GIE bitet egyik megszakításban sem.
A hozzászólás módosítva: Szept 1, 2014
(#) roleez válasza watt hozzászólására (») Szept 1, 2014 /
 
A konstrukciótól nagyban függ ez, sajnos nem jöttem még rá, hogyan tudom kiszedni csak pl. az adc-t.
Azt kipróbáltam, hogy potival leosztott megbízható analóg inputot adtam az eszköznek, amikor már ebbe a fázisba került a gép. Egy idő után szintén előjön ez a probléma. A mintavétel idejétől sem vettem észre releváns függést.
A hozzászólás módosítva: Szept 1, 2014
(#) roleez válasza proba hozzászólására (») Szept 1, 2014 /
 
Tehát a mintavétel indítása előtt pl. kapcsoljam ki az GIE-t?
A jel változása "lassú" néhány száz érték / mp (12 bit adc-n értve) - és a konstrukcióból adódóan sem lehet hirtelen változás. Ezt be is írtam a programba, hogy hagyja ki az extrém kiugró értékeket. Ez segít bizonyos esetekben, de jobban érdekel, hogy mitől vannak ezek a kiugrások...?
A jel maga nem stacionárius.
(#) roleez válasza ktamas66 hozzászólására (») Szept 1, 2014 /
 
az analóg beolvasó int rutin forrásrészlet:
  1. TRISA = 0xFF;
  2.               delay_us(20);
  3.               //bal_szedo = ADC_Read(BMAGAS);
  4.              
  5.               bal_szedo=bal_szedo-(bal_szedo>>3)+ADC_Get_Sample(BMAGAS)/*ADC_Read(BMAGAS)*/;   // ez egy szures
  6.               bal_szedo_filt=bal_szedo>>3;
  7.               if ((bal_szedo_filt-bal_szedo_filt_bak)>DIFFI) bal_szedo_filt=bal_szedo_filt_bak;
  8.               bal_szedo_filt_bak = bal_szedo_filt;
  9.  
  10.               delay_us(5);
  11.               //jobb_szedo = ADC_Read(JMAGAS);
  12.               jobb_szedo=jobb_szedo-(jobb_szedo>>3)+ADC_Get_Sample(JMAGAS)/*ADC_Read(JMAGAS)*/;   // ez egy szures
  13.               jobb_szedo_filt=jobb_szedo>>3;
  14.               if ((jobb_szedo_filt-jobb_szedo_filt_bak)>DIFFI)  jobb_szedo_filt=jobb_szedo_filt_bak;
  15.               jobb_szedo_filt_bak = jobb_szedo_filt;
  16.  
  17.               delay_us(5);
  18.               bal_kiter = ADC_Get_Sample/*ADC_Read*/(BKITER);
  19.               delay_us(10);
  20.               jobb_kiter = ADC_Get_Sample/*ADC_Read*/(JKITER);
  21.               delay_us(10);
  22.               tapfesz = ADC_Get_Sample/*ADC_Read*/(UT_tapfesz);


elméletileg csatornaváltosokra van 5 usec delay per pillanat . A chip 48 MHz-en megy.
Valszeg az 5 usec a kevés?
(#) ktamas66 válasza roleez hozzászólására (») Szept 1, 2014 /
 
Ebből a programrészből nem tudom megmondani, de az biztos, hogy a csatornaváltás után kellene várni (ami gondolom az ADC_Get_Sample függvényben van), nem a mérések között, bár oda is javasol 2TAD-ot, ami a javasolt 64Tosc-nál nem kevés idő, ha nem a belső RC órajelet használod. Különben az 5-10us elegendőnek tűnik.
(#) watt válasza roleez hozzászólására (») Szept 1, 2014 /
 
Miért, nem te írtad a programot?
(#) roleez válasza watt hozzászólására (») Szept 1, 2014 /
 
De. Abszolút.
A bug-gal együtt Csak nem találom mi okozza....
A hozzászólás módosítva: Szept 1, 2014
(#) roleez válasza ktamas66 hozzászólására (») Szept 1, 2014 /
 
Belső RC clock, 2 TAD a beállítás.
Az ADC_Get_Sample() rutin: (ezt a mikroC libraryból hívom)
  1. _ADC_Get_Sample:
  2. ;__Lib_ADC_K22.c,16 ::         
  3. ;__Lib_ADC_K22.c,19 ::         
  4. 0x60A8  0x0EC3          MOVLW       195
  5. 0x60AA  0x16C2          ANDWF       ADCON0, 1
  6. ;__Lib_ADC_K22.c,21 ::         
  7. 0x60AC  0xF000C35D      MOVFF       FARG_ADC_Get_Sample_channel, R0
  8. 0x60B0  0x3600          RLCF        R0, 1
  9. 0x60B2  0x9000          BCF         R0, 0
  10. 0x60B4  0x3600          RLCF        R0, 1
  11. 0x60B6  0x9000          BCF         R0, 0
  12. 0x60B8  0x5000          MOVF        R0, 0
  13. 0x60BA  0x12C2          IORWF       ADCON0, 1
  14. ;__Lib_ADC_K22.c,23 ::         
  15. 0x60BC  0xF025EC07      CALL        _Delay_22us, 0
  16. ;__Lib_ADC_K22.c,24 ::         
  17. 0x60C0  0x82C2          BSF         ADCON0, 1
  18. ;__Lib_ADC_K22.c,25 ::         
  19. L_ADC_Get_Sample0:
  20. 0x60C2  0xA2C2          BTFSS       ADCON0, 1
  21. 0x60C4  0xD001          BRA         L_ADC_Get_Sample1
  22. ;__Lib_ADC_K22.c,26 ::         
  23. 0x60C6  0xD7FD          BRA         L_ADC_Get_Sample0
  24. L_ADC_Get_Sample1:
  25. ;__Lib_ADC_K22.c,27 ::         
  26. 0x60C8  0xF001CFC4      MOVFF       ADRESH, R1
  27. 0x60CC  0x6A00          CLRF        R0
  28. 0x60CE  0xF35EC000      MOVFF       R0, ADC_Get_Sample_rslt_L0
  29. 0x60D2  0xF35FC001      MOVFF       R1, ADC_Get_Sample_rslt_L0+1
  30. ;__Lib_ADC_K22.c,28 ::         
  31. 0x60D6  0x50C3          MOVF        ADRESL, 0
  32. 0x60D8  0x1200          IORWF       R0, 1
  33. 0x60DA  0x0E00          MOVLW       0
  34. 0x60DC  0x1201          IORWF       R1, 1
  35. 0x60DE  0xF35EC000      MOVFF       R0, ADC_Get_Sample_rslt_L0
  36. 0x60E2  0xF35FC001      MOVFF       R1, ADC_Get_Sample_rslt_L0+1
  37. ;__Lib_ADC_K22.c,29 ::         
  38. 0x60E6  0x0E00          MOVLW       0
  39. 0x60E8  0x1400          ANDWF       R0, 0
  40. 0x60EA  0x6E02          MOVWF       R2
  41. 0x60EC  0x5001          MOVF        R1, 0
  42. 0x60EE  0x0B80          ANDLW       128
  43. 0x60F0  0x6E03          MOVWF       R3
  44. 0x60F2  0x0E00          MOVLW       0
  45. 0x60F4  0x1803          XORWF       R3, 0
  46. 0x60F6  0xE102          BNZ         L__ADC_Get_Sample8
  47. 0x60F8  0x0E00          MOVLW       0
  48. 0x60FA  0x1802          XORWF       R2, 0
  49. L__ADC_Get_Sample8:
  50. 0x60FC  0xE003          BZ          L_ADC_Get_Sample2
  51. ;__Lib_ADC_K22.c,30 ::         
  52. 0x60FE  0x0103          MOVLB       3
  53. 0x6100  0x6B5E          CLRF        ADC_Get_Sample_rslt_L0, 1
  54. 0x6102  0x6B5F          CLRF        ADC_Get_Sample_rslt_L0+1, 1
  55. L_ADC_Get_Sample2:
  56. ;__Lib_ADC_K22.c,31 ::         
  57. 0x6104  0xF000C35E      MOVFF       ADC_Get_Sample_rslt_L0, R0
  58. 0x6108  0xF001C35F      MOVFF       ADC_Get_Sample_rslt_L0+1, R1
  59. ;__Lib_ADC_K22.c,32 ::         
  60. L_end_ADC_Get_Sample:
  61. 0x610C  0x0012          RETURN      0
  62. ; end of _ADC_Get_Sample


Ahogy nézem van benne delay. Meg azt is, hogy jó hosszú...
A hozzászólás módosítva: Szept 1, 2014
Következő: »»   1183 / 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