Página 1 de 1

I2C entre dois PICs

MensagemEnviado: 15 Jun 2012 09:04
por roquetti
Pessoall,
Estou fazendo a comunicação entre dois PICs via I2C, alguém sabe como coloco o endereço do PIC escravo? ou coloco 00000000 no Master chamando o escravo?

MensagemEnviado: 15 Jun 2012 20:19
por tcpipchip
Antes a gente necessita saber em que linguagem estas fazendo...

Eu já fiz o pic slave para ser uma camera i2c para se comunicar com o modulo TELIT Ge863...que tinha i2c...

Usei o exemplo do link abaixo...

http://www.picbasic.co.uk/forum/showthread.php?t=5632

Miguel

MensagemEnviado: 15 Jun 2012 20:28
por roquetti
tcpipchip escreveu:Antes a gente necessita saber em que linguagem estas fazendo...

Eu já fiz o pic slave para ser uma camera i2c para se comunicar com o modulo TELIT Ge863...que tinha i2c...

Usei o exemplo do link abaixo...

http://www.picbasic.co.uk/forum/showthread.php?t=5632

Miguel


descobri que o registrador SSPADD quando o pic é escravo coloco o endereço dele ali, estou usando os PICs 18F2550 em C18 um Master e um Escravo.

MensagemEnviado: 15 Jun 2012 21:16
por tcpipchip
Eu posso mandar o meu exemplo para ler uma camera JPG via PIC e manda via I2C para um master frame por frame. Eu utilizei endereço 06 :)
PVT ME
TCPIPCHIP

MensagemEnviado: 17 Jun 2012 18:31
por tcpipchip
Código: Selecionar todos
'************************************************************
'*  Nome    : driver.bas                                    *
'*  Author  : Miguel Wisintainer                       *
'*  Date    : 09/04/2006                                    *
'*  Version : 6.0 100%                                      *
'*  Notes   : PIC CAMERA i2c para TELIT PYTHON                     *
'*  Changes : Returns error camera                          *
'             Vendo questao SYNC, quando ocorre erro        *
'   115200 i2clows 1,REMOVIDO RESET CAMERA,status connect Setup      *
'   WATCH-DOG ENABLE 64 PREESCALER                          *
'   removido reset                                          *
'   connect = 60                                            *
'   I2CSLOW AGORA PARA 1 ----MUDEI NOVAMENTE PARA 0         *
'   TIRADO BOREM RESET, STACK RESET                         *
'   SEM CONNECT NO INICIO CAMERA                            *
'   I2CHOLD = 1                                             *
'   I2CSLOW = 1                                             *
'   RESTART CAUSE IMPLEMENTED                               *
'   TIRADO PAUSE 500 PARA INICIALIZAÇÕES                    *
'   TEMPORIAMENTE PORTA SAIDA                               *
'   REHABILITAR RESETE CAMERA (POWER DOWN)                  *
'   DIMINUIR 10% HSERIN                                     *
'   RESULT PARA GET_IMAGE
'   GRAVACAO AT45XXXX VIA ATME168 SPI
'************************************************************
         
INCLUDE "modedefs.bas"

     '   ifdef PLL@REQ ; Do we require the PLL ?
@ __CONFIG _CONFIG1H, _OSCS_OFF_1H & _HSPLL_OSC_1H
   '   else
'@ __CONFIG _CONFIG1H, _OSCS_ON_1H & _HS_OSC_1H
   '   endif
@ __CONFIG _CONFIG2L, _BOR_OFF_2L & _BORV_20_2L & _PWRT_ON_2L
   '   ifdef WATCHDOG_REQ
   '      @__CONFIG CONFIG2H, WDT_OFF_2 & WDTPS_128_2
   '   else
@ __CONFIG _CONFIG2H, _WDT_ON_2H & _WDTPS_64_2H
   '   endif
@ __CONFIG _CONFIG3H, _CCP2MX_ON_3H
   '   ifdef DEBUG@REQ ; Do we require DEBUG ?
   '      @__CONFIG CONFIG4L, STVR_ON_4 & LVP_OFF_4 & DEBUG_ON_4
   '   else
@ __CONFIG _CONFIG4L, _STVR_OFF_4L & _LVP_OFF_4L & _DEBUG_OFF_4L

' EEPROM BACKUP IMAGEM

DEFINE  I2C_SLOW 1                                     
'DASABILITE
DEFINE  I2C_HOLD 1

