TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: algc80 en 20 de Septiembre de 2007, 09:37:56

Título: Necesito ayuda.. muy simple pero no me funciona
Publicado por: algc80 en 20 de Septiembre de 2007, 09:37:56
 Bueno, soy novatillo y voy al grano:

- El programa es una adaptación de uno que encontré por ahi, pero simplificado.Genera un senyal PWM y es muy sencillo. Lo he compilado con PCWH Compiler. Lo vuelco con IC Prog, comprobado q llega al PIC. Simulo con PIC Simulator IDE (Osho) y funciona (eso entiendo pq se me activa portB0 cuando debe). Probando con la PIC no obtengo nada en salida.. ¿que ocurre? ¿configuración ICProg? ¿compilador? ¿configuración I/O en el PIC?

Os escribo el programilla.. a ver si alguien me puede ayudar.. GRACIAS

// servo_pwm

// Ejemplo con un servo Hitech HS-325
// Alimentación y pulsos a 5V

// Cuadro de Tiempos :

//    Periodo 20 ms (Frecuencia 50 Hz)
//    Ancho Pulso minimo 0.9 ms
//    Ancho pulso medio  1.5 ms
//    Ancho pulso maximo 2.1 ms

//    TMR0 a 1:16 -> 1 RTCC cada 4.096 ms
//                -> 1 Tick cada 0.096 / 256 = 0.016 ms
//                -> 20 ms = (4 x RTCC completas) + (1 * RTCC - 30 ticks)

//    Ancho Pulso minimo 0.9 ms ->  56 ticks de TMR0
//    Ancho pulso medio  1.5 ms ->  93 ticks de TMR0
//    Ancho pulso maximo 2.1 ms -> 131 ticks de TMR0


#include <16f876.h>
#fuses XT,NOWDT,NOPROTECT,NOLVP,PUT,BROWNOUT
#use delay(clock=4000000)
#use standard_io(b)

#define PIN_SERVO1 PIN_B0

const int AJUSTE_FINO_DE_RTCC =  30;
const int ticks_PULSO_MINIMO  =  56;
const int ticks_PULSO_MEDIO   =  93;
const int ticks_PULSO_MAXIMO  = 131;

int1 flagRTCC   = 0;
int  contRTCC   = 0;
int1 flagSERVO1 = 0;
int  tSERVO1    = ticks_PULSO_MINIMO;


#int_RTCC
RTCC_isr(){

   ++contRTCC;
   if(contRTCC==4){
      set_TIMER0(AJUSTE_FINO_DE_RTCC);
   }
   if(contRTCC==5){
      flagRTCC=1;
      contRTCC=0x00;
   }
}

