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   751 / 1216
(#) benjami válasza moltam hozzászólására (») Feb 8, 2016 /
 
Kihasználja. Meg is nézheted a szorzó rutinokat a C18 src/tradicional/math könyvtárában. Az fxm kezdetűek azok.
(#) jocka0012 hozzászólása Feb 8, 2016 /
 
Üdv!
Azt szeretném kérdezni , hogy egy folyamat leprogramozására (c-ben) milyen megoldások vannak?Arra gondolok , hogy például egy óránál menü funkció , meg ébresztés funkció.Van jobb megoldás az if elágazások tömkelegénél?
(#) moltam válasza benjami hozzászólására (») Feb 8, 2016 /
 
Kösz a választ.
(#) moltam válasza jocka0012 hozzászólására (») Feb 8, 2016 /
 
Switch-case. Bővebben: Link Ha jól értem erre gondoltál.
(#) icserny válasza jocka0012 hozzászólására (») Feb 8, 2016 /
 
if, switch, véges állapotgép (ez utóbbi nem C utasítás, hanem programozási technika)
(#) Balagemann2031 hozzászólása Feb 9, 2016 /
 
Sziasztok! PIC24H-nál, megszakítás kezeléskor, miket érdemes elmenteni? SR, W0 (és még amiket használok gondolom W1,2,3) Program számláló? szoftver verem?
(#) Zsora válasza Balagemann2031 hozzászólására (») Feb 9, 2016 /
 
A (megszakítási rutinban) használt regisztereket. Az állapotregiszter és a programszámláló automatikusan eltárolódik a verembe. Az árnyékregiszterek használatánál meg figyelembe kell venni hogy az árnyéktár csak 1-es mélységű, tehát ha a megszakított programban használva vannak, akkor a megszakító rutinban ne legyenek (vagy fordítva)! Ha mégis, akkor azokat is menteni kell a normál regiszterek után.
A hozzászólás módosítva: Feb 9, 2016
(#) Balagemann2031 válasza Zsora hozzászólására (») Feb 9, 2016 /
 
Köszönöm!
(#) Lamboo hozzászólása Feb 9, 2016 /
 
Sziasztok!
Még régebben írtam egy programot 16f628a típusú PIC-re, amiről kiderült, hogy tartalmaz egy bugot amit fel kéne derítenem. MPLABX-et használok XC8 fordítóval linux és windows alatt egyaránt. Sajnos az áramkörhöz nem férek már hozzá, így az mplab szimulátorát szeretném használni debuggoláshoz. A probléma az, hogy futtatja a programot, a változókat tudom is figyelni, PC értékét is mutatja de az éppen végrehajtott sort nem látom és breakpointok is brokenek bárhová is rakom őket. Hogyan lehetne ezt megoldani?
Előre is köszönöm a válaszokat!
(#) Lamboo hozzászólása Feb 10, 2016 /
 
Linux alatt működik, csak windows alatt nem.
(#) pajti2 válasza don_peter hozzászólására (») Feb 10, 2016 /
 
Szia,

Bevallom őszintén, nem olvastam el a teljes történetet, mert a legeleje valahol 6 lappal ezelőtt volt, és hát jó hosszan kínlódsz vele. A tutit megmondani nem az én dolgom, épp csak felhívnám szíves figyelmedet pár apróságra.

Ha sebességet kell elérni, a normális hardver a fontos első lépésben, és annak a hatékony kihasználása második lépésben.

Első lépésben 4550-et választani lehetségesen nem volt a legbölcsebb döntés. Azon a pic-en - amennyire az adatlapot felkotorni tudtam - szerencsére van különálló adó és vevő buffer, de csak 1 byte mélységű. Ha nem tudsz az érkező adatra figyelni 70 usec idő alatt, akkor a buffered túlcsordul (8 bit / 115200 bit => 69.44 micro sec per byte). Mindezt adó és vevő oldalon is kezelni azt jelenti, hogy kb 70 usec időnként kell lefutnia egy interrupt alsó oldalt kezelő rutinodnak mind vétel mind adás számára, hogy azon a sebességen időkiesés nélkül kezelni tudják az adatátvitelt. Vételi oldalon az interruptod tud futni akkor, amikor érkezett új byte, és az biztosan akkor fog csak futni, amikor van mit csinálnia, de az adat kiküldést timer interruptra kell majd raknod, mert nem biztos, hogy a kimeneti buffered akkor fog kiürülni, amikor van következő kiküldendő adat is. Ha majd tényleg belejössz, eljátszadozhatsz azzal, hogy a timer interruptot bekapcsolni a felső fél kezelési területről, ha byte került a kimeneti bufferbe, valamint átkikapcsolni a timerből uart transmitter interruptra, ha elég sok byte van benne, mert akkor az uart interrupt is biztosan fog következő byte-ot találni, mire az előzőt kiküldte, és annak kell majd újra visszakapcsolnia a timer interruptot, ha éppen nem talált már semmit, valamint a timer interruptnak lekapcsolnia önmagát, ha újfent semmit sem talált (a felső fél majd úgyis visszakapcsolja az első bufferbe helyezett byte után). Meg lehet vele spórólni valamennyi cpu időt összességében Mellette a felső oldalon az alkalmazás logikának annyi cpu idő maradhat, amennyi marad. Hogy mi mindent akarsz belegyömöszölni egy 8 bites pic-be, azt nem tudom, de tökéletes flow control mellett is én túlterheltnek érzem. Az interrupt alsó fél mellett a felső féllel (ami az érkezett byte-okat álltja majd össze feladat csomagokká) már pollozni kell a helyi bufferedet, arra is cpu idő megy el, és még mellette az alkalmazás logikára, amit gondolom idővel fejleszteni is szándékozol. Nincs fejlesztési tartalékod azon a cpu-n. Hogy nyersen tudni fogsz 115200-ig turbózni adatátvitelt, az nem jelenti azt, hogy az akkor is tudni fog működni, amikor a teljes alkalmazást is belegyömöszölöd a pic-be. Ami tippet a következő alkalomra adnék (valahol olyasmit láttam, hogy valami már le van gyártva, ergó már kőbe vésted az elhamarkodott döntést), hogy mostanra 32 bites pic-et is fele áron kapsz, mint a 4550-est (forrás chipcad jelenlegi szabad készlet árlista), és azokban nem a semmiért van felbővítve az adó / vevő buffer 8 byte mélységűre, meg normálisabb cpu teljesítményed is van, mint a 4550-esen.

Második lépésben a "flow control" fogalmára hívnám fel szíves figyelmedet. Amennyire az első bejegyzéseket láttam, az adatátviteli protokoll arra épül, hogy miután leküldtél egy csomagnyi adatot, azt a pic feldolgozza, és addig a pc vár. Ha a pic visszaküldte a feldolgozás eredményét, a pc akkor fogja küldeni a következő feladat csomagot (és addig meg a pic vár). Most nem tétel, mit jelent a "feldolgozás" és a "munkacsomag", azt kezeljük fekete dobozként, "valami". Maga a folyamat a gyenge. Ha legfelső szinten teljesítményt szeretnél látni a pic oldalán, nullára kell csökkentened a pic oldalán az üresben várakozási időt. Nincsen olyan, hogy vársz, amíg a pc küldi a következő csomagot. Helyette a pic oldalán is előre bufferelned kell egy következő csomagot. Ha a pc elküldte az elsőt, annak a pic nekiállhat, de míg fut az alkalmazás logikád, a háttérben a pc-nek már küldenie kell a második feladat csomagot is, és azt pic oldalon le kell bufferelned (arra valók az interrupt rutinok). Amikor a pic alkalmazás a helyi (virtuális) kimeneti bufferbe lerakta az első feladat feldolgozási eredményeit (amit "háttérben" az interrupt alsó fél fog kidobálni a pc felé), addigra már ott kell lennie a következő feladatnak a helyi memóriában, hogy várakozás nélkül nekikezdhessen. Ha nem így csinálod, időkiesésekkel számolhatsz, ami a végső statisztikában a teljes sávszélességedet csökkenti majd. Alkalmasint siralmasan alacsonyra.

Ha úgyis csak hobby, gondolom lesz rá elég időd összeismerkedni az interrupt-ok működésével, a flow control és a párhuzamos folyamatok fogalmával (abban a pic-ben önálló elektronikai eszköz az uart és a cpu, valójában párhuzamos információ kezelésed van), az aszinkron adatkezelés fogalmával, számolgatni kicsit, hogy összesen mire tud elég lenni a 4550-es memóriája (az a 2048 byte bizony nem sok, és abba kell mindent belegyömöszölnöd), és hogy a cpu időből mennyi megy el interruptokra (ezt ki kellene majd mérni), és mennyi marad az alkalmazásra, és mindezekhez hozzácsiszolni a pc alkalmazásodat is. Apropó a pc oldalán is lehet sok szálasan építeni alkalmazást, nem kell annak egyetlen főciklus mentén várakozásban pörögnie, vagy oda se figyelnie a soros portra, tud a pc program egyszerre is csinálni sok mindent, hála a sokmagos processzoroknak.

Ja igen, a "Csharp" szokásosabb jelölése "C#", de az öregebb szleng néhol csak "dot c"-ként ismeri (a "c#" a ".net" c-je, ejtsd "dot net").

Remélem nem lett túl hosszú
(#) don_peter válasza pajti2 hozzászólására (») Feb 10, 2016 /
 
Szerintem az a sebesség talán már elég lesz amit a végére ki tudtam préselni belőle.
Amúgy 18F442 nem 4550.
Utoljára 5-6kb/s-el kocorgott az adatátvitel, 64byte-ot bufferelve, de ezt még fel tudom vinni duplájára vagy is annak közelébe.
Úgy gondolom az már elég lesz, de ha még sem, akkor továbbgondolom a dolgot és nem UART hanem USB kommunikációt fogok alkalmazni nyilván másik (18F4550) pic-kel, de mivel ez egy kis tanuló és hobbi projekt nem hiszem, hogy lényeges lenne ennyire kiélezni a dolgot.
Meglátom, hogy a memória írási folyamat mennyire lassítja be majd a kész hardvert, ott még lehetnek gondok amúgy, de csak tudok majd kicsit rajta hegyezgetni, ha kell.
Ha memóriában is otthon vagy akkor itt tudsz segíteni mert elakadtam: Bővebben: Link

ui: a választás pedig arra esik általában ami a fiókban van, és megfelel a célnak. (lábszám, funkciók...stb)
18F442, 452 van a fiókba, kiveszem és nem kerül semmibe.
A hozzászólás módosítva: Feb 10, 2016
(#) pajti2 válasza don_peter hozzászólására (») Feb 10, 2016 /
 
32mx795 20 mhz mag frekivel, az mc usb libjével, pc oldalon generic usb driverrel c# alatt oda-vissza teszteltem a sebességet mindenféle flowcontrollal vacakolás nélkül is egy alkalmazásban, és 60 kbyte/sec simán volt meg. Ennyit tudok tesztekről írni. Egy 8 bites pic-el lassabb lesz, de a soros portnál biztosan gyorsabb. MEgnézem a memória problémádat is a másikon.
(#) Balagemann2031 hozzászólása Feb 10, 2016 /
 
Sziasztok! Gondom akadt egy INT1 megszakítással. A főszerepben PIC24H, és nem akar belépni a megszakításba, semmi képpen. Egy másik környezetben INT0 val hibátlanul működik a dolog, viszont INT1 áthelyezhető periféria, ez is be van állítva mégsem jó valami. Csatolom a fontosabb részeket:
  1. __INT1Interrupt:
  2.                 BCLR            IFS1,#INT1IF
  3. SAVE:
  4.                 MOV                     W0,W0_TEMP
  5.                 MOV                     W1,W1_TEMP
  6.                 MOV                     SR,W0
  7.                 MOV                     W0,SR_TEMP
  8. ISR:
  9.                 BCLR            LATA,#2
  10.  
  11. LOAD:
  12.                 MOV                     SR_TEMP,W0
  13.                 MOV                     W0,SR
  14.                 MOV                     W1_TEMP,W1
  15.                 MOV                     W0_TEMP,W0
  16.                 RETFIE 
  17.  
  18.  
  19. ;PERIFÉRIA ÁTHELYEZÉS ENGEDÉLYEZÉSE
  20.                         mov             #OSCCON,w1
  21.                         mov             #0x46,w2
  22.                         mov             #0x57,w3
  23.                         mov.b   w2,[w1]
  24.                         mov.b   w3,[w1]
  25.                         bclr    OSCCON,#IOLOCK
  26. ;--PERIPHERIA ÁTHELYEZÉS     
  27.                                                                                                         ;***INT1***
  28.                         mov             #0x0400,w0
  29.                         mov             w0,RPINR0                               ;INT1->RP4
  30.  
  31.  
  32.                                                                                                         ;***SPI1***
  33.                         mov             #0x0005,w0
  34.                         mov             w0,RPINR20                              ;SDI1->RP5,
  35.                         mov             #0x0700,w0
  36.                         mov             w0,RPOR1                                ;SDO1->RP3
  37.                         mov             #0x0008,w0
  38.                         mov             w0,RPOR3                                ;SCK1->RP6
  39.  
  40.                                                                                                         ;***UART1***
  41.                         mov             #0x000C,w0                             
  42.                         mov             w0,RPINR18                              ;RX->RP12
  43.                         mov             #0x0300,w0                             
  44.                         mov             w0,RPOR6                                ;TX->RP13
  45.                                                                                                         ;***OC_PWM***
  46.                         mov             #0x1415,w0
  47.                         mov             w0,RPOR5                                ;OC3->RP11,OC4->RP10
  48.                         mov             #0x1312,w0
  49.                         mov             w0,RPOR7                                ;OC1->RP11,OC2->RP10
  50. ;--PERIPHERIA LEZÁRÁSA
  51.                         mov             #OSCCON,w1
  52.                         mov             #0x46,w2
  53.                         mov             #0x57,w3
  54.                         mov.b   w2,[w1]
  55.                         mov.b   w3,[w1]
  56.                         bset    OSCCON,#IOLOCK
  57.                         GOTO    SPI1_init
  58.  
  59.  
  60.  
  61. INT1_SETTING:
  62.                         BSET    INTCON2,#INT1EP         ;MEGSZAKÍTÁS LEFUTÓ ÉLRE
  63.                         MOV             #0x0005,W0
  64.                         MOV             W0,IPC5
  65.                         BSET    IEC1,#INT1IE
Mi lehet a hiba?
(#) Balagemann2031 válasza Balagemann2031 hozzászólására (») Feb 10, 2016 /
 
Elfelejtettem írni, hogy PK3-mal debuggolás indítása után 1 mp mulva megáll a futás. Gyanítom, hogy ott lehet a hiba, amikor belép megszakításba. Mintha ott eltévedne, vagy nem lenne RETFIE, pedig van.
(#) Balagemann2031 válasza Balagemann2031 hozzászólására (») Feb 10, 2016 /
 
Stimulussal teszteltem MPLAB sim alatt, INT0 külső lefutó élre a megszakítási vektorához ugrik, INT1 pedig resetre Ez mitől lehet?
(#) Zsora válasza Balagemann2031 hozzászólására (») Feb 11, 2016 / 1
 
Üdv!
Esetleg ez lemaradt a program elejéről:
  1. .global   __INT1Interrupt

Minden megszakításvektor alapból a Reset-re mutat, ha nem adsz meg mást.
Egyébként miért nem a verembe mented a regisztereket? Azért (is) van. Ha fix mentési helyet használsz, akkor egymásba ágyazott megszakítások esetén gubanc lesz. Az állapotregisztert meg nem kell menteni, mert az automatikusan megtörténik.
  1. __INT1Interrupt:
  2.           bclr   IFS0,#T1IF
  3. SAVE:     push   w0
  4.           push   w1
  5. ISR:      bclr   LATA,#2
  6. LOAD:     pop    w1
  7.           pop    w0
  8.           retfie

Természetesen jelen esetben a W1 és W2 regiszter mentése is felesleges (mivel a rutinban nem módosulnak), csak a példa miatt kerültek bele.
(#) Balagemann2031 válasza Zsora hozzászólására (») Feb 11, 2016 /
 
Szia! Hihetetlen hogy mennyire figyelmetlen tudok lenni. Az INT0 meg volt adva .global-lal, viszont az INT1 lemaradt... Köszönöm a kiigazítást mentést illetően is! Üdv: Balázs
(#) Zsora válasza Balagemann2031 hozzászólására (») Feb 11, 2016 /
 
Szívesen!
Én is mindig a figyelmetlenségem miatt szívok. (Legtöbbet a helyi címkékre történő helytelen irányú ugrásokkal.)
  1. Szoveg_ir:   mov     szovegcim,w6
  2. 1:           mov.b   [w6++],w0
  3.              cp0.b   w0
  4.              bra     z,2f
  5.              rcall   Kar_ir
  6.              bra     1b
  7. 2:           return
(#) obenhof hozzászólása Feb 11, 2016 /
 
Sziasztok!

ESP8266 modullal próbálok UART-on kommunikálni egy pic18f14k22-es mikrokontrollerrel. USB-Soros átalakító és a modul között tökéletesen megy a párbeszéd, a pic-el viszont durci van. Szkópban látszik a probléma oka de nem találom, hogy hol van elcseszve a program.
Helyes küldés USB-Soros átalakítóval (ESP8266 válaszol):
a
Helytelen pic-el (nincs válasz):
b
Azt látom, hogy egy magas bit becsúszik a két 8bites karakter közé, de miért?
Ezt a programot használom a mikrokontrollerben:
c
És így:
  1. void main(){
  2.     UART_Init(115200);
  3.     TRISCbits.TRISC0=0; //LED
  4.     LED=0;
  5.     __delay_ms(500);
  6.     while(1){      
  7.         UART_Write_Text("T\r");
  8.         while(UART_Data_Ready()){
  9.            LED=1;
  10.            __delay_ms(500);
  11.         }
  12.         LED=0;
  13.         __delay_ms(500);
  14.     }
  15. }

Már órák óta szenvedek vele, minden segítséget előre is köszönök!
A hozzászólás módosítva: Feb 12, 2016
(#) Taki33 válasza obenhof hozzászólására (») Feb 12, 2016 /
 
Szia!

Akaszd rá a PIC TX lábára az USB-Soros átalakítót és akkor terminál programban láthatod, hogy mit küld ki a PIC, vagy az RX lábra akkor pedig az ESP8266 válaszait láthatod.
A hozzászólás módosítva: Feb 12, 2016
(#) Hp41C válasza obenhof hozzászólására (») Feb 12, 2016 /
 
Az ábrákból nem derül ki, mit is küldtél és minek is kellene látnunk a lefolyását. Az uart kapcsolat a keretek között tetszőleges idsejű inaktív szinetet elvisel.
A programodban az UART_Write_Text eljárás legalább egy karakter elküldési idejét váratozással tölti, de lehet, hogy kettőét is. A UART_Data_Ready csak megnézi, hogy van-e már vett karakter, de nem olvassa ki. Ha még egy érkezik, ráfutási hiba keletkezik. Ha volt vett karakter, akkor 1 másodpec, ha nem volt akkor csak 1/2 másodpercig várakozik a program, Ez alatt az idő alatt több karakter is érkezhet, ami megintcsak ráfutási hibához vezethet. Nem fogod megúszni a megszakításos, bufferelt uart kezelést.
Ha a modul 3.3V -os, a pic 5V -os tápról jár, akkor a vételi vezetékre szintillesztőt kell beépíteni.
(#) icserny válasza obenhof hozzászólására (») Feb 12, 2016 /
 
Idézet:
„Azt látom, hogy egy magas bit becsúszik a két 8bites karakter közé, de miért?”
A STOP bit után nem indul azonnal a második karakter küldése. Ez nem hiba.
(#) kuner hozzászólása Feb 12, 2016 /
 
Sziasztok.
Nagyon kezdő vagyok a témában. Kérdésem lenne, hogy *.c *.h *.lkr fájlokból hogyan és mivel lehet egyszerűen hex-et generálni?
(#) Hp41C válasza kuner hozzászólására (») Feb 12, 2016 /
 
A megfelelő C fordítóval.
(#) kuner válasza Hp41C hozzászólására (») Feb 12, 2016 /
 
Köszi. Esetleg valami leírást nem tudnál hozzá linkelni?
MPLAB amim van, hátha ez meg tudná oldani a feladatot.
(#) obenhof válasza Taki33 hozzászólására (») Feb 12, 2016 /
 
Látom én mindkettőt szkópon is, és Pickit3 debug módban is. Képekkel is illusztráltam.
(#) Hp41C válasza kuner hozzászólására (») Feb 12, 2016 /
 
Ha csak az alap MpLab van letöltve, akkor még le kell tölteni egy C fordítót is: XC8, Microchip C18, stb.
Bele kellene nézni a .c állományba, hátha voltak olyan gondosak és beleírták a fordító nevét...
(#) obenhof válasza Hp41C hozzászólására (») Feb 12, 2016 /
 
Idézet:
„Az ábrákból nem derül ki, mit is küldtél és minek is kellene látnunk a lefolyását.”


Idézet:

Helyes küldés USB-Soros átalakítóval (ESP8266 válaszol):
a
Helytelen pic-el (nincs válasz):
b

A programban benne van mit küldök: "T\r", és természetesen ugyan ezt terminál programban is.

Idézet:
„A UART_Data_Ready csak megnézi, hogy van-e már vett karakter, de nem olvassa ki.”

Nem is kell neki, azt debuggerben és szkópon látom, nem ez a lényeg.
Idézet:
„Ha volt vett karakter, akkor 1 másodperc, ha nem volt akkor csak 1/2 másodpercig várakozik a program”

Ez a program csak azért van, hogy szkópon lássam a kimenetet/bemenetet, nem a feldolgozás miatt.
Idézet:
„Ha a modul 3.3V -os, a pic 5V -os tápról jár, akkor a vételi vezetékre szintillesztőt kell beépíteni.”

Nem. 3.3V-ról labortápról működik mindkettő, a mikrokontroller működőképes ebben a feszültségtartományban is.
(#) obenhof válasza icserny hozzászólására (») Feb 12, 2016 /
 
De akkor a terminál programban miért nincs ott a STOP bit? Mert csak így válaszol a modul.
Következő: »»   751 / 1216
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