'WATCH DOG

DEFINE NO_CLRWDT 0

'CRISTAL PROXIMO DE 29 MHZ      (melhor opcao para i2c)
DEFINE OSC 32
DEFINE HSER_RCSTA 90h
DEFINE HSER_TXSTA 20h
DEFINE HSER_BAUD 115200
DEFINE HSER_CLROERR 1
DEFINE HSER_SPBRG 3

'LCD PARA O TELIT
Define LCD_BITS 4 ' 4-bit interface
Define LCD_LINES 2 ' 2 line LCD

' LCD should be connected as follows:
' LCD PIC
' DB4 PortB.0
' DB5 PortB.1
' DB6 PortB.2
' DB7 PortB.3

Define LCD_DREG PORTB
Define LCD_DBIT 0

' RS PortA.4 (add 4.7K pullup resistor to 5 volts)
Define LCD_RSREG PORTA
Define LCD_RSBIT 4

' E PortA.5
Define LCD_EREG PORTA
Define LCD_EBIT 5

' RW Ground
' Vdd 5 volts
' Vss Ground
' Vo 20K potentiometer (wire wiper to Vo, adjust for contrast)
' DB0-3 No connect

Define LCD_COMMANDUS 1500 ' Adjust for slower LCD modules
Define LCD_DATAUS 50

'Command Operation
' $FE, 1 Clear display
 
'$FE, 2 Return home (beginning of first line)
 
'$FE, $0C Cursor off
 
'$FE, $0E Underline cursor on
 
'$FE, $0F Blinking cursor on
 
'$FE, $10 Move cursor left one position
 
'$FE, $14 Move cursor right one position
 
'$FE, $C0 Move cursor to beginning of second line
 
'$FE, $94 Move cursor to beginning of third line

'$FE, $D4 Move cursor to beginning of fourth line

'TECLADO DO TELIX
key         VAR   BYTE     ' Key value
RB0_LCD_KBD var PORTB.0
RB1_LCD_KBD VAR PORTB.1
RB2_LCD_KBD VAR PORTB.2
RB3_LCD_KBD VAR PORTB.3
RB4_KBY     VAR PORTB.4
RB5_KBY     VAR PORTB.5
RB6_KBY     VAR PORTB.6
RB7_KBY     VAR PORTB.7

'COMUNICAÇÃO CONTROLE TELIT

C108_CTR     VAR PORTC.0
TELIT_ON_OFF VAR PORTC.5
'TELIT_RESET  VAR PORTC.2

'PARA CAMERA
RETRIES VAR WORD
B1 VAR BYTE
B2 VAR BYTE
B3 VAR BYTE
B4 VAR BYTE
B5 VAR BYTE
B6 VAR BYTE
FILE_LENGTH VAR WORD
PACKET_LENGTH VAR word
TEMP VAR BYTE
PACKET VAR WORD
NO_PACKET VAR WORD
INDEX_PACKAGE VAR word
INDEX_IMAGE VAR word
INDEX_I2C VAR WORD
BUFFER CON 256

'RESOLUCAO CAMERA

RESOLUCAO VAR BYTE

'VELOCIDADE CAMERA

TRUE CON 1
FALSE CON 0
BUFFER_V VAR WORD
BUFFER_AUX VAR WORD

' Define constants para I2c slave
I2Caddress CON   $02         ' Make our address 2

' Define used register flags
SSPIF   VAR     PIR1.3          ' SSP (I2C) interrupt flag
BF      VAR     SSPSTAT.0       ' SSP (I2C) Buffer Full
R_W     VAR     SSPSTAT.2       ' SSP (I2C) Read/Write
D_A     VAR     SSPSTAT.5       ' SSP (I2C) Data/Address
CKP     VAR     SSPCON1.4        ' SSP (I2C) SCK Release Control
SSPEN   VAR     SSPCON1.5        ' SSP (I2C) Enable
SSPOV   VAR     SSPCON1.6        ' SSP (I2C) Receive Overflow Indicator
WCOL    VAR     SSPCON1.7        ' SSP (I2C) Write Collision Detect

'PICBASIC CAUSE OF RESET

RI_CAUSE_OF_RESET VAR RCON.4
TO_CAUSE_OF_RESET VAR RCON.3
PD_CAUSE_OF_RESET VAR RCON.2
POR_CAUSE_OF_RESET VAR RCON.1
BOR_CAUSE_OF_RESET VAR RCON.0

