prueva con usart.h y masterI2C.h

Página 2 de 2. Precedente  1, 2

Ver el tema anterior Ver el tema siguiente Ir abajo

Re: prueva con usart.h y masterI2C.h

Mensaje  alejandro el Sáb 19 Sep 2009 - 23:22

ok,termino de montar el circuito y paso a los test de comunicaciòn.te hago saber,vale??

alejandro
Participante Activo
Participante Activo

Cantidad de envíos: 41
Fecha de inscripción: 12/02/2009

Volver arriba Ir abajo

Re: prueva con usart.h y masterI2C.h

Mensaje  alejandro el Vie 9 Oct 2009 - 12:39

he construido el circuito 2 semanas atràs.
si uso este codigo con el 16F767 y una Eeprom 24C64 o una 24C256 funciona:
Código:

''''''''''''''' CONFIGURACION DEL PIC '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
#chip 16F767, 20                                  'modelo de pic y velocidad de reloj
#config CP_OFF,DEBUG_OFF,WDT_OFF,PWRTE_ON,VBOR_2_7,BOREN_0,MCLR_ON,OSC=HS,IESO_OFF,FCMEN_OFF
#include <MasterI2C.h>
''''''''''''''' SETUP MASTER I2C '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' 
#define ClockValue b'00010000'                    'ClockValue o SSPADD = (FOSC / (4 * Baud)) - 1  ---  16 = 312500 HZ
''''''''''''''' VARIABLES '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
DIM Index_Byte,Address_mem,vValor AS BYTE
DIM Slv_Motores_Wr,Slv_Motores_Rd AS BYTE
DIM Slv_Comunicacion_Wr,Slv_Comunicacion_Rd AS BYTE
DIM Slv_Mem_Wr,Slv_Mem_Rd AS BYTE
''''''''''''''' SUB PROCEDURAS ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
SUB I2C_Master_to_Memory(MemAddress,Dato)#NR
    Start                                        'Start I2C
    TxI2C(Slv_Mem_Wr)                            'Device ID Slave
    TxI2C(MemAddress_H)                          'Device high Address memory
    TxI2C(MemAddress)                            'Device low Address memory
    TxI2C(Dato)                                  'Send low byte data
    Stop                                          'Stop I2C
END SUB

SUB I2C_Master_to_Slave(IDAddress,Dato)#NR
    Start                                        'Start I2C
    TxI2C(IDAddress)                              'Device ID write byte
    TxI2C(Dato)                                  'Send byte size data
    Stop                                          'Stop I2C 
END SUB 
''''''''''''''' PARAMETROS ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
INTCON=b'00000000'
ADCON1=b'10001111'
TRISA=b'000000'                                  'Puerto A todos out
TRISB=b'00000000'                                'Puerto B todos out
TRISC=b'00011000'                                'Puerto B 3/4 in,los demas out
PORTA=b'00000'                                    'Puerto A todos down
PORTB=b'00000000'                                'Puerto B todos down
PORTC=b'00000000'                                'Puerto C todos down
Address_mem=0                                    'Inicializo la variable del Address
vValor=0                                          'Inicializo la variable del dato
Slv_Comunicacion_Wr=0xA2                          'b'10100010'
Slv_Comunicacion_Rd=0xA3                          'b'10100011'
Slv_Motores_Wr=0xA4                              'b'10100100'
Slv_Motores_Rd=0xA5                              'b'10100101'
Slv_Mem_Wr=0xA6                                  'b'10100110'
Slv_Mem_Rd=0xA7                                  'b'10100111'
''''''''''''''' INICIA ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
InitI2C 
WAIT 500 ms                                      'Inicia la comunicacion                               
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
DO
  I2C_Master_to_Memory(Address_mem,vValor)      'Envia dato a la memoria
  Address_mem=Address_mem+1                      'Incrementa Address_mem de 1
  vValor=vValor+1                                'Incrementa vValor de 1
LOOP UNTIL Address_mem=0xFF
''''''''''''''' TERMINA '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
END

escribe en la Eeprom perfectamente.

màs si cambio el codigo para conversar con el slave:
Código:

DO
  I2C_Master_to_Slave(Slv_Comunicacion_Wr,vValor) 'Envia dato al slave,esperemos.....
  vValor=vValor+1                                'Incrementa vValor de 1
  WAIT 20 ms                                      'Espera escritura
LOOP UNTIL Address_mem=0xFF
''''''''''''''' TERMINA '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''


