Curso de programación de PIC en PICBasic Pro

a OK gracias por la correcion, se me olvido quitarlo yo me fije despues igual gracias, estoy usando microcode version 3.0
 
Bueno ya logre hacer funcionar mas o menos el codigo del triac con el serin cuando lo tenga mas completo lo coloco, ahora les dejo otro aporte de control de dos lcd con un solo pic, un ejemplo que saque de otro foro de http://www.picbasic.co.uk muy bueno de echo tienen librerias para picbasic pro, en fin aca esta la simulacion y el codigo...saludosss

Muy buen aporte Reyvilla
me quedan dos preguntas....

1.- Lo has probado en la realidad?
2.- Las resistencias a RB7 de cuantos Ohms son? de 4k7?



muchas gracias por la respuesta si estoy usando el virtual serial port pero al momento de usarlo y quererlo conectar no se envian los datos yo subi el esquema del proteus y del labview que he estado probando pero no lo he logrado..segun no mal entiendo tengo que usar el max232 por acomples de niveles porque quiero transmitir y recibir desde el micro a la pc
esa es mi duda que no puedo simularlo o soy bien inutil o bien bruto que no alxanzo ha hacerlo

pero al momento de usarlo y quererlo conectar no se envian los datos yo subi el esquema del proteus y del labview que he estado probando pero no lo he logrado.
Yo estoy haciendo mi mejor esfuerzo en decirte como lo puedes hacer, lamentablemente yo ni instalado tengo el labview por eso no puedo ayudarte con esa parte del codigo...

segun no mal entiendo tengo que usar el max232 por acomples de niveles porque quiero transmitir y recibir desde el micro a la pc

si mal entiendes, te repito no es necesario porque el pic tiene diodos de proteccion que hace que trabaje a niveles TTL, en muchos lados esta explicado eso...
esa es mi duda que no puedo simularlo o soy bien inutil o bien bruto que no alxanzo ha hacerlo
Al principio se batalla un poco pero es bien sencillo... verificaste que el pic este en un puerto com y el labview en otro....

digamos el pic que trabaje con el COM1 y el labview con el COM2 y en el virtual port este el enlace entre ellos y ambos trabaje con los mismos baudios? digamos 9600...
 
Última edición:
Yo estoy haciendo mi mejor esfuerzo en decirte como lo puedes hacer, lamentablemente yo ni instalado tengo el labview por eso no puedo ayudarte con esa parte del codigo...

DE nuevo muchas gracias por la respuesta lo cual es muy valiosa de antemano agradezco la paciencia que me tienes y a las preguntas que realizo


si mal entiendes, te repito no es necesario porque el pic tiene diodos de proteccion que hace que trabaje a niveles TTL, en muchos lados esta explicado eso...

La verdad sabia que las entradas del micro tienen los diodos de proteccion pero no sabia que habia como conectarlo directamente pero he escuchado que he puede entorpecer la transmision y la recepcion lo cual investigare bien para salir de dudas

Al principio se batalla un poco pero es bien sencillo... verificaste que el pic este en un puerto com y el labview en otro....

digamos el pic que trabaje con el COM1 y el labview con el COM2 y en el virtual port este el enlace entre ellos y ambos trabaje con los mismos baudios? digamos 9600...[/QUOTE]

te comento que los programas que subi tengo conectado el circuito del proteus al com2 y el labview al com3 creados con el virtual serial port....los he configurado para 8 bits de datos sin paridad un bit de stop y una velocidad de 9600

Sigo intentando hacerlo pero le hare la lucha
 
gracias reconato por las referencias, ahora me gustaría poder realizar otro pero con un control ya sea RF o infrarojo, el problema esta es en fusionar ambos códigos ya que el del dimmer trabaja con detección por cruce por cero con interrupción externa y eso limita bastante el código si alguien me da alguna sugerencia o ayuda les agradecería de verdad igual muchas gracias por sus criticas...saludosss
 
hola gente...
bueno, les cuento que ya solucione mi problema de matriz 5x7 y aqui como siempre, comparto la solucion que esta a su ves en otro post del foro. aqui va https://www.forosdeelectronica.com/posts/605281/ . bueno, paso a contarles el problema que tengo ahora con otro proyecto que estoy tratando de llevar adelante. hoy me ha llegado un wii motion que compre por internet para experimentar. se me ocurrio de ver si se podia leer las señales del giroscopo de tres ejes que trae este aparatito jeje... este tiene un puerto i2c.
se que con las declaraciones i2cread e i2cwrite del pbp podria leerlo pero no se como poner los bits de control que corresponden al wii motion y no tengo idea de como hacer para leerlo. tengo algunos ejemplos de lectura y escritura en eeproms pero obviamente no es lo mismo, al menos en parte. podran acaso darme una manito con este proyectito? gracias, saludosss
 
