TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: linda16 en 20 de Marzo de 2006, 14:15:00

Título: aYUDENME POR FAVOR CON EL PIC 18F4620
Publicado por: linda16 en 20 de Marzo de 2006, 14:15:00
Hola a todos POR FAVOR ALGUIEN QUE ME AYUDE ESTOY DESESPERADA!! Llorando .estoy programando un pics 18f4620 en C con PIC C y necesito leer una señal de entrada que si dura en alto  un tiempo determinado prender un led estos tiempos deben ser seleccionables por unos inerruptores (0.5seg, 1seg y 2 seg) lo debo hacer con un timer interno preferiblemente.tengo algunas ideas con los CCp y con contadores pero de verdad no se bien. POR FAVOR!!! si alguien sabe usar bien los timer y cree que me puede ayudar enviandome un programa se lo agrarecere.....desquiciado

cABE DESTACAR QUE SOLO LLEVO UNA SEMANA PROGRAMANDO ESTE PIC S.O.S
Título: RE: aYUDENME POR FAVOR CON EL PIC 18F4620
Publicado por: Modulay en 20 de Marzo de 2006, 14:43:00
Aquí tienes algo con lo que ir empezando
Título: RE: aYUDENME POR FAVOR CON EL PIC 18F4620
Publicado por: Modulay en 21 de Marzo de 2006, 08:26:00
Por mucho que desesperes no vas a encontrar el programa listo y envuelto en papel de regalo para qué lo único que tengas que hacer es volcarlo sobre el micro.
En el enlace que te dí hay ejemplos de cómo usar los temporizadores del micro,cosa que necesitarás hacer para "cronometrar" el tiempo que permanece tu entrada en alto y también para hacer parpadear los leds con la frecuencia que necesites.
Si bien ninguno de esos ejemplos son adaptados para tu modelo de pic,los cambios que tendrías que hacer son ínfimos,y siempre puedes contar con la disponibilidad de la gente de este foro que te ayudará si no sabes muy bien como hacerlo.
No te equivoques que tan solo pretendí ayudarte....si lo que buscas es que te den el micro ya funcionando creo que lo mejor será que pagues a alguien para que haga el trabajo por tí
Título: RE: aYUDENME POR FAVOR CON EL PIC 18F4620
Publicado por: migsantiago en 21 de Marzo de 2006, 10:53:00
Seguramente quiere que le resolvamos el programa, se lo compilemos y de paso le enviemos el PIC listo hasta la puerta de su casa Muchas risas

Para que se te ayude Linda16, debes demostrar que tienes intención de hacer funcionar tu tarea. Sube el programa que lleves avanzado, aunque esté incompleto. Si no llevas nada no esperes milagros.

Cualquier ayuda que se te proporcione es buena, no deberías rechazarla ni responder de tal manera.
Título: RE: aYUDENME POR FAVOR CON EL PIC 18F4620
Publicado por: linda16 en 21 de Marzo de 2006, 12:39:00
Llorando   MIL DISCULPAS A TODOS!!!  de verdad disculpame migsantiago   me desespere y estos dias he estado mal se que no debi pagarla contigo ni con el foro bueno fue una mala actitud y no se ni porque la tome, bueno no pretendia que me lo hicieran de verdad disculpen si no quisiera hacerlo ya hubiera pagado de verdad quiero aprender pero es que llevo dias todo lo que hago no me da , aunque se que no es excusa de mi mala respuesta bueno espero tus disculpas y la ayuda que me puedan dar sera gratamente recibida.... GRACIAS por responderme la primera vez Sonrisa
Título: RE: aYUDENME POR FAVOR CON EL PIC 18F4620
Publicado por: migsantiago en 21 de Marzo de 2006, 12:59:00
Qué bueno que la situación se aclaró.

Con confianza puedes subir el programa que te está presentando problemas y los expertos de los PIC18 te apodrán ayudar.

Mantengamos el foro tranquilo, aquí puedes hacer amigos. Sonrisa Gigante

Título: RE: aYUDENME POR FAVOR CON EL PIC 18F4620
Publicado por: maunix en 21 de Marzo de 2006, 13:02:00
Escrito originalmente por linda16
Llorando   MIL DISCULPAS A TODOS!!!  de verdad disculpame migsantiago   me desespere y estos dias he estado mal se que no debi pagarla contigo ni con el foro bueno fue una mala actitud y no se ni porque la tome, bueno no pretendia que me lo hicieran de verdad disculpen si no quisiera hacerlo ya hubiera pagado de verdad quiero aprender pero es que llevo dias todo lo que hago no me da , aunque se que no es excusa de mi mala respuesta bueno espero tus disculpas y la ayuda que me puedan dar sera gratamente recibida.... GRACIAS por responderme la primera vez Sonrisa


linda16, en principio dejame decirte le debieras pedir disculpas principalmente a Modulay que fue quien amablemente intentó ayudarte en primera instancia.

Yo opino como Santiago, y de hecho he manifestado mi opinión en contra de la gente que llega al foro pidiendo que los "salven" sin poner ni el minimo esfuerzo, sin siquiera poner una linea de código para que le veamos donde se está equivocando.

No se si bienes del tema de las pcs o de donde, pero dejame decirte que el mundo de los microcontroladores o más ampliamente el mundo de los sistemas embebidos no es algo "simple" ni algo "obvio".  Se juega con miles de variables las cuales transcurren en microsegundos, nano segundos o milisegundos.  Todo eso sumado a la complejidad que conlleva la electrónica en sí.

Los problemas más simples de explicar no siempre tienen la solución más simple.
Explicar algo en 2 líneas tampoco ayuda.

Hay cientos de pics dando vueltas y que justo encuentre un código qeu se ajuste a tu necesidad para el pic puntual que usas es realmente "una lotería" salvo que uses los pics mas comunes.  En tu caso sería la familia de los pic18, donde el 18F452 el más común.  

Los pics tienen la característica de ser muy compatibles entre un modelo y otro, donde las diferencias son muy pocas.  Más aun si programas en C, las diferencias serán mínimas.

Es importante que aclares cual es tu problema, el frustrarte al principio es algo COMUN y NORMAL.  Si necesitas algo urgente, te sugiero que contrates a un profesional y problema solucionado.  Quienes formamos el foro, ayudamos por la sola motivación y pasión del tema y no cobramos por hacerlo.    No siempre estamos online esperando que alguien postee para responderle la solucion!.

En mi caso , me gusta responderle a la gente que demuestra esfuerzo y en post de eso es que le respondo, guiandola (si es que sé la respuesta) para ir avanzando en el tema.

Te invito a que postees nuevamente , siendo MUY CLARA en que intentas hacer, cuales son las dificultades que has tenido y sobre todo que conocimientos tienes del tema.

Saludos y bienvenida al foro

Título: RE: aYUDENME POR FAVOR CON EL PIC 18F4620
Publicado por: linda16 en 21 de Marzo de 2006, 13:23:00
AHI QUE PENA ME DA YA NI VUELVO A ESCRIBIR MAS DE VERDAD QUE PENA LA CAGUE EN FORMA HOY ME PARE PA CAGARLA YA HASTA DAÑE UN PIC Muchas risas. BUENO REALMENTE AL QUE LE ESTABA PIDIENDO DISCULPAS ERA A MODULAY (PORFA DISCULPAME) Y GRACIAS A MAUNIX POR HACERME VER QUE LA PUSE COPIANDO EL NOMBRE DE MODULAY Y COPIE FUE EL DE MIGSANTIAGO (TIENES RAZON EN LO QUE ESCRIBISTE) AHI NO SE QUE PENA DE VERDAD..... GRACIAS Y BUENO AQUI TIENEN UNA AMIGA AUNQUE HA VECES GROCERA PERO CON TODA LA INTENCION DE APRENDER PIC   VOY A ENVIAR EL CODIGO QUE LLEVO A VER  LO ESTOY HACIENDO MAL GRACIAS Y DE NUEVO DISCULPEN
Título: RE: aYUDENME POR FAVOR CON EL PIC 18F4620
Publicado por: maunix en 21 de Marzo de 2006, 13:54:00
Escrito originalmente por linda16
AHI QUE PENA ME DA YA NI VUELVO A ESCRIBIR MAS DE VERDAD QUE PENA LA CAGUE EN FORMA HOY ME PARE PA CAGARLA YA HASTA DAÑE UN PIC Muchas risas. BUENO REALMENTE AL QUE LE ESTABA PIDIENDO DISCULPAS ERA A MODULAY (PORFA DISCULPAME) Y GRACIAS A MAUNIX POR HACERME VER QUE LA PUSE COPIANDO EL NOMBRE DE MODULAY Y COPIE FUE EL DE MIGSANTIAGO (TIENES RAZON EN LO QUE ESCRIBISTE) AHI NO SE QUE PENA DE VERDAD..... GRACIAS Y BUENO AQUI TIENEN UNA AMIGA AUNQUE HA VECES GROCERA PERO CON TODA LA INTENCION DE APRENDER PIC   VOY A ENVIAR EL CODIGO QUE LLEVO A VER  LO ESTOY HACIENDO MAL GRACIAS Y DE NUEVO DISCULPEN


Podemos entender que no tenias un "buen día" y esperemos Modulay acepte tus disculpas.

Con respecto a lo demás, tendrás buen trato mientras mantengas buen trato.

Acá no somos computadoras, somos seres humanos, las reglas son las mismas que en la vida cotidiana...  Giño  asi que si no sigues siendo "grosera" seras bien recibida en el foro, sin importar si tus preguntas son básicas o avanzadas o lo que sea.


Título: RE: aYUDENME POR FAVOR CON EL PIC 18F4620
Publicado por: Modulay en 21 de Marzo de 2006, 16:06:00
Bueno linda,olvidado queda.
Solo hay que tener presente un par de cosas,muy relacionadas con lo que bien ha expresado maunix.Si dedicas 15 segundos y 3 líneas para plantear tu problema,por regla de 3,quien te conteste invertirá lo mismo o menos en darte una respuesta.Con decir algo sobre tu experiencia con pics,si sabes lo que es el timer,si ya has probado algo pero no funciona,pastear código,etc,la persona que te responde sabrá mejor como enfocar su respuesta y que datos proporcionarte.Mi respuesta fué aparentemente insustancial,pero llevaba la doble intención de que nos contaras algo más.No por gritar más fuerte se consigue que te hagan más caso.
Sé explícita,proporciona datos,experiencias,expresa tus ideas de la forma más clara y concisa que puedas,y seguro obtendrás mucha ayuda,pero como ya has leído algunas líneas atrás,no esperes milagros.
Título: RE: aYUDENME POR FAVOR CON EL PIC 18F4620
Publicado por: linda16 en 22 de Marzo de 2006, 13:24:00
Rebotado Aqui les envio dos codigo casi iguales los cuales no se si estan bien o no ; Empece con uno programita simple a ver si me da pero nada y quiesiera saber que tengo mal, bueno supuestamente segun lo que hace el programa es que leo el puerto por un segundo y si esta en alto durante ese tiempo enciende un led cosa que no hace jajaja!! bueno esto es solo como para empezar porque luego no va ha ser un led sino una salida UART que va hacia un transmisor RF, pero si no me enciende el led pues se podran imaginar lo demas.... bueno el programa lo hice usando supuestamente el timer0y que haga un conteo durante ese tiempo porque tengo que estar segura que durante ese tiempo la señal no bajo a cero y luego subio otra vez ,ademas estoy provando con los CCP en modo de CAPTURE usando los flancos de bajada subida y asi hallar los anchos pulsos pero de eso no tengo sino las inicializaciones y puras ideas en mente es decir no tengo un codigo como tal porque estoy averiguando bien como se usa los ccp.