este es el codigo en el slave:
Código:


'''''''''''''''''''''''''''''''''''''' CONFIGURACION DEL PIC ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
#chip 16f88,4
#config OSC=XT,WDT_OFF,PWRTE_ON,MCLR_ON,CP_OFF
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
#include <SSP_I2C_PicSlave.h>                  'libreria I2C slave
''''''''''''''' SETUP SLAVE I2C '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
#define PicSlave 0xA2                          'Configuro Pic_Slave I2C_address
#define BufferLen 1                            'Cuantos byte en recepciòn para activar el interrupt
''''''''''''''' VARIABLES '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
DIM RxBuffer(RxBufferSize) 
DIM Address_Eeprom AS BYTE
''''''''''''''' SUB PROCEDURAS ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Sub I2C_Interrupt                              'Subrutina interrupciones I2C
    EPWrite(Address_Eeprom,RxBuffer(1))        'Recibe byte del Master y lo escribe en la Eeprom del microchip
    Address_Eeprom=Address_Eeprom+1
    WAIT 5 ms
End Sub
''''''''''''''' PARAMETROS ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
TRISA=b'00000'                                  'Puerto A todos out
TRISB=b'00010010'                              'Puerto B 1 y 4 in,los demas out
PORTA=b'00000'                                  'Puerto A todos down
PORTB=b'00000000'                              'Puerto B todos down
Address_Eeprom=0
'''''''''''''' INICIA '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
On Interrupt SSP1Ready call I2C_Interrupt      'Se hay un envio del Master
InitSSP                                        'Configuracion registros SSP y activar el interrupt 
WHILE True
  '''''''''''''''''''''''''''''''''''''''
WEND

sinceramente he ido al sitio de GCBasic,màs tengo problemas al postar el codigo.aparte el mio ingles.

alejandro
Participante Activo
Participante Activo

Cantidad de envíos: 41
Fecha de inscripción: 12/02/2009

Volver arriba Ir abajo

Re: prueva con usart.h y masterI2C.h

Mensaje  alejandro el Vie 9 Oct 2009 - 12:43

me olvidava.tambien usando el mikrobasic(la prueva del nueve,mas quisiera hacer todo el codigo en GCBasic) tengo el mismo problema.solo que algunos caracteres son escritos en modo casual.

alejandro
Participante Activo
Participante Activo

Cantidad de envíos: 41
Fecha de inscripción: 12/02/2009

Volver arriba Ir abajo

Re: prueva con usart.h y masterI2C.h

Mensaje  Pikitin el Sáb 10 Oct 2009 - 22:45

Que tal alejandro?

Mira... yo no conozco el I2C, pero por lo que veo en la librería ( SSP_I2C_PicSlave.h ) no tienes que hacer nada con las interrupciones, entonces he añadido una linea a SS_I2C_PicSlave.h para que "avise" cuando recive dato ( I2C_rec_flag ).
También he cambiado la forma como configura las interrupciones por lo que te comenté en anteriores mensajes.

Esta es la nueva versión:
Código:


'***************************************************************
'This library is for the use of a Pic device as an I2C Slave
'thru the Synchronous Slave Port (SSP). This is a port of the
'Microchip AN734a to GCBasic.
'By Kent Schafer August 16,2007 - Modified October 10, 2009
'
'Pic is a tm of Microchip, I2C is a tm of Phillips/NXP
'***************************************************************

Dim I2C_rec_flag as bit        'data received flag

Sub InitSSP
    SSPCON = 0x36 'set for 7 bit address
    SSPADD = PicSlave 'I2C address of slave

    #script 'GCBasic treats AnyArray(1) as variable
        RxBufferSize = BufferLen
        if BufferLen = 1 then RxBufferSize = 2
    #endscript
   
    On Interrupt SSP1Ready call SlaveStatus 'Setup Interrupt
End Sub

Sub SlaveStatus
    SSPSTATtemp = SSPSTAT AND b'00101101'

    Select Case SSPSTATtemp
        'Case #1 Write operation, last byte was an address, buffer full
        Case b'00001001'
            For index = 1 to BufferLen
                RxBuffer(index) = 0
            Next
            DummyRead = SSPBUF 'Dummy read of SSBUF

        'Case #2 Write operation, last byte was data, buffer full
        Case b'00101001'
            For index = 1 to BufferLen
                RxBuffer(index) = SSPBUF
            Next
            Set I2C_rec_flag on

        'Case #3 Read Operation, last bytes was an address, buffer is empty
        Case b'00001100'
            index = 1
            BufferTemp = RxBuffer(index)
            WriteI2C BufferTemp

        'Case #4 Read operation, last byte was data, buffer is empty
        Case b'00101100'
            For index = 2 to BufferLen
                BufferTemp = RxBuffer(index)
                WriteI2C BufferTemp
            Next

        'Case #5 A Nack was received when transmitting data from master
        Case b'00101000'
        'Set ERROR On
    End Select
End Sub


Sub WriteI2C(BufferTemp)#NR
    Do: Loop While BF = 1          'Is buffer full?
    Do
        WCOL = 0                    'Clear the collision flag
        SSPBUF = BufferTemp
    While WCOL = 1                  'Was there a collision?
    CKP = 1                        'Release clock
End sub




Y este ejemplo de uso (modificando tu programa):

Código:


'''CONFIGURACION DEL PIC
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
#chip 16f88,4
#config OSC = HS, WDT_OFF, PWRTE_ON, MCLR_ON, CP_OFF

