Fórum témák

» Több friss téma
Fórum » PIC - Miértek, hogyanok haladóknak
Lapozás: OK   1242 / 1318
(#) Attila86 válasza Attila86 hozzászólására (») Jan 18, 2017 /
 
Én valahogy ilyesmi módon gondoltam:
  1. typedef struct
  2. {
  3.     char  s;  //Enkóder láb beolvasás
  4.     char  f;  //Megszakítási flag
  5.     char  e;  //Megszakítás-engedélyezés
  6.     char  p;  //Megszakítás él
  7. }Enkoder1_type;
  8.  
  9. typedef struct
  10. {
  11.     Enkoder1_type  A;   //Enkóder egyik fele
  12.     Enkoder1_type  B;   //Enkóder másik fele
  13. }Enkoder_type;
  14.  
  15. Enkoder_type    Enkoder[2];     //Enkóderek létrehozása
  16.  
  17. //Enkóderek beállítása:
  18. Enkoder[0].A.s=PORTBbits.RB2;
  19. Enkoder[0].A.e=INTCON3bits.INT2IE;
  20. Enkoder[0].A.f=INTCON3bits.INT2IF;
  21. Enkoder[0].A.p=INTCON2bits.INTEDG2;
  22. Enkoder[1].A.s=PORTBbits.RB1;
  23. Enkoder[1].A.e=INTCON3bits.INT1IE;
  24. Enkoder[1].A.f=INTCON3bits.INT1IF;
  25. Enkoder[1].A.p=INTCON2bits.INTEDG1;

Persze nyilván a stuktúra elemeit nem lehet ezekkel feltölteni, ez itt a gondom. A stuktúra elemeinek típusának is csak azért írtam char-t hogy legyen oda írva valami.
(#) Attila86 válasza Hp41C hozzászólására (») Jan 18, 2017 /
 
Az enkóder-kezelő függvény a megszakításban van meghívva, az enkóder A és B felének le és felfutási megszakításai okán hívódik meg. Azért is kell neki átadni a portláb beolvasásának mikéntjén felül a megszakítási dolgokat is (flag, él és engedélyezés).
(#) pajti2 válasza Attila86 hozzászólására (») Jan 18, 2017 /
 
Bocsi a buta kérdésért, de mi a bánat az a rotációs enkóder? Mit rotál és mit enkódol?
(#) bbalazs_ válasza pajti2 hozzászólására (») Jan 18, 2017 /
 
Egy tetszoleges szamban, szabadon korbeforgathato tekerogomb, ami a tekeres sebesseget es iranyat adja. Elve egy ket impulzussorozatos kimeneti negyszogjel, ahol a jelek egymastol fel fazissal el vannak tolva. Igy a beerkezo szintekbol az irany kikalkulalhato, a sebesseg pedig ertelemszeruen a frekibol. Az impulzusok darabszama a lepesek szamat jelenti, a finomsagot a gyartaskor hatarozzak meg hardverszinten.
A belso szekezete altalaban mechanikus, egyszeruen egy forgo tarcsa, amin ket erintkezo van es a palya szakaszonkent megszakitott. Igy a ket erintkezo idonkent kap, idonkent nem kontaktust. Letezik belole magneses gyurus, ilyenkor hall-szenzorral veszik az impulzusokat.
Tekereskor eros poziciokba allasok erezhetok, mert ugy alakitjak ki a hardvert.

pelda ra mondjuk a digitalis mikrok tekeros idozitoje.
(#) Attila86 válasza Attila86 hozzászólására (») Jan 18, 2017 /
 
A beállításokat rosszul írtam, így a jó:
  1. //Enkóderek beállítása:
  2. Enkoder[0].A.s=PORTBbits.RB2;
  3. Enkoder[0].A.e=INTCON3bits.INT2IE;
  4. Enkoder[0].A.f=INTCON3bits.INT2IF;
  5. Enkoder[0].A.p=INTCON2bits.INTEDG2;
  6. Enkoder[0].B.s=PORTBbits.RB1;
  7. Enkoder[0].B.e=INTCON3bits.INT1IE;
  8. Enkoder[0].B.f=INTCON3bits.INT1IF;
  9. Enkoder[0].B.p=INTCON2bits.INTEDG1;
  10. Enkoder[1].A.s=PORTBbits.RB3;
  11. Enkoder[1].A.e=INTCON3bits.INT3IE;
  12. Enkoder[1].A.f=INTCON3bits.INT3IF;
  13. Enkoder[1].A.p=INTCON2bits.INTEDG3;
  14. Enkoder[1].B.s=PORTBbits.RB4;
  15. Enkoder[1].B.e=INTCON3bits.INT4IE;
  16. Enkoder[1].B.f=INTCON3bits.INT4IF;
  17. Enkoder[1].B.p=INTCON2bits.INTEDG4;
(#) pajti2 válasza bbalazs_ hozzászólására (») Jan 18, 2017 /
 
Azt nem inkább érintkező tripletekkel csinálják? Csak abból gondolom, hogy mechanikailag kedvezőbb lehet úgy. Ha érintkező duplet van mondjuk a forgó részen, és szimpla vezető felületek az álló részen, akkor szénkefézni kell a forgó részt. Ha a forgó részre tesznek csak egyetlen vezetősávot, az álló részre pedig érintkező tüske tripletet, akkor a forgatás irányát is ki lehet találni pld jobb-közép összeérintve utána mindhárom összeérintve, vagy előbb bal-közép összeérintve, és utána a három együtt. Ha úgy csinálják, nem kell a forgó részt szénkefézni, mechanikailag időt állóbb lehet. Vagy éppen az a cél, hogy bonyolultabb legyen, és romoljon csak L ?
(#) kissi válasza pajti2 hozzászólására (») Jan 18, 2017 /
 
(#) GPeti1977 válasza pajti2 hozzászólására (») Jan 18, 2017 /
 
Láttam már 3 fázisú enkódert, autórádió hangerőszabalyozója, de nagyon nincs elterjedve csak a két fázisú.
(#) Hp41C válasza Attila86 hozzászólására (») Jan 19, 2017 /
 
A megszaításos kezelés elég megbízhatatlan lesz, ha az éritkezők prellegnek. Még akkor is lehet érzékelési bizonytalanság miatt prell, ha optikai az érzékelő, de a pozíció pont a váltás határán van. Ha élvezérelt megszakítást használsz a prell ideje alatt előre - hátra lépkedni fok egy pozíciót.
Hogyan akasz mondjuk 8 encoder -t kezelni, ha a kontrollernek nincs 16 megszakítás bemenete?
(#) Hp41C válasza pajti2 hozzászólására (») Jan 19, 2017 /
 
Egy műanyag tárcsa forog, a felületén két pályán van a Gray kódú fémezés. Az A és a B kivezekés a két pályára kapcsolódik, a harmadik pedig mindkettőre. Csak 4 apró érinkező rugó... Tönkre is megy kb. egy év alatt az olcsó egerek görgőjénél.
(#) Attila86 válasza Hp41C hozzászólására (») Jan 19, 2017 /
 
A függvény a gyakorlatban így ahogy van teljesen jól működik a megszakításban. Ki lett próbálva. A prellegést is leköveti, épp ez a dolga neki. Nem tud olyan gyorsan prellegni hogy a 70MIPS-el ne tudja követni a PIC. De most hogy rákérdeztél megnézem digit szkóppal is, kíváncsi vagyok mennyi időt tölt a megszakításban pontosan...
Nyolc enkódert nem akarok, de kettőt mindenképp jó lenne! Négy INT lába viszont van a PIC-nek, plusz ott az "Interrupt-On-Change". De valójában ez mindegy is mert a kérdés nem az enkóder működésére, vagy az enkódert kezelő függvény működésére irányult, hanem csupán arra hogy hogyan lehetne több kitüntetett-regiszter bitet kezelni ugyan azzal az egy függvénnyel. Igazából itt most irreleváns hogy a függvény mit csinál.
(#) Hp41C válasza Attila86 hozzászólására (») Jan 19, 2017 /
 
Idézet:
„... hanem csupán arra hogy hogyan lehetne több kitüntetett-regiszter bitet kezelni ugyan azzal az egy függvénnyel.”

Csak az lehetséges, hogy regisztercímet és maszkot adsz át.
(#) zenetom válasza Hp41C hozzászólására (») Jan 19, 2017 /
 
R-C taggal és/vagy IC-vel nagyon szépen meg lehet oldani ezt a problémát. Legalábbis nekem anno sikerült.

Attila86:
Nem tudom, létre lehet-e hozni bitstruktúrát, de ha nem akkor szerintem a bit maszkolásos byte struktúra jó megoldás, csak "sokat" kell írni.
Szóval az Enkoder egy byte tömb, aminek a 0. eleme ugyebár az egyik enkóder, aminek van a két csatornána (A, B). Egy enkóderhez ugye pont 8 bit kell, miknek úgy adsz értéket, hogy először kinullázod, majd maszkolva beállítod (VAGY művelettel) az egyes biteket (pl jobbról balra: maszkolás előtt rotálod őket: először nem is rotálsz, utána egyet balra, majd kettőt balra ... és így tovább 7-ig).
Szerk.: most látom, már írtad a bitenkénti verziót. Akkor nem szóltam.
A hozzászólás módosítva: Jan 19, 2017
(#) pajti2 válasza Hp41C hozzászólására (») Jan 19, 2017 /
 
Rendesen kódolva még akkor sem igazán ciki, ha már stabilnak kellene lennie az előző érintkező jelének, amikor még mindig prelleg, és már a következő is prellegni kezdett. Még akkor is lehet modellezni az állapotukat, mint például stabil volt X msec ideig, akkor az egy állapot volt, és ha utána egyáltalán prellegni kezdett, akkor az az ellenkező állapotba váltás eseménye. Csak egy ötlet.
(#) Attila86 hozzászólása Jan 20, 2017 /
 
Én rontok el valamit, vagy az atof() függvény működik rosszul?
Korábban hibát találtam a gyári Microchipes strstr() függvényben is (Bővebben: Link) úgyhogy nem lepne meg ha ez is hibás lenne...

atof hiba.png
    
(#) Wezuv hozzászólása Jan 23, 2017 /
 
Sziasztok!
Harmony-val játszok, veszem fel egymás után a Drivereket. Egy SD FAT (SPI) -vel kezdtem, majd egy USB HID-et építettem rá, már ekkor is néha lefagyott, nem foglalkoztam vele, ritkán történt, gondoltam csak időpocsékolás lenne elmerülni az ok keresésében. Aztán felvettem a HTTP Servert is és így együtt el is indul, server fut, SD fut, USB HID konnektál. Aztán amikor egy adatot küldök az USB-n, lefagy a System Timer. Régen is volt hasonló gondom, kikerültem, mert akkor én írtam az egész kódot az elejétől, de a harmony tele van ennek használatával, így félek nem tudom kikerülni, de ezt ma meglátom, ha hazaértem.
Naszóval a kérdésem, nem találkozot valaki infóval arról, hogy a SYS_TMR_TickCountGet(), ami a System Timer számláló értékével tér elvileg vissza (ha jól tudom), hogyan adhat vissza azonos értékeket? Nyílván nem fog futni az Stack-ek időzítése sem... Érdekes, hogy csak az ethernet fagy le, az USB és az SD tovább fut (másképp vannak időzítve a belső elemek, gondolom). A timer megszakításokkal is gond van ilyenkor, mert a TMR_Stack-ek nem törlik a megszakítás IF-eket, és roszz értékekkel térnek vissza, beragasztják a szálat a megszakításba. Remélem megtalálom a megoldást, de várom a segítségeteket is! Köszönöm!
(#) Zsolt2 hozzászólása Jan 24, 2017 /
 
Sziasztok.
Watchdogot szertném konfigurálni, úgy, hogy csak az inicializálás után induljon el. Adatlap szerint ez lehetséges FWDTEN kinfigurációs bit segítségével.
Idézet:
„The WDT is enabled or disabled by the Watchdog Enable bit (FWDTEN) in the WDT Configuration register (FWDT<7>).”

A kérdésem az lenne, hogy ennek a bitnek az értékét hogyan lehet változtatni C forráskódbol futásidőben?
Megj: dsPIC33EP512MU810-et használok, xc16-os kompilerrel.
(#) pajti2 válasza Zsolt2 hozzászólására (») Jan 24, 2017 /
 
Config bitet nem tudsz átírni futási időben. Ha a flash programozás segít is benne, az device resetkor már shadow registerbe van másolva, ergo az induláskori értéke akkor is megmarad.

Az RCON register-ben az SWDTEN bitet tudod átírni futás időben, az adatlapon megtalálod (DS70616G-page 143).

Mint ahogy azt is megtalálod, hogy az FWDTEN configurációs bit (DS70616G-page 477, DS70616G-page 478, DS70616G-page 482).

A device pragma-k között nézz szét, milyen néven van definiálva a config bit változtatása, azt hirtelen most nem találtam meg.

A mechanizmus úgy néz ki, hogy default esetben configból kikapcsolva van, és akkor szoftveresen bekapcsolhatod, ha akarod. Ha configból bekapcsolod, akkor szoftveresen már letiltani sem tudod.
(#) Zsolt2 válasza pajti2 hozzászólására (») Jan 24, 2017 /
 
Köszönöm a segítséged, így már müködik.
(#) Lamprologus hozzászólása Jan 24, 2017 /
 
CCS-C ben járatos emberek segítségét kérném!

soros protra küldök ki adatokat:
  1. fprintf(UART_PORT2,"t2.txt=\"%03.1f\"%c%c%c",Lakas1_homerseklet,0xFF, 0xFF, 0xFF);
  2. fprintf(UART_PORT2,"t3.txt=\"%3.1w\"%c%c%c",Homerseklet_alapjel,0xFF, 0xFF, 0xFF);


Ha a soros portnál beállítom, hogy legyen adási puffer
  1. #use rs232(UART2, baud=9600, RECEIVE_BUFFER=0, TRANSMIT_BUFFER=500, stream=UART_PORT2)

akkor a Homerseklet_alapjelet többnyire hibásan küldi ki a portra. Ciklikusan ismétlődnek a hibás adatok, de minden 6.-ra helyesen küldi ki. Ha nincs adási puffer akkor mindig hibátlanul küldi az adatokat. A Lakas1_homerseklet mindig hibátlanul megy.

Ez mitől lehet?
(#) Hp41C válasza Lamprologus hozzászólására (») Jan 24, 2017 /
 
Milyen típusú a Lakas1_homerseklet és a Homerseklet_alapjel változó?
Idézet a Manual -ból:
Idézet:
„Format:
The format takes the generic form %n t. n is optional and may be 1-9 to specify how many characters are to be outputted, or 01-09 to indicate leading zeros, or 1.1 to 9.9 for floating point and %w output. t is the type and may be one of the following:”

A felsorol formátumok között nem találok lf -et, a float -nél nincs utalás a bevezető 0 -ra.
(#) Lamprologus válasza Hp41C hozzászólására (») Jan 24, 2017 /
 
Homerseklet_alapjel: unsigned int16
Lakas1_homerseklet: float
(#) Hp41C válasza Lamprologus hozzászólására (») Jan 24, 2017 /
 
Próbáld meg így:
  1. fprintf(UART_PORT2,"t2.txt=\"%3.1f\"%c%c%c",Lakas1_homerseklet,0xFF, 0xFF, 0xFF);
(#) Lamprologus válasza Hp41C hozzászólására (») Jan 24, 2017 /
 
Próbáltam, nem lett jó.
De nem is ezzel, hanem a Homerseklet_alapjel kiírással van gond. És azzal is csak akkor ha adási puffer van beállítva ( és akkor a főciklusból az fputc_send(UART_PORT2); parancs küldi ki az adatot)
A hozzászólás módosítva: Jan 24, 2017
(#) Kovidivi válasza Lamprologus hozzászólására (») Jan 24, 2017 /
 
Gondolom elcsúszik vagy a géped, vagy a uC a megadott baud rate-től, ez okozza, hogy mindig ugyanott van a hiba. Mire odaér, addigra pont annyi hiba összegyűlik, hogy bajt okoz.
(#) Lamprologus válasza Kovidivi hozzászólására (») Jan 24, 2017 /
 
Ennek elentmondani látszik az a tény hogy a %...f sorokat hibátlanul küldi, a %...w adatoknál viszont 70-80% -ban hibásan küldi az adatokat. Logikai analizátorral nézve, automatikus baud rate-val is hibás az adat. (Az analizátor szerint 9592 Baud a sebesség)

Azért holnap kipróbálom, hogy más sorrendben küldöm ki az adatokat, ha igaz a feltevésed, akkor másik adatnál kell jelentkezzen a hiba.
(#) whipeer hozzászólása Jan 25, 2017 /
 
Üdv! Egy olyan programot keresnek ami projectorhoz való, úgy nevezett lampa timer reset kene, sajnos amit csatoltam kepet az levan vedve igy nem tudom kiolvasnia programot.

PLC-WXU 300
Pic16f688
lámpa Timer reset ??
(#) Lamprologus válasza Kovidivi hozzászólására (») Jan 25, 2017 /
 
Átírtam a sorrendet, sajnos ugyan azt az adatot küldi ki hibásan.

Van egy programrész ahol 11db float típust küldök ki, mind hibátlanul megérkezik. Ezt a rész átírtam, hogy az unsigned int16-okat küldje ki ... 11-ből 2-3 jó a többi hibás!

Ha nincs beállítva buffer minden adat hibátlan!

Milyen összefüggés lehet egy szám átkonvertálása és a soros port bufferelése között?

Ha LCD kijelzőre küldöm az adatot (azonos formátumban) az minden esetben hibátlan.
(#) pajti2 válasza whipeer hozzászólására (») Jan 25, 2017 /
 
Ha ismered az elektronikai környezetet, és le tudod írni precízen, milyen feltételekkel mi legyen a felhasználói élmény, egyszerűbb a nulláról felépíteni egyet, mint meglévőkkel kísérletezni.
(#) Bakman válasza whipeer hozzászólására (») Jan 25, 2017 /
 
Rakj az adatvezetékekre logikai analizátort, azzal kb. minden kideríthető.
Következő: »»   1242 / 1318
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