void main() {

   int ValTIMER0;

   setup_counters(RTCC_INTERNAL,RTCC_DIV_16);

   enable_interrupts(global);

   set_TIMER0(0);

   enable_interrupts(INT_RTCC);


   do {

      // DISPARO DEL PULSO PWM

      if(flagRTCC==1){
         flagRTCC=0;
         output_high(PIN_SERVO1);
         flagSERVO1=1;
      }

      // CONTROL DE ANCHO DEL PULSO PWM

      if(flagSERVO1==1){
         valTIMER0 = get_TIMER0();
         if(valTIMER0>tSERVO1){
            flagSERVO1=0;
            output_low(PIN_SERVO1);
         }

      }

      } while (TRUE);

}
Título: Re: Necesito ayuda.. muy simple pero no me funciona el SERVO
Publicado por: RedPic en 20 de Septiembre de 2007, 10:18:52
Salvo algún pequeño detalle y la evidente simplificación del código creo que el autor soy yo y el "por ahí" puede ser Picmanía (http://picmania.garcia-cuervo.net/PICC2.php#SERVO1) ... publicado también en este mismo foro en Controlando un SERVO con el PIC desde nuestro PC (http://www.todopic.com.ar/foros/index.php?topic=4629.msg37817#msg37817)
 :mrgreen:

¿No obtienes nada de nada? .... hummm ... ¿tienes alguna forma de verificar que el PIC está oscilando correctamente, un led, un osciloscopio o algo así?

Título: Re: Necesito ayuda.. muy simple pero no me funciona
Publicado por: algc80 en 20 de Septiembre de 2007, 11:03:57
Oh.. se me caen las lagrimas de la emoción. Podrías decirme como verificar esto que me dices.. tngo led's y lo que haga falta. Estaba investigando en el manual del 16F876 sobre la activación de TRISB.. es donde se establece si es entrada o salida ¿no? Pensaba que podía faltar eso en el código.. pero si me dices que parece que esté bien..
Y perdón por la copiada/adaptación. Se entendía muy bien y es lo que necesitaba.

Saludos
Título: Re: Necesito ayuda.. muy simple pero no me funciona
Publicado por: maunix en 20 de Septiembre de 2007, 19:54:20
Oh.. se me caen las lagrimas de la emoción. Podrías decirme como verificar esto que me dices.. tngo led's y lo que haga falta. Estaba investigando en el manual del 16F876 sobre la activación de TRISB.. es donde se establece si es entrada o salida ¿no? Pensaba que podía faltar eso en el código.. pero si me dices que parece que esté bien..
Y perdón por la copiada/adaptación. Se entendía muy bien y es lo que necesitaba.

Ya lo estas conociendo a Don Diego... jeje, tiene códigos para muchas cosas, a veces tiene cosas que ni el mismo se acuerda que tiene ¿no diego?  :D :D
Título: Re: Necesito ayuda.. muy simple pero no me funciona
Publicado por: RedPic en 21 de Septiembre de 2007, 05:06:23
Ja, ja, ja  :D :D :D muy cierto mauricio pero cuando veo código hecho por mí reconozco mis nombres de variables y la forma que tengo de "flage-ar" todo ...  :mrgreen: :mrgreen: :mrgreen:

sobre la activación de TRISB.. es donde se establece si es entrada o salida ¿no? Pensaba que podía faltar eso en el código..

Al usar el standard_io es el propio CCS el que pone los TRIS automáticamente según detecte un input o un output en el correspondiente PIN.

Y perdón por la copiada/adaptación. Se entendía muy bien y es lo que necesitaba.

No hay nada que perdonar, está publicado para que todo el mundo lo use, lo modifique, lo adapte o haga con él lo que quiera, solo que la leer eso de "por ahí" decidí el ponerle nombre y apellidos al padre y convertirlo en un "por aquí".  :mrgreen:

tngo led's y lo que haga falta.

Lo que quiero primero es establecer que el programa está rodando correctamente. Y por eso decía ponerle un led en algun pin y conmutarlo cada cierto tiempo para ver que está funcionando ... por ejemplo si colocas un Led en PIN_B1 podrías incrustar en el bucle del main() algo así ...

Código: C++
  1. do{
  2.    if(++contador==0) output_toggle(PIN_B1);
  3.    ...
  4. }

Así podrías ver una onda cuadrada con un periodo de 256 veces el tiempo que tarde el bucle while(true) en ejecutarse. Y eso te diría que el PIC corre adecuadamente ... después podríamos pasar a ver lo demás ...

Nota: Si quieres quita el #use standard_io(b) ya que si no pones nada es el modo por defecto de compilar CCS.
Título: Re: Necesito ayuda.. muy simple pero no me funciona
Publicado por: algc80 en 21 de Septiembre de 2007, 13:29:33
OK.. mil gracias.. sois geniales.. a partir del Lunes me pondré en marcha con ello. Mi modesto objetivo es mover un servo con 2 pics. Tengo que generar 2 PWMs (uno para poner el servo a 90º y otro para llevarlo a 0º. Con lo cual, 20ms de periodo y un Duty Cicle de 0'9 y 1,5 milis en cada caso.. ya os contaré.

Saludos
Título: Re: Necesito ayuda.. muy simple pero no me funciona
Publicado por: RedPic en 21 de Septiembre de 2007, 15:10:41
... Mi modesto objetivo es mover un servo con 2 pics. Tengo que generar 2 PWMs ...

Ja, ja, ja  :D :D :D Muchos PIC para tan poco Servo. Ja, ja, ja  :D :D :D

Imagino un Lapsus Scritptae y serán dos servos con un PIC  :shock:

Título: Re: Necesito ayuda.. muy simple pero no me funciona
Publicado por: 5GTT en 24 de Septiembre de 2007, 00:56:57
Yo probaria antes de nada a utilizar el wimpic800 en lugar del ICprog, es mucho mas intuitivo y facil de utilizar.

A mi me paso algo parecido al principio con ICProg y era por que no supe poner los valores debidamente y el PIC realmente no estaba programado.
Título: Re: Necesito ayuda.. muy simple pero no me funciona
Publicado por: algc80 en 08 de Octubre de 2007, 09:38:51
Gracias.. me voy a poner con esto.. ahora llevaba dias fuera por trabajo.. ya os contaré  !!