Here you can find a step-by-step tutorial about the Bascom-AVR code to drive an AVR
and an WIZ810MJ Ethernet controller.

DHCP and this time on a Arduino Ethernetshield

 

New on the long and short board:
UDP-switch that can be controlled by a iPhone app
UDP_remote

 

New on the Red Bokito:
Email-switcher with confirmation-mail

There is now also a version running on the Wiz812MJ

This tutorial is based on my own hardware

Step 1. Getting the hardware...

You can cut and paste all green parts of the next text and place it into the Bascom-AVR IDE.

This is the small sandwichboard.
There must be about 200 running at the moment.


 

 

The long board, module, relays, RS232, all on one single PCB

Here the board on the Embedded Systems Conference in San Jose

The long bare PCBs

The small board with the separate relay and RS232 board. 

In this tutorial I use both, the long and the small board.

Here the schematics:

and here another part


The Atmega168 microcontroller that is used on the above board has some fuse bits. Care should be taken while programming these fuse bits.

First, start with a small description what you are planning to do with date and/or version-number.

'-----------------------------------------------------------
' Atmega168 and WIZ810MJ
'-----------------------------------------------------------
' Version 1.0 - July 2008

Make a small note what you did with the fuse bits of the microcontroller
For this program the following fuse bits should be set:

 

$crystal = 8000000
$regfile = "M168def.dat"

$hwstack = 64
$swstack = 64
$framesize = 64
 

$crystal is used to give the MHz or Megacycles you are using. 
$regfile is used to have Bascom-AVR use the right registers for the right microcontroller. In this case we are using a Atmega168.
 

Step 2: Preparing the SPI-port and Chip-select-pin

The next piece of code is to configure two output pins.

On the long board reset of the WIZ810MJ is PORTC.0
On the sandwich board reset of the WIZ810MJ is PORTD.3

And the relays are on different pins

Long board:

Relais 1 on PORTC.1
Relais 2 on PORTC.2
Relais 3 on PORTC.3
Relais 4 on PORTC.4

Sandwichboard:

Relais 1 on PORTD.4
Relais 2 on PORTD.5
Relais 3 on PORTD.6
Relais 4 on PORTD.7

To make your code a bit more readable, you can use aliases. To create one code for both boards you can use #IF #ENDIF combinations.

' 0 = long board
' 1 = sandwichboard

Const Board = 1

'Used Wiz5100 ports and pins
Wiz5100_cs Alias Portb.2                                             'Chipselect WIZ810MJ

#if Board                                                                          'sandwichboard
Wiz5100_res Alias Portd.3                                           'reset of WIZ810MJ
'Other used ports and pins
Relais1 Alias Portd.4
Relais2 Alias Portd.5
Relais3 Alias Portd.6
Relais4 Alias Portd.7
#elseif
Wiz5100_res Alias Portc.0                                            'long board
Relais1 Alias Portc.1
Relais2 Alias Portc.2
Relais3 Alias Portc.3
Relais4 Alias Portc.4
#endif

Configure them as output

'Used ports and pins
Config Wiz5100_cs = Output
Config Wiz5100_res = Output

The WIZ810MJ is a stand-alone Ethernet controller with an industry standard Serial Peripheral Interface (SPI). It is designed to serve as an Ethernet network interface for any controller equipped with SPI. With a single Config SPI command Bascom-AVR configures the complete SPI-bus. See the Help for Bascom-AVR for every single parameter of the Config SPI command.

'Configuration of the SPI-bus
Config Spi = Hard , Interrupt = Off , Data Order = Msb , Master = Yes , Polarity = Low , Phase = 0 , Clockrate = 4 , Noss = 0

'init the spi pins
Spiinit

 

This is all you need to communicate with the WIZ810MJ Ethernet module.

Step 3: Believe it or not....

 

1474 bytes!!

1474 bytes, that is all you need to get PING working on the WIZ810MJ-module.

'--------------------------------------------------------------
' Atmega168 and WIZ810MJ All you need to get a PING working
'--------------------------------------------------------------

$regfile = "m168def.dat"
$crystal = 8000000

$hwstack = 64
$swstack = 64
$framesize = 64

'Common registers
'Mode register
Const W5100_mr = &H0000
'Gateway address registers
Const W5100_gar0 = &H0001
Const W5100_gar1 = &H0002
Const W5100_gar2 = &H0003
Const W5100_gar3 = &H0004
'Subnet mask Address registers
Const W5100_subr0 = &H0005
Const W5100_subr1 = &H0006
Const W5100_subr2 = &H0007
Const W5100_subr3 = &H0008
'Source Hardware Address registers
Const W5100_shar0 = &H0009
Const W5100_shar1 = &H000A
Const W5100_shar2 = &H000B
Const W5100_shar3 = &H000C
Const W5100_shar4 = &H000D
Const W5100_shar5 = &H000E
'Source IP Address registers
Const W5100_sipr0 = &H000F
Const W5100_sipr1 = &H0010
Const W5100_sipr2 = &H0011
Const W5100_sipr3 = &H0012

Dim Value As Byte
Dim Adres As Word
Dim Adresl As Byte At Adres Overlay
Dim Adresh As Byte At Adres + 1 Overlay

' 0 = long board
' 1 = sandwichboard

Const Board = 1

'Used Wiz5100 ports and pins
Wiz5100_cs Alias Portb.2                                             'Chipselect WIZ5100

#if Board                                                                          'sandwichboard
Wiz5100_res Alias Portd.3                                           'reset of WIZ810MJ
'Other used ports and pins
Relais1 Alias Portd.4
Relais2 Alias Portd.5
Relais3 Alias Portd.6
Relais4 Alias Portd.7
#elseif
Wiz5100_res Alias Portc.0                                            'long board
Relais1 Alias Portc.1
Relais2 Alias Portc.2
Relais3 Alias Portc.3
Relais4 Alias Portc.4
#endif

'Used ports and pins
Config Wiz5100_cs = Output
Config Wiz5100_res = Output

'Configuration of the SPI-bus
Config Spi = Hard , Interrupt = Off , Data Order = Msb , Master = Yes , Polarity = Low , Phase = 0 , Clockrate = 4 , Noss = 0

'Init the spi pins
Spiinit

'Here we declare the used sub routines
Declare Sub Wiz5100_init
Declare Sub Wiz5100_readvalue(byval Reg As Word)
Declare Sub Wiz5100_writevalue(byval Reg As Word , Byval Value As Byte)
Declare Sub Wiz5100_reset



Dim Wiz5100_opcode_read As Byte
Wiz5100_opcode_read = 15
Dim Wiz5100_opcode_write As Byte
Wiz5100_opcode_write = 240

Call Wiz5100_init                                                    'We initialize the Wiz5100

Do
Loop
End

Sub Wiz5100_init
Call Wiz5100_reset                                                 'Hardware reset
'Register reset
Call Wiz5100_writevalue(W5100_mr , &H80)



'Set gateway IP address
Call Wiz5100_writevalue(W5100_gar0 , 192)
Call Wiz5100_writevalue(W5100_gar1 , 168)
Call Wiz5100_writevalue(W5100_gar2 , 0)
Call Wiz5100_writevalue(W5100_gar3 , 254)


'Set Subnet mask
Call Wiz5100_writevalue(W5100_subr0 , 255)
Call Wiz5100_writevalue(W5100_subr1 , 255)
Call Wiz5100_writevalue(W5100_subr2 , 255)
Call Wiz5100_writevalue(W5100_subr3 , 0)



'Set MAC
Call Wiz5100_writevalue(W5100_shar0 , &H00)
Call Wiz5100_writevalue(W5100_shar1 , &H10)
Call Wiz5100_writevalue(W5100_shar2 , &H20)
Call Wiz5100_writevalue(W5100_shar3 , &H30)
Call Wiz5100_writevalue(W5100_shar4 , &H40)
Call Wiz5100_writevalue(W5100_shar5 , &H50)



'Set own IP address
Call Wiz5100_writevalue(W5100_sipr0 , 192)
Call Wiz5100_writevalue(W5100_sipr1 , 168)
Call Wiz5100_writevalue(W5100_sipr2 , 0)
Call Wiz5100_writevalue(W5100_sipr3 , 73)
End Sub

Sub Wiz5100_readvalue(reg)
Adres = Reg
Reset Wiz5100_cs
Spiout Wiz5100_opcode_read , 1
Spiout Adresh , 1
Spiout Adresl , 1
Spiin Value , 1
Set Wiz5100_cs
End Sub

Sub Wiz5100_writevalue(reg , Value )
Adres = Reg
Reset Wiz5100_cs
Spiout Wiz5100_opcode_write , 1
Spiout Adresh , 1
Spiout Adresl , 1
Spiout Value , 1
Set Wiz5100_cs
End Sub

Sub Wiz5100_reset
Wiz5100_res = 1
Waitms 10
Wiz5100_res = 0
Waitms 30                                                                       'Minimum 20 s
Wiz5100_res = 1
End Sub

We are using the internal clock of the Atmega168. With the CONST we are mapping registers to address locations. Later on we will put all constants in a separate INClude-file.

Start a PING and you will see the reaction of the WIZ810MJ-module. 

 

Include file - W5100.INC....

Have put all registers in an Include file. 

$include "W5100.inc"

 

UDP, a few extra lines:

 

'now open a UDP-socket

'Assign all 8k memory to socket 0 for RX
Call Wiz5100_writevalue(w5100_rmsr , &B00000011)
'Assign all 8k memory to socket 0 for TX
Call Wiz5100_writevalue(w5100_tmsr , &B00000011)

'protocol = UDP
Call Wiz5100_writevalue(w5100_s0_mr , Sn_mr_udp)

Call Wiz5100_writevalue(w5100_s0_port0 , &H13)                                      ' port 5000
Call Wiz5100_writevalue(w5100_s0_port1 , &H88)
'give the open command
Call Wiz5100_writevalue(w5100_s0_cr , Sn_cr_open)
'wait for socket to come online
Do

Print "Value = " ; Value
Call Wiz5100_readvalue(w5100_s0_sr)
Loop Until Value = Sock_udp

Print "value = " ; Value

Call Wiz5100_readvalue(&H6000)
Print "6000" ; " " ; Chr(value) ; " " ; Value

etc.etc

In a terminal you will get this

I have used the Ethernet I/O Control Panel that, with an interval, the UDP string SEND INFORMATION NOW sends. In the above screen in the buffer of the WIZ810MJ on address &H6000 first the IP-address of the sender 192.168.0.226, followed by the destination port 5002 (19 = &H13, 138 = &H8A : &H138A = 5002). Followed by the length of the UDP string (20) and then the UDP-string itself.

The Ethernet I/O Control Panel can be downloaded at www.drftech.com

UDP working, 2206 bytes used.

Here the program so far, and some extra info from the datasheet:

'--------------------------------------------------------------
' Atmega168 and WIZ810MJ  PING and UDP working
'--------------------------------------------------------------

$regfile = "m168def.dat"
$crystal = 8000000

$hwstack = 64
$swstack = 64
$framesize = 64

$include "w5100.inc"

Dim Value As Byte
Dim Adres As Word
Dim Adresl As Byte At Adres Overlay
Dim Adresh As Byte At Adres + 1 Overlay

' 0 = long board
' 1 = sandwichboard

Const Board = 1

'Used Wiz5100 ports and pins
Wiz5100_cs Alias Portb.2 'Chipselect WIZ5100

#if Board                                                                          'sandwichboard
Wiz5100_res Alias Portd.3                                           'reset of WIZ810MJ
'Other used ports and pins
Relais1 Alias Portd.4
Relais2 Alias Portd.5
Relais3 Alias Portd.6
Relais4 Alias Portd.7
#elseif
Wiz5100_res Alias Portc.0                                            'long board
Relais1 Alias Portc.1
Relais2 Alias Portc.2
Relais3 Alias Portc.3
Relais4 Alias Portc.4
#endif

'Used ports and pins
Config Wiz5100_cs = Output
Config Wiz5100_res = Output

'Configuration of the SPI-bus
Config Spi = Hard , Interrupt = Off , Data Order = Msb , Master = Yes , Polarity = Low , Phase = 0 , Clockrate = 4 , Noss = 0

'Init the spi pins
Spiinit

'Here we declare the used sub routines
Declare Sub Wiz5100_init
Declare Sub Wiz5100_readvalue(byval Reg As Word)
Declare Sub Wiz5100_writevalue(byval Reg As Word , Byval Value As Byte)
Declare Sub Wiz5100_reset

Dim Wiz5100_opcode_read As Byte
Wiz5100_opcode_read = 15
Dim Wiz5100_opcode_write As Byte
Wiz5100_opcode_write = 240

Call Wiz5100_init                                                  'We initialize the Wiz5100

'now open a UDP-socket
'Assign all 8k memory to socket 0 for RX
Call Wiz5100_writevalue(w5100_rmsr , &B00000011)
'Assign all 8k memory to socket 0 for TX
Call Wiz5100_writevalue(w5100_tmsr , &B00000011)
'protocol = UDP
Call Wiz5100_writevalue(w5100_s0_mr , Sn_mr_udp)
Call Wiz5100_writevalue(w5100_s0_port0 , &H13) ' port 5000
Call Wiz5100_writevalue(w5100_s0_port1 , &H88)
'give the open command
Call Wiz5100_writevalue(w5100_s0_cr , Sn_cr_open)
'wait for socket to come online
Do
'test
Print "Value = " ; Value
Call Wiz5100_readvalue(w5100_s0_sr)
Loop Until Value = Sock_udp
Print "value = " ; Value


Do
For X = &H6000 To &H601C
Call Wiz5100_readvalue(x)
Print hex(X) ; " " ; Chr(value) ; " " ; Value
Next X

Here you can get the size of the UDP-packet just received


'Socket 0 RX Received Size
Call Wiz5100_readvalue(w5100_s0_rx_rsr0)
Print "Size received data " ; Value
Call Wiz5100_readvalue(w5100_s0_rx_rsr1)
Print "Size received data " ; Value

Here you can see where the read-pointer is


'Socket 0 RX Read Pointer
Call Wiz5100_readvalue(w5100_s0_rx_rd0)
Print "Readpointer " ; Value
Call Wiz5100_readvalue(w5100_s0_rx_rd1)
Print "Readpointer " ; Value
Wait 10
Print "--------"
Loop
End


Sub Wiz5100_init
Call Wiz5100_reset 'Hardware reset

'Register reset
Call Wiz5100_writevalue(w5100_mr , &H80)
'Set gateway IP adress
Call Wiz5100_writevalue(w5100_gar0 , 192)
Call Wiz5100_writevalue(w5100_gar1 , 168)
Call Wiz5100_writevalue(w5100_gar2 , 0)
Call Wiz5100_writevalue(w5100_gar3 , 254)
'Set Subnetmask
Call Wiz5100_writevalue(w5100_subr0 , 255)
Call Wiz5100_writevalue(w5100_subr1 , 255)
Call Wiz5100_writevalue(w5100_subr2 , 255)
Call Wiz5100_writevalue(w5100_subr3 , 0)
'Set MAC
Call Wiz5100_writevalue(w5100_shar0 , &H00)
Call Wiz5100_writevalue(w5100_shar1 , &H10)
Call Wiz5100_writevalue(w5100_shar2 , &H20)
Call Wiz5100_writevalue(w5100_shar3 , &H30)
Call Wiz5100_writevalue(w5100_shar4 , &H40)
Call Wiz5100_writevalue(w5100_shar5 , &H50)
'Set own IP adress
Call Wiz5100_writevalue(w5100_sipr0 , 192)
Call Wiz5100_writevalue(w5100_sipr1 , 168)
Call Wiz5100_writevalue(w5100_sipr2 , 0)
Call Wiz5100_writevalue(w5100_sipr3 , 73)
End Sub

Sub Wiz5100_readvalue(reg)
Adres = Reg
Reset Wiz5100_cs
Spiout Wiz5100_opcode_read , 1
Spiout Adresh , 1
Spiout Adresl , 1
Spiin Value , 1
Set Wiz5100_cs
End Sub

Sub Wiz5100_writevalue(reg , Value )
Adres = Reg
Reset Wiz5100_cs
Spiout Wiz5100_opcode_write , 1
Spiout Adresh , 1
Spiout Adresl , 1
Spiout Value , 1
Set Wiz5100_cs
End Sub