'LIGA DESLIGA CAMERA

CAMERA_ON_OFF VAR PORTC.1

' Allocate RAM

i2c_index       var     byte              'Indice Vector i2c
vetor_i2c_index var     byte[54]          'Vetor I2c
RESULT          VAR     BYTE              ' DISPOSITIVO RESPONDE COM 1 OU TECLA
DATAIN          VAR     BYTE
OPCAO_I2C_PERIF VAR     BYTE

'GUARDA UM FRAME DA IMAGEM

IMAGE VAR BYTE[BUFFER]

'AQUI COMEÇA O PROGRAMA PRINCIPAL

'PORTA CONTROLE TELIT
       
        PORTC = 0
        TRISC.0 = 1           '00000001
        'TRISC.2 = 0 NAO MAIS RESET TELIT...APENAS ON OFF

'PAUSA PARA INICIALIZAÇÕES

        'PAUSE 500

' Initialize I2C slave mode

        SSPADD = I2Caddress         ' Set our address
        SSPCON2 = 0             ' General call address disabled
        SSPCON1 = $36             ' Set to I2C slave with 7-bit address

        i2c_index = 0

        INTCON2.7 =    0           'Enable PORTB pull-ups para Teclado Telit
        ADCON1 = 7                 'ALL PIN DIGITAL (portA)
       
        'PARA TAMANHO BUFFER (LSB E MSB)
       
        BUFFER_V = BUFFER           
       
        'PARA PEGAR LSB E MSB
        BUFFER_AUX = BUFFER_V - 6
       
        'ZERA INDEXADOR INDEX_IMAGE
       
        INDEX_IMAGE = 0   
       
        'I2C PERIPHERAL
        OPCAO_I2C_PERIF = " "
       
        'STARTUP (SINALIZA)
               
        'PAUSE 1000 ; AGUARDA LCD INICIALIZAR

'loopis:
 '      HSerout ["hello my world",13,10] 'CONVERSAR COM A CAMARA????, OU LEITOR???
 '      PAUSE 1000       
 '      goto loopis
       
        'HSERIN 1000,LIMPA_BUFFER,[B1,B2,B3,B4,B5,B6] 'SOMENTE NO PROTEUS

        'GOSUB TIRA_FOTO

'HABILITA INTERRUPT SSP
'ON INTERRUPT goto I2C_ISR
'GLOBAL  = 1

        'GOSUB CAMERA_SETUP
       
'HABILITA WATCH DOG       

        'WDTCON.0 = 0

'TELIT RESET

        'TELIT_RESET = 0

'MOSTRA MODO OPERACAO TELIT

IF RI_CAUSE_OF_RESET = 1 THEN
   IF TO_CAUSE_OF_RESET = 1 THEN
      IF PD_CAUSE_OF_RESET = 1 THEN
         IF POR_CAUSE_OF_RESET = 0 THEN
            IF BOR_CAUSE_OF_RESET = 0 THEN
                    if C108_CTR = 1 then
                        lcdout $fe,1," MODO EXECUCAO"
                        LCDOUT $fe,$c0,"AGUARDANDO APLIC"
                    else
                        lcdout $fe,1," MODO DE UPLOAD"
                    endif       
                    'LIGA CAMERA
                    TRISC.1 = 0
                    CAMERA_ON_OFF = 1
                    'LIGA TELIT
                    TRISC.5 = 0         
                    TELIT_ON_OFF = 1
                    PAUSE 1000
                    CLEARWDT
                    PAUSE 1000
                    CLEARWDT
                    PAUSE 1000
                    CLEARWDT
                    TELIT_ON_OFF = 0
                    TRISC.5 = 1
                    '3 PAUSE FOR CAUSA DO WATCH-DOG
            ENDIF
         ENDIF
      ENDIF
   ENDIF
ENDIF

' LIGA CAMERA
                    TRISC.1 = 0
                    CAMERA_ON_OFF = 1

'APENAS PARA INICIALIZAR TXD/RXD

        'GOSUB CAMERA_CONNECT

        WHILE TRUE
           CLEARWDT
           IF SSPIF = TRUE Then         ' Check for I2C interrupt flag
                GoSub i2cslave
           EndIF           
           'call getkey
           'lcdout $fe,1,dec key
           'pause 100         
        WEND
       
