TODOPIC
Microcontroladores PIC => Lenguaje Basic para microcontroladores PIC => Mensaje iniciado por: facundo_10 en 05 de Abril de 2008, 14:32:52
-
Hola , estoy haciendo un proyecto con un DAC especificamente el TC1321 y es interfaz I2C.. Estoy usando tambien el PIC 16f877, segun se los pines del I2C son Portc.3 y portc.4 .. Ahora esos pines los tengo ocupados, y remodelar el circuito para cambiarlos seria un dolor de cabeza, se pueden usar otro pines para el I2C ?
-
Por supuesto amigo.
En el HELP figura:
********************************************************
Declares
There are three DECLARE directives for use with BusOut. These are: -
DECLARE SDA_PIN PORT. PIN
Declares the port and pin used for the data line (SDA). This may be any valid port on the PICmicro. If this declare is not issued in the BASIC program, then the default Port and Pin is PORTA.0
DECLARE SCL_PIN PORT . PIN
Declares the port and pin used for the clock line (SCL). This may be any valid port on the PICmicro. If this declare is not issued in the BASIC program, then the default Port and Pin is PORTA.1
These declares, as is the case with all the DECLARES, may only be issued once in any single program, as they setup the I2C library code at design time.
DECLARE SLOW_BUS ON - OFF or 1 - 0
Slows the bus speed when using an oscillator higher than 4MHz. The standard speed for the I2C bus is 100KHz. Some devices use a higher bus speed of 400KHz. If you use an 8MHz or higher oscillator, the bus speed may exceed the devices specs, which will result in intermittent transactions, or in some cases, no transactions at all. Therefore, use this DECLARE if you are not sure of the device's spec. The datasheet for the device used will inform you of its bus speed.
DECLARE BUS_SCL ON - OFF, 1 - 0 or TRUE - FALSE
Eliminates the necessity for a pullup resistor on the SCL line.
The I2C protocol dictates that a pullup resistor is required on both the SCL and SDA lines, however, this is not always possible due to circuit restrictions etc, so once the BUS_SCL ON DECLARE is issued at the top of the program, the resistor on the SCL line can be omitted from the circuit. The default for the compiler if the BUS_SCL DECLARE is not issued, is that a pullup resistor is required.
*******************************************************
Por lo que al iniciar el programa puedes declarar:
DECLARE SDA_PIN PORTC.0
DECLARE SCL_PIN PORTC.1
y dichos pines te funcionarán cómo SDA y SCL respectivamente.
Espero te sea útil.
Saludos !
Mario
-
Muchas gracias voy a probar que tal me va, de paso pregunto alguien ha tenido alguna experiencia comunicandose con un DAC ? El compilador que uso es el SPI...
Estaba pensando en usar las instruccion tipo I2CSEND, I2C STOP , etc...
-
Como bien te comentaron se pueden cambiar los pin del I2C. La emulación del I2C del lenguaje permite cambiar los pin que quieras esto es mas o menos igual para todos los Basic incluyendo la mayoría de los otros lenguajes.
PIC Basic del PSI:
'************************DS1624*************************************
.
.
Symbol sda = RB1 'asignamos nombre al pin que hará de SDA del puerto I2C
Symbol scl = RB4 'asignamos nombre al pin que hará de SCL del puerto I2C
.
.
.
.
main:
temperatura = d_ds1624(0, 0, 0) 'genera una lectura en el chip ds
WaitMs 1000 'pausa de 1Seg, tiempo máximo de conversión del chip ds
temperatura = d_ds1624(0, 0, 1) 'lee la lectura en dos Bytes (13bit)
.
.
.
goto main
end
.
.
.
'Funcion de lectura/escritura del DS1624
'ds1624_rw=0 el chip prepara un lectura, ds1624_rw=1 el chip entrega una lectura
'ds1624_rw=2 se hace una lectura del registro de control.
Function d_ds1624(ds1624_h As Byte, ds1624_l As Byte, ds1624_rw As Byte) As Word
RA4 = 1 'led placa I2c a On
If ds1624_rw = 0 Then 'solicita una lectura de temperatura
I2CWrite sda, scl, %10010010, 0xac, 0x00 'inicializa el registro de control
WaitMs 10 'pausa para que termine la escritura
I2CWrite1 sda, scl, %10010010, 0xee 'comienza una conversión
Endif
If ds1624_rw = 1 Then 'hace la lectura de la temperatura
I2CWrite1 sda, scl, %10010010, 0xaa 'prepara el chip para lectura de temperatura
I2CRead1 sda, scl, %10010011, ds1624_h, ds1624_l 'lee la temperatura
Endif
If ds1624_rw = 2 Then 'hace una lectura del registro de control
I2CRead sda, scl, %10010011, 0xac, ds1624_l 'lee registro de control
ds1624_h = 0 'borra Byte alto de antiguos valores
Endif
d_ds1624.HB = ds1624_h 'actualiza la temperatura
d_ds1624.LB = ds1624_l 'actualiza decimales temperatura o indica datos registro control
RA4 = 0 'led placa i2c a OffEnd Function
End Function
.
.
.
end
http://www.todopic.com.ar/foros/index.php?topic=14917.msg126106#msg126106
Recuerda que si utilizas interrupciones tienes que deshabilitarlas antes de usar las funciones del lenguaje I2C y recordar volver a activarlas al final de la rutina antes de salir de ella.
-
Gracias me ha quedado muy claro, dogflu66 he leido todos tus post y al parecer eres un genio en PSI :mrgreen: Me preguntaba si alguna vez has usado un DAC ?
Te cuento lo que yo queria hacer era lo siguiente..
Conectar un microfono (con ampli) al ADC del pic, y tambien conectar una Memoria RAM de 32 kbytes al pic, de esta manera el sonido que entra al pic por el ADC lo guardo en una variable, teniendo en cuenta que el adc es de 10 bits (como maximo puedo tener 1023) diviendolo por 4 me da 255, lo que es genial ya que cuando haya picos altos sera 255 y cuando sea mas bajo sera menos, entonces no tendre problemas para grabar byte a byte en la memoria ram..
La señal de muestreo seria unos 6,4 khz . Asi puedo grabar 5 segundos en la memoria RAM
Hasta aqui esta parte del programa la tengo diseñada, todo lo que es escritura y lectura de memoria ram y uso del ADC division de la variable y escribirla en la ram.
Ahora ---->
Cada byte lo graba a la ram, y luego mi idea era conectar un DAC (interfaz I2C) al pic (el pic es un 16f877a) , entonces llevar byte a byte de la señal digital que hay guardada en la ram al DAC, de este modo convertirla a Analogica y luego un ampli y parlante....
Para poder escuchar lo grabado anteriormente...
Te cuento que estamos llevando a cabo este proyecto con un amigo JAVICHO del foro, el en assembler y yo en basic.. Nuestro proyecto principal es el de hacer un Reproductor MP3... Pero estamos iniciando bien desde abajo...
Crees que podrias darme una mano para la conexion con el dac ? Mi idea como dije en el post anterior era usar las instrucciones I2CSEND para llevar de a un byte al DAC..
Todo el proceso deberia tardar no mas de 156us para que la calidad de audio sea de 6.4 khz.
Pero segun veo en los ejemplos que has puesto mas abajo, utilizas para controlar el DS1624 funciones como I2C WRITE , READ , ETC.....
Crees que puedas darme una mano ?
-
En todo lo que pueda amigo... :mrgreen: