Continue to Site

Welcome to EDAboard.com

Welcome to our site! EDAboard.com is an international Electronics Discussion Forum focused on EDA software, circuits, schematics, books, theory, papers, asic, pld, 8051, DSP, Network, RF, Analog Design, PCB, Service Manuals... and a whole lot more! To participate you need to register. Registration is free. Click here to register now.

Mikroc + ethernet +pic16f887...

Status
Not open for further replies.

jit_singh_tara

Full Member level 6
Joined
Dec 22, 2006
Messages
325
Helped
9
Reputation
18
Reaction score
4
Trophy points
1,298
Location
Delhi , India
Activity points
4,293
Hello friends ,

I need to build an application where :

I need to access my mcu pins data on/off , adc data on a website which i could access from anywhere .....

So far this is my setup :



What i am doing is that connecting enc28j60 module to my hardware and connecting the lan cable to its connector on one end , other end connected to my router .

Similarly 2nd lan cable connected between my laptop and router .

Using the mikroc compiler to run the example project with mcu changed , i m using pic16f887 .
So far i am just trying to run the example project but it is not connecting .i.e

running on 8Mhz internal oscillator , SPI MODE.

I read the ip address of my laptop connected to router it showed 192.168.1.260 .
I changed the ip address in the c code to this value .

When i tried to open the website using this address it is not connecting .
Another point is that i dnt know what to do with mac address ,how to identify my enc28j60 mac address .

I want to know where am i wrong , or what should i do to work in right direction .
Not much aware about tcp/ip settings , networking etc.....

Please help how to open the webpage connecting to my hardware via enc28j60.


The code is as follows :




Code C - [expand]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
// duplex config flags
#define Spi_Ethernet_HALFDUPLEX     0x00  // half duplex
#define Spi_Ethernet_FULLDUPLEX     0x01  // full duplex
 
 
// mE ehternet NIC pinout
sfr sbit SPI_Ethernet_Rst at RC0_bit;
sfr sbit SPI_Ethernet_CS  at RC1_bit;
sfr sbit SPI_Ethernet_Rst_Direction at TRISC0_bit;
sfr sbit SPI_Ethernet_CS_Direction  at TRISC1_bit;
// end ethernet NIC definitions
 
 
typedef struct
{
  unsigned canCloseTCP: 1;  // flag which closes TCP socket (not relevant to UDP)
  unsigned isBroadcast: 1;  // flag which denotes that the IP package has been received via subnet broadcast address (not used for PIC16 family)
} TEthPktFlags;
 
 
/************************************************************
 * ROM constant strings
 */
const unsigned char httpHeader[] = "HTTP/1.1 200 OK\nContent-type: " ;  // HTTP header
const unsigned char httpMimeTypeHTML[] = "text/html\n\n" ;              // HTML MIME type
const unsigned char httpMimeTypeScript[] = "text/plain\n\n" ;           // TEXT MIME type
unsigned char httpMethod[] = "GET /";
/*
 * web page, splited into 2 parts :
 * when coming short of ROM, fragmented data is handled more efficiently by linker
 *
 * this HTML page calls the boards to get its status, and builds itself with javascript
 */
 //*************************************************************************
 // Change the IP address of the page to be refreshed
 
const char *indexPageHEAD = "<meta http-equiv='refresh' content='10;url=http://192.168.1.260/'>\
<HTML><HEAD></HEAD><BODY>\
<h1>PIC 16F887 (8MHz) + ENC28J60 Mini Web Server,<p>avec MikroC PRO v5.6.1</h1>\
<p><a href="http://olivier.fournet.free.fr/e.html">NOTICE</a><p>\
<p><a href=/>Reload</a><p>\
<script src=/s></script>";
 
 
const char *indexPageBODY =  "<table><tr><td valign=top><table border=1 style='font-size:20px; font-family: terminal;'>\
<tr><th colspan=2>ADC</th></tr>\
<tr><td>AN2</td><td><script>document.write(AN2);</script></td></tr>\
<tr><td>AN3</td><td><script>document.write(AN3);</script></td></tr>\
</table></td><td><table border=1 style='font-size:20px; font-family: terminal;'>\
<tr><th colspan=2>PORTB (IN) : <script>document.write(PORTB);</script></th></tr>\
<script>\
var str,i;\
str='';\
for(i=0;i<8;i++)\
{\
str+='<tr><td bgcolor=#cccccc>BUTTON #'+i+'</td>';\
if(PORTB&(1<<i))\
{str+='<td bgcolor=green>ON';}\
else\
{str+='<td bgcolor=red>OFF';}\
str+='</td></tr>';}\
document.write(str);\
</script>";
 
 
const char *indexPageBODY2 =  "</table></td><td>\
<table border=1 style='font-size:20px; font-family: terminal;'>\
<tr><th colspan=3>PORTD (OUT) : <script>document.write(PORTD);</script></th></tr>\
<script>\
var str,i;\
str='';\
for(i=0;i<8;i++)\
{\
str+='<tr><td bgcolor=#cccccc>LED #'+i+'</td>';\
if(PORTD&(1<<i))\
{\
str+='<td bgcolor=yellow>ON';\
}\
else\
{\
str+='<td bgcolor=#999999>OFF';\
}\
str+='</td></tr>';}\
document.write(str);\
</script>\
</table></td></tr></table>\
<p>This is HTTP request #<script>document.write(REQ)</script><p>\
</BODY></HTML>";
 
 
//*************************************************************************
 
 
 
 
/***********************************
 * RAM variables
 */
