Consulta skypic puerto C

59 views
Skip to first unread message

Victoru

unread,
Jun 25, 2012, 2:16:37 PM6/25/12
to Skylist
Hola, hace unos años hice el taller de skybot e indague preguntando ya
un poco por aqui (gracias de nuevo por aquellas repsuestas que me
vinieron tan bien), ahora, ya estudiando informática en la
universidad, me propongo reutilizar la targeta skypic para realizar un
primer prototipo de robot velocista,
He estado probando con una placa, fabricada por mi, de 8 sensores
CNY70, tenia la intencion de conectar con un bus plano por completo a
los 8pines (+Vcc+GND) al puerto C, pero al conectarla y configurar
dicho puerto como lectura me encuentro conque algunos pines funcionan
bn (0,1,2,5) peor el resto no, (leen siempre un 1 aunq la tension este
próxima a 0) tambien e probado ejemplos mas sencillos probando puertos
con cables al aire, a 5V o a 0.. y justo los puertos que funcionan son
los que estando al aire oscilan (aleatoriamente) entre 0 y 1 mientras
que el resto a menos que esten conectados a tierra leen siempre un 1
lógico.
Si me podeis explicar porque sucede esto? o q tienen de especial esos
pines?? como podria solucionar para leer 8 sensores digitales ( y
tener mas puertos para controlar motores con PWM y algun otro sensor
digital mas para encoders..)

Muchas gracias de antemano, Un saludo,
Víctor Uceda.

Juan Gonzalez Gomez

unread,
Jun 26, 2012, 3:36:43 AM6/26/12
to skyl...@googlegroups.com

Hola,

  Tienes muchos ejemplos de programación de la skypic en este curso del pic, que está publicado en la web:

http://www.iearobotics.com/wiki/index.php?title=Programaci%C3%B3n_del_PIC16_en_C

  El puerto C lo puedes usar entero como salidas (mira el ejemplo C-salidas8.c). Sin embargo, si lo usas como entradas, los pines RC7 y RC6 no los podrás usar porque están conectados al chip max232 y se usan para las comunicaciones serie con el PC.   Si sacas este chip del zócalo sí los podrás usar, pero pierdes las comunicaciones serie (y no podrás descargar el firmware en la skypic).

Mira el plano en pdf de la Skypic:

http://www.iearobotics.com/proyectos/skypic/download/v1.3/skypic-esquema.pdf

  También en los pines RC4 y RC3 están conectadas dos resistencias de pull-up que se usan para las comunicaciones por el bus I2C (por ello simpere leerás '1' en ellos). Para usarlos como entradas tendrás que quitar los jumpers JP6 y JP7.

Saludos, Juan





--
Has recibido este mensaje porque estás suscrito al grupo "Skylist" de Grupos de Google.
Para publicar una entrada en este grupo, envía un correo electrónico a skyl...@googlegroups.com.
Para anular tu suscripción a este grupo, envía un correo electrónico a skylista+u...@googlegroups.com
Para tener acceso a más opciones, visita el grupo en http://groups.google.com/group/skylista?hl=es.


Victoru

unread,
Jun 27, 2012, 11:59:47 AM6/27/12
to skyl...@googlegroups.com
Hola Juan, muchas gracias por responder tan rápido,
Sospechaba que algo así estaba pasando pero no sabía muy bien con que funciones estaban "multiplexadas" estas entradas,
Finalmente creo que voy a utilizar los 4 pines del puerto C que no requiren quitar jumpers ni chips (par no perder funciones ni de puerto serie ni de I2C) y otro cuatro pines del puerto A configurados como entradas digitales.. haber como me las apaño con los cables xD y utilizo el puerto B como salidas para controlar los motores  dos pines (RB4 y RB5 ) como entradas de los encoders a que me permiten detectar los cambios por interrupciones.
También quería hacerte una pregunta a este respecto, he visto los diferentes ejemplos en los que usas interrupciones, por lo que he entendido solo hay una única rutina de atención a interrupciones, si queremos controlar mas de una interrupción, debemos de averiguar la causa que producido la interrupción en la rutina y actuar en consecuencia dentro de esa misma función todo, es así?
Muchas gracias de nuevo,
Un saludo,
Víctor.
Para anular tu suscripción a este grupo, envía un correo electrónico a skylista+unsubscribe@googlegroups.com