'***********************************************
'LEITURA DO TECLADO
'BUG: UMA TECLA POR VEZ DEVE SER PRESSIONADA
'MELHORADA PARA SER MAIS RÁPIDA
'***********************************************
getkey:
        key = 16
        RB0_LCD_KBD = 0:RB1_LCD_KBD = 1:RB2_LCD_KBD = 1:RB3_LCD_KBD = 1
        IF RB4_KBY = 0  THEN KEY = 0         
        IF RB5_KBY = 0  THEN KEY = 1
        IF RB6_KBY = 0  THEN KEY = 2
        IF RB7_KBY = 0  THEN KEY = 12
        RB0_LCD_KBD = 1:RB1_LCD_KBD = 0:RB2_LCD_KBD = 1:RB3_LCD_KBD = 1
        IF RB4_KBY = 0  THEN KEY = 3 
        IF RB5_KBY = 0  THEN KEY = 4 
        IF RB6_KBY = 0  THEN KEY = 5 
        IF RB7_KBY = 0  THEN KEY = 13
        RB0_LCD_KBD = 1:RB1_LCD_KBD = 1:RB2_LCD_KBD = 0:RB3_LCD_KBD = 1
        IF RB4_KBY = 0  THEN KEY = 6 
        IF RB5_KBY = 0  THEN KEY = 7 
        IF RB6_KBY = 0  THEN KEY = 8 
        IF RB7_KBY = 0  THEN KEY = 14
        RB0_LCD_KBD = 1:RB1_LCD_KBD = 1:RB2_LCD_KBD = 1:RB3_LCD_KBD = 0
        IF RB4_KBY = 0  THEN KEY = 9 
        IF RB5_KBY = 0  THEN KEY = 10
        IF RB6_KBY = 0  THEN KEY = 11
        IF RB7_KBY = 0  THEN KEY = 15
        RETURN
       
'**************************************************************************************
'*  Sends a 6-byte long packet to the camera.
'**************************************************************************************
SEND_CAMERA:
        HSEROUT[B1,B2,B3,B4,B5,B6]
        RETURN
       
'**************************************************************************************
'*  (Re) connects and resynchronize to the camera, possibly waking it
'*  up from auto-power save feature.
'**************************************************************************************
'**************************************************************************************
'*  Receives an ACKNOWLEDGE packet. Logs a message on the debug stream in
'*  case of errors.
'**************************************************************************************
CAMERA_CONNECT:
        RESULT = 0
        FOR RETRIES = 1 TO 60           'FIQUE TENTANDO
            b1 = $aa                      'ENVIANDO PACOTES DE SYNC
            b2 = $0d
            b3 = 0
            b4 = 0
            b5 = 0
            b6 = 0
            gosub send_camera
            HSERIN 45,TIME_OUT_CAMERA,[B1,B2,B3,B4,B5,B6]
            if (B1 = $AA) AND (B2 = $0E) AND (B3 = $0D) AND (B5 = $00) AND (B6 = $00) THEN
                RESULT = 1
                GOTO SAI_CAMERA_CONNECT                          'ENTAO SINCRONIZE O PACOTE
            ENDIF
            'ERRO CRITICO, CAMERA COM PROBLEMAS
            IF (B1 = $AA) AND (B2 = $0F) THEN
                RESULT = B5
                GOTO SAI_CAMERA_CONNECT_II
             ENDIF           
TIME_OUT_CAMERA:
             CLEARWDT
        NEXT RETRIES
        'NAO CONSEGUIU COMUNICAR COM CAMERA :(
        RESULT = $0E
        'BASIC4EVER
        'GOTO SAI_CAMERA_CONNECT_II
SAI_CAMERA_CONNECT:
            HSERIN 45, SAI_CAMERA_CONNECT_II,[B1,B2,B3,B4,B5,B6]
            IF (B1 = $AA) AND (B2 = $0D) AND (B3 = $00) AND (B4 = $00) AND (B5 = $00) AND (B6 = $00) THEN
                RESULT = 2
                b1 = $AA                    'CONFIRME SYNC COM PACOTE DE ACK
                b2 = $0E
                b3 = $0D
                b4 = 0
                b5 = 0
                b6 = 0
                gosub SEND_CAMERA
            ELSE
                RESULT = $0E
            ENDIF
SAI_CAMERA_CONNECT_II:
            RETURN