Hola dario...

pon por aqui la ficha tecnica del aparato....
en esta debe estar el protocolo, o las direcciones y los datos....

hola lbeck, gracias por responder.
bueno, lo que pude conseguir es esta descripcion en ingles de la wikipedia:

http://wiibrew.org/wiki/Wiimote/Extension_Controllers creo que es lo que mas se acerca. podrias ayudarme a descifrar un poco esto? saludosss

aca consegui el datasheet del giroscopo itg3205 que es el sensor que lleva incorporado, lo dejo adjunto
 

Adjuntos

  • itg3205.pdf
    1.1 MB · Visitas: 74
Última edición:
Mmm.. pues lei el link del wiki pero no creo que sea lo mismo a lo que necesitas... y el protocolo del giroscopio puede no ser igual al protocolo del aparato en si, es decir, puede que uno se comunique externamente con un microcontrolador que tenga el aparato y ese comunicarse con el giroscopio, tu necesitarias el protocolo del microcontrolador del aparato obvio....no el del giroscopio.

ese protocolo debe ser similar a esto...

Dibujo.JPG

y debe estar explicado para que sirve cada instruccion, sino es como intentar manejar un avion sin algun manual de vuelo, ni instructivo, ni instructor :D
 
Última edición:
bueno he hecho mi primer programilla un poco dificil, se trata de un contador y unos led, dependiendo de que numero estes se encienden unos led u otros. tiene un pequeño fallo, que justo al arrancarlo en proteus se encienden los tres led primeros, pero luego ya no vuelve a pasar. si alguno de vosotros sabe como arregrarlo me lo podria decir por favor, ya que no logro encontrar la solucion.
es un 16f877 con 4 led, un pulsador para aumentar el numero y un 7447 de d0 a d4 con un 7 segmentos para ver el numero:
El programa es:

trisd=%11110000
trisb=0
numero var byte
flag var bit
z var byte
x var byte
led var portb.0
led1 var portb.1
led2 var portb.2
led3 var portb.3
led4 var portb.4
bot var portc.7
encerar:
numero=0
display:
portd=numero
if bot=0 then aumentar
pause 80
flag=0
goto display
aumentar:
if flag=1 then goto display
flag=1
if numero=9 then encerar
numero=numero+1
inicio:
z=numero
select case z
case is <3
for x=0 to z
portb=%00000001
pause 200
portb=%00000010
pause 200
portb=%00000100
pause 200
portb=%00001000
pause 200
portb=%00010000
pause 200
low led4
next
case 4
for x=0 to 4
high led3
pause 50
low led3
pause 70
next
case is >8
for x=3 to z
pause 200
high led1
pause 200
low led1
high led2
pause 200
low led2
pause 200
next
end select
goto display
end
 
Mmm.. pues lei el link del wiki pero no creo que sea lo mismo a lo que necesitas... y el protocolo del giroscopio puede no ser igual al protocolo del aparato en si, es decir, puede que uno se comunique externamente con un microcontrolador que tenga el aparato y ese comunicarse con el giroscopio, tu necesitarias el protocolo del microcontrolador del aparato obvio....no el del giroscopio.

ese protocolo debe ser similar a esto...

Ver el archivo adjunto 65996

y debe estar explicado para que sirve cada instruccion, sino es como intentar manejar un avion sin algun manual de vuelo, ni instructivo, ni instructor :D

pues si que tenes razon :LOL: es bastante incomprensible jeje... bueno, he estado investigando unpoco mas y he encontrado un codigo para comunicar un nunchak con un 16f628 hecho en pbp, aqui lo dejo, lo voy a investigar un poco para ver como hace la lectura. obviamente el nunchak no tiene el mismo codigo de control que me hace falta pero me sirve para saber como leer estos aparatitos. ah, tambien encontre un codigo en c para arduino que puede leer los datos del wii motion, se trata de un sistema imu para estabilizar un cuadrocoptero. esta buenisima la idea. aca comparto la parte en la que yo pienso que comienza la lectura del wii notion, talves alguno de los que entienden c para arduino nos ayude a descifrar como se produce la lectura del wii motion.
saludosss

Código:
#if !GYRO 
// ************************************************************************************************************
// I2C Wii Motion Plus + optional Nunchuk
// ************************************************************************************************************
// I2C adress 1: 0xA6 (8bit)    0x53 (7bit)
// I2C adress 2: 0xA4 (8bit)    0x52 (7bit)
// ************************************************************************************************************
void WMP_init(uint8_t d) {
  delay(d);
  i2c_writeReg(0xA6, 0xF0, 0x55); // Initialize Extension
  delay(d);
  i2c_writeReg(0xA6, 0xFE, 0x05); // Activate Nunchuck pass-through mode
  delay(d);
  if (d>0) {
    // We need to set acc_1G for the Nunchuk beforehand; It's used in WMP_getRawADC() and ACC_Common()
    // If a different accelerometer is used, it will be overwritten by its ACC_init() later.
    acc_1G = 200;
    uint8_t numberAccRead = 0;
    // Read from WMP 100 times, this should return alternating WMP and Nunchuk data
    for(uint8_t i=0;i<100;i++) {
      delay(4);
      if (WMP_getRawADC() == 0) numberAccRead++; // Count number of times we read from the Nunchuk extension
    }
    // If we got at least 25 Nunchuck reads, we assume the Nunchuk is present
    if (numberAccRead>25)
      nunchuk = 1;
    delay(10);
  }
}

uint8_t WMP_getRawADC() {
  uint8_t axis;
  TWBR = ((16000000L / I2C_SPEED) - 16) / 2; // change the I2C clock rate
  i2c_getSixRawADC(0xA4,0x00);

  if (micros() < (neutralizeTime + NEUTRALIZE_DELAY)) {//we neutralize data in case of blocking+hard reset state
    for (axis = 0; axis < 3; axis++) {gyroADC[axis]=0;accADC[axis]=0;}
    accADC[YAW] = acc_1G;
    return 1;
  } 

  // Wii Motion Plus Data
  if ( (rawADC[5]&0x03) == 0x02 ) {
    // Assemble 14bit data 
    gyroADC[ROLL]  = - ( ((rawADC[5]>>2)<<8) | rawADC[2] ); //range: +/- 8192
    gyroADC[PITCH] = - ( ((rawADC[4]>>2)<<8) | rawADC[1] );
    gyroADC[YAW]  =  - ( ((rawADC[3]>>2)<<8) | rawADC[0] );
    GYRO_Common();
    // Check if slow bit is set and normalize to fast mode range
    gyroADC[ROLL]  = (rawADC[3]&0x01)     ? gyroADC[ROLL]/5  : gyroADC[ROLL];  //the ratio 1/5 is not exactly the IDG600 or ISZ650 specification 
    gyroADC[PITCH] = (rawADC[4]&0x02)>>1  ? gyroADC[PITCH]/5 : gyroADC[PITCH]; //we detect here the slow of fast mode WMP gyros values (see wiibrew for more details)
    gyroADC[YAW]   = (rawADC[3]&0x02)>>1  ? gyroADC[YAW]/5   : gyroADC[YAW];   // this step must be done after zero compensation    
    return 1;
  } else if ( (rawADC[5]&0x03) == 0x00 ) { // Nunchuk Data
    ACC_ORIENTATION(  ( (rawADC[3]<<2)      | ((rawADC[5]>>4)&0x02) ) ,
                    - ( (rawADC[2]<<2)      | ((rawADC[5]>>3)&0x02) ) ,
                      ( ((rawADC[4]>>1)<<3) | ((rawADC[5]>>5)&0x06) ) );
    ACC_Common();
    return 0;
  } else
    return 2;
}
#endif

void initSensors() {
  delay(200);
  POWERPIN_ON
  delay(100);
  i2c_init();
  delay(100);
  if (GYRO) Gyro_init();
  else WMP_init(250);
  if (BARO) Baro_init();
  if (ACC) {ACC_init();acc_25deg = acc_1G * 0.423;}
  if (MAG) Mag_init();

codigo en pbp para leer un nunchak:

Código:
'****************************************************************
'*  Name    : NUNCHUCK RF.BAS                                   *
'*  Author  : [Hugo Oliveira]                                   *
'*  Notice  : Copyright (c) 2010                                *
'*          : All Rights Reserved                               *
'*  Date    : 09-07-2010                                        *
'*  Version : 1.0                                               *
'*  Notes   : BreadBoard                                        *
'*          : PIC16F628A                                        *
'****************************************************************
include "modedefs.bas"
DEFINE OSC 4
DEFINE I2C_HOLD 1

@ DEVICE pic16F628A, INTOSC_OSC_NOCLKOUT
@ DEVICE pic16F628A, WDT_OFF
@ DEVICE pic16F628A, PWRT_OFF
@ DEVICE pic16F628A, MCLR_OFF
@ DEVICE pic16F628A, BOD_OFF
@ DEVICE pic16F628A, LVP_OFF
@ DEVICE pic16F628A, CPD_OFF
@ DEVICE pic16F628A, PROTECT_OFF


'                               VARIÁVEIS
' ====================================================================
Jx var byte
Jy var byte
Ax var Byte
Ay var byte
BE var bit
BD var bit
buffer var byte[6]

'                       REGISTOS PINOUT 1 = IN; 0 = OUT
' ====================================================================
         '76543210
TRISA  = %00000000 
TRISB  = %00000010
CMCON = 7  
VRCON = 0  
'                              NOMES PINOUT
' ====================================================================
LED    VAR PORTA.1
TX     Var PORTB.2
RX     VAR PORTB.1
SDA    var PORTB.4
SCL    var PORTB.5
'                              DEFENIÇÕES
' ====================================================================
DEFINE DEBUG_REG PORTB  
DEFINE DEBUG_BIT 2
DEFINE DEBUG_BAUD 19200
DEFINE DEBUG_MODE 0

'                             INICIO PROGRAMA
' ====================================================================
Start:
 HIGH LED
 PAUSE 500
 LOW LED
 PAUSE 500
 HIGH LED
 PAUSE 500
 LOW LED
 PAUSE 500
 HIGH LED
 
Main:

 GOSUB NUNCHUCK
'                             JoyStick Eixo X
' ====================================================================
  if JX>70 and JX<=100 then
   'SEROUT TX,T9600,["%TE"]
   DEBUG "%TE"
   pause 20
  endif
  
   if JX>0 and JX<=70 then
   'SEROUT TX,T9600,["%TE1"]
   DEBUG "%TE1"
   pause 20 
  endif 
  
  if Jx>180 and Jx<210 then
   'SEROUT TX,T9600,["%TD"]
   DEBUG "%TD"
   pause 20
  endif 
  
  if Jx>=210 then
   'SEROUT TX,T9600,["%TD1"] 
   DEBUG "%TD1"
   pause 20
  endif
'                             JoyStick Eixo Y
' ====================================================================  
  if JY>70 and JY<=100 then
   'SEROUT TX,T9600,["%TB"]
   DEBUG "%TB"
   pause 20 
  endif
  
  if JY>0 and JY<=70 then
   'SEROUT TX,T9600,["%TB1"]
   DEBUG "%TB1"
   pause 20 
  endif  
  
  if Jy>180 and Jy<210 then
   'SEROUT TX,T9600,["%TC"]
   DEBUG "%TC" 
   pause 20
  endif
  
  if Jy>=210 then
   'SEROUT TX,T9600,["%TC1"]
   DEBUG "%TC1" 
   pause 20
  endif    
'                             Axis -  Eixo X
' ====================================================================
  if Ax<100 then
   'SEROUT TX,T9600,["%TE2"]
   DEBUG "%TE2"
   pause 20 
  endif
  
 if Ax>140 then
   'SEROUT TX,T9600,["%TD2"]
   DEBUG "%TD2" 
   pause 20
  endif
'                             Axis -  Eixo Y
' ====================================================================  
  if Ay<110 then
   'SEROUT TX,T9600,["%TB2"]
   DEBUG "%TB2" 
   pause 20
  endif
  
  if Ay>140 then
   'SEROUT TX,T9600,["%TC2"]
   DEBUG "%TC2" 
   pause 20
  endif
'                             Botões
' ====================================================================    
  IF BE = 0 then
   'SEROUT TX,T9600,["%RL1"]
   DEBUG "%RL1" 
   pause 80
  endif

  IF BD = 0 then
   'SEROUT TX,T9600,["%RD1"]
   DEBUG "%RD1" 
   pause 80
  endif    
goto Main
'                      SUB ROTINA - LEITURA DADOS NUNCHUK
' ====================================================================
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
END
 
Hola dario hace poco realice un sistema de lectura y escritura de una memoria y un real timer por un bus ic2, y me encontré con el problema de identificar o poder diferenciar con quien me estaba comunicando y descrubri que hay un comando llamado "con" en el PBP que se utiliza para determinar los bit de control de cada dispositivo conectado en el bus ic2, en tu caso seria: "CONT CON %110100" para poder indicarle al dispositivo que esta abierta la comunicación con el, luego de eso esta las direcciones y el contenido de cada una de ellas, donde puedes leer cada dato de posición y guardarlo en una variable tipo byte ejemplo:

TEMPERATURAH VAR BYTE
TEMPERATURAL VAR BYTE
EJEZH VAR BYTE
EJEZL VAR BYTE
EJEYH VAR BYTE
EJEYL VAR BYTE
EJEXH VAR BYTE
EJEXL VAR BYTE

CONT CON %110100
ADDR VAR BYTE


ADDR = $1B
I2CREAD sda,scl,cont,addr,[TEMPERATURAH, TEMPERATURAL, EJEZH, EJEZL, EJEYH, EJEYL, EJEXH_
EJEXL]
PAUSE 10

'hasta este punto ya tendrías los valores de cada eje, los bit bajos y los altos, ahora quedaría
'mostrarlos en una lcd que valores son ya que lei que son con formato de complemento a dos o algo así
'lo otro seria sumar ambos valores L y H para tener un valor completo bueno eso creo de todas formas es solo una idea cual quier cosa me avisas...saludosss
 
ok, muchas gracias amigo reyvilla por el ejemplo. ahora me que da una duda, he estado leyendo el codigo en c y he notado que al principio dice: I2C adress 1: 0xA6 (8bit) 0x53 (7bit) al parecer el bit de control del wii motion seria este y el de abajo seria para el nunchak ¿uds que opinan?
y si fuera este y yo quisiera leer los datos utilizando tu ejemplo amigo rey ¿deberia quedar algo asi?

I2CREAD sda,scl,0xA6,addr,[TEMPERATURAH, TEMPERATURAL, EJEZH, EJEZL, EJEYH, EJEYL, EJEXH_
EJEXL]
o la declaracion CONT CON %110100 es valida para cualquier dispositivo? perdon si me estoy equivocando :D
saludosss
 
Hola a todos, baterod3 el esquema está por debajo. reyvilla también tratando de conseguir algo para poner aquí. Perdón por la mala pronunciación, estoy utilizando un traductor.
Saludos.

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
 
ok, muchas gracias amigo reyvilla por el ejemplo. ahora me que da una duda, he estado leyendo el codigo en c y he notado que al principio dice: I2C adress 1: 0xA6 (8bit) 0x53 (7bit) al parecer el bit de control del wii motion seria este y el de abajo seria para el nunchak ¿uds que opinan?
y si fuera este y yo quisiera leer los datos utilizando tu ejemplo amigo rey ¿deberia quedar algo asi?

I2CREAD sda,scl,0xA6,addr,[TEMPERATURAH, TEMPERATURAL, EJEZH, EJEZL, EJEYH, EJEYL, EJEXH_
EJEXL]
o la declaracion CONT CON es valida para cualquier dispositivo? perdon si me estoy equivocando :D
saludosss

Yo manejando un real timer y una memoria eerprom me quedo asi:

CONT CON %10100000 'memoria eeprom 24C04
CONT2 CON %11010000 'real timer DS1303

el comando con es como la identificación del dispositivo, digamos que tienes 100 dispositivos con conexión i2c, para poder controlar individualmente cada uno, tiene que poder identificarlo y llamarlo, seria como un numero de telefono, al llamarlo el dispositivo se activa y ya puedes leerlo o escribirlo.

En la hoja de cada dispositivo tiene ese comando, para la eeprom 24c04 es %10100000 para el dc1307 es %11010000 y para tu dispositivo es %11010000, con lo cual un ejemplo para controlar los 3 por el mismo bus seria:

addr var byte
CONT CON %10100000 'memoria eeprom 24C04
CONT2 CON %11010000 'real timer DS1303
CONT3 CON %11010010 'tu dispositivo, donde el los últimos bit son de identificación

Nota: el dispositivo tiene un registro que se llama WHO_AM_I, quien soy yo? se trata
de un identificador modificable el cual te permite utilizar varios al mismo tiempo
por el mismo bus de datos.

luego para escribir y leer o modificar registros seria:

ADDR = 0
I2CREAD sda,scl,cont2,addr,[SEGUNDOS,MINUTOS,HORA,DIAS,DIAF,MES,ANO] 'DS1307
PAUSE 10

addr = 1B
I2CREAD sda,scl,cont3,addr,[TEMPERATURAH, TEMPERATURAL, EJEZH, EJEZL, EJEYH, EJEYL, EJEXH, EJEXL]' tu dispositivo
pause 10

addr = 0
I2CREAD sda,scl,cont,addr,[VAR1,VAR2,VAR3]'VA DE LA 0 A 3 EEPROM
PAUSE 10

Y cualquier cosa me avisas me interesa tu proyecto ya que nunca he manejado uno y se ve interesante...:apreton:
 
Atrás
Arriba