unsigned char   myMacAddr[6] = {0x00, 0x14, 0xA5, 0x76, 0x19, 0x3f};   // my MAC address
unsigned char   myIpAddr[4]  = {192,168,1,260};                     // my IP address
unsigned char   getRequest[15];                                        // HTTP request buffer
unsigned char   get_Request, digit_getRequest, etat_interrupteur;
unsigned char   dyna[30];                                              // buffer for dynamic response
unsigned long   httpCounter = 0;                                       // counter of HTTP requests
 
 
/*******************************************
 * functions
 */
 
 
/*
 * put the constant string pointed to by s to the ENC transmit buffer.
 */
/*unsigned int    putConstString(const char *s)
        {
        unsigned int ctr = 0 ;
 
 
        while(*s)
                {
                Spi_Ethernet_putByte(*s++) ;
                ctr++ ;
                }
        return(ctr) ;
        }*/
/*
 * it will be much faster to use library Spi_Ethernet_putConstString routine
 * instead of putConstString routine above. However, the code will be a little
 * bit bigger. User should choose between size and speed and pick the implementation that
 * suites him best. If you choose to go with the putConstString definition above
 * the #define line below should be commented out.
 *
 */
#define putConstString  SPI_Ethernet_putConstString
 
 
/*
 * put the string pointed to by s to the ENC transmit buffer
 */
/*unsigned int    putString(char *s)
        {
        unsigned int ctr = 0 ;
 
 
        while(*s)
                {
                Spi_Ethernet_putByte(*s++) ;
 
 
                ctr++ ;
                }
        return(ctr) ;
        }*/
/*
 * it will be much faster to use library Spi_Ethernet_putString routine
 * instead of putString routine above. However, the code will be a little
 * bit bigger. User should choose between size and speed and pick the implementation that
 * suites him best. If you choose to go with the putString definition above
 * the #define line below should be commented out.
 *
 */
#define putString  SPI_Ethernet_putString
 
 
/*
 * this function is called by the library
 * the user accesses to the HTTP request by successive calls to Spi_Ethernet_getByte()
 * the user puts data in the transmit buffer by successive calls to Spi_Ethernet_putByte()
 * the function must return the length in bytes of the HTTP reply, or 0 if nothing to transmit
 *
 * if you don't need to reply to HTTP requests,
 * just define this function with a return(0) as single statement
 *
 */