'**************************************************************************************
'*  Receives an ACKNOWLEDGE packet. Logs a message on the debug stream in
'*  case of errors.
'**************************************************************************************
acknowledge:
    HSERIN 45,SAI_acknowledge,[B1,B2,B3,B4,B5,B6]
    IF B1<>$AA THEN
        IF B2<>$0E THEN
           'lcdout $fe,138, "ERROR"
        ENDIF
    ENDIF           
SAI_acknowledge:   
    RETURN

'**************************************************************************************
'*  Connects to the camera and sets the resolution given.
'*  Sets buffer size for picture data transfers to BUFFER SIZE bytes.
'*  Resolution can be one of two values: vgaResolution (640x480)
'*  and cctvResolution (320x200)
'**************************************************************************************
CAMERA_SETUP:
    b1 = $AA                   
    b2 = $01
    b3 = $00
    b4 = $07
    b5 = $07
    b6 = RESOLUCAO   
    GOSUB SEND_CAMERA
    GOSUB acknowledge

    if (B1 = $AA) AND (B2 = $0E) AND (B3 = $01) AND (B5 = $00) AND (B6 = $00) THEN   
        RESULT = 1
    'SETA O TAMANHO DO BUFFER
        b1 = $AA                   
        b2 = $06
        b3 = $08
        b4 = BUFFER_V.LOWBYTE
        b5 = BUFFER_V.HIGHBYTE
        b6 = $00
        GOSUB SEND_CAMERA
        GOSUB acknowledge
        'LCDOUT $FE,1, HEX B1, " ",HEX B2, " ",HEX B3, " ",HEX B4, " ",HEX B5, " ",HEX B6, " "
        'PAUSE 15000
        if (B1 = $AA) AND (B2 = $0E) AND (B3 = $06) AND (B5 = $00) AND (B6 = $00) THEN   
            RESULT = 2
        ENDIF
    ENDIF

    RETURN       

'********************************************************
'TAKE A PICTURE
'********************************************************
CAMERA_SNAPSHOT:
            b1 = $AA                   
            b2 = $05
            b3 = $00
            b4 = $00
            b5 = $00
            b6 = $00
            GOSUB SEND_CAMERA   'Send SNAPSHOT command...
            GOSUB acknowledge   '...and get acknowledge.
            'HSEROUT [HEX B1, HEX B2, HEX B3]
            if (B1 = $AA) AND (B2 = $0E) AND (B3 = $05) AND (B5 = $00) AND (B6 = $00) THEN               
                RESULT = 1
            ELSE
                RESULT = 2
            ENDIF
            RETURN
'**************************************************************************************
'*  Takes a snapshot and dumps picture data to input/output stream #3
'*  The caller must open the stram prior to call - this routine knows nothing
'*  of where data is actually going.
'**************************************************************************************
GET_IMAGE:
        b1 = $AA                   
        b2 = $04
        b3 = $01
        b4 = $00
        b5 = $00
        b6 = $00
        GOSUB SEND_CAMERA   'Request snapshot data header
        gosub  acknowledge
       
        if (B1 = $AA) AND (B2 = $0E) AND (B3 = $04) AND (B5 = $00) AND (B6 = $00) THEN   
            HSERIN 45,SAI_GET_IMAGE,[B1,B2,B3,B4,B5,B6] '...then command response.
            RESULT = 1

            if (B1 = $AA) AND (B2 = $0A) AND (B3 = $01) THEN
                FILE_LENGTH = B6
                FILE_LENGTH = FILE_LENGTH * 256
                FILE_LENGTH = FILE_LENGTH + B5
                FILE_LENGTH = FILE_LENGTH * 256
                FILE_LENGTH = FILE_LENGTH + B4
                NO_PACKET = FILE_LENGTH / (BUFFER - 6)
                INDEX_I2C = 0
                RESULT = 2
             ENDIF
        ENDIF
SAI_GET_IMAGE:
        RETURN       

