Fórum témák

» Több friss téma
Fórum » PIC - Miértek, hogyanok haladóknak
Lapozás: OK   1219 / 1320
(#) Wezuv hozzászólása Márc 7, 2016 /
 
Nem jövök rá, hogyan tudok egy db karaktert elküldeni PIC32MZ UART-al. A FIFO-ja 8 mély, csak akkor kezdi elküldeni egyenként a karaktereket, ha megtelt, azaz a 9. beérkezésekor elküldi az elsőt. De egy karaktert is el kellene tudnia küldeni, de nem jövök rá hogyan. Megszakításból a 24 karakterből elkült 15-öt. Nem találok olyan beállítást, hogy FIFO kikapcsolása. MX-en ez simán ment, persze FIFO nélkül...
(#) Zsora válasza Wezuv hozzászólására (») Márc 8, 2016 /
 
Pedig nincs különbség az MX és az MZ UART-ja között, és a FIFO nem tiltható le egyiküknél sem. Alap esetben az adásnak meg kell kezdődnie közvetlenül a TX tárba való írás után (FIFO ide vagy oda). Ha viszont használod a Flow Control módot, akkor az adás csak a /CTS jelre indul meg. Szerintem nézd át az /RTS és /CTS lábak beállítását!
(#) Wezuv válasza Zsora hozzászólására (») Márc 8, 2016 /
 
A vezérlő lábakat kikapcsoltam(illetve nem kapcsoltam be.). Biztosan valami beállítás, de nem jöttem rá eddig.
Azt írod, mindenképpen meg kell kezdődnie? Break-el hajtottam végre a megszakítást, amiben egyenként küldöm el a bájtokat egy tömbből. A 9. beírásakor került ki az első. Ha ezt akarnád, hogyan oldanád meg?
A hozzászólás módosítva: Márc 8, 2016
(#) Wezuv válasza Zsora hozzászólására (») Márc 8, 2016 /
 
Találtam különbséget. Azon kívül, hogy az MX-nek 4 mélységű, az MZ-nek 8, eltérés van a megszakítás jel generálódásában is. Nem pontosan értem, csak sejtem, hogy mi az eltérés, ha tudtok segítsetek megérteni!

  1. UxSTA: (regiszter)
  2. UTXISEL<1:0>: TX Interrupt Mode Selection bits(1)
  3.  
  4. For 4-level deep FIFO UART modules: (MX)
  5. 10 = Interrupt is generated when the transmit buffer becomes empty
  6. 01 = Interrupt is generated when all characters have been transmitted
  7. 00 = Interrupt is generated when the transmit buffer contains at least one empty space
  8.  
  9. For 8-level deep FIFO UART modules: (MZ)
  10. 10 = Interrupt is generated and asserted while the transmit buffer is empty
  11. 01 = Interrupt is generated and asserted when all characters have been transmitted
  12. 00 = Interrupt is generated and asserted while the transmit buffer contains at least one empty space
(#) ha1drp válasza f2f2 hozzászólására (») Márc 8, 2016 /
 
Adások előtt a TRMT bitet ellenőrizted?
(#) Wezuv válasza Wezuv hozzászólására (») Márc 8, 2016 /
 
Azt hiszem arra már rájöttem, hogy miért tűnik úgy, hogy csak a 9. karakter után viszi ki az első karaktert. Azért, mert a megszakítás jel csak akkor törlődik, ha tele a puffer 8 mélyen, 00-s beállítás esetén. A puffert olyan gyorsan tölti, hogy a debuggolás közbeni betérések alatt nem ér ki egy bit sem a soros vonalon. Ezt követően már csak akkor tér be a megszakításba, ha kiment egy adat, mert akkor már legalább egy puffer üres, azaz megvárja, míg kimegy egy karakter.

Azt még nem értem, hogyan maradhat bent a pufferben az utolsó 9 adat...

De rájöttem! Ez egy RS485 illesztővel ellátott vonal. Amikor kiért a beállított számosságú karakter, letiltom a TX megszakítást és a kimenetet bemenetté fordítom. Hiába küldi az UART a maradékot, nem jut ki a vonal illesztőn. Meg kell várjam, míg teljesen kiürül a puffer, azaz menet közben módosítanom kell a megszakítás mód jelzőt és ha kiürült minden, akkor szabad vételre váltanom! Félek nem lesz sok időm délután, de beszámolok, ha sikerült! Köszi az eddigieket!
A hozzászólás módosítva: Márc 8, 2016
(#) Wezuv válasza ha1drp hozzászólására (») Márc 8, 2016 /
 
Megszakításban kezelt TX-nél nem szükséges szerintem, mert a megszakítás jelek helyettesítik.
(#) Zsora válasza Wezuv hozzászólására (») Márc 8, 2016 /
 
4-szintű FIFO UART modulnál:
11 = X
10 = Megszakítás keletkezik amikor a TX tár kiürül
01 = Megszakítás keletkezik amikor minden adat el lett küldve (TX tár és SR kiürült)
00 = Megszakítás keletkezik amikor a TX tárnak lesz legalább egy üres helye

8-szintű FIFO UART modulnál:
11 = X
10 = Megszakítás keletkezik és addig fenn is marad amíg a TX tár üres
01 = Megszakítás keletkezik amikor minden adat el lett küldve (TX tár és SR kiürült)
00 = Megszakítás keletkezik és addig fenn is marad amíg a TX tárnak van legalább egy üres helye

Az én értelmezésem szerint:
4-szintű FIFO-nál a megfelelő esemény bekövetkeztekor a megszakításjelző bit bebillen, de utána programból törölhető.
8-szintű FIFO-nál viszont törlés után a bit visszabillen újra mindaddig amíg az eseményt kiváltó állapot fennáll. (Tehát előbb meg kell szüntetni az okot, majd törölni a bitet!)
(#) Droot hozzászólása Márc 8, 2016 /
 
Sziasztok!

A Cast-olással akadt problémám!

  1. volatile uint16_t avg_lux_tmp = 0;
  2. uint8_t backlight_set = 0;
  3. #define BACKLIGHT_SENSOR_SENS   100
  4. #define MAX_LUX                 1300
  5. #define MIN_LUX                 0
  6. #define MIN_BACKLIGHT           20
  7. #define MAX_BACKLIGHT           254


Adott ez a sor:
  1. backlight_set = (float)((float)((float)(MAX_BACKLIGHT-MIN_BACKLIGHT)/MAX_LUX)*avg_lux)+MIN_BACKLIGHT;

Néha 0 lesz az értéke, és úgy látom, nagyon nem pontos. Túl nagy lépésközzel jön a backlight_set-be eredmény, biztos, hogy nem számol mindig rendesen tizedesekkel.
Lehet, hogy float helyett double kellene?
Mindig is voltak gondjaim a cast-olással.
Valaki helyre tudná ezt tenni?
A backlight_set-be egész számok kerülhetnek, egy PWM generátorba megy. Tulajdonképpen ez az egész egy kijelző fényerejét szabályozza automatikusan.
(#) Wezuv válasza Zsora hozzászólására (») Márc 8, 2016 /
 
Köszönöm! Szimulációban csodálkoztam, hogy nem törlődik a bit, azt hittem bugos, ezek szerint csak okos.
(#) icserny válasza Droot hozzászólására (») Márc 8, 2016 /
 
Ha úgyis egész eredmény kell, akkor felejtsd el a float és double típust! Az egész osztás csonkítása miatt azonban meg kellene cserélni a szorzás és az osztás sorrendjét. Emiatt long típusú átmeneti tárolásra lesz szükséged.
(#) Droot válasza icserny hozzászólására (») Márc 8, 2016 /
 
Le tudnád írni esetleg egy példában, hogy hogyan gondolod ezt?
A számlálóba vigyem fel az avg_lux szorzást?
(#) icserny válasza Droot hozzászólására (») Márc 8, 2016 /
 
Idézet:
„A számlálóba vigyem fel az avg_lux szorzást?”
Igen.
(#) Droot válasza icserny hozzászólására (») Márc 8, 2016 /
 
Így is butaságokat mér sajna:
  1. backlight_set = ((((MAX_BACKLIGHT-MIN_BACKLIGHT)*avg_lux)/MAX_LUX))+MIN_BACKLIGHT;
(#) Wezuv válasza Droot hozzászólására (») Márc 8, 2016 /
 
Valószínű, hogy a szorzás eredménye nem fér bele a vélhetően 16, vagy 32bites változókba. Ha netán nem így lenne most, deklarálj long long változókat, vagy több lépésben hajtsd végre a műveleteket, sok esetben még gyorsabb is lesz, mint így egybe nyomorgatva. A C szép dolog, de ára van.
A hozzászólás módosítva: Márc 8, 2016
(#) Droot válasza Wezuv hozzászólására (») Márc 8, 2016 /
 
Most azon agyalok, ha a main-ben végzem ezt el, akkor működik. 1ms-os megszakítsában csináltam, mint most kiderült, nincs elég ideje elvégezni. Úgyhogy kell a main-embe egy flag.
(#) Wezuv válasza Droot hozzászólására (») Márc 8, 2016 /
 
Jut eszembe, az MZ EF sorozatnak van hardveres float és double támogatása. Tedd át doublébe és számoltasd ki ugyanezt, lehet, hogy gyorsabb lesz! (Azt nem tudom, hogyan kell rávenni a fordítót, hogy ezt használja, talán tudja magától, ha a legújabb XC32-t használod.))
(#) Droot válasza Wezuv hozzászólására (») Márc 8, 2016 /
 
A legújabbat használom!
Végülis nem kell lebegőpontos számolás.
Ez lett a vége a main-ben egy flag-el:
  1. backlight_set = ((((MAX_BACKLIGHT-MIN_BACKLIGHT)*avg_lux)/MAX_LUX))+MIN_BACKLIGHT;

Elég látványosan működik, frankó lett. De pl 200-as kitöltési tényezőről 100-ra ugrás elég hirtelen a kijelző fényerejét illetően, úgy csinálom meg, hogy ms-onként vegyen vissza egyet a kitöltési tényezőből.
(#) Wezuv válasza Droot hozzászólására (») Márc 8, 2016 /
 
Nem biztos, hogy lineáris öszefüggés lesz a fényerő és a kitöltés között.

Nem izgat, hogy az FPU-val hogyan menne? Ha jól láttam pár órajel alatt kiszámolja az eredményeket, még gyökvonás is van, ha jól látom. Az adatlap(60001320B.pdf) 3.1.4 részénél nézd meg miket tud!
(#) Droot válasza Wezuv hozzászólására (») Márc 8, 2016 /
 
Mindjárt átnézem.
(#) f2f2 válasza ha1drp hozzászólására (») Márc 8, 2016 /
 
A prg induláskor minden beállítás majd
-egyik teszten 1 byte kiküldés
-másik teszten 2 byte kiküldés
és üres pörgés NOP sorozaton.
Ennyinél miért kellene küldés előtt TRMT vel torődnöm ?
UART1 és 2 ugyanaz a helyzet.

TRMT...
mivel 1 byte nál még nem tellik meg és nem lesz a TRMT full
és ennél is ismétlődik a kiküldés ebből gondolom nem TRMT
miatt történik az ismétlődő TXd.
Úgy néztem 2 byte nál lesz full a TRMT
és ezt e PIR3 configban is lehet ellenőrizni mármint hogy üres vagy tele a TXbuff.
Érdekes hogy ennyit kell görcsölni.
a jel szabálytalan és nem áll le.
A hozzászólás módosítva: Márc 8, 2016
(#) f2f2 válasza ha1drp hozzászólására (») Márc 9, 2016 /
 
A leírás szerint így kellene lennie:

A TRMT üres/tele különbözik a TX1IF üres/tele lekérdezéstől.
2 byte-ot lehet a bufferbe küldeni.
A TRMT akkor lesz üres jelzésű, ha buffer utolsó byteja is ki lett küldve és a stopbit nél tart
A TX1IF pedig 1 byte TXREG be küldésekor ad egy picic LOGIC-0 jelet, de LOGIC-1re visszatér
és amikor már beküldtük a 2. byte-ot és tele van a buffer úgy, hogy az első byte
küldése nem fejeződött be tartós LOGIC-0 lesz a legelső STOPbitig.

A problémám is tesztelve TRMT LOGIC-1 ekkor küldök 1 byte-ot ki LOGIC-0 lesz
és a következő csapda, ami LOGIC-1 re várakozik már nem jut túl rajta a stopbit
látván sem, mert köpködi ki a byte-ot. Asynchronra módon vagyok.
A hozzászólás módosítva: Márc 9, 2016
(#) Wezuv hozzászólása Márc 9, 2016 /
 
Tegnap kevés időm volt(ma is az lesz), addig jutottam, hogy 8nál több karaktert tudok küldeni megszakításból. 8-nál kevesebb nem megy ki. Az U6TXREG-be beteszem az adatot és nem történik semmi. Egyelőre nem értem, ilyennel még nem találkoztam, pedig 12F-től minden PIC családdal dolgoztam...
A hozzászólás módosítva: Márc 9, 2016
(#) Zsora válasza Wezuv hozzászólására (») Márc 9, 2016 /
 
Tehát ha bepakolsz a CPU-val manuálisan (Nem DMA-val vagy megszakítással) pl. 5db adatot az U6TXREG-be, nem kezd el adni? Szkóppal mérve nem jön ki semmi? Az U6STA regiszterben történik változás?
Hogyan inicializálod az UART-ot, és hogyan küldesz?
(#) Wezuv válasza Zsora hozzászólására (») Márc 9, 2016 /
 
De! Manuálisan megy, TRMT-t figyelve.
Próbálom elmondani mi van, de nem egyszerű, mert nehezen tudom megfogalmazni, hogy érthető legyen. Talán azzal kezdeném, ahogy most már működik. Cél, hogy megszakításban legyenek elküldve a karakterek egy pufferből. Átadásra kerül az elküldendő karakterek száma és engedélyezésre kerül a TX megszakítás a folyamat megindításához.
Ahogy most működik:
Megszakítás mód beállítás:
  1. U6STAbits.UTXISEL=0b01; //Az utolsó karakter elküldését követően szakít meg.

Ebben a módban az történik, hogy betöltöm a karaktert a FIFO-ba (U6TXREG-be), elküldésre kerül, amikor kiért megszakít, újra betöltöm, egyesével, mindezt addig, amíg el nem fogynak a karakterek.
Ez a működés megfelel a régi hagyományos FIFO nélküli módnak, mert a FIFO-ba mindig csak egy karakter lesz letéve.

Természetesen szeretném kihasználni a FIFO-t, megszakításban, de eddig nem sikerült. Ha az U6STAbits.UTXISEL=0b00, ami akkor szakít meg, ha van legalább egy szabad hely a pufferben, akkor addig belepörög a megszakításba, amíg nem telik meg a FIFO. Amikor ez megvan, akkor elvileg csak akkor tér be, ha a FIFO legalább egy karakterrel ürül, azaz innen azonos a működés lenne a fent leírtakkal. Meg kéne oldani, hogy amikor elfogynak a karakterek, de még a FIFO félig tele, várja meg, míg kiürül, de eközben folyamatosan megszakítás történik a 00-s módban, mert a FIFO nincs már tele. Itt nem lenne szép elkezdeni vizsgálni a TRMT-t, mert az már nem megszakításban való kezelés, még ha ott is pörög a szál. Tehát át kéne váltani a U6STAbits.UTXISEL=0b01; módra és várni, míg kiér az utolsó karakter és akkor jön a megszakítás. Ekkor lehetne törölni a megszakítás engedélyt és visszaváltani 0b00 módra, valamint bemenetre váltani az RS485 vonalat.
Ez elvileg jónak tűnik(lehetne finomítani ez elején a FIFO első feltöltésén ciklusban, hogy itt is csak egy megszakítás legyen, de ez most mindegy), de az adatlap azt írja, hogy a U6STAbits.UTXISEL bitet nem javasolt módosítani, csak akkor, ha a FIFO üres. Na szép! Ezzel meg vagyok lőve, mert nem értem minek a FIFO, ha nem tudom használni.

Ha van ötleted a használatára, szívesen venném!
A hozzászólás módosítva: Márc 9, 2016
(#) Droot válasza Wezuv hozzászólására (») Márc 9, 2016 /
 
Egy komplett library-t elküldtem neked erre ma délután emailben.
(#) Wezuv válasza Droot hozzászólására (») Márc 9, 2016 /
 
Nemrég értem haza, nem láttam még. Megnézem, köszi!
(#) Wezuv válasza Droot hozzászólására (») Márc 9, 2016 /
 
Nálam most ez működik, gyakorlatilag ugyanabban a módban, amit küldtél. Eddig ezt használtam, de most gondoltam jó lenne kihasználni a FIFO-t, de csak küzdök vele.
  1. void __ISR(_UART6_TX_VECTOR, IPL6AUTO) UART6TXIntKezeles(void){ //UART6 TX INT
  2.     //Adás megszakításban (RS485)
  3.     if(TX6_cik!=Data_TX6_Size){  //
  4.         U6TXREG=TX6_DataPointer[TX6_cik++];//Bájtok kivitele        
  5.     }else{
  6.         IEC5bits.U6TXIE=Ki;     //TX megszakítás kikapcs
  7.         RS485_Vetel_6();        //Adás végén vételre vált
  8.     }
  9.     IFS5bits.U6TXIF=Clear;      
  10. }
A hozzászólás módosítva: Márc 9, 2016
(#) Droot válasza Wezuv hozzászólására (») Márc 9, 2016 /
 
Azért küldtem, mert ezt az utat már egyszer végigjártam! Annyit lehet rajta javítani, hogy double buffering-et használjon. Egy másik buffernek átadod a memóriacímet, ami ugye gyorsabb, mint a másolás.
(#) Wezuv válasza Droot hozzászólására (») Márc 10, 2016 /
 
Ez nem ugyanaz, amit írok. De köszönöm hogy segíteni próbálsz! A FIFO 8 mélységű és az MX-hez képest másképpen működnek a megszakítás jelek is. Emellett amit felraktam kódot, egyenértékű a tiéddel: beteszem a TX6_DataPointer mutatóba puffer címét, amiben az adatok vannak, engedélyezem a megszakítást és elküldi egyenként, egy-egy megszakításban feltöltve a TXREG-et(bemegy, feltölt, kijön...).
A FIFO kezelése csökkentené a megszakítások számát, így erőforrás szabadulna fel (nem sok, de tény). Bemegy, feltölti a FIFO-t max 9 karakterrel, mert egy rögtön lecsúszik a léptető regiszterbe és a küldés megkezdődik, de még a start jel sem megy ki, mire a FIFO feltöltődik és kilép a megszakításból.
Az nem fér a fejembe, hogy ha nem javasolt menet közben módosítani a megszakítás módokat, akkor hogy gondolták a FIFO használatát a MC-nél?
Következő: »»   1219 / 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