ME Labs, Inc.
719-520-5323
 
Home:
  Developer Resources:

Programming Clues
    Sample Programs
   
    PICBASIC PRO™
Compiler Manual
    PICBASIC™ Compiler
Manual
    Serin2/Serout2 Modes
    ASCII Character Set
    Number Conversion
    Floating Point
Routines
    PBP Debug Monitor
    Articles and Tutorials

Hardware Clues
    Parts / Vendor List
    PICPROTO™ Boards
    LAB-X1 Docs
    LAB-X2 Docs
    LAB-X20 Docs
    LAB-X3 Docs
    LAB-X4 Docs
    LAB-XUSB Docs
    LAB-XT Docs
     
 

ME Labs, Inc. | 1-719-520-5323 | Example Program - PROGEEX.pbp

PICBASIC PRO program to receive a HEX file from PC and write data to I2C memory. Writes data in page mode, 16 bytes at one time. Memory device must be addressed with 8 bits and capable of receiving 16 bytes at once.
' Name        : PROGEEX.pbp
' Compiler    : PICBASIC PRO Compiler 2.6
' Assembler   : PM or MPASM
' Target PIC  : 40-pin 16F877A, 18F452 or similar
' Hardware    : LAB-X1 Experimenter Board
' Oscillator  : 4MHz external crystal
' Keywords    : HSERIN, HSEROUT, I2CREAD, I2CWRITE, WAIT
' Description : PICBASIC PRO program to receive a HEX file from PC
' and write data to I2C memory. Writes data in page mode, 16 bytes at
' one time. Memory device must be addressed with 8 bits and capable
' of receiving 16 bytes at once.
'

' Define LOADER_USED to allow use of the boot loader.
' This will not affect normal program operation.
Define LOADER_USED 1

' Set receive register to receiver enabled
Define HSER_RCSTA  90h
' Set transmit register to transmitter enabled
Define HSER_TXSTA  20h
' Set baud rate
Define HSER_BAUD   2400

scl    VAR PORTC.3  ' Clock pin
sda    VAR PORTC.4  ' Data pin
pinin  VAR PORTC.7  ' Serial receive pin
pinout VAR PORTC.6  ' Serial transmit pin

addr VAR WORD       ' Memory Address
dta1 VAR BYTE[17]   ' Data array with location for checksum
bb   VAR BYTE       ' Byte count
tt   VAR BYTE       ' Record type
i    VAR WORD       ' Loop counter
cs   VAR BYTE       ' Checksum
ln   VAR BYTE       ' Line count

   Clear            ' Clear RAM data
   ADCON1 = 7       ' Set PORTA and PORTE to digital
   ln = 0           ' Clear line count

   HSerout ["Erasing"]
        
   For i = 0 To 8192 Step 8  ' Store $00 to all locations (for testing)
     I2CWrite sda,scl,$A0,i,[STR dta1\8]
     If i//256 = 0 Then
        HSerout ["."]           
     EndIf                                   
     Pause 6
   Next i
        
   HSerout [13,10,"Ready",13,10] ' Notify: ready for file
        
mainloop:
   cs = 0                    ' Reset checksum byte
   HSerin [WAIT(":"),HEX2 bb,HEX4 addr,HEX2 tt] ' Receive line and parse
   cs = bb + addr.lowbyte + addr.highbyte + tt  ' Begin checksum calculation
   
   If (tt = 1) Then eof      ' Check for end of file
   For i = 0 To bb           ' Loop for each expected data-byte and checksum
     HSerin [HEX2 dta1[i]]   ' Store each byte to location in array
     cs = cs + dta1[i]       ' Add each byte to checksum calculation
   Next i

   ln = ln + 1               ' Count line received
   If (cs <> 0) Then sume    ' Check for checksum error
   
   I2CWrite sda,scl,$A0,addr,[STR dta1\bb] ' Write data to device, checksum is dropped
   Goto mainloop             ' Go get another line   

sume:
   HSerout ["Checksum Error: line ",DEC ln,13,10] ' Notify: checksum error
             
eof:
   HSerout [DEC ln," lines received",13,10] ' Notify: Confirm line count

   For i = 0 To (ln*16)         ' Loop 16 times for each line received
     I2CRead sda,scl,$A0,i,[cs] ' Read back each character
     HSerout [HEX2 cs]          ' Send each character
     If (i+1)//16 = 0 Then
        HSerout [13,10]         ' New line every 16 characters
     EndIf                                   
   Next i

   HSerout [13,10,13,10]        ' New Lines

   End

           

Download the program file.