entonces no se que hacer por doonde me meto no llego a nada por favor todas las ideas seran valiosas para mi GRACIAS!!!

#include <18F4620.h>
#device adc=8
#use delay(clock=4000000)
#fuses NOWDT,WDT128,XT, NOPROTECT, IESO, BROWNOUT, BORV21, NOPUT, NOCPD, STVREN, NODEBUG, LVP, NOWRT, NOWRTD, NOEBTR, NOCPB, NOEBTRB, NOWRTC, NOWRTB, FCMEN, XINST, PBADEN, LPT1OSC, MCLR
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=9)



#define INTS_PER_SECOND 16

BYTE seconds;
BYTE int_count;

#int_RTCC

RTCC_isr()
{


    if(--int_count==0)
    {
      if (input(PIN_A0)==1)
         {

         output_bit (PIN_B0,1);

         delay_us (5);

         }
      int_count=INTS_PER_SECOND;
    }



}



void main()
{

   int_count=INTS_PER_SECOND;

   
   set_tris_b (0x00);
 
   setup_adc_ports(NO_ANALOGS|VSS_VDD);
   setup_adc(ADC_OFF);
   setup_psp(PSP_DISABLED);
   setup_spi(FALSE);
   setup_wdt(WDT_OFF);


   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_timer_3(T3_DISABLED|T3_DIV_BY_1);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);

   set_RTCC(0);
   
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_256|RTCC_8_bit);
   enable_interrupts(INT_RTCC);
   enable_interrupts(GLOBAL);

  }
---------------------------------------------------------------------------------------------------------
Este es parecido pero no igual no se cual esta mejor:

#include <18F4620.h>
#device adc=8
#use delay(clock=4000000)
#fuses NOWDT,WDT128,XT, NOPROTECT, IESO, BROWNOUT, BORV21, NOPUT, NOCPD, STVREN, NODEBUG, LVP, NOWRT, NOWRTD, NOEBTR, NOCPB, NOEBTRB, NOWRTC, NOWRTB, FCMEN, XINST, PBADEN, LPT1OSC, MCLR
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=9)



#define INTS_PER_SECOND 16

BYTE seconds;
BYTE int_count;

#int_RTCC
RTCC_isr()
{


    if(--int_count==0)
    {
      ++seconds;
      int_count=INTS_PER_SECOND;
    }



}



void main()
{

   int_count=INTS_PER_SECOND;



   setup_adc_ports(NO_ANALOGS|VSS_VDD);
   setup_adc(ADC_OFF);
   setup_psp(PSP_DISABLED);
   setup_spi(FALSE);
   setup_wdt(WDT_OFF);


   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_timer_3(T3_DISABLED|T3_DIV_BY_1);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);

   set_RTCC(0);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_256|RTCC_8_bit);
   enable_interrupts(INT_RTCC);
   enable_interrupts(GLOBAL);

   set_tris_b (0x00);
 

   do{                        // esto supuestamente espera a que el puerto reciba un alto

   }while (input(PIN_A0)==1);



   if (seconds == 1 && input(PIN_A0)==1)// esto segun yo espera a que el contador llegue a 1seg y
                                        //si todavia esta en uno la entrada prendame el led en el pin 0
                                        //del puerto B      

      {

        output_bit (PIN_B0,1);



      }



}

Título: RE: aYUDENME POR FAVOR CON EL PIC 18F4620
Publicado por: 10f206 en 22 de Marzo de 2006, 14:53:00
linda16: Debo confesar que C es mi segunda opcion para programar PICs, y por lo tanto no estoy muy seguro de la sintaxis exacta de la version exacta que tu uses, asi que entiende el texto que sigue como una IDEA,  y que esto NO ES CODIGO compilable.

(Estoy obviando la parte de configuracion por no tener sentido aqui)

for (j=1;j<=3 && PIN_INPUT;j++) {
delay_ms(500);
}

if (j==1) // .5s o menos
if (j==2) // entre .5s y 1s
if (j==3) // entre 1s y 1.5s

Espero sirva de algo.

El codigo esta en dependencia de una variable independiente y no del pin, eso hace que trabaje por separado y funcionara para lo que quieres, el uso del timer0, si no estas haciendo procesos en paralelo no le veo mucho sentido.

Saludos Cordiales.
Título: RE: aYUDENME POR FAVOR CON EL PIC 18F4620
Publicado por: linda16 en 27 de Marzo de 2006, 13:55:00
gracias  10f206     por tu codigo me ayudo para el primer avance de mi proyecto por lo menos logre mostrarle a mi profesor que podia prender un led un segundo dos segundo y asi gracias de verdad...Giño ahora tengo que seleccionar por unos interruptores los segundos (0.5seg, 1seg 2seg y combinaciones de ellos) y si la entrada permanece en alto (bit cero del puerto C) ese tiempo prender un led (bit 0 del puerto B). aqui le envio lo que yo creo que debo hacer pero no me da nada por favor me gustaria que me dijeran que estoy haciendo mal y como puedo solucionarlo.... Gracias de antemanoChica

#include <18F4620.h>
#device adc=8
#use delay(clock=4000000)
#fuses NOWDT,WDT128,XT, NOPROTECT, IESO, BROWNOUT, BORV21, NOPUT, NOCPD, NOSTVREN, NODEBUG, NOLVP, NOWRT, NOWRTD, NOEBTR, NOCPB, NOEBTRB, NOWRTC, NOWRTB, NOFCMEN, NOXINST, NOPBADEN, NOLPT1OSC, NOMCLR


unsigned char  tiempos;

void main()
{


   set_tris_b(0x00);
   set_tris_a(0x3f);
   set_tris_c(0xff);


   setup_adc_ports(NO_ANALOGS|VSS_VDD);
   setup_adc(ADC_OFF);
   setup_psp(PSP_DISABLED);
   setup_spi(FALSE);
   setup_wdt(WDT_OFF);

   setup_timer_0(RTCC_INTERNAL);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_timer_3(T3_DISABLED|T3_DIV_BY_1);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);



   while (1)
   {


      if (input(PIN_C0)==1)
      {

        tiempos = input_a();

        switch (tiempos)
        {

            case (0b000000):
               break;

            case (0b000001):         //0.5seg
               delay_ms(500);
               output_bit (PIN_B0,1);
               break;

            case (0b000010):         //1seg
               delay_ms(1000);
               output_bit (PIN_B0,1);
               break;

            case (0b000011):         //1.5seg
               delay_ms(1500);
               output_bit (PIN_B0,1);
               break;

            case (0b000100):         //2seg
               delay_ms(2000);
               output_bit (PIN_B0,1);
               break;


            case (0b000101):         //2.5seg
               delay_ms(2500);
               output_bit (PIN_B0,1);
               break;

            case (0b000110):         //3seg
               delay_ms(3000);
               output_bit (PIN_B0,1);
               break;

            case (0b000111):         //3.5seg
               delay_ms(3500);
               output_bit (PIN_B0,1);
               break;

        }

      }

   }
}
Título: RE: aYUDENME POR FAVOR CON EL PIC 18F4620
Publicado por: maunix en 27 de Marzo de 2006, 14:58:00
No entendi bien tu objetivo, pero fijate lo siguiente

Codigo:

delay_ms(500);
output_bit (PIN_B0,1);
break;



Aqui esperas 500 mseg y luego enciendes el pin... pero... cuando lo apagas?

Yo que tu haría asi.

Codigo:

output_bit (PIN_B0,1);
delay_ms(500);
output_bit (PIN_B0,0);
break;




1ro lo enciendes al pin, esperas 500mseg y luego lo apagas.

Si quieres ver el efecto del apagado, tambien puedes (y hasta creo que debes) poner una demora posterior al apagado.

El punto es que si lo apagas nomas y lo vuelves a releer... todo el tiempo entonces se enciende constantemente entonces no lo veras parpadear.

Saludos
Título: RE: aYUDENME POR FAVOR CON EL PIC 18F4620
Publicado por: linda16 en 27 de Marzo de 2006, 15:15:00
Llorando si ok mi objetivo es el siguiente tengo una entrada en el puerto c  si esta entrada dura en alto los tiempos (0.5s,1s , 2s y combinaciones de los mismos) que seran seleccionados por tres interruptores entonces prendo un led no importa que no se me apague porque luego ese led va a ser una señal uart para enviarla a un transmisor rf y luego recibida por un receptor y luego a otro pic que me enviara una señal que ya lo recibio y eso sera lo que apagara la señal que estoy enviando (no se si me explique bien). pero por ahora lo que quiero es que si la entrada me dura en alto esos tiempos prenda un led..
por eso lo hice con un switch que segun la entradas de los interruptores selecciono un tiempo y veo si la entrada esta en alto prendo un led bueno eso es lo que yo creo claro ; quisiera saber si esa es la mejor manera o la puedo hacer de otra manera... de verdad no se como hacerlo me he metido por contadores internos y demas pero pense que sta era la manera mas facil Llorando pero no me da AYUDENME
Título: RE: aYUDENME POR FAVOR CON EL PIC 18F4620
Publicado por: linda16 en 27 de Marzo de 2006, 15:29:00
una Pregunta es muy dificil leer una entrada cierto tiempo (seleccionable) y luego combertirla a una señal uart para enviarla serialmente ese es todo mi problema....porfa ayudenme en lo que puedan
Título: RE: aYUDENME POR FAVOR CON EL PIC 18F4620
Publicado por: maunix en 27 de Marzo de 2006, 21:12:00
Escrito originalmente por linda16
una Pregunta es muy dificil leer una entrada cierto tiempo (seleccionable) y luego combertirla a una señal uart para enviarla serialmente ese es todo mi problema....porfa ayudenme en lo que puedan


La verdad,  a que llamas "leer una entrada un cierto tiempo" y luego convertirla en una señal USART ??

Entendí lo anterior de que recibiras un alto un cierto tiempo que es variable y en funcion de eso tu excitaras un LED, pero hablando de esto que dices realmente no comprendo que quieres deccir.

Título: RE: aYUDENME POR FAVOR CON EL PIC 18F4620
Publicado por: linda16 en 28 de Marzo de 2006, 09:55:00
jajaja bueno por ahora necesito lo del led ya me estuvieron explicando lo del uart asi que no importa eso por ahora; me preocupa lo que escribi antes que cuanto tenga una señal en alto cierto tiempo (seleccionable ) me penda un led no importa que no se apague, y bueno ya envie anterior mente lo que tengo echo por fa ayudame a ver si lo que tengo esta mal.... gracias..Llorando

Título: RE: aYUDENME POR FAVOR CON EL PIC 18F4620
Publicado por: maunix en 28 de Marzo de 2006, 12:34:00
El tema es el siguiente fijate esto.


Codigo:

if (input(PIN_C0)==1)
{

tiempos = input_a();

switch (tiempos)
{

case (0b000000):
break;

case (0b000001): //0.5seg
delay_ms(500);
output_bit (PIN_B0,1);
break;
}
}



Hasta donde leo , sí hará lo que tu dices pero cuando se pone en 0? eso es lo que te pregunté antes.  Si bien comprendí tu respuesta, dejame decirte que en algun momento se debe poner en 0.

Si no se pone nunca en 0, como sabes que está andando bien???  Asi como pusiste el código, ponerle 500ms o 1500 ms, dará el mismo resultado es decir UN LED SIEMPRE PRENDIDO.

Se entiende ahora?