Sub Wiz5100_reset
Wiz5100_res = 1
Waitms 10
Wiz5100_res = 0
Waitms 30 'Minimum 20 s
Wiz5100_res = 1
End Sub

With the tool from Hugh Duff I get 28 characters each time.

 

A small UDP application:

 

CC 29 FE E0

Going to do a small experiment.

Get the EDTP Electronics Internet Test Panel from www.edtp.com 

Start you network sniffer (Etherreal, Wireshark, Iris etc. etc.)

Send a X to a timeserver, here I use 193.67.79.202, a timeserver here in Holland, on port 37.

If all goes well you will get a reply, at the time I started the UDP-transmission I got a four hex-digits: CC 29 FE E0

Startup Bascom-AVR, type in the program, and run it in the simulator.

You will get: Date: 07/17/08, Time: 19:24

7200 = 2 hours from GMT.

And about the 1139293696 you can read about it here:
http://unix.derkeiler.com/Newsgroups/comp.unix.shell/2006-09/msg00253.html

 

Receiving on Socket 0 and getting an interrupt...

In the WizNet forum I have read that the combination SPI and an hardware Interrupt should work. Have spend some time but can not get the hardware Interrupt working. In the datasheet, SPI-connection, no hardware interrupt line is used.

So how to detect there is something received on Socket 0

This simple routine:

'only on socket 0
Call Wiz5100_writevalue(w5100_imr , &B0000_0001)

'check on RECV
Do
Call Wiz5100_readvalue(w5100_s0_ir)
Print Bin(value)
If Value.2 = 1 Then
     Print "Received something on Socket 0"
     Call Wiz5100_writevalue(w5100_s0_ir , &B0000_0100)
End If
Loop

We first mask the interrupt we want to have. After that we want to check if something is received. When something is received bit 2 of the W5100_S0_ir is set, and by writing a '1' to it we clear this bit again.

Sending a X CR/LF to receive the time from a NTP-server....

' Sending a UDP-packet
'IP-number
Call Wiz5100_writevalue(w5100_s0_dipr0 , 193)     'IP-number of NTP-server in Holland
Call Wiz5100_writevalue(w5100_s0_dipr1 , 67)
Call Wiz5100_writevalue(w5100_s0_dipr2 , 79)
Call Wiz5100_writevalue(w5100_s0_dipr3 , 202)
'Destination port
Call Wiz5100_writevalue(w5100_s0_dport0 , 0)
Call Wiz5100_writevalue(w5100_s0_dport1 , 37)      'port 37
'Data
Call Wiz5100_writevalue(&H4000 , 88)                        ' X
Call Wiz5100_writevalue(&H4001 , &H0D)                  'carriage return
Call Wiz5100_writevalue(&H4002 , &H0A)                  'line feed
'set size
Call Wiz5100_writevalue(w5100_s0_tx_wr0 , 0)
Call Wiz5100_writevalue(w5100_s0_tx_wr1 , 3)                       ' size of the packet
' send

Wait 1
'
Call Wiz5100_writevalue(w5100_s0_cr , Sn_cr_send)
Do
Call Wiz5100_readvalue(w5100_s0_cr)
Loop Until Value = 0

Print "X CR/LF should have been send"
Print

'let's have a look if interrupt is working while using SPI
'only on socket 0
Call Wiz5100_writevalue(w5100_imr , &B0000_0001)

'check on RECV
Do
Call Wiz5100_readvalue(w5100_s0_ir)
'Print Bin(value)
If Value.2 = 1 Then
Print "Received something on Socket 0"
Call Wiz5100_writevalue(w5100_s0_ir , &B100)
Exit Do
End If
Loop



Do
For X = &H6000 To &H601C
Call Wiz5100_readvalue(x)
Print Hex(x) ; " " ; Chr(value) ; " " ; Value
Next X

'Socket 0 RX Received Size
Call Wiz5100_readvalue(w5100_s0_rx_rsr0)
Print "Size received data " ; Value
Call Wiz5100_readvalue(w5100_s0_rx_rsr1)
Print "Size received data " ; Value

'Socket 0 RX Read Pointer
Call Wiz5100_readvalue(w5100_s0_rx_rd0)
Print "Readpointer " ; Value
Call Wiz5100_readvalue(w5100_s0_rx_rd1)
Print "Readpointer " ; Value
Wait 10
Print "--------"
Loop
End

16 bytes received back from the time-server.

CC 33 80 D0

 

Receiving UDP...

Dim Temp As Word
Dim Size As Word
Dim Sizel As Byte At Size Overlay
Dim Sizeh As Byte At Size + 1 Overlay
Dim Count As Byte
Dim Clock(4) As Byte
Dim L1 As Long At Clock Overlay
Dim L2 As Long

$lib "datetime.lbx"

Config Date = Dmy , Separator = /

Const Gs0_tx_base = &H4000
Const Gs1_tx_base = &H4800
Const Gs2_tx_base = &H5000
Const Gs3_tx_base = &H5800

Const Gs0_rx_base = &H6000
Const Gs1_rx_base = &H6800
Const Gs2_rx_base = &H7000
Const Gs3_rx_base = &H7800

Const Gsn_rx_mask = &H07FF
Const Gsn_tx_mask = &H07FF

'Socket 0 RX Received Size
Call Wiz5100_readvalue(w5100_s0_rx_rsr0)
Sizeh = Value
Call Wiz5100_readvalue(w5100_s0_rx_rsr1)
Sizel = Value
Print "Received bytes " ; Size

Decr Size
Count = 1
Temp = Gs0_rx_base + Size
For X = Gs0_rx_base To Temp
    Call Wiz5100_readvalue(x)
    Print Hex(x) ; " " ; Hex(value) ; " " ; Value;
    If X > &H6007 Then
        Print " <<"
        Clock(count) = Value
        Incr Count
    Else
        Print

    End If
Next X

Print
Swap Clock(1) , Clock(4)
Swap Clock(3) , Clock(2)

L2 = L1 + 1139293696
L2 = L2 + 7200

Print "Date: " ; Date(l2)
Print "Time: " ; Time(l2)

 

Here the code so far. In the meantime I switched to the long board,
you can change settings in the code.

' 0 = long board
' 1 = sandwichboard

Const Board = 0

Read/Write pointer and freesize

'
Print "TX Write pointer"
Call Wiz5100_readvalue(w5100_s0_tx_wr0)
Print "W5100_s0_tx_wr0 = " ; Hex(value)
Call Wiz5100_readvalue(w5100_s0_tx_wr1)
Print "W5100_s0_tx_wr1 = " ; Hex(value)
'
Print "TX Read pointer"
Call Wiz5100_readvalue(w5100_s0_tx_rd0)
Print "W5100_s0_tx_rd0 = " ; Hex(value)
Call Wiz5100_readvalue(w5100_s0_tx_rd1)
Print "W5100_s0_tx_rd1 = " ; Hex(value)
'
Print "Freesize"
Call Wiz5100_readvalue(w5100_s0_tx_fsr0)
Print "W5100_s0_tx_fsr0 = " ; Hex(value)
Call Wiz5100_readvalue(w5100_s0_tx_fsr1)
Print "W5100_s0_tx_fsr1 = " ; Hex(value)
'


Socket registers...

 

Example: Every socket 2 Kbyte.

Several registers for the sockets

 

TX read pointer sliding through the memory.

I am using datasheet W5100_Datasheet v1.1.5.PDF In it two different names for registers
&H422/423, &H522/523, &H622/623 and &H722/723.

Sn_TX_RD0 and Sn_TX_RD1 or Sn_TX_RR0 and Sn_TX_RR1


The complete code to get a NTP-client working


'------------------------------------------------------------------
' Atmega168 and WIZ810MJ All you need to get a PING and NTP working
'------------------------------------------------------------------

$regfile = "m168def.dat"
$crystal = 8000000
$baud = 9600


$hwstack = 64
$swstack = 64
$framesize = 64

$loadersize = 2048

$include "w5100.inc"

Dim Value As Byte
Dim Adres As Word
Dim Adresl As Byte At Adres Overlay
Dim Adresh As Byte At Adres + 1 Overlay
Dim X As Word
Dim Temp As Word
Dim Size As Word
Dim Sizel As Byte At Size Overlay
Dim Sizeh As Byte At Size + 1 Overlay
Dim Count As Byte
Dim Clock(4) As Byte
Dim L1 As Long At Clock Overlay
Dim L2 As Long

$lib "datetime.lbx"

Config Date = Dmy , Separator = /

Const Gs0_rx_base = &H6000

' 0 = long board
' 1 = sandwichboard

Const Board = 1

'Used Wiz5100 ports and pins
Wiz5100_cs Alias Portb.2 'Chipselect WIZ810MJ

Print "Start.."


#if Board 'sandwichboard
Wiz5100_res Alias Portd.3 'reset of WIZ810MJ
'Other used ports and pins
Relais1 Alias Portd.4
Relais2 Alias Portd.5
Relais3 Alias Portd.6
Relais4 Alias Portd.7
#elseif
Wiz5100_res Alias Portc.0 'long board
Relais1 Alias Portc.1
Relais2 Alias Portc.2
Relais3 Alias Portc.3
Relais4 Alias Portc.4
#endif

'Used ports and pins
Config Wiz5100_cs = Output
Config Wiz5100_res = Output

Config Lcdpin = Pin , Db4 = Portc.2 , Db5 = Portc.3 , Db6 = Portc.4 , Db7 = Portc.5 , E = Portc.1 , Rs = Portc.0
Config Lcd = 16 * 2

'Configuration of the SPI-bus
Config Spi = Hard , Interrupt = Off , Data Order = Msb , Master = Yes , Polarity = Low , Phase = 0 , Clockrate = 4 , Noss = 0

'Init the spi pins
Spiinit

'Here we declare the used sub routines
Declare Sub Wiz5100_init
Declare Sub Wiz5100_readvalue(byval Reg As Word)
Declare Sub Wiz5100_writevalue(byval Reg As Word , Byval Value As Byte)
Declare Sub Wiz5100_reset

Dim Wiz5100_opcode_read As Byte
Wiz5100_opcode_read = 15
Dim Wiz5100_opcode_write As Byte
Wiz5100_opcode_write = 240

Call Wiz5100_init 'We initialize the Wiz810MJ

'now open a UDP-socket
'Assign all 2k memory to every socket for RX
Call Wiz5100_writevalue(w5100_rmsr , &B01010101) '
'Assign all 2k memory to every socket for TX
Call Wiz5100_writevalue(w5100_tmsr , &B01010101)
'protocol = UDP
Call Wiz5100_writevalue(w5100_s0_mr , Sn_mr_udp)
Call Wiz5100_writevalue(w5100_s0_port0 , &H13) ' port 5000
Call Wiz5100_writevalue(w5100_s0_port1 , &H88)
'give the open command
Call Wiz5100_writevalue(w5100_s0_cr , Sn_cr_open)
'wait for socket to come online
Do
Call Wiz5100_readvalue(w5100_s0_sr)
Loop Until Value = Sock_udp

' Sending a UDP-packet
'IP-number
Call Wiz5100_writevalue(w5100_s0_dipr0 , 193)
Call Wiz5100_writevalue(w5100_s0_dipr1 , 67)
Call Wiz5100_writevalue(w5100_s0_dipr2 , 79)
Call Wiz5100_writevalue(w5100_s0_dipr3 , 202)
'Destination port
Call Wiz5100_writevalue(w5100_s0_dport0 , 0)
Call Wiz5100_writevalue(w5100_s0_dport1 , 37)

'Data
Call Wiz5100_writevalue(&H4000 , 88) ' X
Call Wiz5100_writevalue(&H4001 , &H0D)
Call Wiz5100_writevalue(&H4002 , &H0A)

'set size
Call Wiz5100_writevalue(w5100_s0_tx_wr0 , 0)
Call Wiz5100_writevalue(w5100_s0_tx_wr1 , 3)
' send
Wait 1
'
Call Wiz5100_writevalue(w5100_s0_cr , Sn_cr_send)
Do
Call Wiz5100_readvalue(w5100_s0_cr)
Loop Until Value = 0

Print "X CR/LF send"


'let's have a look if interrupt is working while using SPI
'only on socket 0
Call Wiz5100_writevalue(w5100_imr , &B0000_0001)

'check on RECV
Do
Call Wiz5100_readvalue(w5100_s0_ir)
Print Bin(value)
If Value.2 = 1 Then
Print "Rec. on Sck 0"
Call Wiz5100_writevalue(w5100_s0_ir , &B100)
Exit Do
End If
Loop

'Socket 0 RX Received Size
Call Wiz5100_readvalue(w5100_s0_rx_rsr0)
Sizeh = Value
Call Wiz5100_readvalue(w5100_s0_rx_rsr1)
Sizel = Value
Print "Received bytes " ; Size

Decr Size
Count = 1
Temp = Gs0_rx_base + Size
For X = Gs0_rx_base To Temp
Call Wiz5100_readvalue(x)
Print Hex(x) ; " " ; Hex(value) ; " " ; Value;
If X > &H6007 Then
Print " <<"
Clock(count) = Value
Incr Count
Else
Print
End If
Next X

Print
Swap Clock(1) , Clock(4)
Swap Clock(3) , Clock(2)

L2 = L1 + 1139293696
L2 = L2 + 7200

Cls
Home
Lcd "Date: " ; Date(l2)
Lowerline
Lcd "Time: " ; Time(l2)

End


Sub Wiz5100_init
Call Wiz5100_reset 'Hardware reset
'Register reset
Call Wiz5100_writevalue(w5100_mr , &H80)
'Set gateway IP adress
Call Wiz5100_writevalue(w5100_gar0 , 192)
Call Wiz5100_writevalue(w5100_gar1 , 168)
Call Wiz5100_writevalue(w5100_gar2 , 0)
Call Wiz5100_writevalue(w5100_gar3 , 254)
'Set Subnetmask
Call Wiz5100_writevalue(w5100_subr0 , 255)
Call Wiz5100_writevalue(w5100_subr1 , 255)
Call Wiz5100_writevalue(w5100_subr2 , 255)
Call Wiz5100_writevalue(w5100_subr3 , 0)
'Set MAC
Call Wiz5100_writevalue(w5100_shar0 , &H00)
Call Wiz5100_writevalue(w5100_shar1 , &H10)
Call Wiz5100_writevalue(w5100_shar2 , &H20)
Call Wiz5100_writevalue(w5100_shar3 , &H30)
Call Wiz5100_writevalue(w5100_shar4 , &H40)
Call Wiz5100_writevalue(w5100_shar5 , &H50)
'Set own IP adress
Call Wiz5100_writevalue(w5100_sipr0 , 192)
Call Wiz5100_writevalue(w5100_sipr1 , 168)
Call Wiz5100_writevalue(w5100_sipr2 , 0)
Call Wiz5100_writevalue(w5100_sipr3 , 50)
End Sub

Sub Wiz5100_readvalue(reg)
Adres = Reg
Reset Wiz5100_cs
Spiout Wiz5100_opcode_read , 1
Spiout Adresh , 1
Spiout Adresl , 1
Spiin Value , 1
Set Wiz5100_cs
End Sub

Sub Wiz5100_writevalue(reg , Value )
Adres = Reg
Reset Wiz5100_cs
Spiout Wiz5100_opcode_write , 1
Spiout Adresh , 1
Spiout Adresl , 1
Spiout Value , 1
Set Wiz5100_cs
End Sub

Sub Wiz5100_reset
Wiz5100_res = 1
Waitms 10
Wiz5100_res = 0
Waitms 30 'Minimum 20 s
Wiz5100_res = 1
End Sub

 

Prototype of a LCD-board for the Red Bokito. 
With RS232, optocouplers, 7805 voltageregulator.
With the NTP-example.

 

Receiving UDP-data...

 

Dim Wtempb As Word
Dim Wtempe As Word

Dim Size As Word
Dim Sizel As Byte At Size Overlay
Dim Sizeh As Byte At Size + 1 Overlay

Dim Pointer As Word
Dim Pointerl As Byte At Pointer Overlay
Dim Pointerh As Byte At Pointer + 1 Overlay

Dim Bpointer As Word
Dim Epointer As Word

