Curso de programación de PIC en PICBasic Pro

ok, aver si estoy entendiendo bien. lo que intentas decirme es que no importa que que numero o codigo traiga de fabrica el aparato, yo le puedo asignar una identificacion a mi gusto siempre que sea en binario? por ejemplo si enves de: CONT3 CON %11010010 yo quisiera ponerle: CONT3 CON %10010010 ¿es asi? perdon por lo cabeza dura jajaja :LOL:
 
Mas o menos aun ni yo estoy muy seguro, según la hoja de datos te dice que el registro

WHO_AM_I:

Traductor de google:

Registro Quien soy yo?

Descripción:
Este registro se utiliza para verificar la identidad del dispositivo.

Parámetros:

ID Contiene la dirección I2C del dispositivo, que también se puede cambiar a través de este registro.

El Bit7 siempre debe estar en "0".
El valor de Power-on-reset de bit6: Bit1 es 110 100.
************************
Por lo que logro entender con siempre va hacer %110100
************************
Por otro lado dice tambien:

La dirección del esclavo del ITG-3205 dispositivos se b110100X que es de 7 bits de longitud. El bit LSB de la dirección de 7 bits es determinado por el nivel lógico en el pin 9. Esto permite que dos ITG-3205 dispositivos sean conectados al bus I2C mismo. cuando es utilizado en esta configuración, la dirección de uno de los dispositivos deben ser b1101000 (pin 9 es lógico bajo) y la dirección de la de la otra debe ser b1101001 (pin 9 es lógico alto). La dirección I2C es almacenado en el registro 0 (WHO_AM_I registro).

Entonces únicamente puedes conectar dos, uno con dirección %110100 y el pin nueve en 0V y otro con %1101001 y el pin 9 en alto. Y así tendrías dos ITG-3205 en la misma linea de querer conectar otro necesitarías otros pines del microcontrolador.

PD: Lo que tu hablas del 0xA6 se refiere a otro comando para otro dispositivo al parecer, ya que si lo pasas a binario queda %10100110, lo cual no coincide con la hoja de datos del que tu nombras ITG-3205, parece, mas bien el de una memoria eeprom que es %10100.
 
Última edición:
yo le puedo asignar una identificacion a mi gusto siempre que sea en binario? por ejemplo si enves de: CONT3 CON %11010010 yo quisiera ponerle: CONT3 CON %10010010 ¿es asi? perdon por lo cabeza dura jajaja

mmm... yo creo que no.... todos los perifericos I2c como memoria, expansores, giroscopios...etc...

tienen un identificador unico y de fabrica que es el Addres.... en algunos se configuran 3bits o 2 bits por hardware para identificarse si se van a usar del mismo tipo...
ejemplo un expansor de 16bits tiene 3bits que hace que solo se puedan usar hasta 8 del mismo tipo...

poniendo esto: CONT3 CON %10010010 solo estas diciendo que cont3 es una constante (no variable) con el byte 10010010... ver lo que significa Variables y Constantes....

yo insisto... podrias poner la ficha tecnica del aparato... o estoy entendiendo mal y el wiimote es un giroscopio? :unsure:
 
Última edición:
amigo mio, ahora comprendo porque no nos entendiamos jejeje... yo estoy tratando de leer el wiimotion directamente desde su conector y vos indicandome como leer el ITG3205 jejeje... he visto en un foro de aeromodelismo como cortan los pines de comunicacion i2c del itg y los sacan directamente a un arduino jejeje. aqui una imagen. ¿que opinas? ¿combiene hacer lo mismo?
saludosss

pd: amigo lubeck: no consigo la ficha tecnica del aparato :oops:

attachment.php
 
Última edición:
he visto en un foro de aeromodelismo como cortan los pines de comunicacion i2c del itg y los sacan directamente a un arduino jejeje. aqui una imagen. ¿que opinas? ¿combiene hacer lo mismo?
a mi eso ya me suena mas coherente....

si puedes ponerlo directo entonces la direccion del giroscopio es segun el datashit....
The slave address of the ITG-3205 devices is b110100X which is 7 bits long

ahi tu puedes usar dos giroscopios en una misma red i2c y el 7bit lo defines por hardware con el pin 9 AD0 si lo pones a tierra ese pin la direccion seria 1101000 si lo pones a positivo la direccion seria 1101001

y el comando en PBP seria...
I2CRead Datapin,Dataclock,%1101000,27 'esto para leer el temp_out_H

espero se entienda...
 
Hola lubeck con lo que indicas no es lo mismo que mencione arriba de los dos dispositivos? y se entendió como una variable debido a que "cont" pareciera una, pero mas que una variable es como un symbol para el comando "con" que es el address que tu indicas que mencione o puse de ejemplo como si fuera un numero de teléfono para cara dispositivo, claro es una manera de decir, se sabe que es una identificación unica para cada tipo de dispositivo i2c, La que es variable es la Addr que utilizo para hacer el código mas claro para mi, por otro lado hubo una confusión con respecto a lo que se quiere hacer, una cosa es controlar el ITG-3205 directamente y otra es controlarlo a trabes de la tarjeta del control de wii, y por mi lado y para seguir aportando mas al foro voy a comprar unas memorias para hacer pruebas y quizás tal vez un control para hacer mas pruebas y según me vaya les voy indicando cualquier cosa si me equivoque me avisan saludoss

PD: Ya conseguí los controles unos tirados en mi casa de casualidad ahora los reviso y les aviso para empezar hacer pruebas...saludoss
 
Última edición:
pues yo creo que esta bien el diagrama....aunque veo que los diodos 1n4007 no se necesitan...
la resistencia R2 yo la pondria de 5M... y creo que el simbolo del Triac mas bien parece de Tiristor :D



lubeck gracias por tu comentarios . Lo que realmente es el símbolo de Tiristor :oops: es justo lo que había en Livewire. La resistencia y la más alto posible. Experimenté con el 16F628 y sólo funciona por debajo de 680K.
 
Hola reconato, yo utilice 2M y me funciono, con respecto a los diodos no utilice ningun diodo puse la resistencia directo al pin del pic, recuerda colocar como entrada el pin del pic a utilizar y de configurar bien las interrupciones, por otro lado te recomiendo trates de conseguir el proteus para realizar mejor tus esquemas y así también poder probar y depurar bien el código antes de montarlo físicamente...saludosss :apreton:
 
Hola lubeck con lo que indicas no es lo mismo que mencione arriba de los dos dispositivos?

Es que no habia leido bien lo que pusiste :D, pero efectivamente estamos hablando practicamente de lo mismo, y yo tambien me confundi de como querian controlar el dispostivo...

lo que creo que no queda muy claro es lo de una constante, una variable y un symbol...

segun yo en una variable su valor puede ser cambiado durante la ejecucion de un programa, y una constante no.. se asigna una sola vez y no puede ser cambiada durante la ejecucion... en PBP la instruccion symbol efectivamente pareciera una constante pero no lo es, symbol es un reemplazo de un nombre... o sea que cada que el compilador vea eso lo reemplaza por lo que se le haya asignado... los tres son similares pero no son lo mismo...
 
Exacto se supone que cada uno tiene un propósito especifico, symbol yo lo uso nombrar pines del pic, y "con" segun el pbp y lo que yo entiendo significa parámetro de control o dirección de control para el bus i2c, y las constantes nunca que yo recuerde las he manejado, a menos que sean definiciones
por ejemplo OSC 20 aunque no es parte del programa igual es una constante ya que su valor no cambia en todo el codigo.
 
a ver si no estamos hablando ahora si de cosas diferentes ehhhh :D

esto es sacado de la ayuda de PBP
Named constants may be created in a similar manner to variables. It can be more convenient to use a constant name instead of a constant number. If the number needs to be changed, it may be changed in only one place in the program; where the constant is defined. Variable data cannot be stored in a constant.

Example

mice CON 3
traps CON mice * 1000

las llamadas constantes son creadas de manera similar a las variables, puede ser mas conveniente usar un nombre de una constante en lugar de un numero constante... si se necesita cambiar el numero, este puede ser cambiado solo en un lugar del programa,cuando esta es definida. el valor de una variable no puede ser definida en una constante... (o algo asi dice :D)

con el ejemplo mice siempre va a tener el valor de 3...
traps siempre va a ser 3000...

si yo durante la ejecucion del programa pongo mice=mice+1 seguramente me marcara un error(no lo he probado) porque es como si dijera 3=3+1... :eek:
 
Última edición:
Cierto ya logre ver porque el ejemplo del pbp, como el ejemplo es de una memoria, para simplificar lineas ellos colocan el valor de direccionamiento en una constante llamada cont, que se refiere al control del dispositivo i2c que este conectado.

Osea en ves de decir:

I2CREAD PORTA.0,PORTA.1,%10100000,0,[VAR1]

QUEDARIA ASI:

addr = 0
I2CREAD SDA,SCL,CONT,addr,[VAR1]

DONDE SDA = PORTA.0 ; SCL = PORTA.1 ; cont = %10100000 ; addr = 0

Osea el ejemplo del PBP es para ponerlo de una manera que se entienda a la hora de leer y se vea mas bonito por que de resto le veo mucho sentido.
 