unsigned int  SPI_Ethernet_UserTCP(unsigned char *remoteHost, unsigned int remotePort,
                               unsigned int localPort, unsigned int reqLength, TEthPktFlags *flags)
{
  unsigned int    len = 0 ;                   // my reply length
  unsigned int    i ;                         // general purpose integer
 
 
  // should we close tcp socket after response is sent?
  // library closes tcp socket by default if canClose flag is not reset here
  // flags->canClose = 0; // 0 - do not close socket
                          // otherwise - close socket
 
 
  if(localPort != 80)
  {                        // I listen only to web request on port 80
    return(0) ;
  }
 
 
  // get 10 first bytes only of the request, the rest does not matter here
  for(i = 0 ; i < 10 ; i++)
  {
    getRequest[i] = SPI_Ethernet_getByte() ;
  }
  
  getRequest[i] = 0 ;
 
 
  if(memcmp(getRequest, httpMethod, 5))
  {      // only GET method is supported here
    return(0) ;
  }
 
 
  httpCounter++ ;   // one more request done
  
  get_Request = getRequest[5];  // s , d
  
  if(get_Request == 's')  // utiliser pour <script src=/s></script>
  {
    // if request path name starts with s, store dynamic data in transmit buffer
    // the text string replied by this request can be interpreted as javascript statements
    // by browsers
    len = putConstString(httpHeader);     // HTTP header
    len += putConstString(httpMimeTypeScript); // with text MIME type
 
 
    // add AN2 value to reply
    IntToStr(ADC_Read(2), dyna);
    len += putConstString("var AN2=");
    len += putString(dyna);
    len += putConstString(";");
 
 
    // add AN3 value to reply
    IntToStr(ADC_Read(3), dyna);
    len += putConstString("var AN3=");
    len += putString(dyna);
    len += putConstString(";");
 
 
    // add PORTB value (buttons) to reply
    len += putConstString("var PORTB=");
    IntToStr(PORTB, dyna);
    len += putString(dyna);
    len += putConstString(";");
 
 
    // add PORTD value (LEDs) to reply
    len += putConstString("var PORTD=");
    IntToStr(PORTD, dyna);
    len += putString(dyna);
    len += putConstString(";");
 
 
    // add HTTP requests counter to reply
    IntToStr(httpCounter, dyna);
    len += putConstString("var REQ=");
    len += putString(dyna);
    len += putConstString(";");
  }
  else
  {
   //
   if(get_Request == 'd') // Commande PORTD
   {
    if( isdigit(getRequest[6]) )
    {
     digit_getRequest  = getRequest[6] - '0'; // numéro de port 0 à 7
    
     if( getRequest[7] == 'o' )  // Contact Ouvert (OFF)
      etat_interrupteur = 0;
 
 
     if( getRequest[7] == 'f' )  // Contact Fermer (ON)
      etat_interrupteur = 1;
 
 
     switch(digit_getRequest)
     {
       case 0: PORTD.B0 = etat_interrupteur; break;
       case 1: PORTD.B1 = etat_interrupteur; break;
       case 2: PORTD.B2 = etat_interrupteur; break;
       case 3: PORTD.B3 = etat_interrupteur; break;
       case 4: PORTD.B4 = etat_interrupteur; break;
       case 5: PORTD.B5 = etat_interrupteur; break;
       case 6: PORTD.B6 = etat_interrupteur; break;
       case 7: PORTD.B7 = etat_interrupteur; break;
     }
    }
   }
   //
  }
  
  if(len == 0)
  {           // what do to by default
    len =  putConstString(httpHeader);       // HTTP header
    len += putConstString(httpMimeTypeHTML); // with HTML MIME type
    len += putConstString(indexPageHEAD);    // HTML page first part
    len += putConstString(indexPageBODY);    // HTML page second part
    len += putConstString(indexPageBODY2);   // HTML page second part
  }
 
 
  return(len) ;                               // return to the library with the number of bytes to transmit
}
 
 
/*
 * this function is called by the library
 * the user accesses to the UDP request by successive calls to Spi_Ethernet_getByte()
 * the user puts data in the transmit buffer by successive calls to Spi_Ethernet_putByte()
 * the function must return the length in bytes of the UDP reply, or 0 if nothing to transmit
 *
 * if you don't need to reply to UDP requests,
 * just define this function with a return(0) as single statement
 *
 */
unsigned int  SPI_Ethernet_UserUDP(unsigned char *remoteHost, unsigned int remotePort,
                                   unsigned int destPort, unsigned int reqLength, TEthPktFlags *flags)
{
   return 0;              // back to the library with the length of the UDP reply
}
 
 
/*
 * main entry
 */
void main()
{
  //ANSEL = 0x0C ;          // AN2 and AN3 convertors will be used
  //C1ON_bit = 0;           // Disable comparators
  //C2ON_bit = 0;
  PORTA = 0 ;
  TRISA = 0xff ;          // set PORTA as input for ADC
 
 
  //ANSELH = 0;             // Configure other AN pins as digital I/O
  PORTB = 0 ;
  TRISB = 0xff ;          // set PORTB as input for buttons
 
 
  PORTD = 0 ;
  TRISD = 0 ;             // set PORTD as output
 
 
 
 
  OSCCON =0b01110001;delay_ms(100);
  
  OPTION_REG = 0b10000000;
  INTCON.GIE = 1;
  INTCON.INTE = 1;
  
  
  
 
 
  /*
   * starts ENC28J60 with :
   * reset bit on RC0
   * CS bit on RC1
   * my MAC & IP address
   * full duplex
   */
  SPI1_Init();
  SPI_Ethernet_Init(myMacAddr, myIpAddr, Spi_Ethernet_FULLDUPLEX) ;
 
 
  while(1)
  {                            // do forever
    /*
     * if necessary, test the return value to get error code
     */
    SPI_Ethernet_doPacket() ;   // process incoming Ethernet packets
 
 
    /*
     * add your stuff here if needed
     * Spi_Ethernet_doPacket() must be called as often as possible
     * otherwise packets could be lost
     */
  }
}

 
Last edited by a moderator:

mac and ip are unique you cant just assign your laptop ip to it. change it to 192.168.1.xxx .where xxx could be anywhere between 0 to 255 but not the same as your laptop or other devices connected to net. second read the datasheet of enc28j60 or just assign the unique mac address to it.
Note: use pic18 or higher series not 16. also check mikroc help for it.

Regards.
Maliks
 
I changed the ip address in my program to 192.168.1.124 , then i tried to open the same address on web browser but it couldnt connect , this is what i got :



I am not able to get the web browser communicate via enc28j60 to my microcontroller

- - - Updated - - -

Got it working........



But this is working when both my hardware and laptop are connected to same router.....
What if i have to connect it to some other computer , i.e some other location ?
How do we proceed it such a case........
 

Then you have to enable port 80 i believe. search and you will find lots of info about it.

Regards
Maliks
 

Some times require static IP
or IP redirecting facilities
 

Status
Not open for further replies.

Similar threads

Part and Inventory Search

Welcome to EDABoard.com

Sponsor

Back
Top