'check on RECV
Do
     Call Wiz5100_readvalue(w5100_s0_ir)
     If Value.2 = 1 Then
          Print "Received something on Socket 0"
          Print
          'read the Read Pointer

          'Print "Read RX_RD0/1"
          Call Wiz5100_readvalue(w5100_s0_rx_rd0)
          'Print "W5100_s0_rx_rd0 " ; Hex(value)
          Pointerh = Value
          Call Wiz5100_readvalue(w5100_s0_rx_rd1)
          'Print "W5100_s0_rx_rd1 " ; Hex(value)
          Pointerl = Value

          'Print "Read Pointer = " ; Hex(pointer)
          Bpointer = Pointer

          'Socket 0 RX Received Size
          Call Wiz5100_readvalue(w5100_s0_rx_rsr0)
          Sizeh = Value
          Call Wiz5100_readvalue(w5100_s0_rx_rsr1)
          Sizel = Value

          Pointer = Pointer + Size
          Epointer = Pointer

          Print "Begin is = " ; Bpointer
          Print "End is = " ; Epointer
          Print "Size is = " ; Size

          Wtempb = W5100_s0_rx_base + Bpointer
          Wtempe = Wtempb + Size

          'we still have to take care of the MASK of &H07FF (later)

          Print "Begin WIZ810MJ RX-memory = " ; Hex(wtempb)
          Print "End WIZ810MJ RX-memory = " ; Hex(wtempe)
          Print

          'skip 8 byte header
          Wtempb = Wtempb + 8
          Decr Wtempe

          Print "Received UDP-string"
          Print
          For X = Wtempb To Wtempe
               Call Wiz5100_readvalue(x)
               Print Chr(value);
          Next X
          Print
          Print

          'update pointer
          Call Wiz5100_writevalue(w5100_s0_rx_rd0 , Pointerh)
          Call Wiz5100_writevalue(w5100_s0_rx_rd1 , Pointerl)

          Call Wiz5100_writevalue(w5100_s0_cr , Sn_cr_recv)
          'reset interrupt
          Call Wiz5100_writevalue(w5100_s0_ir , &B100)
     End If

Loop

The big picture... We have made a loop and are polling the interrupt-register  w5100_s0_ir. If bit 2 is set, something has been received. We store the RX-read pointer in pointer, the size of the received UDP-packet in size. We calculate the start in the RX-memory (adding the W5100_s0_rx_base), we calculate the end of the UDP-packet. Then we skip the 8-byte header and read the contents of the UDP-packet. After that we update the RX-read pointer and do a reset of the interrupt. That's all. We still have to take care of the size op the circular RX-memory (&H0800). Have to optimize the code and make it available for all sockets. Not that difficult, all is handled within the routine, the old RX-memory pointer, the size of the UDP-packet and updating the new RX-memory pointer.


In the example I have started the Ethernet I/O panel from Hugh Duff with an interval of 10 seconds, IP-number 192.168.0.50 and port 5000. This tool sends a string "SEND INFORMATION NOW" every 10 seconds.

Here the code for this example

Checking socket size

 

If you go over the boundaries of your socket (RX-memory) you get the information of the next socket. In this case, we work in the socket 0 memory and go over the top into socket 1 memory. So we have to check that we remain in our own socket 0 memory. On the top of the picture my own test program, in Visual Basic 6.0. Just a Winsock-component, a command button and a textbox.

 

UDP in a circular buffer....


In this picture you can see the receive pointer at work. It is only a forward step counter so you will go beyond the boundary of the 2 Kbytes of the Socket 0 receive buffer. Have started the Ethernet I/O tool from Hugh, and it is sending a UDP message every 5 seconds. With Startpos, Offset, Startadress, Offsend, Uppersize and Size you can see exactly what is happening. Especially the Uppersize is important. Have put the baud rate in the code and the terminal on 38400 baud to keep up.

If Offsend > &H800 Then
     Print "Offsend > &H800"

    
'here we go over the top

     Uppersize = &H800 - Offset
     Print "Uppersize nu " ; Hex(uppersize)

     Temp = 0
     For X = 1 To Uppersize
          'skip header 8 byte
          Incr Temp
          If Temp > 8 Then
               Call Wiz5100_readvalue(bpointer)
               Print Chr(value);
          End If
          Incr Bpointer
     Next X

     Bpointer = &H6000
     Incr Uppersize

     For X = Uppersize To Size
          Incr Temp
          If Temp > 8 Then
               Call Wiz5100_readvalue(bpointer)
               Print Chr(value);
          End If
          Incr Bpointer
     Next X
Else
     
    
'here we don't have to go over the top

     Temp = 0
     For X = 1 To Size
          'skip header 8 byte
          Incr Temp
          If Temp > 8 Then
               Call Wiz5100_readvalue(bpointer)
               Print Chr(value);
          End If
          Incr Bpointer
     Next X
End If
Print

Here the code up to this point.

This piece of code has been written by Thomas Heldt 
and you will also see it back in the web server code.

Next step, a web server...

 

The next piece of code is a real web server, driving the four relays of the relay board. It is based on the small board with the relay board. Baud rate switched back to 9600 baud.

Less than 1000 lines to get a full web server working

(including a configuration-screen through the RS232 port)

For those who haven't got the full Bascom-compiler, I included the HEX-file. It should be used to program the flash of the Atmega168. The Bascom-AVR can be bought at www.mcselec.com

wiz_webserver.txt and w5100.inc

wiz_webserver.hex

How about IP-number, net mask, gateway, logon-screen, names on the buttons etc. etc.
All can be configured in a configuration screen. You get this when you connect a RS232-cable to your Small board, start HyperTerminal at 9600 baud and press a key. 

A configuration menu will start and you can enter your settings. 
Because the settings are stored in EEPROM you should put Fuse bit High G on 0.
When erasing flash, to add your own routines, the contents of the EEPROM will not be erased.

The configuration screen

 

Client application, a mailer....

 

Perhaps you already know, with Telnet it is possible to send a mail.

Start/run/cmd (on a Windows PC)

Telnet 213.51.130.46 25

(213.51.130.46 is the mail server of my ISP and port 25 is for sending mail).

You will get this

 

Wouldn't it be nice to have this done by the Wiz810mj-board? A switch is turned, you get a mail. A alarm condition, you get a mail. Threshold to low or to high, mail. We have to make a client application.
This is the flow.

 

Call Wiz5100_writevalue(w5100_s0_mr , Sn_mr_tcp)
Call Wiz5100_writevalue(w5100_s0_port0 , &H13)                    'port 5000
Call Wiz5100_writevalue(w5100_s0_port1 , &H88)


Call Wiz5100_writevalue(w5100_s0_dipr0 , 213)                       'IP-number of mail-server
Call Wiz5100_writevalue(w5100_s0_dipr1 , 51)
Call Wiz5100_writevalue(w5100_s0_dipr2 , 130)
Call Wiz5100_writevalue(w5100_s0_dipr3 , 46)

Call Wiz5100_writevalue(w5100_s0_dport0 , 00)                       'port 25
Call Wiz5100_writevalue(w5100_s0_dport1 , 25)

'give the open command
Call Wiz5100_writevalue(w5100_s0_cr , Sn_cr_open)

'wait time to get ARP-request finished
Wait 2
Do
Call Wiz5100_readvalue(w5100_s0_sr)
'sock init?
Loop Until Value = Sock_init

'give the connect command
Call Wiz5100_writevalue(w5100_s0_cr , Sn_cr_connect)

'wait time to get ARP-request finished
Wait 2
Do
Call Wiz5100_readvalue(w5100_s0_sr)
'Sock Established
Loop Until Value = Sock_established

(And now I understand some questions in the WizNet-forum. What bit should be checked to be sure the ARP-request is finished successful - now I included twice 2 seconds wait).

This is the answer from my ISP mail server. Groningen, Holland.
Translated: It is not permitted to use this server to sent SPAM, Mass-mail or unwanted mail.


 

'Set Discon Flag
Call Wiz5100_writevalue(w5100_s0_cr , &H8)

And here the result, a mail from the Red Bokito in my own mailbox.

Here the code for this mailer.
You have to adapt it for your own mail server.

If you want to be absolutely sure your mail is send, you have to check the status messages you get from your mail server.

 

The status messages.

And here the program. Haven't optimized the code yet. You have to adapt it for your own mail server.

wiz810mj_mailer2.txt

Watch the details From, To, CC, BCC

 

and a mail-retriever....

 

Changing PORT and a few commands lets us retrieve the mail.

Call Wiz5100_writevalue(w5100_s0_dipr0 , 213)                             'IP-number of mail-server
Call Wiz5100_writevalue(w5100_s0_dipr1 , 51)
Call Wiz5100_writevalue(w5100_s0_dipr2 , 146)
Call Wiz5100_writevalue(w5100_s0_dipr3 , 39)

Call Wiz5100_writevalue(w5100_s0_dport0 , 00)                             'port 110
Call Wiz5100_writevalue(w5100_s0_dport1 , 110)

Do
Call Wiz5100_readvalue(w5100_s0_sr)
'Sock Established
Loop Until Value = Sock_established
Call Wiz5100_waitfor( "+OK")

'Here we start the conversation
Buffer = "USER bzijlstra@home.nl" + Chr(13) + Chr(10)
Call Wiz5100_sendit
Call Wiz5100_waitfor( "+OK")

Buffer = "PASS xxxxxx" + Chr(13) + Chr(10)
Call Wiz5100_sendit
Call Wiz5100_waitfor( "+OK")

Buffer = "list" + Chr(13) + Chr(10)
Call Wiz5100_sendit
Call Wiz5100_waitfor( "???")

Bcount = Split(reaction , Ar(1) , " ")

Print
Print "You have got " ; Ar(2) ; " messages"

Quit:
Buffer = "quit" + Chr(13) + Chr(10)
Call Wiz5100_sendit

'Set Discon Flag
Call Wiz5100_writevalue(w5100_s0_cr , &H8)

End

The code for the mail-retriever

On the LCD prototype board.

 

About authentication and passwords....

Have noticed Internet Explorer 6.0 and Internet Explorer 7.0 are both acting different on a authentication of the webpage. Searching on the Internet I found this

Authentication differences between IE6 and IE7 - TedMa 

13-Jun-08 12:56:01

We serve secure web sites using Windows 2003 Server SP2 asd IIS 6 in Digest authentication mode using
Network Solutions wildcard certificates.  These sites provide information from a number of applications and
servers within frames of the main site.
With IE6 (Automatic login with current username and password), the user could launch any of these applications
without further entering authentication information.
With IE7, the authentication window pops up for every transition, including launching an application within a frame, 
then returning to the main page.
I believe this is a programming error in IE7.  In IE6, it appears that the browser would check to see if the
Automatic login and password would work, and if they would, proceed to launch the page or frame.
In IE7, it appears that when encountering a new page or frame, the browser pops up the authentication window
without checking to see if the authentication would succeed.  This requires the user to constantly be challenged 
by the authentication window, rendering the site unusable to IE7 users.
As its unlikely that Microsoft will make any changes so that "Automatic login with current username and password"
will actually work, can anyone provide a work-around for this issue?

What about a password on the buttons to avoid any problems?

Here a snippet of the code

'Look for variable and replace them, here we can insert new own variables if we want
If Buffer = "%MRELAIS1%" Then
     Call Part1
     Mid(buffer , X1 ) = "1"
     Bfr = System1
     Buffer = Buffer + Bfr + Chr(34) + "></form>"
End If

Sub Part1
If Psw = &HFF Then
     Buffer = Buffer + "Enter password and press reboot"
End If
Buffer = "<br><form action=" + Chr(34) + "/" + Chr(34) + " method=" + Chr(34) + "POST" + Chr(34) + ">"
If Psw = &HFF Then
     Buffer = Buffer + "<input name=" + Chr(34) + "%%%%%%" + Chr(34) + " size=" + Chr(34) + "15" + Chr(34)
     Buffer = Buffer + " maxlength=" + Chr(34) + "15" + Chr(34)
     Buffer = Buffer + " style=" + Chr(34) + "border-style: solid" + Chr(34)
     Buffer = Buffer + " type=" + Chr(34) + "password" + Chr(34) + "><br>&nbsp;"
End If
Buffer = Buffer + "<input type=" + Chr(34) + "hidden" + Chr(34) + " name=" + Chr(34)
Buffer = Buffer + "MRELAIS#"
Buffer = Buffer + Chr(34) + " value=" + Chr(34) + "0" + Chr(34) + ">"
Buffer = Buffer + "<input type=" + Chr(34) + "submit" + Chr(34) + " value=" + Chr(34) + "Reboot "
X1 = Instr(buffer , "#")
X2 = Instr(buffer , "%%%%%%")
End Sub

When I get back from this subroutine, buffer filled with HTML-code,  in X1 the position of the character #, and in X2 the position of the %%%%%%. # will be replaced by the relays-number, and %%%%%% wil be replaced by the name for the input text field. The next step will be replacing the # by the number of relays and %%%%%% by the systemname fetched from the EEPROM (System1). Is the "Use password on buttons flag" (PSW) then the MRELAIS will be replaced by "MPSW01".

If Buffer = "%MRELAIS1%" Then
    
Call Part1
     Mid(buffer , X1 ) = "1"
     If Psw = &HFF Then
          Mid(buffer , X2 , 6) = "MPSW01"
     End If
     Bfr = System1
     Buffer = Buffer + Bfr + Chr(34) + "></form>"
End If

Here you can find the passwords. Perhaps later on I will have them filled in the Configurationscreen and store them in EEPROM.

