Fórum témák

» Több friss téma
Fórum » PIC - Miértek, hogyanok haladóknak
Lapozás: OK   1115 / 1319
(#) _vl_ válasza slogan hozzászólására (») Márc 11, 2013 /
 
No, meg is találtam őket:
Texas: TLC5945 TLC5947
LT: LT8500
Mondjuk az utolsó már QFN tokos, ami nem túl barátságos dolog, de cserébe van rajta 48 kimenet.
(#) bbalazs_ válasza watt hozzászólására (») Márc 11, 2013 /
 
Az nem nano- hanem mikrosec, vagyis kb fel millisec.
(#) kissi válasza bbalazs_ hozzászólására (») Márc 11, 2013 /
 
Idézet:
„Ahogy néztem a port kiíratások között 500nsec eltolódás van, de az "új" PICben még nem is néztem (18F67K22).”

Szerintem erre írta !
(#) bbalazs_ válasza kissi hozzászólására (») Márc 11, 2013 /
 
Oh, igazad van! Nem neztem, hogy az eredeti hozzaszolas iroja irta. Igy o nem csak a szkopkep alapjan nyilatkozhat.
De akkor viszont ne aggodjon, mert egy 400Hz-es jelnel az az ido elhanyagolhato.
(#) akos_b hozzászólása Márc 11, 2013 /
 
Helló!
Más másik témában is írtam, de ott nem sikerült megoldani a problémát; gondoltam próbálkozok itt is. PICkit 2-n (PIC16F887) próbálgatom az indirekt memóriacímzést de nem sikerül. Debuggoláskor látom, hogy az FSR megkapja a megfelelő értéket, de a MOVWF INDF már nem működik rendesen. A beállított cím helyett a 0x021 kapja meg a WREG értékét. A melléket képen látszik minden. Mi okozhatja a problémát?

indirekt.PNG
    
(#) _vl_ válasza akos_b hozzászólására (») Márc 11, 2013 /
 
Szimulátorban, vagy igazi PIC-en? A szimulátor nekem ritkán csinálta jól a dolgokat.
Az is lehet probléma, ha engedélyezed az interruptokat, és az interrupt rutin "elrontja" a regisztereket. Ha a főprogram is használja ugyanazokat a registereket, mint az interrupt rutin (pl. itt az FSR), akkor az interrupt rutin elején menteni, végén visszaállítani kell. Ugyanez igaz a STATUS byte-ra is, bár azt nyilván mindenki tudja, hogy menteni kell.
(#) akos_b válasza _vl_ hozzászólására (») Márc 11, 2013 /
 
Igazi PIC, és a kód is a MAIN elején van szóval még szó sincs megszakításról.
(#) _vl_ válasza akos_b hozzászólására (») Márc 11, 2013 / 1
 
Na várjál. A CPU pont azt csinálja, amit mondtál neki.
Beraktál decimális 33-at (= hexa 0x21) a címregiszterbe, ő meg berakta erre címre az értéket. Hol itt a gond?
(#) akos_b válasza _vl_ hozzászólására (») Márc 11, 2013 /
 
Köszi szépen azt hittem ez decimálisan működik.
(#) slogan válasza _vl_ hozzászólására (») Márc 11, 2013 /
 
Köszi szépen !
Meglesem mik ezek ,meg hogy hol lehet kapni.
(#) janish hozzászólása Márc 12, 2013 /
 
Üdv mindenki!

Egy meglehetősen zavaró probléma ügyében szeretnék segítséget kérni.Az általam használt pic18f4550-es meglehetősen furcsán kezeli a megszakításokat. Ha egy perifériamegszakítást alacsony prioritásúnak állítok be akkor egyszerűen nem veszi ezt figyelembe, mintha nem is lenne ilyen megszakításom. Ennél is furcsább a magas szintű megszakítások viselkedése. Ugyanis amint engedélyezem akkor a kontroller egyből beugrik a rutinba és többet nem hajlandó "kimászni" belőle. A while(1){...} -be írt programrészek nem futnak le. Ha a különböző funkciókat valahogyan beletuszkolom a magas szintű megszakítás rutinba akkor normálisan működnek.
Ezidáig nem találtam megoldást a problémára pedig nem egy fórumot adatlapot errata-t bogarásztam át. Már gyakorlatilag lemásoltam a tankönyvi példákat, de ugyanez a helyzet. Szintén nem változik semmi akár a direkt regiszter kezelést választom akár a C18-as fordító könyvtárait.
Nekem már nincs több ötletem, de ha valaki már látott hasonló problémát akkor örömmel venném ha felvilágosítana, hogy mit nem vettem észre.
Itt a tesztprogram épp aktuális 4. verziója (a main.h-ban csak a függvénydeklarációk vannak):

  1. #include <p18f4550.h>
  2. #include "GenericTypeDefs.h"
  3. #include <delays.h>
  4. #include <timers.h>
  5. #include <usart.h>
  6. #include "main.h"
  7.  
  8. /******************************************************************************/
  9. #pragma config PLLDIV = 12
  10. #pragma config CPUDIV = OSC1_PLL2
  11. #pragma config FOSC = HSPLL_HS
  12. #pragma config WDT = OFF
  13. /******************************************************************************/
  14. #pragma udata
  15. /******************************************************************************/
  16. #pragma idata
  17. unsigned char TX_Buff[5] = {0x02,'a','b','c',0x03};
  18. volatile unsigned char RC_Buff = 0;
  19. /******************************************************************************/
  20. #pragma code High_Vector = 0x08
  21. void High_Vector(void)
  22. {
  23.     _asm goto High_ISR _endasm
  24. }
  25. #pragma code Low_Vector = 0x18
  26. void Low_Vector(void)
  27. {
  28.     _asm goto Low_ISR _endasm
  29. }
  30. /******************************************************************************/
  31. #pragma code
  32. #pragma interrupt High_ISR
  33. void High_ISR(void)
  34. {
  35.     if(DataRdyUSART())
  36.     {
  37.         if(RCSTAbits.OERR)
  38.         {
  39.             RCSTAbits.CREN = 0;
  40.             RCSTAbits.CREN = 1;
  41.         }
  42.         RC_Buff = ReadUSART();
  43.         while(!BusyUSART())
  44.         {
  45.             WriteUSART((char)RC_Buff);
  46.         }
  47.     }
  48. }
  49. #pragma interruptlow Low_ISR
  50. void Low_ISR(void)
  51. {
  52.     if(INTCONbits.T0IF)
  53.     {
  54.         INTCONbits.T0IF = 0;
  55.         USART();
  56.     }
  57. }
  58. /******************************************************************************/
  59. void Interrupt_Config(void)
  60. {
  61.     RCONbits.IPEN = 1;
  62.     INTCONbits.GIE_GIEH = 1;
  63.     INTCONbits.PEIE_GIEL = 1;
  64.     IPR1bits.RCIP = 1;
  65.     INTCON2bits.T0IP = 0;
  66.     INTCONbits.T0IF = 0;
  67. }
  68. void IO_Config(void)
  69. {
  70.     TRISD = 0x00;
  71.     LATD = 0x00;
  72. }
  73. void USART(void)
  74. {
  75.     unsigned int it = 0;
  76.     while(!BusyUSART())
  77.     {
  78.         while(it<5)
  79.         {
  80.             WriteUSART((char)TX_Buff[it]);
  81.             it++;
  82.             Delay1KTCYx(10);
  83.         }
  84.     }
  85. }
  86. /******************************************************************************/
  87. #pragma code
  88. void main(void)
  89. {
  90.     Interrupt_Config();
  91.     IO_Config();
  92.     OpenTimer0(TIMER_INT_ON & T0_16BIT & T0_SOURCE_INT & T0_PS_1_64);
  93.     OpenUSART(USART_TX_INT_ON & USART_RX_INT_ON & USART_ASYNCH_MODE & USART_EIGHT_BIT & USART_BRGH_LOW & USART_CONT_RX, 31);
  94.     while(1)
  95.     {
  96.         LATDbits.LATD1 = 0;
  97.         Delay1KTCYx(50);
  98.         LATDbits.LATD1 = 1;
  99.     }
  100.     CloseTimer0();
  101.     CloseUSART();
  102. }


A segítséget előre is köszönöm.
(#) watt válasza janish hozzászólására (») Márc 12, 2013 /
 
Szerintem rosszul szervezed az USART folymatot. A Timer minden megszakításban belép az USART függvénybe, majd jó elidőzik ott(mit keres ott várakozás?) , miközben az USART megszakítás is bejöhet, az megszakítja az alacsonyat, rálicitál egy küldéssel a félbeszakadt adásnak, stb. Ez így minden csak nem jó. Gondold át mégegyszer. Tisztítsd le a programot és egyszerre csak egy lépést próbálj ki!
(#) janish válasza watt hozzászólására (») Márc 12, 2013 /
 
Hali,

közben én is rájöttem, hogy így nem lesz jó mert nem fog működni a timer megszakítás.
Viszont nem ez az igazi probléma. Korábban már kipróbáltam csak a timer-t használva és akkor is ugyanazt műveli. Magas szintűként az aktiválást követően azonnal beugrik a megszakításrutinba akár történt tényleges timer interrupt akár nem,( ha csak a USART-ot használtam akkor is ugyanez volt) . Az hogy van mellette egy USART is ami néha megszólal az gyakorlatilag nem oszt nem szoroz. A baj az, hogy a while(1){...}-ig el sem jut és így csak a HP interruptban tudom kiszolgálni a többi folyamatot.
(#) _vl_ válasza janish hozzászólására (») Márc 12, 2013 /
 
Ez csak egyetlen módon lehet: ha valami interrupt forrás folyamatosan interruptot generál. Végig kéne nézni, hogy mit mutatnak a státuszflagek.
(#) icserny válasza janish hozzászólására (») Márc 12, 2013 /
 
Nem ártana tisztázni, hogy milyen programnyelvet használsz, mert C18 esetén például #pragma interrupt és #pragma interruptlow kell ahhoz, hogy a fordító tudja, hogy mit kell csinálnia.

Itt találsz mintapéldát működő kétszintű megszakítás használatra.
(#) petikkkeee hozzászólása Márc 12, 2013 /
 
sziasztok!
Azért írtam ide, mert sürgős segítség kéne nekem és hátha ti tudtok segíteni.

http://www.talkingelectronics.com/projects/Elektor/PIC10F222/IgnSta...r.html

ezen az oldalon található egy kapcsolás a hozzá tartozó PIC programmal. Nekem annak a programnak az inverze kéne. És még annyi, hogy a nyomógombal csak egy bemenetet használjon. Ennek az átalakításában tud valaki segíteni? :/ Tehát hogy ne keljen még a kapcsolásba egy invertert bekötni, hanem szoftveresen legyen helyretéve. Nagyon megköszönném ha valaki tudna ebbe segíteni :/.

Péter
(#) janish válasza icserny hozzászólására (») Márc 12, 2013 /
 
A program MPLAB X v1.60 -val készült, a használt fordító: C18 v3.40, az XC8-at a USART könyvtár hiánya miatt egyenlőre hanyagoltam. Az interrupt függvényeket a C18 User's Guide és a Kónya féle PIC-es könyv alapján írtam.

Erre már én is gondoltam, bár debug alatt egyenlőre csak a PIR1 és az INTCON1 regisztereket figyeltem, majd holnap megnézem a PIR2-t is, de nem láttam hogy más megszakítás aktiválódott volna. (Elvileg minden alapértelmezetten ki van kapcsolva) . De még ha van is másik akkor sem magyarázza semmi azt, hogy az alacsony szintű megszakítások egyáltalán nem hajlandók futni, még akkor sem ha csak azok van engedélyezve.
(Korábban például már használtam az A/D konvertert is, igaz, hogy az egy 18f4450-es volt, viszont ott a main loop-ban blokkoló módon kezeltem az interrupt flaget és úgy emlékszem ott nem jött elő ez a probléma, vagy legalábbis nem tűnt föl.)
(#) kissi válasza janish hozzászólására (») Márc 12, 2013 /
 
A jelzőbitet nem felejted el törölni ?!
(#) janish válasza kissi hozzászólására (») Márc 12, 2013 /
 
Melyikre gondolsz? Az RCIF-et elvileg nem is kell kézzel törölni mert automatikusan törlődik ha kiolvassuk az RCREG-et, de már megpróbáltam kézzel is törölni, több helyen is, de ugyanúgy nem lép ki a megszakításrutinból hanem egyből visszaugrik ide:
  1. #pragma code High_Vector = 0x08
  2. void High_Vector(void)
  3. {
  4.     [b]_asm goto High_ISR _endasm[/b]
  5. }

és ez az amit egyáltalán nem érem.
(#) kissi válasza janish hozzászólására (») Márc 12, 2013 /
 
Ez a "beugrálás" szerintem akkor következik be, ha nem törlöd a jelzőbitet ( pl. az RCREG olvasásával , de ez nem látszik a mellékelt kódból, vagy csak én nem láttam : a ReadUSART(); csak utal rá, de mi történik belül ?!) ! Mindenképpen hasznos lehet egy szimuláció, én azt szoktam, mikor "nem látom a fától az erdőt" !
(#) Hp41C válasza janish hozzászólására (») Márc 12, 2013 /
 
Szia!
Át kellene nézni a könyvtári függvények működését. Az USART adó megszakítást kér rögtön az inicializálás után. A megszakítási rutinban akkor kezeled le az adási megszakításkérést, ha a vevő elkészült. Amennyiben nincs mit adni, az adási megszakításkérést le kell tiltani.
A RCIF és TXIF biteket a hardware törli, nem kell programból törölni őket.

Mennyivel átláthatóbb a program, ha nem használjuk azokat a könyvtári függvényeket, amik csak egy két utasításból állnak és az általuk generált belépési és kilépési kód sokkal hosszabb, mint az az egy-két utasítás, ami az igazi funkció...
A hozzászólás módosítva: Márc 12, 2013
(#) potyo válasza janish hozzászólására (») Márc 12, 2013 /
 
Én utolsóként kapcsolnám be a GIEH bitet, és utolsó előttiként a GIEL bitet a megszakítások inicalizálása során. Nem hiszem, hogy ez a gond, csak úgy megelőzésképpen szólok.
(#) janish válasza Hp41C hozzászólására (») Márc 12, 2013 /
 
Én úgy tudom, hogy a TXIF csak egy jelzőflag ami az adóregiszter foglaltságát jelzi, de most bogarat ültettél a fülembe. Holnap első dolgom lesz ezt kipróbálni. Egyébként nem rossz ötlet a könyvtári függvények átnézése sem, bár amikbe belenézegettem pl.: a DataRdyUSART() csak ennyi:
  1. char DataRdyUSART(void)
  2. {
  3.   if(PIR1bits.RCIF)  // If RCIF is set
  4.     return 1;  // Data is available, return TRUE
  5.   return 0;  // Data not available, return FALSE
  6. }
.
Tulajdonképpen ugyanaz mint amit egyébként is használnák csak ezt egyszerűbb begépelni(nesze neked lustaság...).
(#) janish válasza kissi hozzászólására (») Márc 12, 2013 /
 
Azt a linkelt kódot ne vedd szentírásnak, csak gyorsan összecsaptam, meg is látszott a futtatás eredményén.... A javított verziójában már benne vannak a kézi flag törlések meg még pár javítás.
Egyébként én itt találtam meg a konkrét függvényeket:C:\Program Files (x86)\Microchip\mplabc18\v3.41\src\pmc_common
(#) _vl_ válasza janish hozzászólására (») Márc 12, 2013 /
 
Idézet:
„Én úgy tudom, hogy a TXIF csak egy jelzőflag ami az adóregiszter foglaltságát jelzi, de most bogarat ültettél a fülembe.”

Fordítva! Azt jelzi, hogy üres. És ha nem akarsz semmit se küldeni, akkor ugye folyamatosan üres, tehát folyamatosan küldi az interruptot. Ergó le kell tiltani, és csak akkor engedélyezni, amikor van mire várni (foglalt a regiszter ÉS még van küldenivaló), amint a küldésre váró byte-ok száma nullára csökken, megint le kell tiltani.
(#) benjami válasza janish hozzászólására (») Márc 12, 2013 /
 
Annyit még hozzátennék _vl_ mondandójához, hogy ha az adást is megszakításból szeretnéd (ehhez egy circbuffert célszerű alkalmazni), akkor az ISR-ben nem csak TXIF-et, hanem TXIE-t is figyelni kell:
  1. if(PIE1bits.TXIE && PIR1bits.TXIF)...
(#) Hp41C válasza benjami hozzászólására (») Márc 12, 2013 /
 
Lehet én vagyok rettenetesen maradi...
Ez a megoldás:
  1. if ((PIR1 & PIE1 & 0x10))

rövidebb, mint ez:
  1. if(PIE1bits.TXIE && PIR1bits.TXIF)

Az utóbbiban két ugrás van...
Illetve nagyon erőltetik ezt a XXXbits.YYY formát, de sok helyen egyszerűbb, rövidebb lenne más megoldás:
  1. if (RCSTA & 0x06)..

az
  1. if(RCSTAbits.OERR || RCSTAbits.FERR)..

helyett,
avagy a
  1. DCF_Flags.x |= (DCFWaitSyncMask | DCFParityErrorMask | DCFErrorMask);

a
  1. DCF_Flags.DCFWaitSync = 1;
  2. DCF_Flags.DCFParityError = 1;
  3. DCF_Flags.DCFError = 1;

helyett...
A hozzászólás módosítva: Márc 12, 2013
(#) janish válasza _vl_ hozzászólására (») Márc 12, 2013 /
 
Jogos. Igazából pont a TX interrupt az amiről a legkevesebbet találtam, de ha tényleg ugyanolyan a hatása mint a többi interrupt flag-nek akkor azt hiszem megvan az elásott kutya.
Viszont még ez esetben is marad a kérdés, hogy amikor ugyanezt a USART kezelést átraktam az alcsony prioritású megszakításfv.-be akkor miért nem volt hajlandó működni. Lenne valamilyen megkötés a perifériák prioritásszintjére vonatkozóan? De akkor meg nem lenne értelme annak, hogy mi állíthatjuk be a szinteket. Nem értem... Na mindegy... a TXIE-s javaslatodat viszont holnap kipróbálom.
(#) Lüke Aladár hozzászólása Márc 12, 2013 /
 
Üdv.! Egy gyors kérdés: Ha egy PIC-re rá van kötve egy RTC (I2C-n)és egy SD kártya (SPI-n) jó a következő felállás:
-SD kártya: 3.3V
-RTC+PIC: 5V

Működik így is vagy célszerű mindennek 3.3V-os tápot adni?
(#) _vl_ válasza Lüke Aladár hozzászólására (») Márc 12, 2013 /
 
Az SD-kártya nem fogja elviselni, ha 5V-tal megküldi felé a PIC a kimeneteit, az 5V-ról üzemelő PIC bemenete pedig nem biztos, hogy 1-nek veszi, ha csak ~3-3.3V-ot kap.
Szóval én a helyedben biztosan 3.3V-ról üzemeltetném az egészet. Lehet persze mindenféle szintillesztésekkel szórakozni, a kérdés inkább az, hogy van-e értelme, ha mindenki mehetne egy tápról.
Következő: »»   1115 / 1319
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