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   652 / 1210
(#) don_peter válasza matheattila hozzászólására (») Márc 28, 2015 /
 
Mi van akkor, ha valami megszakításban olvasol?
Akkor az olvasás addig tart ameddig tart és minden csak ezután jöhet.
Vagy ilyen lehetőség nem játszik?

Bár nem egészen értem a problémád, de hátha valami segít vagy rávezet a megoldásra:
SPI sebességének növelése.
MCU sebességének növelése.
LED driver más egyéb kommunikációs csatorna, ha lehetséges. (írásnál szokott ilyen lenni, olvasásnál kevésbé)
(#) matheattila válasza Bell hozzászólására (») Márc 28, 2015 /
 
A LED driverben sok regiszter van, ezekből csak vagy 2-3 van ami változhat menet közben, mert azokban állapotjelző flag-ek vannak, így azokon keresztül tud problémákat jelezni a mikrovezérlőnek (persze ha a mikrovezérlő ki is olvassa belőle). Ezért is alkalmaztam jelenleg ezt a módszert, de a legkorrektebb az lenne ha minen módosításnál kiolvasnám, változtatnám az egyes biteket majd visszaírnám.
(#) matheattila válasza don_peter hozzászólására (») Márc 28, 2015 /
 
Ha csak olyan egyszerű lenne a probléma, hogy egy sima megszakításban lekezelném akkor nem tettem volna fel a kérdést...
Az a gond, hogy operációs rendszer fut a mikrovezérlőn, amikben különböző task-ok vannak, amelyeket bizonyos időközönként meghív az op rendszer, egyiket pl 1ms-onként, másikat 10ms harmadikat 25ms. A teljes program rengeteg modulból áll amik flag-eken keresztül kommunikálnak egymással. Az a rész ahol adatokat kellene küldjek és fogadjak (a LED drivernek) a 25ms-os container-ben van és abban tudom meghívni az SPI függvényeket, amik egy másik modulban vannak, nem tudom milyen módon vannak megírva, de azok amúgyse módosíthatóak, annyit tudok, hogy kb 2ms után állít be egy flag-et és azzal jelzi, hogy kiküldte vagy beolvasta az adatot.
Így én ha kiküldök a 25ms-os függvényemből egy bájtot akkor annak a továbbításáról csak 2ms múlva szerzek tudomást, ezért küldésnél csak 25ms-onként tudok küldeni egy-egy adatot. Olvasásnál is ugyanez lenne a helyzet, azaz kiküldeném az olvasni kívánt regiszter címét, majd 25ms múlva meghívhatom az olvasó függvényt, hogy olvassa ki nekem az adatokat, amit megint csak 2ms múlva kapok meg, de addig nem várakozhatok ott annyit, mert a 25ms-os függvényem teljes lefutási ideje le van korlátozva az op rendszer miatt és csak úgy egy while-t nem tehetek be, hogy várja meg a flag-et...
Így ha az olvasást követő parancs az lenne hogy az olvasás eredményét módosítsa és küldje vissza akkor nem tehetek semmit, mert még nincs adat amit módosítani kellene. Emiatt kérdeztem, hogy ha még valakinek volt hasonló problémája akkor mi a teendő, jelenleg csak a küldést használom, egy segédváltozóval (egyfajta Latch-ként használom) és működik is jól, remélem a későbbiekben nem kérik az olvasást is
Amúgy a mikrovezérlő 24MHz-en fut az SPI meg 600kHz-en. A LED driver csak SPI-on tud kommunikálni, de ezen változtatni már nem lehet, mert a hardver már készen le van gyártva, már csak a szoft kell rá.
(#) lastewer hozzászólása Márc 28, 2015 /
 
Sziasztok!

Tudna valaki egy kis segítséget adni MM74C32N bekötéséhez? Konkrétan Ehhez szeretném szintillesztésként használni.
(#) Bell válasza lastewer hozzászólására (») Márc 28, 2015 /
 
Ez nem tűnik szintillesztőnek.
Bővebben: Link
(#) lastewer válasza Bell hozzászólására (») Márc 28, 2015 /
 
Megnéztem én is , igen , nekem is volt egy gyanúm rá hogy ez nem lesz jó. Köszi.
(#) Bell válasza lastewer hozzászólására (») Márc 28, 2015 /
 
Én nemrég 74LVC07A -t használtam ilyesmihez.
(#) lastewer válasza Bell hozzászólására (») Márc 28, 2015 /
 
Köszi. Lenne egy kérdésem. Egy ledet kapcsolok ki - be és szeretném lekérdezni az állapotát , hogy éppen be van e kapcsolva vagy nincs.

Ezt hogy lehet? Mert
  1. PORTB.F0 = 1;
-el bekapcsolom , de lekérdezni meg így próbáltam :

  1. if(PORTB.F0 == 1) { //led bekapcsolva}
, de nem jó.
A hozzászólás módosítva: Márc 28, 2015
(#) nedudgi válasza lastewer hozzászólására (») Márc 28, 2015 /
 
Használj egy változót a PORTB árnyékaként. Annak a bitjeit állítsad, majd küldd ki a portra az egész bájtot.
Beolvasáskor a PORTB a PIC lábának állapotát adja vissza. A LED ottléte eltolja a szinteket, ezért nem kapsz jó eredményt.
(#) cross51 válasza lastewer hozzászólására (») Márc 28, 2015 /
 
Milyen PIC-et használsz nem muszáj árnyék változót létrehozni, ha van LAT regiszter is (ha jól tudom az is egy árnyék regiszternek számít) a PIC18-nál(az újabb 16F nél is) a LAT vissza van kötve a kimeneti LATCH-ról és ha azt figyeled és abba írod a kimeneti állapotot akkor működnie kell.
(#) lastewer válasza cross51 hozzászólására (») Márc 28, 2015 /
 
Pic16f877A-t , köszönöm.
(#) cross51 válasza lastewer hozzászólására (») Márc 28, 2015 /
 
Ennél a PIC-nél nincs LAT marad az árnyék változó vagy esetleg ha analóg port kapcsold ki az analóg bemenetet(ANSEL:ANSELH) és úgy próbáld meg(de ebben nem vagyok biztos én mindig LAT-al figyeltem).
(#) lastewer válasza cross51 hozzászólására (») Márc 28, 2015 /
 
Hogy lehet árnyék változót készíteni ? Az az define lenne ? Nem találok semmit a googleban
(#) nedudgi válasza lastewer hozzászólására (») Márc 28, 2015 /
 
Egy változót csak tudsz deklarálni? Az árnyék jelzőt csak a könnyebb érthetőség kedvéért használtuk.
(#) kissi válasza lastewer hozzászólására (») Márc 28, 2015 /
 
Ha figyelemmel kísérnéd a fórumot, akkor tudnád:
Bővebben: Link
(#) lastewer válasza nedudgi hozzászólására (») Márc 28, 2015 /
 
Igen ,pl. unsigned int test = 0 ;


Köszi.
(#) lastewer válasza lastewer hozzászólására (») Márc 28, 2015 /
 
Aha , nem tudok
(#) lastewer válasza nedudgi hozzászólására (») Márc 28, 2015 /
 
  1. unsigned char led = PORTB.F0;


Most így elvileg megkapnám a led változóban , nem ?
(#) cross51 válasza lastewer hozzászólására (») Márc 28, 2015 /
 
Vagy így:
  1. unsigned char LATB = 0x01
  2. PORTB  = LATB
  3. if((LATB & 0x01) == 1)
  4. {...}

A LATB a LED valtózónak megfelelő.
A hozzászólás módosítva: Márc 28, 2015
(#) lastewer válasza cross51 hozzászólására (») Márc 29, 2015 /
 
Erre is hibát dob :

Idézet:
„29 401 ; expected, but '=' found example.c”

Idézet:
„29 392 'PORTB' Identifier redefined example.c”


MikroC a fordítóm egyébként.
A hozzászólás módosítva: Márc 29, 2015
(#) nedudgi válasza cross51 hozzászólására (») Márc 29, 2015 /
 
Egy utasítást nem a ';' karakternek kéne lezárni?
(#) cross51 válasza nedudgi hozzászólására (») Márc 29, 2015 /
 
De igazad van telefonról írtam és elfelejtettem.
(#) killbill válasza nedudgi hozzászólására (») Márc 29, 2015 /
 
Megis hogyan kepes egy LED eltolni annyira a szintet, hogy nem jo erteket olvas be? Ha nem totem-pole a kimenet (mondjuk nyitott kollektoros), akkor vilagos. Vagy, ha nincs elotet ellenallas a LED-del sorban, de akkor elobb azt a problemat kell megszuntetni.
(#) nedudgi válasza killbill hozzászólására (») Márc 29, 2015 /
 
Igazad van, úgy kellett volna írni, hogy eltolhatja a szinteket.
A hozzászólás módosítva: Márc 29, 2015
(#) kt hozzászólása Márc 29, 2015 /
 
Sziasztok.
Szerintetek ezt a pickit2 clont érdemes megvenni?
Bővebben: Link
A hozzászólás módosítva: Márc 29, 2015
(#) kt válasza kt hozzászólására (») Márc 29, 2015 /
 
Ez a programozó az előbb rosszul linkeltem be.
(#) Pali79 válasza kt hozzászólására (») Márc 29, 2015 /
 
Ennyiért otthon is kapsz talán még eredetit is.
(#) lastewer válasza killbill hozzászólására (») Márc 29, 2015 /
 
Szia!

2K előtét ellenállás van a leden és így sem mutatja azt , hogy bekapcsolva lenne ( Mindig az else ág teljesül tehát Kikapcsolva).

Bemásolom a teljes forrást (59. sorban van az első vizsgálat, 143.ban pedig a második)
  1. // duplex config flags
  2. #define Spi_Ethernet_HALFDUPLEX     0x00  // half duplex
  3. #define Spi_Ethernet_FULLDUPLEX     0x01  // full duplex
  4.  
  5. // mE ehternet NIC pinout
  6. sfr sbit SPI_Ethernet_Rst at RC0_bit;
  7. sfr sbit SPI_Ethernet_CS  at RC1_bit;
  8. sfr sbit SPI_Ethernet_Rst_Direction at TRISC0_bit;
  9. sfr sbit SPI_Ethernet_CS_Direction  at TRISC1_bit;
  10. // end ethernet NIC definitions
  11.  
  12. typedef struct
  13. {
  14.   unsigned canCloseTCP: 1;  // flag which closes TCP socket (not relevant to UDP)
  15.   unsigned isBroadcast: 1;  // flag which denotes that the IP package has been received via subnet broadcast address (not used for PIC16 family)
  16. } TEthPktFlags;
  17.  
  18. /************************************************************
  19.  * ROM constant strings
  20.  */
  21. const unsigned char httpHeader[] = "HTTP/1.1 200 OK\nContent-type: " ;  // HTTP header
  22. const unsigned char httpMimeTypeHTML[] = "text/html\n\n" ;              // HTML MIME type
  23. const unsigned char httpMimeTypeScript[] = "text/plain\n\n" ;           // TEXT MIME type
  24. unsigned char httpMethod[] = "GET /";
  25.  
  26.  
  27.  
  28.  
  29.  
  30.  
  31.  
  32. /*
  33.  * web page, splited into 2 parts :
  34.  * when coming short of ROM, fragmented data is handled more efficiently by linker
  35.  *
  36.  * this HTML page calls the boards to get its status, and builds itself with javascript
  37.  */
  38.  //*************************************************************************
  39.  // Change the IP address of the page to be refreshed
  40.  
  41. const char *indexPageHEAD = "<meta http-equiv='refresh' content='10;url=http://192.168.0.170/'>\
  42. <HTML><HEAD></HEAD><BODY>\
  43. <h1>Teszt mikrovezérlo<p>avec MikroC PRO v5.6.1</h1>\
  44. <p><a href=\"http://192.168.0.170/b\">Led be</a> - <a href=\"http://192.168.0.170/k\">Led ki</a><p>\
  45. <p><a href=/>Frissít</a><p>\
  46. <script src=/s></script>";
  47.  
  48. const char *indexPageBODY =  "<form name='input' method='get'><input type='text' name='parancs' /> <br/><input type='submit' name='be' value='Mehet'/></form>";
  49.  
  50. const char *indexPageBODY2 =  "</table></td><td>\
  51. <table border=1 style='font-size:20px; font-family: terminal;'>\
  52. <tr><th colspan=3>PORTD (OUT) : <script>document.write(ss);</script></th></tr>\
  53. <script>\
  54. var str,i;\
  55. str='';\
  56. for(i=0;i<8;i++)\
  57. {\
  58. str+='<tr><td bgcolor=#cccccc>LED #'+i+'</td>';\
  59. if(PORTB.F0 == 0)\
  60. {\
  61. str+='<td bgcolor=green>Bekapcsolva';\
  62. }\
  63. else\
  64. {\
  65. str+='<td bgcolor=#999999>Kikapcsolva';\
  66. }\
  67. str+='</td></tr>';}\
  68. document.write(str);\
  69. </script>\
  70. </table></td></tr></table>\
  71. <p>This is HTTP request #<script>document.write(REQ)</script><p>\
  72. </BODY></HTML>";
  73.  
  74. //*************************************************************************
  75.  
  76.  
  77. /***********************************
  78.  * RAM variables
  79.  */
  80. unsigned char   myMacAddr[6] = {0x00, 0x14, 0xA5, 0x76, 0x19, 0x3f};   // my MAC address
  81. unsigned char   myIpAddr[4]  = {192, 168, 0, 170};                     // my IP address
  82. unsigned char   getRequest[15];                                        // HTTP request buffer
  83. unsigned char   get_Request, digit_getRequest, etat_interrupteur;
  84. unsigned char   dyna[30];                                              // buffer for dynamic response
  85. unsigned long   httpCounter = 0;                                       // counter of HTTP requests
  86.  
  87.  
  88. #define putConstString  SPI_Ethernet_putConstString
  89. #define putString  SPI_Ethernet_putString
  90.  
  91. unsigned int  SPI_Ethernet_UserTCP(unsigned char *remoteHost, unsigned int remotePort,
  92.                                unsigned int localPort, unsigned int reqLength, TEthPktFlags *flags)
  93. {
  94.   unsigned int    len = 0 ;                   // my reply length
  95.   unsigned int    i ;                         // general purpose integer
  96.  
  97.   // should we close tcp socket after response is sent?
  98.   // library closes tcp socket by default if canClose flag is not reset here
  99.   // flags->canClose = 0; // 0 - do not close socket
  100.                           // otherwise - close socket
  101.  
  102.   if(localPort != 80)
  103.   {                        // I listen only to web request on port 80
  104.     return(0) ;
  105.   }
  106.  
  107.   // get 10 first bytes only of the request, the rest does not matter here
  108.   for(i = 0 ; i < 10 ; i++)
  109.   {
  110.     getRequest[i] = SPI_Ethernet_getByte() ;
  111.   }
  112.  
  113.   getRequest[i] = 0 ;
  114.  
  115.   if(memcmp(getRequest, httpMethod, 5))
  116.   {      // only GET method is supported here
  117.     return(0) ;
  118.   }
  119.  
  120.   httpCounter++ ;   // one more request done
  121.  
  122.   get_Request = getRequest[5];  // s , d
  123.  
  124.   if(get_Request == 'b')
  125.   {
  126.     len = putConstString(httpHeader);     // HTTP header
  127.     len += putConstString(httpMimeTypeHTML); // with text MIME type
  128.     PORTB.F0 = 1;
  129.     len += putConstString(indexPageHEAD);    // HTML page first part
  130.     len += putConstString(indexPageBODY);    // HTML page second part
  131.     len += putConstString(indexPageBODY2);   // HTML page second part
  132.  
  133.   }
  134.  
  135.   if(get_Request == 'k')
  136.   {
  137.     len = putConstString(httpHeader);     // HTTP header
  138.     len += putConstString(httpMimeTypeHTML); // with text MIME type
  139.     PORTB.F0 = 0;
  140.     len += putConstString(indexPageHEAD);    // HTML page first part
  141.     len += putConstString(indexPageBODY);    // HTML page second part
  142.     len += putConstString(indexPageBODY2);   // HTML page second part
  143.      if(PORTB.F0 == '0')   { PORTB.F7 = 1; }
  144.   }
  145.        
  146.   if(get_Request == 's')  // utiliser pour <script src=/s></script>
  147.   {
  148.     // if request path name starts with s, store dynamic data in transmit buffer
  149.     // the text string replied by this request can be interpreted as javascript statements
  150.     // by browsers
  151.     len = putConstString(httpHeader);     // HTTP header
  152.     len += putConstString(httpMimeTypeScript); // with text MIME type
  153.  
  154.     // add AN2 value to reply
  155.     IntToStr(ADC_Read(2), dyna);
  156.     len += putConstString("var AN2=");
  157.     len += putString(dyna);
  158.     len += putConstString(";");
  159.  
  160.     // add AN3 value to reply
  161.     IntToStr(ADC_Read(3), dyna);
  162.     len += putConstString("var AN3=");
  163.     len += putString(dyna);
  164.     len += putConstString(";");
  165.  
  166.     // add PORTB value (buttons) to reply
  167.     len += putConstString("var PORTB=");
  168.     IntToStr(PORTB, dyna);
  169.     len += putString(dyna);
  170.     len += putConstString(";");
  171.  
  172.     // add PORTD value (LEDs) to reply
  173.     len += putConstString("var PORTD=");
  174.     IntToStr(PORTD, dyna);
  175.     len += putString(dyna);
  176.     len += putConstString(";");
  177.  
  178.     // add HTTP requests counter to reply
  179.     IntToStr(httpCounter, dyna);
  180.     len += putConstString("var REQ=");
  181.     len += putString(dyna);
  182.     len += putConstString(";");
  183.   }
  184.  
  185.  
  186.   if(len == 0)
  187.   {  
  188.  
  189.           // what do to by default
  190.     len =  putConstString(httpHeader);       // HTTP header
  191.     len += putConstString(httpMimeTypeHTML); // with HTML MIME type
  192.     len += putConstString(indexPageHEAD);    // HTML page first part
  193.     len += putConstString(indexPageBODY);    // HTML page second part
  194.     len += putConstString(indexPageBODY2);   // HTML page second part
  195.   }
  196.  
  197.   return(len) ;                               // return to the library with the number of bytes to transmit
  198. }
  199.  
  200.  
  201.  
  202.  
  203.  
  204.  
  205.  
  206. unsigned int  SPI_Ethernet_UserUDP(unsigned char *remoteHost, unsigned int remotePort,
  207.                                    unsigned int destPort, unsigned int reqLength, TEthPktFlags *flags)
  208. {
  209.    return 0;              // back to the library with the length of the UDP reply
  210. }
  211.  
  212. /*
  213.  * main entry
  214.  */
  215. void main()
  216. {
  217.  
  218.   PORTA = 0 ;
  219.   TRISA = 0xff ;          // set PORTA as input for ADC
  220.  
  221.   PORTB = 0 ;
  222.   TRISB = 0xff ;          // set PORTB as input for buttons
  223.  
  224.   PORTD = 0 ;
  225.   TRISD = 0 ;             // set PORTD as output
  226.  
  227.   TRISB0_bit = 0;         // B port láb kimenetre állítva
  228.  
  229.  
  230.   /*
  231.    * starts ENC28J60 with :
  232.    * reset bit on RC0
  233.    * CS bit on RC1
  234.    * my MAC & IP address
  235.    * full duplex
  236.    */
  237.   SPI1_Init();
  238.   SPI_Ethernet_Init(myMacAddr, myIpAddr, Spi_Ethernet_FULLDUPLEX) ;
  239.  
  240.   while(1)
  241.   {                            // do forever
  242.     SPI_Ethernet_doPacket() ;   // process incoming Ethernet packets
  243.   }
  244. }


Valakinek ötlet esetleg?
A hozzászólás módosítva: Márc 29, 2015
(#) killbill válasza lastewer hozzászólására (») Márc 29, 2015 /
 
Az elso if az 59. sorban az ugye nem 'C' kod, nem szolok hozza, nem tudom, hogy a bongeszodben futo Script mit tud a PIC port allapotarol. Azt latom, hogy a dinamikusan generalt szovegben elofordul a PORTB=nn; resz, ahol nn a PORTB erteke decimalisan, de hogy a PORTB.F0 mit jelent a javascriptnek, azt nem tudom.

A masodik (143. sor) már 'C' kod, de egy 1 bites bitfield erteke sosem lesz 48. Felteve, hogy a PORTB.F0 az egy egybites bitfield. Namost a 48 meg onnan jon, hogy a '0' az a nulla karakter ASCII kodja, ami 48.
(#) don_peter válasza killbill hozzászólására (») Márc 29, 2015 /
 
Az "if(PORTB.F0 == 0)\"{\ az nem javascript, hanem a főprogram része. (kellene, hogy legyen, hogy működjön is)
Oda kellene valami még mert ezt így nem fogja értelmezni sem a fordító sem pedig a HTML.
Ott be kellene zárni a HTML tagot majd a főprogram vagy is az if() feltétel után ismét folytatni a HTML tagot.
Annak az if() feltételnek az lenne az eredménye, hogy színezze és a feltétel teljesülése eredményének fényébe a "Bekapcsolva" avagy a "Kikapcsolva" feliratot jelenítené meg a HTML oldal.

A 143. sor pedig nem szám értéknek kellene lennie? (decimális, bináris vagy hexa)
Az biztos jó lehet, hogy ASCII ellenőrzi port tartamát?
Szerintem az ott ilyennek kellene lennie: (Nem biztos csak tipp)
  1. if(PORTB.F0 == 0)
A hozzászólás módosítva: Márc 29, 2015
Következő: »»   652 / 1210
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