Juan Gonzalez Gomez

unread,
Jun 28, 2012, 3:41:19 AM6/28/12
to skyl...@googlegroups.com
Si. En los micros PiC sólo hay una única rutina de atención. Y hay que hacer polling para conocer la causa y llamar a la función correspondiente.

  Es un poco incómodo de programar, pero por otro lado te permite establecer las prioridades por software.

Saludos, Juan

Para ver este debate en la Web, visita https://groups.google.com/d/msg/skylista/-/7clIHp15-WUJ.

Para publicar una entrada en este grupo, envía un correo electrónico a skyl...@googlegroups.com.
Para anular tu suscripción a este grupo, envía un correo electrónico a skylista+u...@googlegroups.com

Victoru

unread,
Jul 2, 2012, 6:07:35 AM7/2/12
to skyl...@googlegroups.com
OK, ya estoy programando y ya he conseguido detectar los cambios en cada encoder por interrupciones, los cuales e conectado a los pines RB4 y RB5, ahora he proseguido programando el control de motores mediante PWM y me he topado con algunas dudas: Necesito crear dos señales PWM de frecuencias independientes para un control diferencial de dos motores, cada uno con su velocidad, e los ejemplos no he visto nada parecido (solo el control de 8 servos pero es posible ya que el periodo e mucho mas grande que el máximo tiempo activo para el máximo grado de posición), he pensado en utilizar otro timer del PIC, timer0 para una señal y timer2 para otra ya que son los dos que tienen 8bits, conoces algún ejemplo de programación en C del timer2 ?
Viendo información sobre timers también creo que sería mucho mejor leer los encoders como señal de reloj externo y el timer como contador, mas preciso y mas fácil de acceder a los datos, pero me quedo sin timers suficientes en el PIC ya que solo tiene 3, he pensado en solucionarlo utilizando una 2ª skipic que maneje la entrada de encoders y algunos sensores y que se comunique con la skypic principal mediante I2C, como lo ves?? que crees que sería más practico?? Si tienes ejemplo de programación en C para la comunicación entre dos tarjetas skypic (ya he visto los del taller de programación pero solo accede a 6 registros) t lo agradecería mucho!

Muchas gracias de antemano, Un saludo,
Víctor Uceda.



Muchas gracias de antemano

Victoru

unread,
Jul 3, 2012, 6:34:31 AM7/3/12
to skyl...@googlegroups.com
Hola de nuevo,
He seguido indagando y he visto bastante información sobre los módulos ccp que incorporan los microcontroladores PIC en este caso el 16f876a de la skypic lleva dos asiq me he propuesto generar la señal de pwm por estos módulos, programando el pic con el compilador css hay librerías más fáciles que permiten el manejo de este modulo con 3 funciones que realizan el setup del timer2 y del modulo, como estoy programándolo con el compilador scdd creo que no tengo esa posibilidad, así que tengo que modificar cada registro interno el código que el realizado es este: (si alguien encuentra algún error le agradezco me lo diga, ya que no obtengo la señal que debería por el bit RC2..)


#include <pic16f876a.h>
void main(void)
{

/***Configuracion del timer2 ***/
 TMR2IF=0; //Limpio el flag del timer2
 T2CKPS1=0;  T2CKPS0=0; //preescaler timer2 = 1:1
 TOUTPS3=0;  TOUTPS2=0;  TOUTPS1=0;  TOUTPS0=0; //postescaler timer2= 1:1
 PR2=0xFF; //Inicializacion Periodo de PWM y del timer2
 CCP1CON=0x0C; //configuracion del ccp1 modo PWM

 CCPR1L=0xC8; CCP1X=0; CCP1Y=0; //set_pwm1_duty(230);
 TRISC2=0; //RC2 de salida (salida del ccp1)
 TMR2ON=1; //comienza el timer2

}


Un saludo,
Víctor.

Juan Gonzalez Gomez