If Psw = &HFF Then
     If Instr(buffer , "POST /") = 1 Then
          'Toggle RELAIS1
           If Instr(buffer , "MPSW01=
test01") > 0 Then
                Call Mrelais1
           End If
           'Toggle RELAIS2
           If Instr(buffer , "MPSW02=
test02") > 0 Then
                Call Mrelais2
           End If
           'Toggle RELAIS3
           If Instr(buffer , "MPSW03=
test03") > 0 Then
                Call Mrelais3
           End If
           'Toggle RELAIS4
          If Instr(buffer , "MPSW04=
test04") > 0 Then
               Call Mrelais4
          End If
End If

 

and while we are busy, include some temperature sensors...

We will be using the LM75 I2c temperature-sensor. I have found this piece of software on a Dutch Bascom-forum.

Configure the I2c-lines to be used:

'I2c
Config Sda = Portb.7
Config Scl = Portb.6

Declare the subroutines to be used

'LM75
Declare Sub Dec_in_2er
Declare Sub 2er_in_dec
Declare Sub Read_temp
Declare Sub Resetpointer
Declare Sub Check

Add two new HTML-instructions

%TEMP1% and %TEMP2%

I have added a few remarks in the HTML-code

<!--T1--> and <!--T2-->

With these remarks in combination with a external program HTML-GET it is possible to retrieve the temperature of several boards in a single program. Giving the board some added value.

If Buffer = "%TEMP1%" Then
     Lm75read = &H91
     Lm75write = &H90
     Call Read_temp
     Buffer = "<br>Temperature 1 <b><!--T1-->" + Chr(vz) + Str(temp_vk) + "." + Chr(temp_nk) + " C" '
End If

If Buffer = "%TEMP2%" Then
     Lm75read = &H93
     Lm75write = &H92
     Call Read_temp
     Buffer = "<br></b>Temperature 2 <b><!--T2-->" + Chr(vz) + Str(temp_vk) + "." + Chr(temp_nk) + " C"
End If

And here the subroutines used

Sub Read_temp
I2cstart                                                                     'LM75 address on the bus
I2cwbyte Lm75read                                               'Read Temp register
I2crbyte Msb , Ack                                                  'before decimal point
I2crbyte Lsb , Nack                                                 'after decimal point
I2cstop
Call 2er_in_dec
Call Check
Call Resetpointer
End Sub


' *** 2e complement in decimal ***
Sub 2er_in_dec
If Msb.7 = 0 Then                                                    'Check of temp positive Bit7 = 0
     Temp_vk = Msb
Else                                                                            'else negative
     Temp_vk = Not Msb                                           'ignore
End If
End Sub


' *** Decimal 2e complement ***
Sub Dec_in_2er
Msb = Not Msb                                                          'invert
Msb = Msb + 1                                                          'add 1
End Sub


' *** check on I2C Bus error ***
Sub Resetpointer
If Err = 1 Then
     Print "IC Bus Error " ; Err
End If
I2cstart
I2cwbyte Lm75write
I2cwbyte &B00000000 , Nack
I2cstop
If Err = 1 Then
     Print "Resetpointer - IC Bus Error "
End If
End Sub


' *** 
Sub Check
' *** check on positive ***
If Msb.7 = 1 Then
     Vz = " "
     Temp_vk = Makeint(msb , &HFF)
Else
     Temp_vk = Makeint(msb , &H00)                                         ' positive
End If
' *** check if temp negative and 0,5 C bit set ***
If Lsb.7 = 1 And Msb.7 = 1 Then
     Incr Temp_vk                                                                            'incr. value
End If
' *** check if temp <> 0 and positive
If Msb <> 0 And Msb.7 = 0 Then
     Vz = "+" 'Dann "+" Zeichen
End If
' *** check if temp = -0,5C ***
If Msb = 255 And Lsb = 255 Then                                               ' -0,5 Grad corr.
     Vz = "-"
End If
' *** check on exact 0C ***
If Msb = 0 And Lsb.7 = 0 Then                                                     'on 0 C
     Vz = " "
End If
' ** after decimal point ***
If Lsb.7 = 1 Then                                                                            'after dec. point = ,5 ?
     Temp_nk = "5"
Else
     Temp_nk = "0"
End If
End Sub

Add two commands in the HTML-data lines on separate lines (just like %MRELAIS1%, %IP%, %END% etc.).

Data "%TEMP1%"
Data "%TEMP2%"

 

It will end up like this

Prototypes of the LM75 temperaturesensors.

A scan of the I2c-bus and on &H90 and &H94 the two sensors can be found.

And here the Bascom-AVR code. What are the differences?
Removed the global login-screen because there were problems with Internet Explorer 7 and Firefox, password possible on all buttons, two temperature-sensors and a username/password on the configuration screen.

Quote("test")?

I compile it and it is giving errors about a Quote-command?
Yes, that is a new command and it will be released in the next Bascom-AVR version.

Instead of a chr(34) + "test"+ chr(34)
you can use quote("test") to get the same.
Makes the HTML-code more readable.

red_bokito_260908_0000.txt

and here the compiled files

red_bokito_longboard_260908_0000.hex

red_bokito_smallboard_260908_0000.hex

To get in the configuration: user:admin password:fire

Monitoring the temperatures with HTTP-GET...

It is possible to read the temperatures and switch the relays from within a external program, not using a browser. Post_demo is such a external program. When doing a GET on your board you will get this:

HTTP/1.0 200 Document follows
Server: ecoserver
Content-Type: text/html

<html><head><meta http-equiv="Pragma" Content="no cache"><title>Remote reboot</title></head><body><center><table width="600"><tr><td align="center"><font face="verdana" color="#000000"><H1>Remote reboot</H1><br>System 1<br><form action="/" method="POST"><input type="hidden" name="MRELAIS1" value="0"><input type = "submit" value = "Reboot ECOserver1"></form><br>System 2<br><form action="/" method="POST"><input type="hidden" name="MRELAIS2" value="0"><input type = "submit" value = "Reboot ECOserver2"></form><br>System 3<br><form action="/" method="POST"><input type="hidden" name="MRELAIS3" value="0"><input type = "submit" value = "Reboot ECOserver3"></form><br>System 4<br/><form action="/" method="POST"><input type="hidden" name="MRELAIS4" value="0"><input type = "submit" value = "Reboot ECOserver4"></form><br><br><font face="verdana" color="#000000">Your IP-number is: <b>84.31.131.212</b><br><br>
Temperature 1 <b><!--T1-->+26.5 C<br></b>Temperature 2 <b><!--T2-->+27.0 C<br><br></b>This server is online: <b>23</b> Days, <b>17</b> Hours, <b>8</b> Minutes and <b>11</b> Seconds<br><br><hr><br>www.ecoserver.nl</a></font></td></tr></table></center></body></html>

I have added two remarks in the HTML-code to make it easy just to pick up both temperatures.

If you want to test it, you can download a Visual Basic 6.0 version of the HTTP-GET-program here. You should put the IP-number of your board in it and the request mode on GET. You can also switch the relais by putting the variables MRELAIS1 - MRELAIS4 with a value 0 in it. Request mode on POST.

It should be possible to poll several boards in a datacenter and give an alarm when temperatures are going over a pre-defined threshold.

post-demo.zip

Remote ADC monitoring....


Someone asked if I could monitor voltage over the Internet. The Atmega168 has 6 ADC channels so that wouldn't be that hard. Also Thomas Heldt has used ADC in his examples.

A total of 6 ADC lines can be used.

And here some additions to the Red Bokito code

Configure ADC on the Atmega168

Config Adc = Single , Prescaler = Auto , Reference = Avcc

Start ADC

Adding extra commands. You have to make this 6 times if you want to use all channels.

If Buffer = "%ADC0%" Then
Adctemp = Getadc(0)
Adcref2 = Adcref / 1024
Adcresult = Adcref2 * Adctemp
Buffer = Fusing(adcresult , "#.###")
End If

HTML-datalines with the ADC-commands

Data "</b><br>ADC 0 = <b>"
Data "%ADC0%"
Data " volts</b><br>"

Data "</b><br>ADC 1 = <b>"
Data "%ADC1%"
Data " volts</b><br>"

Data "</b><br>ADC 2 = <b>"
Data "%ADC2%"
Data " volts</b><br>"

Data "</b><br>ADC 3 = <b>"
Data "%ADC3%"
Data " volts</b><br>"

Data "</b><br>ADC 4 = <b>"
Data "%ADC4%"
Data " volts</b><br>"

Data "</b><br>ADC 5 = <b>"
Data "%ADC5%"
Data " volts</b><br>"

Measuring the voltages over a potentiometer. On a single ADC-line.

 

Switching the relais with a Visual Basic program

 

Switching the Red Bokito from the command line or with a Visual Basic program. With one extra component (Microsoft Internet Transfer Control 6.0) and four buttons it is possible to switch the relays from the Red Bokito direct from within a Visual Basic program, or compiled to an EXE-file with one command with some parameters.

Start a new form, and at the components add Microsoft Internet Transfer Control 6.0. Put this control on the form and name is inet1

Put four buttons on the form and add the code just like in the picture below.

Run it. When the Red Bokito is configured without using passwords on the buttons the relays and the LED should go on for half a second.

 

And here a command line version

 

Another example, reading 8 opto-couplers over the Internet....

 

Prototype

The optocouplers still have to be fitted in these pictures. PC817 will be used.

And here the commercial version in some nice cases

 

 

 

 

 

 

ABS-71

Hammond 1594 C

Email-switcher with confirmation

 

I would like to switch the relays by email? That is possible. Here an example of using POP (Post Office Protocol) to check mail, and SMTP to send mail. I am using two separate sockets. It is possible to combine some subroutines but for clarity, I copied  and changed two of the major subroutines.

'----------------------------------------------------------------------------------------
' Atmega168 and WIZ810MJ All you need to get a email-switch working  - POP / SMTP
'----------------------------------------------------------------------------------------
'

$regfile = "m168def.dat"
$crystal = 8000000
$baud = 9600

'you should keep the stack-settings this high, if you make them smaller strange things can happen.
$hwstack = 128
$swstack = 128
$framesize = 128

$include "w5100.inc"

Dim Value As Byte
Dim Adres As Word
Dim Adresl As Byte At Adres Overlay
Dim Adresh As Byte At Adres + 1 Overlay

Dim Pointer As Word
Dim Pointerl As Byte At Pointer Overlay
Dim Pointerh As Byte At Pointer + 1 Overlay

Dim Size As Word
Dim Sizel As Byte At Size Overlay
Dim Sizeh As Byte At Size + 1 Overlay

Dim Bpointer As Word

Dim X As Word
Dim Freesize As Word
Dim Sendsize As Integer
Dim Tmp_str As String * 1
Dim Tmp_value As Byte

Dim Startpos As Word
Dim Tx_wr As Word
Dim Offset As Word
Dim Offsend As Word
Dim Uppersize As Word
Dim Startadress As Word
Dim Highbyte As Byte
Dim Lowbyte As Byte
Dim Buffer As String * 180
Dim Glaenge As Word
Dim Hulp As Byte

Dim Parameter As String * 3
Dim Reaction As String * 20
Dim Preaction As Byte
Dim Timeout As Bit

Dim Linebuffer As String * 80
Dim Frombuffer As String * 80
Dim Tobuffer As String * 80
Dim Subjectbuffer As String * 80
Dim Pincode As String * 4

Dim Begin As Byte
Dim Eind As Byte
Dim Email As String * 30

Dim Linefeed_flag As Byte

Dim Bcount As Byte
Dim Ar(3) As String * 8

' 0 = long board
' 1 = sandwichboard

Const Board = 1

'Used Wiz5100 ports and pins
Wiz5100_cs Alias Portb.2                                    'Chipselect WIZ810MJ

Print "Start mail-retriever.."
Wait 1

'You can still choose the small or the long board
#if Board                                                                  'sandwichboard
Wiz5100_res Alias Portd.3                                   'reset of WIZ810MJ
'Other used ports and pins
Relais1 Alias Portd.4
Relais2 Alias Portd.5
Relais3 Alias Portd.6
Relais4 Alias Portd.7
#elseif
Wiz5100_res Alias Portc.0                                   'long board
Relais1 Alias Portc.1
Relais2 Alias Portc.2
Relais3 Alias Portc.3
Relais4 Alias Portc.4
#endif

'Used ports and pins
Config Wiz5100_cs = Output
Config Wiz5100_res = Output

'Config the port/pin directions
Config Relais1 = Output
Config Relais2 = Output
Config Relais3 = Output
Config Relais4 = Output

Relais1 = 1
Relais2 = 1
Relais3 = 1
Relais4 = 1


'Configuration of the SPI-bus
Config Spi = Hard , Interrupt = Off , Data Order = Msb , Master = Yes , Polarity = Low , _
	Phase = 0 , Clockrate = 4 , Noss = 0

'Init the spi pins
Spiinit

Wait 1

'Up to here nothing new, perhaps some new variables

'And here the declares of the subroutines. S0 for Socket 0, S1 for Socket 1

'Here we declare the used sub routines
Declare Sub Wiz5100_init
Declare Sub Wiz5100_readvalue(byval Reg As Word)
Declare Sub Wiz5100_writevalue(byval Reg As Word , Byval Value As Byte)
Declare Sub Wiz5100_reset
Declare Sub Wiz5100_s0_sendit
Declare Sub Wiz5100_s0_waitfor(byval Parameter As String)
Declare Sub Wiz5100_s1_sendit
Declare Sub Wiz5100_s1_waitfor(byval Parameter As String)

Declare Sub Catchlines
Declare Sub Confirmmail(byval Frombuffer As String , Byval Subjectbuffer As String)

Declare Sub Mrelais1_toggle
Declare Sub Mrelais2_toggle
Declare Sub Mrelais3_toggle
Declare Sub Mrelais4_toggle

Declare Sub Mrelais1_on
Declare Sub Mrelais2_on
Declare Sub Mrelais3_on
Declare Sub Mrelais4_on

Declare Sub Mrelais1_off
Declare Sub Mrelais2_off
Declare Sub Mrelais3_off
Declare Sub Mrelais4_off


Dim Wiz5100_opcode_read As Byte
Wiz5100_opcode_read = 15
Dim Wiz5100_opcode_write As Byte
Wiz5100_opcode_write = 240

Call Wiz5100_init                                                                        'We initialize the Wiz810MJ

Do

   Print "POP Mail checker"

   'socket 0 - retrieve email

   'protocol = tcp
   Call Wiz5100_writevalue(w5100_s0_mr , Sn_mr_tcp)
   Call Wiz5100_writevalue(w5100_s0_port0 , &H13)           'port 5000
   Call Wiz5100_writevalue(w5100_s0_port1 , &H88)

'here the IP-number and port to read the email (POP)

   Call Wiz5100_writevalue(w5100_s0_dipr0 , 91)                 'IP-number of mail-server
   Call Wiz5100_writevalue(w5100_s0_dipr1 , 198)
   Call Wiz5100_writevalue(w5100_s0_dipr2 , 169)
   Call Wiz5100_writevalue(w5100_s0_dipr3 , 81)

   Call Wiz5100_writevalue(w5100_s0_dport0 , 00)               'port 110
   Call Wiz5100_writevalue(w5100_s0_dport1 , 110)

   'give the open command
   Call Wiz5100_writevalue(w5100_s0_cr , Sn_cr_open)

   'wait time to get ARP-request finished
   Wait 2

   Do
   Call Wiz5100_readvalue(w5100_s0_sr)
   'sock init?
   Loop Until Value = Sock_init

   'give the connect command
   Call Wiz5100_writevalue(w5100_s0_cr , Sn_cr_connect)

   Call Wiz5100_readvalue(w5100_s0_ir)
   If Value.3 = 1 Then
      Print "Timeout"
      Timeout = 1
      Goto Quit_s0
   End If

   Wait 2

   Do
   Call Wiz5100_readvalue(w5100_s0_sr)
   'Sock Established
   Loop Until Value = Sock_established
   Call Wiz5100_s0_waitfor( "+OK")
   If Timeout = 1 Then Goto Quit_s0

'to keep standard things like username, password etc. outside the program you can find them as
'DATA-lines at the end of the program

   'Here we start the conversation
   Restore User
   Read Buffer
   Buffer = "USER " + Buffer + Chr(13) + Chr(10)

   Call Wiz5100_s0_sendit
   Call Wiz5100_s0_waitfor( "+OK")
   If Timeout = 1 Then Goto Quit_s0

   Restore Password
   Read Buffer
   Buffer = "PASS " + Buffer + Chr(13) + Chr(10)
   Call Wiz5100_s0_sendit
   Call Wiz5100_s0_waitfor( "+OK")
   If Timeout = 1 Then Goto Quit_s0

'In another example I have used LIST, now I am using STAT to check how many emails are in the queue
  Buffer = "STAT" + Chr(13) + Chr(10)
   Call Wiz5100_s0_sendit

   Call Wiz5100_s0_waitfor( "+OK")
   If Timeout = 1 Then Goto Quit_s0

   Bcount = Split(reaction , Ar(1) , " ")

   Print
   Print "You have got " ; Ar(2) ; " message"
   Hulp = Val(ar(2))
   If Hulp > 1 Then
      Print "s"
   End If

'In ar(2) the number of emails. Get the first one.

   If Val(ar(2)) > 0 Then
      Buffer = "RETR 1" + Chr(13) + Chr(10)
      Call Wiz5100_s0_sendit

      Call Wiz5100_s0_waitfor( "+OK")
      If Timeout = 1 Then Goto Quit_s0

      Buffer = "DELE 1" + Chr(13) + Chr(10)
      Call Wiz5100_s0_sendit

      Call Wiz5100_s0_waitfor( "+OK")
      If Timeout = 1 Then Goto Quit_s0

   End If

   Quit_s0:
   Buffer = "quit" + Chr(13) + Chr(10)
   Call Wiz5100_s0_sendit

   'Set Discon Flag
   Call Wiz5100_writevalue(w5100_s0_cr , &H8)

'When we arrived here we got the email, got a few strings with all details like Pincode
'(Accesscode), from, to and subject.

   Pincode = ""

   If Frombuffer <> "" Then
      Print Frombuffer
      Print Tobuffer
      Print Subjectbuffer

      Restore Pincode
      Read Buffer
      If Mid(subjectbuffer , 10 , 4) <> Buffer Then
         Subjectbuffer = "Wrong code"
         Print "Wrong accescode"
         Pincode = "*"
      End If

      Print "POP Mail checker"
      Print Mid(subjectbuffer , 10)

      Frombuffer = Mid(frombuffer , 7)

      Subjectbuffer = Mid(subjectbuffer , 15)
      Hulp = Len(subjectbuffer)
      Decr Hulp
      Subjectbuffer = Left(subjectbuffer , Hulp)

      Select Case Subjectbuffer
         Case "RELAY1=ON" : Call Mrelais1_on
         Case "RELAY2=ON" : Call Mrelais2_on
         Case "RELAY3=ON" : Call Mrelais3_on
         Case "RELAY4=ON" : Call Mrelais4_on

         Case "RELAY1=OFF" : Call Mrelais1_off
         Case "RELAY2=OFF" : Call Mrelais2_off
         Case "RELAY3=OFF" : Call Mrelais3_off
         Case "RELAY4=OFF" : Call Mrelais4_off

         'RELAY1=TOGGLE

         Case "RELAY1=TOGGLE" : Call Mrelais1_toggle
         Case "RELAY2=TOGGLE" : Call Mrelais2_toggle
         Case "RELAY3=TOGGLE" : Call Mrelais3_toggle
         Case "RELAY4=TOGGLE" : Call Mrelais4_toggle

         Case Else : Subjectbuffer = "Unknown command" + Subjectbuffer
      End Select

      If Pincode = "*" Then
         Subjectbuffer = "Wrong accesscode"
      End If

      Call Confirmmail(frombuffer , Subjectbuffer)

      Tobuffer = ""
      Frombuffer = ""
      Subjectbuffer = ""
   End If

   Wait 120
   Cls
   Home

Loop
End


Sub Wiz5100_init
   Call Wiz5100_reset                                       'Hardware reset
   'Register reset
   Call Wiz5100_writevalue(w5100_mr , &H80)
   'Set gateway IP adress
   Call Wiz5100_writevalue(w5100_gar0 , 192)                '192.168.0.254 My gateway
   Call Wiz5100_writevalue(w5100_gar1 , 168)
   Call Wiz5100_writevalue(w5100_gar2 , 0)
   Call Wiz5100_writevalue(w5100_gar3 , 254)
   'Set Subnetmask
   Call Wiz5100_writevalue(w5100_subr0 , 255)               '255.255.255.0 networkmask
   Call Wiz5100_writevalue(w5100_subr1 , 255)
   Call Wiz5100_writevalue(w5100_subr2 , 255)
   Call Wiz5100_writevalue(w5100_subr3 , 0)
   'Set MAC
   Call Wiz5100_writevalue(w5100_shar0 , &H00)              'MAC-address
   Call Wiz5100_writevalue(w5100_shar1 , &H10)
   Call Wiz5100_writevalue(w5100_shar2 , &H20)
   Call Wiz5100_writevalue(w5100_shar3 , &H30)
   Call Wiz5100_writevalue(w5100_shar4 , &H40)
   Call Wiz5100_writevalue(w5100_shar5 , &H50)
   'Set own IP adress
   Call Wiz5100_writevalue(w5100_sipr0 , 192)               'IP-number of device
   Call Wiz5100_writevalue(w5100_sipr1 , 168)
   Call Wiz5100_writevalue(w5100_sipr2 , 0)
   Call Wiz5100_writevalue(w5100_sipr3 , 75)

   'Assign 4k memory to socket 0 and socket 1 for RX
   Call Wiz5100_writevalue(w5100_rmsr , &B00001010)         
   'Assign 4k memory to socket 0 and socket 1 for TX
   Call Wiz5100_writevalue(w5100_tmsr , &B00001010)
End Sub

Sub Wiz5100_readvalue(reg)
Adres = Reg
Reset Wiz5100_cs
Spiout Wiz5100_opcode_read , 1
Spiout Adresh , 1
Spiout Adresl , 1
Spiin Value , 1
Set Wiz5100_cs
End Sub

Sub Wiz5100_writevalue(reg , Value )
Adres = Reg
Reset Wiz5100_cs
Spiout Wiz5100_opcode_write , 1
Spiout Adresh , 1
Spiout Adresl , 1
Spiout Value , 1
Set Wiz5100_cs
End Sub

Sub Wiz5100_reset
Waitms 250
Wiz5100_res = 1
Waitms 250
Wiz5100_res = 0
Waitms 250
Wiz5100_res = 1
End Sub

'There are two almost identical routines to send things to the W5100, one for socket 0 and
'one for socket 1

Sub Wiz5100_s0_sendit
   Sendsize = Len(buffer)

   Freesize_s0:
   Call Wiz5100_readvalue(w5100_s0_tx_fsr0)
   Freesize = Value
   Shift , Freesize , Left , 8
   Call Wiz5100_readvalue(w5100_s0_tx_fsr1)
   Freesize = Freesize + Value

   If Freesize < Sendsize Then
      Goto Freesize_s0
   End If

   Call Wiz5100_readvalue(w5100_s0_tx_wr0)
   Tx_wr = Value
   Shift , Tx_wr , Left , 8
   Call Wiz5100_readvalue(w5100_s0_tx_wr1)
   Tx_wr = Tx_wr + Value

   Startpos = Tx_wr
   Offset = Tx_wr And &H0FFF
   Startadress = &H4000 + Offset
   Offsend = Offset + Sendsize
   Pointer = Startadress

   If Offsend > &H1000 Then
      Uppersize = &H1000 - Offset

      For X = 1 To Uppersize
         Tmp_str = Mid(buffer , X , 1)
         Tmp_value = Asc(tmp_str)
         Call Wiz5100_writevalue(pointer , Tmp_value)
         Incr Pointer
      Next X

      Pointer = &H4000
      Incr Uppersize

      For X = Uppersize To Sendsize
         Tmp_str = Mid(buffer , X , 1)
         Tmp_value = Asc(tmp_str)
         Call Wiz5100_writevalue(pointer , Tmp_value)
         Incr Pointer
      Next X
   Else
      For X = 1 To Sendsize
         Tmp_str = Mid(buffer , X , 1)
         Tmp_value = Asc(tmp_str)
         Call Wiz5100_writevalue(pointer , Tmp_value)
         Incr Pointer
      Next X
   End If

   Call Wiz5100_readvalue(w5100_s0_tx_wr0)
   Startpos = Value
   Shift , Startpos , Left , 8
   Call Wiz5100_readvalue(w5100_s0_tx_wr1)
   Startpos = Startpos + Value

   Glaenge = Startpos + Sendsize

   'Send text
   Highbyte = High(glaenge)
   Call Wiz5100_writevalue(w5100_s0_tx_wr0 , Highbyte)

   Lowbyte = Low(glaenge)
   Call Wiz5100_writevalue(w5100_s0_tx_wr1 , Lowbyte)

   'Set SEND flag
   Call Wiz5100_writevalue(w5100_s0_cr , Sn_cr_send)
End Sub


'get reaction of the mailserver
Sub Wiz5100_s0_waitfor(byval Parameter As String)
   Timeout = 0
   Do
   'check on RECV
   Call Wiz5100_readvalue(w5100_s0_ir)
   If Value.3 = 1 Then
      Print "Timeout"
      Timeout = 1
      Exit Sub
   End If
   Loop Until Value.2 = 1

   Wait 1                                            ' important to get the whole message

   Reaction = ""
   Preaction = 0

   Call Wiz5100_readvalue(w5100_s0_rx_rd0)
   Pointerh = Value
   Call Wiz5100_readvalue(w5100_s0_rx_rd1)
   Pointerl = Value

   'Socket 0 RX Received Size
   Call Wiz5100_readvalue(w5100_s0_rx_rsr0)
   Sizeh = Value
   Call Wiz5100_readvalue(w5100_s0_rx_rsr1)
   Sizel = Value
   Startpos = Pointer
   Offset = Startpos And &H0FFF
   Startadress = &H6000 + Offset
   Offsend = Offset + Size
   Bpointer = Startadress

   If Offsend > &H1000 Then
      Uppersize = &H1000 - Offset

      For X = 1 To Uppersize
            Call Wiz5100_readvalue(bpointer)

            Call Catchlines

            Print Chr(value) ;


            If Preaction < 20 Then
               Reaction = Reaction + Chr(value)
               Incr Preaction
            End If
            Incr Bpointer
      Next X

      Bpointer = &H6000
      Incr Uppersize

      For X = Uppersize To Size
            Call Wiz5100_readvalue(bpointer)

            Call Catchlines

            Print Chr(value) ;

            If Preaction < 20 Then
               Reaction = Reaction + Chr(value)
               Incr Preaction
            End If
            Incr Bpointer
      Next X
   Else
         For X = 1 To Size
            Call Wiz5100_readvalue(bpointer)

            Call Catchlines

            Print Chr(value) ;

            If Preaction < 20 Then
               Reaction = Reaction + Chr(value)
               Incr Preaction
            End If
            Incr Bpointer
         Next X
   End If
   Print

   Pointer = Pointer + Size

   'update pointer
   Call Wiz5100_writevalue(w5100_s0_rx_rd0 , Pointerh)
   Call Wiz5100_writevalue(w5100_s0_rx_rd1 , Pointerl)

   Call Wiz5100_writevalue(w5100_s0_cr , Sn_cr_recv)

   'reset interrupt
   Call Wiz5100_writevalue(w5100_s0_ir , &B100)
   '
   Call Wiz5100_readvalue(w5100_s0_cr)

   If Parameter = "???" Then
      Print Reaction
      Exit Sub
   End If

   If Parameter <> Left(reaction , 3) Then
      Print "Unexpected reaction from mailserver " ; Reaction
      Goto Quit_s0
   End If

End Sub

'Here we catch the To, From, Subject lines. Catching lines from linefeed to linefeed and comparing them
'with the keywords we must have.

Sub Catchlines

   ' Get lines From:
   '           To:
   '           Subject:
   '

   If Value = &H0A Then
      Linefeed_flag = 1
      If Left(linebuffer , 6) = "From: " Then
         Frombuffer = Linebuffer
      End If
      If Left(linebuffer , 4) = "To: " Then
         Tobuffer = Linebuffer
      End If
      If Left(linebuffer , 9) = "Subject: " Then
         Subjectbuffer = Linebuffer
      End If
      Linebuffer = ""
      Exit Sub
   End If

   If Linefeed_flag = 1 Then
      Linebuffer = Linebuffer + Chr(value)
      If Len(linebuffer) > 79 Then
         Linebuffer = ""
      End If
   End If

End Sub

'Here the subroutine to send a confirmation email. SMTP is used. 
'With Base64 encrypted USER and PASSWORD.
Sub Confirmmail(byval Frombuffer , Byval Subjectbuffer)

   ' socket 1 - SMTP send confirmation mail

   Print "Message to: " ; Frombuffer
   Print "Subject:        " ; Subjectbuffer

   'filter just the email-adres

   Begin = Instr(frombuffer , "<")
   Begin = Begin + 1
   Eind = Instr(frombuffer , ">")
   Hulp = Eind - Begin
   Email = Mid(frombuffer , Begin , Hulp)

   Print "Email to " ; Email

   Print "SMTP confirm"

   'protocol = tcp
   Call Wiz5100_writevalue(w5100_s1_mr , Sn_mr_tcp)
   Call Wiz5100_writevalue(w5100_s1_port0 , &H13)        'port 5000
   Call Wiz5100_writevalue(w5100_s1_port1 , &H88)

'Here the IP-number and Port of my provider

   Call Wiz5100_writevalue(w5100_s1_dipr0 , 195)         'IP-number of mail-server
   Call Wiz5100_writevalue(w5100_s1_dipr1 , 47)
   Call Wiz5100_writevalue(w5100_s1_dipr2 , 247)
   Call Wiz5100_writevalue(w5100_s1_dipr3 , 201)

   Call Wiz5100_writevalue(w5100_s1_dport0 , &H09)       'port 2525
   Call Wiz5100_writevalue(w5100_s1_dport1 , &HDD)

   'give the open command
   Call Wiz5100_writevalue(w5100_s1_cr , Sn_cr_open)

   'wait time to get ARP-request finished
   Wait 2

   Do
   Call Wiz5100_readvalue(w5100_s1_sr)
   'sock init?
   Loop Until Value = Sock_init

   'give the connect command
   Call Wiz5100_writevalue(w5100_s1_cr , Sn_cr_connect)

   Call Wiz5100_readvalue(w5100_s1_ir)
   If Value.3 = 1 Then
      Print "Timeout"
      Timeout = 1
      Goto Quit_s1
   End If

   Wait 2

   Do
   Call Wiz5100_readvalue(w5100_s1_sr)
   'Sock Established
   Loop Until Value = Sock_established

   Call Wiz5100_s1_waitfor( "220")
   If Timeout = 1 Then Goto Quit_s1
'Yes, it is a fake domainname

   Buffer = "HELO sokophouder.nl" + Chr(13) + Chr(10)
   Call Wiz5100_s1_sendit
   Call Wiz5100_s1_waitfor( "250")
   If Timeout = 1 Then Goto Quit_s1

   Buffer = "AUTH LOGIN"+ Chr(13) + Chr(10)
   Call Wiz5100_s1_sendit
   Call Wiz5100_s1_waitfor( "334")
   If Timeout = 1 Then Goto Quit_s1

'Here the Base64-encrypted username is fetched. See DATA-lines belowe.

   Restore User_bs64
   Read Buffer
   Buffer = Buffer + Chr(13) + Chr(10)
   Call Wiz5100_s1_sendit
   Call Wiz5100_s1_waitfor( "334")
   If Timeout = 1 Then Goto Quit_s1

   Restore Password_bs64
   Read Buffer
   Buffer = Buffer + Chr(13) + Chr(10)
   Call Wiz5100_s1_sendit
   Call Wiz5100_s1_waitfor( "235")
   If Timeout = 1 Then Goto Quit_s1

   Buffer = "MAIL FROM: alarm@sokophouder.nl" + Chr(13) + Chr(10)
   Call Wiz5100_s1_sendit
   Call Wiz5100_s1_waitfor( "250")
   If Timeout = 1 Then Goto Quit_s1

   Buffer = "RCPT TO: " + Email + Chr(13) + Chr(10)
   Call Wiz5100_s1_sendit
   Call Wiz5100_s1_waitfor( "250")
   If Timeout = 1 Then Goto Quit_s1

   Buffer = "DATA" + Chr(13) + Chr(10)
   Call Wiz5100_s1_sendit
   Call Wiz5100_s1_waitfor( "354")
   If Timeout = 1 Then Goto Quit_s1

   Buffer = "From: Alarm@sokophouder.nl" + Chr(13) + Chr(10)
   Buffer = Buffer + "To: " + Email + Chr(13) + Chr(10)
   Buffer = Buffer + "Subject: Confirm " + Subjectbuffer + Chr(13) + Chr(10)
   Call Wiz5100_s1_sendit

   Wait 1

   Buffer = "." + Chr(13) + Chr(10)
   Call Wiz5100_s1_sendit
   Call Wiz5100_s1_waitfor( "250")
   If Timeout = 1 Then Goto Quit_s1

Quit_s1:
   Buffer = "quit" + Chr(13) + Chr(10)
   Call Wiz5100_s1_sendit

   'Set Discon Flag
   Call Wiz5100_writevalue(w5100_s1_cr , &H8)

   Print "POP Mail checker"

End Sub

'***** socket 1

Sub Wiz5100_s1_sendit
   Sendsize = Len(buffer)

   Freesize_s1:
   Call Wiz5100_readvalue(w5100_s1_tx_fsr0)
   Freesize = Value
   Shift , Freesize , Left , 8
   Call Wiz5100_readvalue(w5100_s1_tx_fsr1)
   Freesize = Freesize + Value

   If Freesize < Sendsize Then
      Goto Freesize_s1
   End If

   Call Wiz5100_readvalue(w5100_s1_tx_wr0)
   Tx_wr = Value
   Shift , Tx_wr , Left , 8
   Call Wiz5100_readvalue(w5100_s1_tx_wr1)
   Tx_wr = Tx_wr + Value

   Startpos = Tx_wr
   Offset = Tx_wr And &H0FFF
   Startadress = &H5000 + Offset
   Offsend = Offset + Sendsize
   Pointer = Startadress

   If Offsend > &H1000 Then
      Uppersize = &H1000 - Offset

      For X = 1 To Uppersize
         Tmp_str = Mid(buffer , X , 1)
         Tmp_value = Asc(tmp_str)
         Call Wiz5100_writevalue(pointer , Tmp_value)
         Incr Pointer
      Next X

      Pointer = &H5000
      Incr Uppersize

      For X = Uppersize To Sendsize
         Tmp_str = Mid(buffer , X , 1)
         Tmp_value = Asc(tmp_str)
         Call Wiz5100_writevalue(pointer , Tmp_value)
         Incr Pointer
      Next X
   Else
      For X = 1 To Sendsize
         Tmp_str = Mid(buffer , X , 1)
         Tmp_value = Asc(tmp_str)
         Call Wiz5100_writevalue(pointer , Tmp_value)
         Incr Pointer
      Next X
   End If

   Call Wiz5100_readvalue(w5100_s1_tx_wr0)
   Startpos = Value
   Shift , Startpos , Left , 8
   Call Wiz5100_readvalue(w5100_s1_tx_wr1)
   Startpos = Startpos + Value

   Glaenge = Startpos + Sendsize

   'Send text
   Highbyte = High(glaenge)
   Call Wiz5100_writevalue(w5100_s1_tx_wr0 , Highbyte)

   Lowbyte = Low(glaenge)
   Call Wiz5100_writevalue(w5100_s1_tx_wr1 , Lowbyte)

   'Set SEND flag
   Call Wiz5100_writevalue(w5100_s1_cr , Sn_cr_send)
End Sub


'get reaction of the mailserver
Sub Wiz5100_s1_waitfor(byval Parameter As String)
   Timeout = 0
   Do
   'check on RECV
   Call Wiz5100_readvalue(w5100_s1_ir)
   If Value.3 = 1 Then
      Print "Timeout"
      Timeout = 1
      Exit Sub
   End If
   Loop Until Value.2 = 1

   Wait 1                                                                                ' important to get the whole message!!

   Reaction = ""
   Preaction = 0

   Call Wiz5100_readvalue(w5100_s1_rx_rd0)
   Pointerh = Value
   Call Wiz5100_readvalue(w5100_s1_rx_rd1)
   Pointerl = Value

   'Socket 1 RX Received Size
   Call Wiz5100_readvalue(w5100_s1_rx_rsr0)
   Sizeh = Value
   Call Wiz5100_readvalue(w5100_s1_rx_rsr1)
   Sizel = Value
   Startpos = Pointer
   Offset = Startpos And &H0FFF
   Startadress = &H7000 + Offset
   Offsend = Offset + Size
   Bpointer = Startadress

   If Offsend > &H1000 Then
      Uppersize = &H1000 - Offset

      For X = 1 To Uppersize
            Call Wiz5100_readvalue(bpointer)

            Call Catchlines

            Print Chr(value) ;


            If Preaction < 20 Then
               Reaction = Reaction + Chr(value)
               Incr Preaction
            End If
            Incr Bpointer
      Next X

      Bpointer = &H7000
      Incr Uppersize

      For X = Uppersize To Size
            Call Wiz5100_readvalue(bpointer)

            Call Catchlines

            Print Chr(value) ;

            If Preaction < 20 Then
               Reaction = Reaction + Chr(value)
               Incr Preaction
            End If
            Incr Bpointer
      Next X
   Else
         For X = 1 To Size
            Call Wiz5100_readvalue(bpointer)

            Call Catchlines

            Print Chr(value) ;

            If Preaction < 20 Then
               Reaction = Reaction + Chr(value)
               Incr Preaction
            End If
            Incr Bpointer
         Next X
   End If
   Print

   Pointer = Pointer + Size

   'update pointer
   Call Wiz5100_writevalue(w5100_s1_rx_rd0 , Pointerh)
   Call Wiz5100_writevalue(w5100_s1_rx_rd1 , Pointerl)

   Call Wiz5100_writevalue(w5100_s1_cr , Sn_cr_recv)

   'reset interrupt
   Call Wiz5100_writevalue(w5100_s1_ir , &B100)
   '
   Call Wiz5100_readvalue(w5100_s1_cr)

   If Parameter = "???" Then
      Print Reaction
      Exit Sub
   End If

   If Parameter <> Left(reaction , 3) Then
      Print "Unexpected reaction from mailserver " ; Reaction
      Goto Quit_s1
   End If

End Sub
'Here the subroutine to put the relais ON, OFF or TOGGLE them

Sub Mrelais1_toggle
    Relais1 = 0
    Waitms 250
    Relais1 = 1
End Sub

Sub Mrelais2_toggle
    Relais2 = 0
    Waitms 250
    Relais2 = 1
End Sub

Sub Mrelais3_toggle
    Relais3 = 0
    Waitms 250
    Relais3 = 1
End Sub

Sub Mrelais4_toggle
    Relais4 = 0
    Waitms 250
    Relais4 = 1
End Sub

Sub Mrelais1_on
    Relais1 = 0
End Sub

Sub Mrelais2_on
    Relais2 = 0
End Sub

Sub Mrelais3_on
    Relais3 = 0
End Sub

Sub Mrelais4_on
    Relais4 = 0
End Sub

Sub Mrelais1_off
    Relais1 = 1
End Sub

Sub Mrelais2_off
    Relais2 = 1
End Sub

Sub Mrelais3_off
    Relais3 = 1
End Sub

Sub Mrelais4_off
    Relais4 = 1
End Sub


User:
Data "alarm@sokophouder.nl"
'Have used the Bascom-AVR simulator to get the Base64-notation of the username. 
'And the same for the Base64-password.

User_bs64:
Data "YWxhcm1Ac29rb3Bob3VkZXIubmw"

Password:
Data "hallodaar"
 

Password_bs64:
Data "aGFsbG9kYWFy"

Pincode:
Data "1956"
This is the way you should send PINCODE and the command. Because in the code you got a string from whom 
the mail is, you could also allow just a few people to give commands and receive confirmation-emails.
And this is the confirmation mail you will receive.
 
Have added a small routine to delete mails with large attachments or large pieces of text in the
message part. Things like SPAM. In AR(3) the size of the mail is stored, is it larger that 4000 bytes 
then it will be deleted.
DIM Whulp as word
If Val(ar(2)) > 0 Then
    Print "Size of the mail is " ; Val(ar(3))
    Whulp = Val(ar(3))
    If Whulp > 4000 Then
        Print "Delete large mail " ; Ar(3) ; " bytes"
    Goto Skip_large_mails
End If

Buffer = "RETR 1" + Chr(13) + Chr(10)
Call Wiz5100_s0_sendit

Call Wiz5100_s0_waitfor( "+OK")
If Timeout = 1 Then Goto Quit_s0

Skip_large_mails:

Buffer = "DELE 1" + Chr(13) + Chr(10)
Call Wiz5100_s0_sendit

Call Wiz5100_s0_waitfor( "+OK")
If Timeout = 1 Then Goto Quit_s0

End If
The best way to work with this application is to use a dedicated email-addres. Will try to make an
application that checks for this kind of mails in your regulair mailbox and handle just those. 

SNMP Simple Network Management Protocol

Add this

to get this

to catch this

All done with SNMP.

What do you need to get this working on one or more sensors, on one or more modules....

First, get a webserver running on a PC. The easiest way is to install Wampserver, from www.wampserver.com You get Apache, PHP and MySQL For Linux users, get LAMP

Get a copy of Cacti www.cacti.net
There is a version for Windows and for Linux

Get rrdtools, Net-SNMP, Spine and Cygwin.
Google for a installation-sheet for Cacti and you will see what to do.

And as last, download
APC_Environmental_Temp_sensor.1.5.zip

These are the templates we use to monitor the Red Bokito with LM75-temperaturesensors.

Preliminary code...

My receive buffer starts at &H6000. My transmit buffer starts at &H4000. Everytime I issue a Call Wiz5100_writevalue(W5100_s0_mr, Sn_mr_udp) the read and write pointers are put back on their begin so the SNMP string I receive can every time be found on exact the same location in the receive-buffer and I can reply with an UDP-string at exact the same spot in the transmit buffer.

I also use this on a TCP/IP securitysystem, works very well...

About the code, everytime a SNMP call is done, on port 161, with communitystring 'public' the Red Bokito will return the temperature. Have to enhance the code to react on different OID's and also implement SNMP-traps yet.

'-----------------------------------------------
' Atmega168 and WIZ810MJ - SNMP - working
'--------------------------------------
---------

$regfile = "m168def.dat"
$crystal = 8000000
$baud = 9600

$hwstack = 128
$swstack = 128
$framesize = 128

$include "w5100.inc"

Dim Value As Byte
Dim Adres As Word
Dim Adresl As Byte At Adres Overlay
Dim Adresh As Byte At Adres + 1 Overlay
Dim Src_ip(4) As Byte
Dim Src_prt(2) As Byte
Dim Wlength As Word
Dim Length(2) As Byte
Dim Wsrc_prt As Word
Dim Reqid(2) As Byte
Dim Xx As Word

'LM75
Dim Lm75read As Byte
                                '&H91/&H93 adres lezen
Dim Lm75write As Byte
                                '&H90/&H92 adres schrijven
Dim Temp_vk As Integer
                            'before comma value
Dim Temp_nk As Byte
                                  'after comma value
Dim Msb As Byte
                                          'Temperature for comma as Integer -32768 tot +32767
Dim Lsb As Byte

Dim Vz As Byte 'voorteken (-/+)
Dim Btemp_vk As Byte

Const W5100_s3_rx_base = &H7800
Const W5100_s2_rx_base = &H7000
Const W5100_s1_rx_base = &H6800
Const W5100_s0_rx_base = &H6000

Const W5100_s3_tx_base = &H5800
Const W5100_s2_tx_base = &H5000
Const W5100_s1_tx_base = &H4800
Const W5100_s0_tx_base = &H4000

Const W5100_sn_rx_mask = &H07FF

Const W5100_sn_tx_mask = &H07FF

'Used Wiz5100 ports and pins
Wiz5100_cs Alias Portb.2 ' Chipselect WIZ810MJ

'Used ports and pins
Config Wiz5100_cs = Output

' 0 = long board
' 1 = sandwichboard

Const Board = 1

Print "Start.."

Wait 1

#if Board 'sandwichboard
Wiz5100_res Alias Portd.3 'reset of WIZ810MJ

'Other used ports and pins
'Relais1 Alias Portd.4
'Relais2 Alias Portd.5
'Relais3 Alias Portd.6
'Relais4 Alias Portd.7
#elseif
Wiz5100_res Alias Portc.0 'long board
'Relais1 Alias Portc.1
'Relais2 Alias Portc.2
'Relais3 Alias Portc.3
'Relais4 Alias Portc.4
#endif

Config Wiz5100_res = Output

'I2c

Config Sda = Portb.7
Config Scl = Portb.6

I2cinit

'Configuration of the SPI-bus
Config Spi = Hard , Interrupt = Off , Data Order = Msb , Master = Yes , Polarity = Low , Phase = 0 , Clockrate = 4 , Noss = 0

'Init the spi pins
Spiinit

Wait 1

'Here we declare the used sub routines
Declare Sub Wiz5100_init
Declare Sub Wiz5100_readvalue(byval Reg As Word)
Declare Sub Wiz5100_writevalue(byval Reg As Word , Byval Value As Byte)
Declare Sub Wiz5100_reset
Declare Sub Wiz5100_reply

'LM75
Declare Sub Dec_in_2er
Declare Sub 2er_in_dec
Declare Sub Read_temp
Declare Sub Resetpointer
Declare Sub Check
Declare Sub Readtemperature

Dim Wiz5100_opcode_read As Byte
Wiz5100_opcode_read = 15
Dim Wiz5100_opcode_write As Byte
Wiz5100_opcode_write = 240

Wait 1

Call Wiz5100_init ' We initialize the Wiz810MJ
'Assign all 2k memory to every socket for RX
Call Wiz5100_writevalue(w5100_rmsr , &B01010101) '
'Assign all 2k memory to every socket for TX
Call Wiz5100_writevalue(w5100_tmsr , &B01010101)

'protocol = UDP
Call Wiz5100_writevalue(w5100_s0_mr , Sn_mr_udp)
Call Wiz5100_writevalue(w5100_s0_port0 , &H00) ' port 161
Call Wiz5100_writevalue(w5100_s0_port1 , &HA1)
'give the open command
Call Wiz5100_writevalue(w5100_s0_cr , Sn_cr_open)
'wait for socket to come online

Do
Call Wiz5100_readvalue(w5100_s0_sr)
Loop Until Value = Sock_udp

'check on RECV
Do
Call Wiz5100_readvalue(w5100_s0_ir)
If Value.2 = 1 Then
Call Wiz5100_reply
Call Wiz5100_writevalue(w5100_s0_cr , Sn_cr_recv)
'reset interrupt
Call Wiz5100_writevalue(w5100_s0_ir , &B100)
Call Wiz5100_readvalue(w5100_s0_cr)
End If
Loop
End

Sub Wiz5100_init
Call Wiz5100_reset 'Hardware reset

'Register reset
Call Wiz5100_writevalue(w5100_mr , &H80)
'Set gateway IP adress
Call Wiz5100_writevalue(w5100_gar0 , 192)                                'My gateway
Call Wiz5100_writevalue(w5100_gar1 , 168)
Call Wiz5100_writevalue(w5100_gar2 , 0)
Call Wiz5100_writevalue(w5100_gar3 , 1)

'Set Subnetmask
Call Wiz5100_writevalue(w5100_subr0 , 255)
                             'My networkmask
Call Wiz5100_writevalue(w5100_subr1 , 255)
Call Wiz5100_writevalue(w5100_subr2 , 255)
Call Wiz5100_writevalue(w5100_subr3 , 0)

'Set MAC

Call Wiz5100_writevalue(w5100_shar0 , &H00)                          'My MAC-address
Call Wiz5100_writevalue(w5100_shar1 , &H10)
Call Wiz5100_writevalue(w5100_shar2 , &H20)
Call Wiz5100_writevalue(w5100_shar3 , &H30)
Call Wiz5100_writevalue(w5100_shar4 , &H40)
Call Wiz5100_writevalue(w5100_shar5 , &H50)

'Set own IP adress
Call Wiz5100_writevalue(w5100_sipr0 , 192)
                             'My IP-number
Call Wiz5100_writevalue(w5100_sipr1 , 168)
Call Wiz5100_writevalue(w5100_sipr2 , 0)
Call Wiz5100_writevalue(w5100_sipr3 , 50)
End Sub

Sub Wiz5100_readvalue(reg)
Adres = Reg
Reset Wiz5100_cs
Spiout Wiz5100_opcode_read , 1
Spiout Adresh , 1
Spiout Adresl , 1
Spiin Value , 1
Set Wiz5100_cs
End Sub

Sub Wiz5100_writevalue(reg , Value )
Adres = Reg
Reset Wiz5100_cs
Spiout Wiz5100_opcode_write , 1
Spiout Adresh , 1
Spiout Adresl , 1
Spiout Value , 1
Set Wiz5100_cs
End Sub

Sub Wiz5100_reset
Waitms 250
Wiz5100_res = 1
Waitms 250
Wiz5100_res = 0
Waitms 250
Wiz5100_res = 1
End Sub

Sub Wiz5100_reply

'What do we have to know?

'What is the IP-number of the requester

Call Wiz5100_readvalue(&H6000)
Src_ip(1) = Value
Call Wiz5100_readvalue(&H6001)
Src_ip(2) = Value
Call Wiz5100_readvalue(&H6002)
Src_ip(3) = Value
Call Wiz5100_readvalue(&H6003)
Src_ip(4) = Value

Print "Source IP " ; Src_ip(1) ; "." ; Src_ip(2) ; "." ; Src_ip(3) ; "." ; Src_ip(4)

'What is the returnport of the requester
Call Wiz5100_readvalue(&H6004)
Src_prt(1) = Value
Call Wiz5100_readvalue(&H6005)
Src_prt(2) = Value

Print "Source poort ";

Wsrc_prt = Src_prt(1)
Shift Wsrc_prt , Left , 8
Wsrc_prt = Wsrc_prt + Src_prt(2)

Print Wsrc_prt

'What is the length of the UDP-packet
Call Wiz5100_readvalue(&H6006)
Length(1) = Value
Call Wiz5100_readvalue(&H6007)
Length(2) = Value

Wlength = Length(1)
Shift Wlength , Left , 8
Wlength = Wlength + Length(2)

Print "Length UDP-packet ";

Print Wlength

Print "version"
Call Wiz5100_readvalue(&H600a)
Print Hex(value)
Call Wiz5100_readvalue(&H600b)
Print Hex(value)
Call Wiz5100_readvalue(&H600c)
Print Hex(value)

'skip &H600d
'skip &H600e

'What is the community string? public

For Xx = &H600F To &H6014
Call Wiz5100_readvalue(xx)
Print Chr(value)
Next Xx

Print "PDU-type"
Call Wiz5100_readvalue(&H6015)
Print Hex(value)
Call Wiz5100_readvalue(&H6016)
Print Hex(value)

Print "request ID"
Call Wiz5100_readvalue(&H6017)
Print Hex(value)
Call Wiz5100_readvalue(&H6018)
Print Hex(value)
Call Wiz5100_readvalue(&H6019)
Print Hex(value)
Reqid(1) = Value

Call Wiz5100_readvalue(&H601a)
Print Hex(value)
Reqid(2) = Value
Print "error status"

Call Wiz5100_readvalue(&H601b)
Print Hex(value)
Call Wiz5100_readvalue(&H601c)
Print Hex(value)
Call Wiz5100_readvalue(&H601d)
Print Hex(value)

Print "error index"
Call Wiz5100_readvalue(&H601e)
Print Hex(value)
Call Wiz5100_readvalue(&H601f)
Print Hex(value)
Call Wiz5100_readvalue(&H6020)
Print Hex(value)

'skip &H6021
'skip &H6022

Print "Object identifier"
Call Wiz5100_readvalue(&H6023)
Print Hex(value)
Call Wiz5100_readvalue(&H6024)
Print Hex(value)
Call Wiz5100_readvalue(&H6025)
Print Hex(value)
Call Wiz5100_readvalue(&H6026)
Print Hex(value)
Call Wiz5100_readvalue(&H6027)
Print Hex(value)
Call Wiz5100_readvalue(&H6028)
Print Hex(value)
Call Wiz5100_readvalue(&H6029)
Print Hex(value)
Call Wiz5100_readvalue(&H602a)
Print Hex(value)
Call Wiz5100_readvalue(&H602b)
Print Hex(value)
Call Wiz5100_readvalue(&H602c)
Print Hex(value)
Call Wiz5100_readvalue(&H602d)
Print Hex(value)
Call Wiz5100_readvalue(&H602e)
Print Hex(value)

Print "Value"
Call Wiz5100_readvalue(&H602f)
Print Hex(value)
Call Wiz5100_readvalue(&H6030)
Print Hex(value)

'we are going to send something back...

'protocol = UDP
Call Wiz5100_writevalue(w5100_s0_mr , Sn_mr_udp)
Call Wiz5100_writevalue(w5100_s0_port0 , &H00)                       'from port 161
Call Wiz5100_writevalue(w5100_s0_port1 , &HA1)

'give the open command
Call Wiz5100_writevalue(w5100_s0_cr , Sn_cr_open)

'wait for socket to come online
Do
Call Wiz5100_readvalue(w5100_s0_sr)
Loop Until Value = Sock_udp

' IP-number from requester.....
Call Wiz5100_writevalue(w5100_s0_dipr0 , Src_ip(1))
Call Wiz5100_writevalue(w5100_s0_dipr1 , Src_ip(2))
Call Wiz5100_writevalue(w5100_s0_dipr2 , Src_ip(3))
Call Wiz5100_writevalue(w5100_s0_dipr3 , Src_ip(4))

'Destination port
Call Wiz5100_writevalue(w5100_s0_dport0 , Src_prt(1)) 'returnport from requester
Call Wiz5100_writevalue(w5100_s0_dport1 , Src_prt(2))

'SNMP
Call Wiz5100_writevalue(&H4000 , &H30)
Call Wiz5100_writevalue(&H4001 , &H82)
Call Wiz5100_writevalue(&H4002 , &H00)

Call Wiz5100_writevalue(&H4003 , &H33)                     'how much characters are following

Call Wiz5100_writevalue(&H4004 , &H02)
Call Wiz5100_writevalue(&H4005 , &H01)
Call Wiz5100_writevalue(&H4006 , &H00)

Call Wiz5100_writevalue(&H4007 , &H04)
Call Wiz5100_writevalue(&H4008 , &H06)

Call Wiz5100_writevalue(&H4009 , &H70)                    'community string 'public'
Call Wiz5100_writevalue(&H400a , &H75)
Call Wiz5100_writevalue(&H400b , &H62)
Call Wiz5100_writevalue(&H400c , &H6C)
Call Wiz5100_writevalue(&H400d , &H69)
Call Wiz5100_writevalue(&H400e , &H63)

Call Wiz5100_writevalue(&H400f , &HA2)
Call Wiz5100_writevalue(&H4010 , &H82)
Call Wiz5100_writevalue(&H4011 , &H00)
Call Wiz5100_writevalue(&H4012 , &H24)
Call Wiz5100_writevalue(&H4013 , &H02)
Call Wiz5100_writevalue(&H4014 , &H02)
Call Wiz5100_writevalue(&H4015 , Reqid(1))
Call Wiz5100_writevalue(&H4016 , Reqid(2))
Call Wiz5100_writevalue(&H4017 , &H02)
Call Wiz5100_writevalue(&H4018 , &H01)
Call Wiz5100_writevalue(&H4019 , &H00)
Call Wiz5100_writevalue(&H401a , &H02)
Call Wiz5100_writevalue(&H401b , &H01)
Call Wiz5100_writevalue(&H401c , &H00)
Call Wiz5100_writevalue(&H401d , &H30)
Call Wiz5100_writevalue(&H401e , &H82)
Call Wiz5100_writevalue(&H401f , &H00)

Call Wiz5100_writevalue(&H4020 , &H16)               'how much characters following

Call Wiz5100_writevalue(&H4021 , &H30)
Call Wiz5100_writevalue(&H4022 , &H82)
Call Wiz5100_writevalue(&H4023 , &H00)

Call Wiz5100_writevalue(&H4024 , &H12)              'how much characters following

Call Wiz5100_writevalue(&H4025 , &H06)
Call Wiz5100_writevalue(&H4026 , &H0D)
Call Wiz5100_writevalue(&H4027 , &H2B)
Call Wiz5100_writevalue(&H4028 , &H06)
Call Wiz5100_writevalue(&H4029 , &H01)
Call Wiz5100_writevalue(&H402a , &H04)
Call Wiz5100_writevalue(&H402b , &H01)
Call Wiz5100_writevalue(&H402c , &H82)
Call Wiz5100_writevalue(&H402d , &H3E)
Call Wiz5100_writevalue(&H402e , &H01)
Call Wiz5100_writevalue(&H402f , &H01)
Call Wiz5100_writevalue(&H4030 , &H02)
Call Wiz5100_writevalue(&H4031 , &H01)
Call Wiz5100_writevalue(&H4032 , &H01)
Call Wiz5100_writevalue(&H4033 , &H00)

Call Readtemperature

Call Wiz5100_writevalue(&H4034 , &H42)
Call Wiz5100_writevalue(&H4035 , &H01)
Call Wiz5100_writevalue(&H4036 , Btemp_vk)
      'temperature

'set size
Call Wiz5100_writevalue(w5100_s0_tx_wr0 , 0)
Call Wiz5100_writevalue(w5100_s0_tx_wr1 , &H37)

'send
Call Wiz5100_writevalue(w5100_s0_cr , Sn_cr_send)

Do
Call Wiz5100_readvalue(w5100_s0_cr)
Loop Until Value = 0

End Sub

 

'Subroutines for the LM75 temperature sensor

'Found this routine on the Internet - thanks to the German publisher


'We only will be using the INT-part
'But if you have a LCD connected you can have the temperature display more precise

Sub Readtemperature
Lm75read = &H91
Lm75write = &H90

Call Read_temp

Print "Temperature 1 " ; Chr(vz) ; Str(temp_vk) ; "." ; Chr(temp_nk) ; " C" '
Btemp_vk = Temp_vk

End Sub

Sub Read_temp
I2cstart 'put LM75 addres on the i2c bus
I2cwbyte Lm75read 'read Temp register
I2crbyte Msb , Ack 'before the dot
I2crbyte Lsb , Nack 'after the dot
I2cstop
Call 2er_in_dec
Call Check
Call Resetpointer
End Sub

' *** 2e complement in decimaal ***
Sub 2er_in_dec
If Msb.7 = 0 Then 'Check if temp is postive Bit7 = 0
Temp_vk = Msb
Else 'else negative
Temp_vk = Not Msb 'ignore
End If
End Sub

' *** Decimal 2e complement ***
Sub Dec_in_2er
Msb = Not Msb 'invert
Msb = Msb + 1 'increment
End Sub

' *** check on I2C Bus error ***
Sub Resetpointer
If Err = 1 Then
Print "IC Bus Error " ; Err
End If
I2cstart
I2cwbyte Lm75write
I2cwbyte &B00000000 , Nack
I2cstop
If Err = 1 Then
Print "Resetpointer - IC Bus Error "
End If
End Sub

' *** do some calculation ***
Sub Check
' *** c
heck positive ***
If Msb.7 = 1 Then
Vz = " "
Temp_vk = Makeint(msb , &HFF)
Else
Temp_vk = Makeint(msb , &H00) ' positi
ve
End If

' *** check temp negative and 0,5 C bit set ***
If Lsb.7 = 1 And Msb.7 = 1 Then
Incr Temp_vk
                          'increment before the comma
End If

' *** check on temp <> 0 and positive
If Msb <> 0 And Msb.7 = 0 Then
Vz = "+"
                                 'Put a + in front
End If

' *** check if temp = -0,5C ***
If Msb = 255 And Lsb = 255 Then
                    '-0,5 degrees correction
Vz = "-"
End If

' *** check exact 0C ***
If Msb = 0 And Lsb.7 = 0 Then
                         'on 0 C
Vz = " "
End If

' ** after comma ***
If Lsb.7 = 1 Then                                                 'after the comma value = ,5 ?
Temp_nk = "5"

Else
Temp_nk = "0"
End If
End Sub

If you got Cacti installed you can also monitor your equipment. Here the round-trip time for a PING to a Red Bokito on my own small network. Search on the Internet for the True Ping templates.

 

 

To be continued.... (more sensors, and SNMP-trap)

 

UDP-switch to be controlled by an iPhone UDP-remote App

 

With the iPhone app of http://www.alcorn.com/products/UDP_Remote it would be nice to control our long or short board.

' UDP_Switch

'------------------------------------
' Atmega168 and WIZ810MJ - UDP_Switch
'------------------------------------

' Ben Zijlstra = 2011
'
' Hardware: WIZ810MJ long or sandwich board from http://members.home.nl/bzijlstra

$prog &HFF , &HE2 , &HD7 , &HF9

$regfile = "m168def.dat"
$crystal = 8000000
$baud = 9600

$hwstack = 128
$swstack = 128
$framesize = 128

$include "w5100.inc"

'EEPROM:
'001 = IP(1)
'002 = IP(2)
'003 = IP(3)
'004 = IP(4)
'005 = MAC(1)
'006 = MAC(2)
'007 = MAC(3)
'008 = MAC(4)
'009 = MAC(5)
'010 = MAC(6)
'011 = Netmask(1)
'012 = Netmask(2)
'013 = Netmask(3)
'014 = Netmask(4)
'015 = Gateway(1)
'016 = Gateway(2)
'017 = Gateway(3)
'018 = Gateway(4)

Dim Value As Byte
Dim Adres As Word
Dim Adresl As Byte At Adres Overlay
Dim Adresh As Byte At Adres + 1 Overlay
Dim Toets As Byte

Dim Mymac(6) As Byte
Dim Ippart(4) As String * 4
Dim Myip(4) As Byte
Dim Mygw(4) As Byte
Dim Mymsk(4) As Byte
Dim Mymacs(6) As String * 3
Dim Action As String * 12

Const W5100_s3_rx_base = &H7800
Const W5100_s2_rx_base = &H7000
Const W5100_s1_rx_base = &H6800
Const W5100_s0_rx_base = &H6000

Const W5100_s3_tx_base = &H5800
Const W5100_s2_tx_base = &H5000
Const W5100_s1_tx_base = &H4800
Const W5100_s0_tx_base = &H4000


Const W5100_sn_rx_mask = &H07FF
Const W5100_sn_tx_mask = &H07FF

Const User = "ADMIN"
Const Password = "FIRE"

'Used Wiz5100 ports and pins
Wiz5100_cs Alias Portb.2 ' Chipselect WIZ810MJ

Config Wiz5100_cs = Output


' 0 = long board
' 1 = sandwichboard

Const Board = 0

Print "Start.."
Wait 1

#if Board 'sandwichboard
Wiz5100_res Alias Portd.3 'reset of WIZ810MJ
'Other used ports and pins
Relais1 Alias Portd.4
Relais2 Alias Portd.5
Relais3 Alias Portd.6
Relais4 Alias Portd.7

#elseif
Wiz5100_res Alias Portc.0 'long board
Relais1 Alias Portc.1
Relais2 Alias Portc.2
Relais3 Alias Portc.3
Relais4 Alias Portc.4
#endif

Config Relais1 = Output
Config Relais2 = Output
Config Relais3 = Output
Config Relais4 = Output

Relais1 = 1
Relais2 = 1
Relais3 = 1
Relais4 = 1

Config Wiz5100_res = Output

'Configuration of the SPI-bus
Config Spi = Hard , Interrupt = Off , Data Order = Msb , Master = Yes , Polarity = Low , Phase = 0 , Clockrate = 4 , Noss = 0

'Init the spi pins
Spiinit

Wait 1

'Here we declare the used sub routines
Declare Sub Wiz5100_init
Declare Sub Wiz5100_readvalue(byval Reg As Word)
Declare Sub Wiz5100_writevalue(byval Reg As Word , Byval Value As Byte)
Declare Sub Wiz5100_reset
Declare Sub Banner
Declare Sub Read_ip
Declare Sub Read_gw
Declare Sub Read_mask
Declare Sub Read_mac
Declare Sub Configure
Declare Sub Print_ip
Declare Sub Print_mask
Declare Sub Print_gw
Declare Sub Print_mac
Declare Sub Take_action

Dim Wiz5100_opcode_read As Byte
Wiz5100_opcode_read = 15
Dim Wiz5100_opcode_write As Byte
Wiz5100_opcode_write = 240

Wait 1
Call Banner
Print "Press key for configuration..."
Call Read_ip
Call Read_gw
Call Read_mask
Call Read_mac

Call Wiz5100_init ' We initialize the Wiz810MJ

'now open a UDP-socket
'Assign all 2k memory to every socket for RX
Call Wiz5100_writevalue(w5100_rmsr , &B01010101) '
'Assign all 2k memory to every socket for TX
Call Wiz5100_writevalue(w5100_tmsr , &B01010101)
'protocol = UDP
Call Wiz5100_writevalue(w5100_s0_mr , Sn_mr_udp)
Call Wiz5100_writevalue(w5100_s0_port0 , &H13) ' port 5000
Call Wiz5100_writevalue(w5100_s0_port1 , &H88)
'give the open command
Call Wiz5100_writevalue(w5100_s0_cr , Sn_cr_open)
'wait for socket to come online

Do
Call Wiz5100_readvalue(w5100_s0_sr)
Loop Until Value = Sock_udp


'check on RECV
Do

Toets = Ischarwaiting()
If Toets = 1 Then
Toets = Waitkey()
Call Configure
End If

Action = ""
Call Wiz5100_readvalue(w5100_s0_ir)
If Value.2 = 1 Then
Call Wiz5100_readvalue(&H6008)
Action = Chr(value)
Call Wiz5100_readvalue(&H6009)
Action = Action + Chr(value)
Call Wiz5100_readvalue(&H600a)
Action = Action + Chr(value)
Call Wiz5100_readvalue(&H600b)
Action = Action + Chr(value)
Call Wiz5100_readvalue(&H600c)
Action = Action + Chr(value)
Call Wiz5100_readvalue(&H600d)
Action = Action + Chr(value)
Call Wiz5100_readvalue(&H600e)
Action = Action + Chr(value)
Call Wiz5100_readvalue(&H600f)
Action = Action + Chr(value)
Call Wiz5100_readvalue(&H6010)
Action = Action + Chr(value)
Call Wiz5100_readvalue(&H6011)
Action = Action + Chr(value)
Call Wiz5100_readvalue(&H6012)
Action = Action + Chr(value)

'in action the actionstring

Call Take_action


Call Wiz5100_writevalue(w5100_s0_cr , Sn_cr_recv)

'reset interrupt
Call Wiz5100_writevalue(w5100_s0_ir , &B100)
Call Wiz5100_readvalue(w5100_s0_cr)

End If
Loop

End

Sub Wiz5100_init
Call Wiz5100_reset 'Hardware reset
'Register reset
Call Wiz5100_writevalue(w5100_mr , &H80)
'Set gateway IP adress
Call Wiz5100_writevalue(w5100_gar0 , Mygw(1)) 'My gateway
Call Wiz5100_writevalue(w5100_gar1 , Mygw(2))
Call Wiz5100_writevalue(w5100_gar2 , Mygw(3))
Call Wiz5100_writevalue(w5100_gar3 , Mygw(4))
'Set Subnetmask
Call Wiz5100_writevalue(w5100_subr0 , Mymsk(1)) 'My networkmask
Call Wiz5100_writevalue(w5100_subr1 , Mymsk(2))
Call Wiz5100_writevalue(w5100_subr2 , Mymsk(3))
Call Wiz5100_writevalue(w5100_subr3 , Mymsk(4))
'Set MAC
Call Wiz5100_writevalue(w5100_shar0 , Mymac(1)) 'My MAC-address
Call Wiz5100_writevalue(w5100_shar1 , Mymac(2))
Call Wiz5100_writevalue(w5100_shar2 , Mymac(3))
Call Wiz5100_writevalue(w5100_shar3 , Mymac(4))
Call Wiz5100_writevalue(w5100_shar4 , Mymac(5))
Call Wiz5100_writevalue(w5100_shar5 , Mymac(6))
'Set own IP adress
Call Wiz5100_writevalue(w5100_sipr0 , Myip(1)) 'My IP-number
Call Wiz5100_writevalue(w5100_sipr1 , Myip(2))
Call Wiz5100_writevalue(w5100_sipr2 , Myip(3))
Call Wiz5100_writevalue(w5100_sipr3 , Myip(4))
End Sub


Sub Wiz5100_readvalue(reg)
Adres = Reg
Reset Wiz5100_cs
Spiout Wiz5100_opcode_read , 1
Spiout Adresh , 1
Spiout Adresl , 1
Spiin Value , 1
Set Wiz5100_cs
End Sub


Sub Wiz5100_writevalue(reg , Value )
Adres = Reg
Reset Wiz5100_cs
Spiout Wiz5100_opcode_write , 1
Spiout Adresh , 1
Spiout Adresl , 1
Spiout Value , 1
Set Wiz5100_cs
End Sub


Sub Wiz5100_reset
Waitms 250
Wiz5100_res = 1
Waitms 250
Wiz5100_res = 0
Waitms 250
Wiz5100_res = 1
End Sub


' Routine to get a configuration-screen on the RS232 port
'
Sub Configure
Stop Watchdog
Local Hulp1 As Byte
Local Hulp2 As Byte
Local Hulp3 As Word
Local Hulp4 As Byte
Local Yn As String * 1
Local Ipnr As String * 15
Local Dot1 As Byte
Local Dot2 As Byte
Local Dot3 As Byte
Local Dot4 As Byte
Local Dot5 As Byte
Local Iptemp As String * 1
Local Bfr As String * 20

Call Read_ip
Call Read_gw
Call Read_mask
Call Read_mac

Do
Call Banner
Print
Input "Login: " , Bfr
If Left(bfr , 5) = User Then
Print
Input "Password: " , Bfr
End If
Loop Until Left(bfr , 4) = Password


Call Banner
Print "Configure mode:"
Print
Print "Network:"
Print
Print "IP-number: ";
Call Print_ip
Input "Change IP-number (y/n) " , Yn
If Yn = "y" Then
Print
Print "Input IP-numbers as decimals, seperated by a dot (like 192.168.1.106)"
Print
Input Ipnr
Hulp1 = Split(ipnr , Ippart(1) , ".")
Myip(1) = Val(ippart(1))
Myip(2) = Val(ippart(2))
Myip(3) = Val(ippart(3))
Myip(4) = Val(ippart(4))
Print
Print "New IP-number: ";
Call Print_ip
Print
Input "Accept IP-number (y/n) " , Yn
If Yn = "y" Then
Writeeeprom Myip(1) , 1 : Writeeeprom Myip(2) , 2
Writeeeprom Myip(3) , 3 : Writeeeprom Myip(4) , 4
End If
Print
Print "IP-number: ";
Call Read_ip
Call Print_ip
End If
Print

'Netmask

Print "NetMask: ";
Call Print_mask
Input "Change NetMask (y/n) " , Yn
If Yn = "y" Then
Print
Print "Input IP-numbers as decimals, seperated by a dot"
Print
Input Ipnr
Hulp1 = Split(ipnr , Ippart(1) , ".")
Mymsk(1) = Val(ippart(1))
Mymsk(2) = Val(ippart(2))
Mymsk(3) = Val(ippart(3))
Mymsk(4) = Val(ippart(4))
Print
Print "New Mask: ";
Call Print_mask
Print
Input "Accept NetMask (y/n) " , Yn
If Yn = "y" Then
Writeeeprom Mymsk(1) , 11 : Writeeeprom Mymsk(2) , 12
Writeeeprom Mymsk(3) , 13 : Writeeeprom Mymsk(4) , 14
End If
Print
Print "NetMask: ";
Call Read_mask
Call Print_mask
End If
Print

'Gateway

Print "Gateway: ";
Call Print_gw
Input "Change Gateway (y/n) " , Yn
If Yn = "y" Then
Print
Print "Input IP-numbers as decimals, seperated by a dot"
Print
Input Ipnr
Hulp1 = Split(ipnr , Ippart(1) , ".")
Mygw(1) = Val(ippart(1))
Mygw(2) = Val(ippart(2))
Mygw(3) = Val(ippart(3))
Mygw(4) = Val(ippart(4))
Print
Print "New Gateway: ";
Call Print_gw
Print
Input "Accept Gateway (y/n) " , Yn
If Yn = "y" Then
Writeeeprom Mygw(1) , 15 : Writeeeprom Mygw(2) , 16
Writeeeprom Mygw(3) , 17 : Writeeeprom Mygw(4) , 18
End If
Print
Print "Gateway: ";
Call Read_gw
Call Print_gw
End If
Print

Print "MAC-Address: ";
Call Read_mac
Call Print_mac
Input "Change MAC-address (y/n) " , Yn
If Yn = "y" Then
Mac:
Print
Print "Input MAC-address in hexadecimals (like 00-34-35-36-37-48)"
Print
Input Bfr
If Len(bfr) <> 17 Then Goto Mac
Hulp1 = Split(bfr , Mymacs(1) , "-")

Mymac(1) = Hexval(mymacs(1))
Mymac(2) = Hexval(mymacs(2))
Mymac(3) = Hexval(mymacs(3))
Mymac(4) = Hexval(mymacs(4))
Mymac(5) = Hexval(mymacs(5))
Mymac(6) = Hexval(mymacs(6))

Print
Print "New MAC-address: ";
Call Print_mac
'Print
Input "Accept MAC-address (y/n) " , Yn
If Yn = "y" Then
Writeeeprom Mymac(1) , 5 : Writeeeprom Mymac(2) , 6
Writeeeprom Mymac(3) , 7 : Writeeeprom Mymac(4) , 8
Writeeeprom Mymac(5) , 9 : Writeeeprom Mymac(6) , 10
End If
Print
Print "MAC-address: ";
Call Read_mac
Call Print_mac
End If

Summary:
Print Chr(&H1b) ; "[2J"; ' ANSI goto 0/0
Print "Summary:"
Print
Print "Network:"
Print
Print "IP-number : " ; Myip(1) ; "." ; Myip(2) ; "." ; Myip(3) ; "." ; Myip(4)
Print
Print "NetMask : " ; Mymsk(1) ; "." ; Mymsk(2) ; "." ; Mymsk(3) ; "." ; Mymsk(4)
Print
Print "Gateway : " ; Mygw(1) ; "." ; Mygw(2) ; "." ; Mygw(3) ; "." ; Mygw(4)
Print
Print "Mac-address : " ; Hex(mymac(1)) ; "-" ; Hex(mymac(2)) ; "-" ; Hex(mymac(3)) ; "-" ; Hex(mymac(4)) ; "-" ; Hex(mymac(5)) ; "-" ; Hex(mymac(6))
Print
Print "Rebooting"
Wait 4
Goto 0000
End Sub


'Read IP-number from Eeprom
'
Sub Read_ip
Readeeprom Myip(1) , 1 : Readeeprom Myip(2) , 2
Readeeprom Myip(3) , 3 : Readeeprom Myip(4) , 4
End Sub


' Routine to print the IP-number
'
Sub Print_ip
Print Myip(1) ; "." ; Myip(2) ; "." ; Myip(3) ; "." ; Myip(4)
End Sub


' Routine to read the netmask from the EEPROM
'
Sub Read_mask
Readeeprom Mymsk(1) , 11 : Readeeprom Mymsk(2) , 12
Readeeprom Mymsk(3) , 13 : Readeeprom Mymsk(4) , 14
End Sub


' Routine to print the netmask
'
Sub Print_mask
Print Mymsk(1) ; "." ; Mymsk(2) ; "." ; Mymsk(3) ; "." ; Mymsk(4)
End Sub


' Routine to read the gateway from the EEPROM
'
Sub Read_gw
Readeeprom Mygw(1) , 15 : Readeeprom Mygw(2) , 16
Readeeprom Mygw(3) , 17 : Readeeprom Mygw(4) , 18
End Sub


' Routine to print the gateway
'
Sub Print_gw
Print Mygw(1) ; "." ; Mygw(2) ; "." ; Mygw(3) ; "." ; Mygw(4)
End Sub


' Routine to read the MAC-address from the EEPROM
'
Sub Read_mac
Readeeprom Mymac(1) , 5 : Readeeprom Mymac(2) , 6
Readeeprom Mymac(3) , 7 : Readeeprom Mymac(4) , 8
Readeeprom Mymac(5) , 9 : Readeeprom Mymac(6) , 10
End Sub


' Routine to print the MAC-address
'
Sub Print_mac
Print Hex(mymac(1)) ; "-" ; Hex(mymac(2)) ; "-" ; Hex(mymac(3)) ; "-" ; Hex(mymac(4)) ; "-" ; Hex(mymac(5)) ; "-" ; Hex(mymac(6))
End Sub


' Routine to print a banner
'
Sub Banner
Print Chr(&H1b) ; "[2J"; ' ANSI goto 0/0
Print "UDP-Switch - configuration-menu - ver. 1.0"
Print
Print
End Sub

Sub Take_action
Print Action
Select Case Action
Case "relais1= on" : Relais1 = 0
Case "relais1=off" : Relais1 = 1
Case "relais2= on" : Relais2 = 0
Case "relais2=off" : Relais2 = 1
Case "relais3= on" : Relais3 = 0
Case "relais3=off" : Relais3 = 1
Case "relais4= on" : Relais4 = 0
Case "relais4=off" : Relais4 = 1
End Select

'put all memory pointers back on &H4000 and &H6000
Call Wiz5100_writevalue(w5100_s0_mr , Sn_mr_udp) ' protocol UDP
Call Wiz5100_writevalue(w5100_s0_port0 , &H13) ' port 5000
Call Wiz5100_writevalue(w5100_s0_port1 , &H88)
'give the open command
Call Wiz5100_writevalue(w5100_s0_cr , Sn_cr_open)
'wait for socket to come online
Do
Call Wiz5100_readvalue(w5100_s0_sr)
Loop Until Value = Sock_udp
End Sub

In the iPhone at settings for the UDP_Remote, you can give the 8 buttons any name and the commands that are put under the buttons are:

"relais1= on"
"relais1=off"
"relais2= on"
"relais2=off"
"relais3= on"
"relais3=off"
"relais4= on"
"relais5=off"

I liked to get the strings all the same size so there is a space before on

 

Putting the hardware together

 

Step 1. A bare Small board.

Step 2. SMD first.

The way I do this. Put on one of the SMD sides on the PCB a small piece of tin.
Take a pair of tweezers, and slide the SMD part into the melting tin.

Step 3. Sliding the SMD part.

Step 4. Only 9 SMD parts.

Step 5. SMD LED, which direction?

Put your multimeter on rectifier and check the LED. It should burn when connected right.
Right side is the cathode (on picture and on the PCB).

Step 6. SMD ready. 270, 4K7, 10K, 100 nF, LED.

Step 7. Regulator LM2937-3,3, diode IN4001, elcos 10 uF and the header for the power.

If you put power on it you will know that the LED is put on the right way.

Step 8. The socket for the Atmega168.

Step 9. Headers.

Step 10. Ready to put the WIZ810MJ-module in its place.
Every module I sent has been tested on my test board.

Step 11. WIZ810MJ and microcontroller mounted.

Put the PING-test from the begin of this tutorial in the microcontroller, take care of the fuse bits.

Here the hex-file and the source of the PING-program.

WIZ810MJ_PING_SMALL.HEX
WIZ810MJ_PING_LONG.HEX
Wiz810mj_ping.bas

This way you switch between long and small board

' 0 = long board
' 1 = sandwichboard

Const Board = 0

Step 12. Put a network cable in the WIZ810MJ and put power on the board.
Start a PING <ip-number of your wiznet-module> -t on your PC and if everything is oke you will see this.
In the background a ARP-request is done.


What you should see.....

Till now, only one board didn't work right away. The 4K7 SMD didn't make good contact so the WIZ810MJ-module wasn't put in SPI-Enable mode. Have put more than 30 boards together now.

Take care of the fuse bits of the Atmega168. Standard they are sold with 1 MHz internal RC Oscillator.
An 8 MHz Oscillator is divided by 8. You should put the lock and fuse bits like this:

Later on you should put Fuse bit High G on 0.
IP-number, Subnet mask and Gateway will be stored in EEPROM.


Not done yet, now the relays/RS232-board

Step 10. Bare relays/RS232-board.

Step 11. SMD transistors DTA143ET (PNP) and resistors 270 ohm.

Step 12. 100 nF and LEDs.

Step 13. Max3232.

Step 14. SubD-9 female connector.

Step 15. Relays.

Step 16. Headers.

Step 17. The two boards together.

Ready.

The relay MEDER SIL05-1A72-71D works at 5 volts. So 5 volts should be applied to the power connector. The LM2937-3,3 brings the power to 3,3 volts for the WIZ810MJ-module and the Atmega168 microcontroller. However if you want to apply a higher voltage you can put a 78L05 on JP5 between the top and the lower board. Then a maximum of 30 volt can be applied without any trouble.

This way the module could be mounted in its case.

You got the LEDS the wrong way on the board, here a trick to remove them with two irons.

 

Long way, but at the end we get this...

 

Small sandwichboard or

long web server with four relays

 

Or a web server with up to eight I2c-LM75 temperature sensors and four relays

Here some more documentation of this design.

http://www.circuitcellar.com/wiznet/winners/DE/001141.html

 

Sandwichboard used in EcoServer, here on display at the Cebit in Hannover

Check for more info www.ecoserver.nl

Thanks to:


Thanks to Mark Alberts
the creator of Bascom-AVR
www.mcselec.com

Bought my copy of Bascom-8051 in 1995
a few years later Bascom-AVR
Great stuff!!!

 

Thanks to Thomas Heldt
He created the first Bascom-AVR-code for the WIZ810MJ
http://mikrocontroller.heldt.eu
(Held is hero in Dutch)

 

Thanks to Dietmar Steiner
He converted the WIZ810MJ code to work on the WIZ812MJ.
On Atmega8, 32, 64 and 644
Here is his code

You can reach Dietmar at
steiner(at)key-it.de

 

Thanks to Fred Eady
With the Easy TCP/IP board from Fred I started
my survey on embedded Ethernet.
www.edtp.com

Where are his splendid articles in Circuit Cellar?

 

Thanks to Hugh Duff
for the Ethernet I/O Control Panel
www.drftech.com

Together we have build the AVR Ethernet I/O board

Flags can be downloaded at www.3DFlags.com

 

Ben Zijlstra - Ben's HobbyCorner - 2008