'****************************************************************
'**********              SOLICITA PACOTE        *****************
'****************************************************************
SOLICITA_PACOTE:
        IF  PACKET > NO_PACKET THEN
            b1 = $AA                   
            b2 = $0E
            b3 = $00
            b4 = $00
            b5 = $F0
            b6 = $F0
            GOSUB SEND_CAMERA   'SEND ACK
        ELSE
            RETRIES = 0
            WHILE RETRIES <> 20
                b1 = $AA                   
                b2 = $0E
                b3 = $00
                b4 = $00
                b5 = PACKET.LOWBYTE
                b6 = PACKET.HIGHBYTE
                GOSUB SEND_CAMERA 
                GOSUB LE_FRAME 
            WEND         
         ENDIF
         PACKET = PACKET + 1
        'HSEROUT [" ",HEX B1, " ",HEX B2, " ",HEX B3, " ",HEX B4, " ",HEX B5, " ",HEX B6, " ", dec file_length]
        RETURN

'****************************************************************
'LIMPA USART, GARANTIR QUE NAO TENHA DADO NO BUFFER
'****************************************************************
CLEAR_USART:
        HSERIN 1,TIME_OUT_CLEAR_USART,[TEMP]
TIME_OUT_CLEAR_USART:       
        RETURN
 
'****************************************************************
'********** TEM MAIS FRAME PARA SER LIDO OU NAO *****************
'****************************************************************
'45 TROCAR PARA 1
TIME_OUT_LE_FRAME:
            'lcdout $fe,138, "ERROR2"
            IMAGE[0] = PACKET.LOWBYTE
            IMAGE[1] = PACKET.LOWBYTE
            RETURN
LE_FRAME:
            RETRIES = RETRIES + 1
            HSERIN 6,TIME_OUT_LE_FRAME,[TEMP]
            HSERIN 6,TIME_OUT_LE_FRAME,[TEMP]
            HSERIN 6,TIME_OUT_LE_FRAME,[PACKET_LENGTH.LOWBYTE]
            HSERIN 6,TIME_OUT_LE_FRAME,[PACKET_LENGTH.hIGHBYTE]
            if PACKET_LENGTH > BUFFER_AUX THEN
                'lcdout $fe,138, "ERROR3"
                GOTO TIME_OUT_LE_FRAME
                RETURN
            ENDIF
            FOR INDEX_PACKAGE = 0 TO PACKET_LENGTH - 1
                HSERIN 6,TIME_OUT_LE_FRAME,[IMAGE[INDEX_PACKAGE]]
                'DECREMENTA PARA TELIT MONITORAR SE CHEGOU A ZERO...
                FILE_LENGTH = FILE_LENGTH - 1
                CLEARWDT
            NEXT INDEX_PACKAGE
            HSERIN 6,TIME_OUT_LE_FRAME,[TEMP]       
            HSERIN 6,TIME_OUT_LE_FRAME,[TEMP]
SAI_LE_FRAME:
            RETRIES = 20
            RETURN

'************************************************************
'* TRATA I2C SE É ESCRITA, LEITURA OU ID
'************************************************************
i2cslave:                               ' I2C slave subroutine
      SSPIF = 0                         ' Clear interrupt flag
       
        IF R_W = 1 Then i2crd                ' Read data from us

        IF BF = 0 Then i2cexit               ' Nothing in buffer so exit
       
        IF D_A = 1 Then i2cwr                ' Data for us (not address) 1 = DATA

        IF SSPBUF != I2Caddress Then i2cexit ' Clear the address from the buffer
       
        i2c_index = 0                     ' Mark as first read

        GoTo i2cexit

i2cwr:       
                                                    ' I2C write data to us
        datain = SSPBUF                         ' Put data into array
        vetor_i2c_index[i2c_index] = datain
        i2c_index = i2c_index + 1                   'REMOVER COMENTARIO DEPOIS

        if DATAIN = $00 then      'SE DEU LIMITE DO LCD OU NULL
            i2c_index = 0
            gosub Analisa_Pacote_I2c
        endif

        GoTo i2cexit

i2crd:                                            ' I2C read data from us
       
        IF D_A = 0 Then                                ' ADDRESS
                i2c_index = 0                         ' Mark as first read
        EndIF

        'SE OPCAO FOR CAMERA....SNAPSHOT OU NEXT FRAME
        IF OPCAO_I2C_PERIF = "N" THEN                 
           RESULT = IMAGE[INDEX_IMAGE]
           INDEX_IMAGE = INDEX_IMAGE + 1
           IF INDEX_IMAGE = PACKET_LENGTH THEN
              IF FILE_LENGTH <= BUFFER - 6  THEN
                 IMAGE[0] = FILE_LENGTH.lowbyte
                 IMAGE[1] = FILE_LENGTH.highbyte
              ELSE
                 IMAGE[0] = BUFFER_AUX.LOWBYTE
                 IMAGE[1] = BUFFER_AUX.HIGHBYTE
              ENDIF
              INDEX_IMAGE = 0             
           ENDIF
        ENDIF
        SSPBUF = RESULT
        CKP = 1                                       ' Release SCL line
        GoTo i2cexit               ' That's it