unread,
Jul 5, 2012, 5:57:13 AM7/5/12
to skyl...@googlegroups.com
Hola Victor,

  Gracias por el código :-)   Yo no había probado nunca el CCP por eso no tengo ejemplos

Saludos, Juan

--
Has recibido este mensaje porque estás suscrito al grupo "Skylist" de Grupos de Google.
Para ver este debate en la Web, visita https://groups.google.com/d/msg/skylista/-/ToI-zY8ywwYJ.

Para publicar una entrada en este grupo, envía un correo electrónico a skyl...@googlegroups.com.
Para anular tu suscripción a este grupo, envía un correo electrónico a skylista+u...@googlegroups.com

Victoru

unread,
Jul 6, 2012, 8:55:14 AM7/6/12
to skyl...@googlegroups.com
Si, finalmente ese código funciona para generar señales PWM por los módulos CCP (había cometido un fallo de hardware), en ese caso utilizo el modulo CCP1 pero podría hacerse igual con los registros pertinentes del CCP2 (aunq compartirían la frecuencia de ambas señales  ya que usan el mismo timer).
Ahora estoy intentando compaginarlo con la lectura de encoders por el método de interrupciones por cambio de estado en los pines RB4:7, pero me encuentro que la rutina de interrupción se ejecuta a veces aunq ninguno de los pines cambie de estado.. :S (estoy depurando mandando cada vez que se ejecuta la interrupción el estado de los pines por el puerto serie y repite varias veces sin cambiar el mismo patrón de los pines..) alguien sabe xq puede estar ocurriendo esto?
Un Saludo,
Víctor.
Para anular tu suscripción a este grupo, envía un correo electrónico a skylista+unsubscribe@googlegroups.com

Daniel Berdugo

unread,
Jul 6, 2012, 10:50:14 AM7/6/12
to skyl...@googlegroups.com

Hace tiempo que no toco los pic, pero puede ser que al enviar el estado de los pines por serie, como cambia el estado de los pines de salida del puerto serie este generando nuevas interrupciones.

Tambien creo recordar que los pic no tiene vector de interrupciones independientes, sino que debe ser tu codigo de interrupcion quien verifique cual de los flags de interrupcion ha saltado, asi que podria ser cualquier otra cosa la que te esta generando interrupciones y las tratas todas como si fuesen del tipo cambio de pines.

Un saludo.

-Daniel Berdugo-

Para ver este debate en la Web, visita https://groups.google.com/d/msg/skylista/-/Efm3C2J4T_kJ.

Para publicar una entrada en este grupo, envía un correo electrónico a skyl...@googlegroups.com.
Para anular tu suscripción a este grupo, envía un correo electrónico a skylista+u...@googlegroups.com

Victoru

unread,
Jul 8, 2012, 3:50:49 PM7/8/12
to skyl...@googlegroups.com
Gracais Daniel, la rutina de interrupciones que utilizo le estoy anadiendo un condicional para asegurar que la interrupcion se ha producido por el cambio en los pines del puerto B, es mas o menos asi:

void isr() interrupt 0 
{             

        if(RBIF==1){
temp=PORTB;
  if(RB4!=encd[0]){
EncdDer++;
encd[0]=RB4;
sci_cad("Derecha\n");
}if(RB5!=encd[1]){
EncdIzq++;
encd[1]=RB5;
sci_cad("Izquierda\n");
        }
//depuracion, imprimo por puerto serie  
if(RB5==1)
sci_cad("1      ");
else
sci_cad("0      ");
if(RB4==1)
sci_cad("1\n");
else
sci_cad("0\n");

//-- Luego ponerlo a cero
RBIF=0;

     }
}

y en la salida por el puerto seria el contador si me lo hace mas o menos bn, ya que compruebo que halla cambiado el estado de algún encoder, pero se ejecuta mas veces de las que debería la interrupción.. :S puede ser por interferencias con el puerto serie.. eso no lo se muy bien.. :S pero bueno seguiré intentado mejorar el código, y también el hardware puede ser que los sensores CNY70 que utilizo oscilen demasiado..
Un saludo,
Víctor.
Reply all
Reply to author
Forward
0 new messages