Saludos. Yo realize un programa para clonar memorias I2C
en ese programa obviamente se necesitan dos memorias o mas XD
Esa palabra de control %10100000 o $A0 no cambia por eso se usa una Constante
que coincidentemente la llaman de control.
Yo para referirme a una o a otra memoria lo que hago es solo definir dos líneas SDA y SCL

Esta es la traducción de la ayuda en PBP del uso de Constantes

4.6 CONSTANTES

Las llamadas constantes pueden ser creadas de manera similar a las variables.
Puede ser mas conveniente usar un nombre de constante en lugar de un número constante.
Si el número necesita ser cambiado, únicamente puede ser cambiando
en un lugar del programa donde se define la constante.
No pueden guardarse datos variables dentro de una constante.

Etiqueta CON expresión constante

Algunos ejemplos son:

Mice CON 3
Traps CON Mice *1000
:apreton:
 
Osea el ejemplo del PBP es para ponerlo de una manera que se entienda a la hora de leer y se vea mas bonito por que de resto le veo mucho sentido.

Sip.. es solo por comodidad y que se vea mas bonito...

como dices es lo mismo poner
I2CREAD PORTA.0,PORTA.1,%10100000,0,[VAR1]

que:
SDA Var PortA.0
SCL var PortA.1
Cont Con %10100000
I2CREAD SDA,SCL,CONT,addr,[VAR1]

quizas cuando es una sola linea i2cread sea mas conveniente no definir las constantes y variables, pero si son dos o mas pues es mas conveniente usarlas, solo para ahorrarse tiempo y que se vea mas lindo el codigo....
 
hola amigos, gracias por sus comentarios. les cuento que mañana voy a hacer la primera prueba de lectura del wiimotion, primero voy a intentar leer directamente el wiimotion como dispositivo y despues leer directamente el giroscopio.
saludosss
 
ok, gracias por tu ayuda amigo lubeck. te cuento que para intentar leer el wii directamente, voy a usar la direccion que aparece en el comentario del programa en c que a segun creo yo, es la direccion del integrado wiimotion. el comentario es el siguiente:

// I2C adress 1: 0xA6 (8bit) 0x53 (7bit)

yo creo que la direccion o bit de control es 0x53 a segun estuve leyendo en el foro todopic, aca dejo el enlace http://www.todopic.com.ar/foros/index.php?topic=30669.0

saludosss
 
esto se me hizo interesante....
La dirección I2C de del mando es 0x52 (0b1010010), por lo que para realizar lecturas direccionaremos a 0xA5 (0b10100101) y para escrituras a 0xA4 (0b10100100).

El procedimiento para obtener los datos es el siguiente:

Paso 1.- Abrir comunicación, Inicializar el mando escribiendo en 0xA4 los bytes 0x40, 0x00, cerrar comunicación (solo necesario una vez mientras se mantenga alimentado).

Paso 2.-Abrir comunicación, Posicionar el puntero de lectura escribiendo en 0xA4 el byte 0x00, cerrar comunicación.

Paso 3.- Abrir comunicación, Leer 6 bytes de 0xA5, cerrar comunicación.

Paso 4.-Una vez obtenidos los 6 bytes deberemos decodificarlos realizándole la operación “XOR” 0x17 y seguidamente SUMARLE 0x17 a cada uno de ellos. Tras este tratamiento, los bytes contendrán la siguiente información (byte 1 es el primer byte recibido).

sacado de aqui
 
esto se me hizo interesante....


sacado de aqui

si, eso seria para leer el nunchak. estube haciendo unas comparaciones entre los pasos que da para empezar a leerlo y el codigo en pbp que puse anteriormente y eso es exactamente lo que hace ese codigo, aca dejo la parte en la que creo que lo hace.
Código:
NUNCHUCK:
 i2cwrite sda,scl,$A4,$40,[$00]
  pause 10
 i2cwrite sda,scl,$A4,[$00]
  pause 10
 i2cread sda,scl,$A5,[STR buffer\6]
  pause 10
  
 Jx=(buffer[0] ^ $17)+ $17 
 Jy=(buffer[1] ^ $17)+ $17
 Ax=(buffer[2] ^ $17)+ $17
 Ay=(buffer[3] ^ $17)+ $17
 buffer[5]=((buffer[5] ^ $17)+ $17 )

 if (buffer[5] & $01) <> 0 then
   BE=1
  else
   BE=0
 endif
 
 if (buffer[5] & $02) <> 0 then
   BD=1
  else
   BD=0
 endif
 
RETURN

para escribir el mio, me voy a basar en ese haciendo primero rutinas simples de lectura de cada eje y como no tengo un lcd, voy a utilizar un servo para mostrar el movimiento del mismo, apenas tenga novedad la subo.
saludos
 
Atrás
Arriba