'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
#include <SSP_I2C_PicSlave.h>                    'libreria I2C slave

'SETUP SLAVE I2C ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
#define PicSlave 0xA2                          'Configuro Pic_Slave I2C_address
#define BufferLen 1                            'Cuantos bytes se

''VARIABLES'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
DIM RxBuffer(RxBufferSize) 
DIM Address_Eeprom AS BYTE

''SUB PROCEDURAS '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

Sub I2C_Received                                'Subrutina recibido I2C
    EPWrite(Address_Eeprom,RxBuffer(1))        'Recibe byte del Master y lo escribe en la Eeprom
    Address_Eeprom=Address_Eeprom+1
End Sub

''PARAMETROS'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
TRISA=b'00000'                                  'Puerto A todos out
TRISB=b'00010010'                              'Puerto B 1 y 4 in,los demas out
PORTA=b'00000'                                  'Puerto A todos down
PORTB=b'00000000'                              'Puerto B todos down
Address_Eeprom = 0

'INICIA'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
InitSSP                                        'Configuracion SSP y activar el interrupt 

Do
    If I2C_rec_flag on then call I2C_Received          'Si ha recibido byte llama a sub
Loop

Pikitin
veterano
veterano

Cantidad de envíos: 325
Fecha de inscripción: 26/11/2008

Volver arriba Ir abajo

Re: prueva con usart.h y masterI2C.h

Mensaje  alejandro el Sáb 10 Oct 2009 - 23:15

no mal como idea.
mas antes de modificar la libreria(ya he hecho una modifica en la libreria para el master y ahora "escribe" bien en las memorias esternas.antes no funcionaba) lo hare en el codigo esterno.
la modifica de la libreria MasterI2C.h es esta para el 16F767:
Código:

sub InitI2C 'Disable slew rate control (SMP)
  SSPSTAT = b'11000000'            'ClockValue or SSPADD = (FOSC / (4 * Baud)) - 1  -----  original es b'10000000'
  SSPADD = ClockValue 'Clear the register, only cleared on POR
  SSPCON2 = 0 'Set SSPEN and SSPMx bits for SSP Enable and Master I2C mode
  SSPCON = b'00111000'              'original es b'00101000'
  SET PIR1.SSPIF OFF
  SET PIR2.BCLIF OFF 
end sub

mañana hago las pruevas.
esperemos bien........

alejandro
Participante Activo
Participante Activo

Cantidad de envíos: 41
Fecha de inscripción: 12/02/2009

Volver arriba Ir abajo

Re: prueva con usart.h y masterI2C.h

Mensaje  alejandro el Dom 11 Oct 2009 - 17:21

nada...........
no quiere saber nada.en cambio con la Eeprom funciona.
hare un test del circuito.

alejandro
Participante Activo
Participante Activo

Cantidad de envíos: 41
Fecha de inscripción: 12/02/2009

Volver arriba Ir abajo

Re: prueva con usart.h y masterI2C.h

Mensaje  alejandro el Jue 15 Oct 2009 - 20:10

la situaciòn es esta.
en los pin SDA y SCL de los slave y memoria 24C64/24C256 saldadas resistencias de 270 Ohm para "cortar perturbaciones" en la linea I2C.
continua a "escribir" en las memorias perfectamente.mas los slave no quieren saber de escribir en las memorias internas.a este punto tengo dudas si los datos llegan o el interrupt funciona.en la procedura interrupt pongo solo un test con led.
Código:

Sub I2C_Interrupt                             
    IF SET PORTB.7 OFF THEN SET PORTB.7 ON
    IF SET PORTB.7 ON THEN SET PORTB.7 OFF
End Sub

veamos si funciona.................
Puede ser que los micros slave funcionen solo a 100KHZ y que tenga que cambiar las resistencias de pull-up de 2K2 con las resistencias de 10K??????

alejandro
Participante Activo
Participante Activo

Cantidad de envíos: 41
Fecha de inscripción: 12/02/2009

Volver arriba Ir abajo

Re: prueva con usart.h y masterI2C.h

Mensaje  Pikitin el Vie 16 Oct 2009 - 5:28

Solo un detalle:

Código:
IF PORTB.7 OFF THEN SET PORTB.7 ON

No vale: IF SET..

No sé muy bién como funciona I2C, entonces a ver si preguntando me entero:

¿los datos los mandas con otro pic?
¿para enviar cada dato envias: I2Caddress+dato?... I2Caddress creo que esto es para comunicar con varios slaves.. no?

En el cado de escribir a una eeprom externa, ¿tienes que mandar I2Caddress+direccion(memoria)+dato ?


Saludos.

Pikitin
veterano
veterano

Cantidad de envíos: 325
Fecha de inscripción: 26/11/2008

Volver arriba Ir abajo

Re: prueva con usart.h y masterI2C.h

Mensaje  alejandro el Vie 16 Oct 2009 - 12:31

No vale: IF SET..

gracias,hare las correcciones necesarias.

¿los datos los mandas con otro pic?

si,el master envia o pide informaciòn a los slave y a la memoria de sistema.
el bus es compuesto de:
1 master 16F767 (control sensores,accionamiento de los motores,ruta,calculo de la misma,pedido al chip de comunicaciòn de enviar a traves del modulo radio los datos al PC,etc...)
1 slave 16F876A para control de los motores(PID+odometro+control de consumo de corriente,etc...) --> ID_Address=0xA4
1 slave 16F88(gestiòn de la comunicaciòn en entrada y salida de datos para y del PC) --> ID_Address=0xA2
1 memoria 24C256(la caja negra del rover) --> ID_Address=0xA6

¿para enviar cada dato envias: I2Caddress+dato?... I2Caddress creo que esto es para comunicar con varios slaves.. no?

si, la comunicaciòn entre chip(master <--> slave) es:
inicio de la comunicaciòn I2C --> envio ID_Address --> envio dato o pedido de datos al slave.
el ID_Address en los micros se establece a nivel software.
en las memorias con la conexiòn o menos al Vcc(+5V).
ejemplo:
pin1 + pin2 al Vcc -- pin 3 al GND
en binario:
1010 -- fijos,son el head
0 -- pin 3 al GND=0
1 -- pin 2 al Vcc=1
1 -- pin 1 al Vcc=1
x -- bit de escritura/lectura.si es =1 entonces el ID_Address avisa que a ese dispositivo el master pedira una informaciòn.si es =0 avisa que el master pedira una escritura sobre el dispositivo
1010 0 11 0 =166=0xA6(en escritura.bit 0=0)
1010 0 11 1 =167=0xA7(en lectura.bit 0=0)
En el cado de escribir a una eeprom externa, ¿tienes que mandar I2Caddress+direccion(memoria)+dato ?

depende de la memoria.las memorias hasta el valor 24C16 es asi.
en cambio las memorias desde la 24C32 en adelante se deve enviar:
ID_Address de la memoria
High_byte del Address(direcciòn de la memoria a donde va a parar el dato)
Low_byte del Address(direcciòn de la memoria a donde va a parar el dato)
Dato
Código:

SUB I2C_Master_to_Memory(MemAddress,Dato)#NR
    Start                                                'Start I2C
    TxI2C(Slv_Mem_Wr)                            'Device ID Slave
    TxI2C(MemAddress_H)                          'Device high Address memory
    TxI2C(MemAddress)                            'Device low Address memory
    TxI2C(Dato)                                      'Send low byte data
    Stop                                                'Stop I2C
END SUB


SUB I2C_Master_to_Slave(IDAddress,Dato)#NR
    Start                                        'Start I2C
    TxI2C(IDAddress)                              'Device ID write byte
    TxI2C(Dato)                                  'Send byte size data
    Stop                                          'Stop I2C 
END SUB 

alejandro
Participante Activo
Participante Activo

Cantidad de envíos: 41
Fecha de inscripción: 12/02/2009

Volver arriba Ir abajo

Re: prueva con usart.h y masterI2C.h

Mensaje  alejandro el Mar 17 Nov 2009 - 20:24

de nuevo acà.estube parado con el projecto por culpa de los motores nuevos.tube que cambiar el esquema.ahora funcionan muy bien.este es el nuevo esquema.los terminales Enable_X son conectados a pin1(Enable_1) y pin9(Enable_2) del L293B(down=habilitado - low=deshabilitado).
PWM_X_A y PWM_X_B son los carrier de PWM que llegan del inverter SN74HC04,que a su vez son generados de los CCP1 y CCP2 del 16F876A.



y este es el codigo de test
Código:

'*  Name    : Programa_test en gcbasic para 16F876A             
'*  Author  : Alejandro Daniel Indulgenza                                   
'*  Notice  : Copyright (c) 2009                                                       
'*  Code    : free code                                                                         
'*  Date    : 18/11/2009                                                                   
'*  Version : 1.0                                                                               
'****************** CONFIGURO EL PIC **********************************************
#chip 16F876A,20
#config OSC=HS,WDT_OFF,PWRTE_ON,CP_OFF,DEBUG_OFF,WRT_OFF,BODEN_OFF,CPD_OFF,LVP_OFF
'****************** MOTORES *****************************************************
SUB Motores_Stop()
    HPWM 1,10,127
    HPWM 2,10,127
END SUB

SUB Motores_Adelante()
    HPWM 1,10,0
    HPWM 2,10,0
END SUB

SUB Motores_Adelante_Lento()
    HPWM 1,10,63
    HPWM 2,10,63
END SUB

SUB Motores_Atras()
    HPWM 1,10,255
    HPWM 2,10,255
END SUB

SUB Motores_Atras_Lento()
    HPWM 1,10,191
    HPWM 2,10,191
END SUB

SUB Motores_90_DX()
    HPWM 1,10,255
    HPWM 2,10,0
END SUB

SUB Motores_90_SX()
    HPWM 1,10,0
    HPWM 2,10,255
END SUB

SUB Motores_DX()
    HPWM 1,10,127
    HPWM 2,10,0
END SUB

SUB Motores_SX()
    HPWM 1,10,0
    HPWM 2,10,127
END SUB
 '****************** CONFIGURO LAS PUERTAS *********************************************
INTCON=0                                      'Interrupt desabilitados
ADCON1=130                                '10000010 -- Cinco puertas analogicas
TRISA=47                                        'PORTA como output
TRISB=0                                          'PORTB como output
TRISC=0                                          'PORTC como output
PORTA=0                                        'Setaje PORTA
PORTB=6                                        'Setaje PORTB.Activo Enable_1 + Enable_2
PORTC=6                                        'Setaje PORTC
'****************** ESPERO Y PARTO ***************************************************
PWMOn
Motores_Stop()
WAIT 2  s
'****************** INICIA EL CICLO ***************************************************
FOR Ciclo=1 TO 3
        Motores_Adelante_Lento()
        WAIT 4  s
        Motores_Adelante()
        WAIT 4  s
        Motores_Adelante_Lento()
        WAIT 4  s
        Motores_Stop()
        WAIT 1  s
        Motores_Atras_Lento()
        WAIT 4  s
        Motores_Atras()
        WAIT 4  s
        Motores_Stop()
        WAIT 1  s
        Motores_90_DX()
        WAIT 4  s
        Motores_Stop()
        WAIT 1  s
        Motores_90_SX()
        WAIT 4  s
        Motores_Stop()
        WAIT 1  s
        Motores_DX()
        WAIT 4  s
        Motores_Stop()
        WAIT 1  s
        Motores_SX()
        WAIT 4  s
        Motores_Stop()
        WAIT 2  s
NEXT
PWMOff
PORTB=0                                            'Disactivo Enable_A y Enable_B del L293B

alejandro
Participante Activo
Participante Activo

Cantidad de envíos: 41
Fecha de inscripción: 12/02/2009

Volver arriba Ir abajo

Página 2 de 2. Precedente  1, 2

Ver el tema anterior Ver el tema siguiente Volver arriba


Permiso de este foro:
No puedes responder a temas en este foro.