i2cexit:
      Return

'**********************************************************
'ANALISA O QUE MASTER QUER DO DISPOSITIVO I2C
'**********************************************************
Analisa_Pacote_I2c:
        RESULT = 0
        'P(S) = PICTURE SNAPSHOT  'P(N) = PICTURE NEXT FRAME
        IF vetor_i2c_index[0] = "C" THEN                'SOLICITACAO CAMERA
            IF vetor_i2c_index[1] = "N" THEN            'FOI SOLICITADO PROXIMO PACOTE FOTO
                OPCAO_I2C_PERIF = "N"
                GOSUB CLEAR_USART
                GOSUB SOLICITA_PACOTE
                'POR CAUSA DAQUELES 2 BYTES QUE TEM O TAMANHO NO BUFFER
                INDEX_IMAGE = 0
                RETURN
            ENDIF

            IF vetor_i2c_index[1] = "F" THEN            'FOI SOLICITADO TIRAR FOTO
                OPCAO_I2C_PERIF = "F"
                GOSUB GET_IMAGE
                INDEX_IMAGE = 0
                PACKET = 0
                RETURN
            ENDIF

            IF vetor_i2c_index[1] = "S" THEN            'FOI SOLICITADO SETUP CAMERA
                RESOLUCAO = vetor_i2c_index[2]
                'PARAMETRO RESOLUCAO PASSADO
                OPCAO_I2C_PERIF = "S"
                RESULT = FALSE
                GOSUB CAMERA_SETUP
                RETURN
            ENDIF

            IF vetor_i2c_index[1] = "Y" THEN            'FOI SOLICITADO SYNC CAMERA
                OPCAO_I2C_PERIF = "Y"
                RESULT = FALSE
                GOSUB CAMERA_CONNECT
                RETURN
            ENDIF

            IF vetor_i2c_index[1] = "H" THEN            'FOI SOLICITADO SYNC CAMERA
                OPCAO_I2C_PERIF = "H"
                RESULT = FALSE
                GOSUB CAMERA_SNAPSHOT
                RETURN
            ENDIF
        ENDIF

        IF vetor_i2c_index[0] = "D" THEN                'LCD REQUISITADO
            OPCAO_I2C_PERIF = "D"                       'FOI SOLICITADO LCD
            I2C_INDEX = 1                               'MANDA CARACTERES DE CONTROLE
            WHILE vetor_i2c_index[I2C_INDEX]<>0         'OU DADOS PARA LCD
                  lcdout vetor_i2c_index[I2C_INDEX]
                  I2C_INDEX = I2C_INDEX + 1
            WEND
            RESULT = 1                                 'DISPOSTIVO LCD RESPONDEU
            RETURN         
        ENDIF

        IF vetor_i2c_index[0] = "K" THEN
            OPCAO_I2C_PERIF = "K"                       'FOI SOLICITADO TECLADO TELIT
            GOSUB getkey                               'DISPOSITIVO RESPONDEU COM STATUS TECLA
            RESULT = KEY               
            RETURN
        ENDIF

        IF vetor_i2c_index[0] = "1" THEN               
           OPCAO_I2C_PERIF = "1"         'FOI SOLITADO LIGAR CAMERA
           TRISC.1 = 0
           CAMERA_ON_OFF = 1
           RETURN
        endif

        IF vetor_i2c_index[0] = "0" THEN               
           OPCAO_I2C_PERIF = "0"         'FOI SOLITADO LIGAR CAMERA
           TRISC.1 = 0
           CAMERA_ON_OFF = 0
           RETURN
        endif

        IF vetor_i2c_index[0] = "R" THEN
            OPCAO_I2C_PERIF = "R"                       'FORCE UM RESET           
            'DESLIGA CAMERA E ESPERA RESETAR...
            TRISC.1 = 0
            CAMERA_ON_OFF = 0
            PAUSE 1000
            CLEARWDT
            PAUSE 1000
            CLEARWDT
            'CAMERA_ON_OFF = 1
            PAUSE 5000           
        ENDIF

        return
 
    END