Programas para Pic C Compiler (Tutorial)

buenas!!
como es la instruccion para enviar varios datos por medio de un bufer para rs 232 si me pueden colaborar please....
 
hola otra vez yo gracias por tu blog y tus respuestas he aprendido bastante.
pero las dudas me surgen a diario, la duda con la que me encontré ahora es que quiero realizar la placa que publicas en la pagina principal para el pic18f452 para cargarle el bootloader lo que me pregunto es Puedo alimentar el pic del mismo DB9 para que todo se alimente de la computadora para evitar el uso de una fuente

de Antemano muchísimas gracias un saludo desde Aguascalientes Mex.
 
Buenas gente del foro....
Tengo una pregunta, estoy programando en CCS C compiler con un PIC16F887 y por medio de un botón doy el número de vueltas (aumenta de 1 en 1) al contador que se visualiza en un display alfanumérico 16x2 y es que si lo mantengo presionado lo hace cada 300 ms, pero como le hago para que cuando mantenga presionado el botón por 1 segundo aumente o disminuya mucho más rápida porque puede llegar a 2000 vueltas y de a uno a uno tarda 10 min. en llegar a ese número.
Agradezco su ayuda...
 
Hola estoy tratando de "controlar" el timer1, si RB1 esta en 0 y RB2 esta en 1 se activa la interrupción del timer1, si RB1 esta en 1 y RB2 esta 0 se desactiva el timer1, el código que hise no funciona cuando lo compilo me marcan unos warning que dice condition always false, espero que me puedan ayudar.

Código:
#include <16F886.H>        //Libreria del PIC Implementado.
#fuses HS, NOWDT, NOLVP, PUT, MCLR
#use delay( clock = 4M )
#byte port_B = 0x06

int Cont = 0;

#int_TIMER1
void templs( void )
   {
      Cont++;
      
      if( Cont == 100 )
         {
            output_high( PIN_B3 );
         }
      else if( Cont == 200 )
         {
            output_low( PIN_B3 );
            Cont = 0;
         }
      set_timer1( 15536 );
   }

void main( void )
    {
      set_tris_B( 0x06 );
      
      setup_timer_1( T1_INTERNAL | T1_DIV_BY_2 );
      set_timer1( 15536 );
      
      disable_interrupts( INT_TIMER1 );
      enable_interrupts( GLOBAL );
      
      while( 1 )
         {
            if( PIN_B1 == 0 && PIN_B2 == 1 )
               {
                  set_timer1( 15536 );
                  enable_interrupts( INT_TIMER1 );
               }
            if( PIN_B1 == 1 && PIN_B2 == 0 )
               {
                  disable_interrupts( INT_TIMER1 );
               }
         }
    }
 
Última edición por un moderador:
Hola prueba tu programa así:
si no, me avisas

Código:
#include <16F886.H> //Librería del PIC Implementado.
#fuses HS, NOWDT, NOLVP, PUT, MCLR
#use delay( clock = 4M )
#byte port_B = 0x06

int Cont = 0;
#int_TIMER1
void templs( void ){
Cont++;
if( Cont == 100 ){
output_high( PIN_B3 );
}
else if( Cont == 200 ){
output_low( PIN_B3 );
Cont = 0;
}
set_timer1( 15536 );
}

void main( void ){
set_tris_B( 0x06 );

setup_timer_1( T1_INTERNAL | T1_DIV_BY_2 );
set_timer1( 15536 );

disable_interrupts( INT_TIMER1 );
enable_interrupts( GLOBAL );

while (true) { 
if(input (PIN_B1 == 0 && PIN_B2 == 1 )){
set_timer1( 15536 );
enable_interrupts( INT_TIMER1 );
}
if( input (PIN_B1 == 1 && PIN_B2 == 0 )){
disable_interrupts( INT_TIMER1 );
}
}
}
 
Última edición por un moderador:
Gracias por contestar a mi problema, los warnig desaparecieron pero sigue sin habilitarse la interrupcion del timer1, creo que estoy haciendo algo mal al momento de activar la interrupcion.
 
necesito un codigo en c para programar un pic 18f4550 necesito realizar un contador de 0a 9 qque asienda coun un boton y desienda con otro y mostrar salida en un display
 
tengo una duda con este programa, no se cuales pines son los de la entrada de señal, solo se que el 0x05 es el puerto a pero no se cual seria el 0x05.3?

gracias

Código:
#include <16f628A.h>
#fuses   INTRC,NOWDT,NOPROTECT
#use delay (clock=4000000)
#bit s1= 0x05.3    //    en esta parte no se cual seria el pin de entrada?
#bit s2 =0x05.4    //    en esta parte no se cual seria el pin de entrada? 
void main ()
{
while (true)
  {  
  set_tris_a(0x3f);
  
  if(s1==1 && s2==1)
   { 
  output_b(0x00);
   }
     if(s1==1 && s2==0)
   { 
  output_b(0x01);
  delay_ms(50);
   }
  }
  }
 
Última edición por un moderador:
disculpen, tal vez sea em lugar equivocado de para preguntar esto, pero cm estan familiarizados con el compilador pic c, podran darme respuesta......
E intalado el pic c en win 7 de 64 bits. para crear un proyecto con pic wizard, el progarma deja de funcionar y ce cierra. si utilizo 24pic wizard, este no posee el variors pics uno como el conocido pic 16f84a. Que puedo hacer para solucionar este inconveniente, faltaria librerias ?..gracias de antemano por su respuesta...
 
en principio si tienes una version full (no limitada ) y que realmente sea compatible para windows 7
la version mas completa de ccs c si es al que te refieres es PCWHD esta dispone de la gama
pic32 ademas de las que dices
 
Hola a todos, estoy tratando de hacer un pulso que tenga una duración de 100useg que se mueva en un intervalo de 0 a 8.33mseg lo que hice es detectar flancos de subida y bajada con una interrupción externa por RB0, para moverlo lo quiero hacer con el ADC este toma valores de 0 a 1023 por lo que dividí el tiempo, los 8.33mseg en 1024 partes que serian 8.13useg y con esto calcule el valor para cargar el timer y que ocurra una interrupción en 8.13useg para poner en alto un pin. El problema es que no se por que el timer no funciona no se si sea por que el tiempo es muy pequeño. Dejo mi código para que me puedan ayudar a corregir el error es que no se que sea o no se si la interrupción este funcionando de la manera correcta.

Código:
#include <16F886.H>
#device ADC = 10        //Resolucion del ADC.
#fuses XT, NOWDT, PUT, MCLR, NOLVP
#use delay( clock = 4000000 )
#byte port_B = 0x06

int B_fla, B_adc;
int16 V_adc_h, V_adc_l, Cont = 0;

void Con_tie( void )             //Conversion a Tiempo.
   {
      V_adc_h = read_adc();        //Toma el Valor del Adc.
      V_adc_l = 1023 - V_adc_h;    //Calcula el Valor en Bajo. 
   }

#INT_EXT                                    //Interrupcion Externa.
void intext( void )
   {
      if( B_fla == 0 )                        //Bandera de Cambio de Flanco.
         {
            B_fla = 1;                        //Cambia la Bandera de Flanco.
            ext_int_edge( 0, H_TO_L );       //Cambia a Flanco de Bajada.
            B_adc = 1;                       //Cambia la Bandera del ADC.
         }
      
      else if( B_fla == 1 )                   //Bandera de Cambio de Falnco
         {
            B_fla = 0;                        //Cambia la Bandera de Flanco.
            ext_int_edge( 0, L_TO_H );       //Cambia a Flanco de Subida.
            B_adc = 0;                       //Cambia la Bandera del ADC.
         }
   }

#int_TIMER1                                  //Interrupcion de Timer1.
void timer1( void )
   {
      Cont++;                             //Contador se Incrementa.
      
      if( Cont == V_adc_h )                     //Condicion para el Tiempo.
         {
            output_high( PIN_B1 );
         }
      else if( Cont == V_adc_l )
         {
            output_low( PIN_B1 );
            Cont = 0;                     //Reinicia el Contador.
         }
      set_timer1( 65632 );
   }

void main( void )
   {      
       B_fla = 0, B_adc = 0;       //Inicializa la Bandera de Flanco y la Bandera de Adc y Contador de Timer1.
       
       set_tris_B( 0x01);        //Configura el Puerto B.
       port_B = 0x01;            //Inicializa el Puerto B
      
       setup_adc_ports( SAN0 );              //Configura el Canal AN0.
       setup_adc( ADC_CLOCK_INTERNAL );
       set_adc_channel( 0 );
       
       setup_timer_1( T1_INTERNAL | T1_DIV_BY_2 );    //Configura el Timer1.
       set_timer1( 65632 );
       disable_interrupts( INT_TIMER1 );
       
       ext_int_edge( 0, L_TO_H );            //Configura la Interrupcion Externa.
       enable_interrupts( INT_EXT );
       enable_interrupts( GLOBAL );          //Habilita las Interruciones.
       
       while( 1 )
         {
            if( B_adc == 1 )              //Condicion de la Bandera de Adc.
               {
                  Con_tie();              
                  set_timer1( 65632 );      //Carga el Timer1
                  enable_interrupts( INT_TIMER1 );    //Habilita la Interrupcion del Timer1.
               }
            else if( B_adc == 0 )
               {
                  disable_interrupts( INT_TIMER1 );   //Deshabilita la Interrupcion del Timer1.
               }
         }
   }
 
Última edición por un moderador:
Que tal compañeros, buenas noches, bueno pues a la hora de instalar pic c compiler, no tuve problemas, pero a la hora de querer compilar me sale un error
"not found:
c:\users\victor\desktop\main.c"
Ya investigué acerca de este error pero no logro encontrar como solucionarlo :rolleyes:, espero me puedan ayudar, desde ya mucas gracias.
 
Que tal compañeros, buenas noches, bueno pues a la hora de instalar pic c compiler, no tuve problemas, pero a la hora de querer compilar me sale un error
"not found:
c:\users\victor\desktop\main.c"
Ya investigué acerca de este error pero no logro encontrar como solucionarlo :rolleyes:, espero me puedan ayudar, desde ya mucas gracias.
Eso puede ocurrir cuando abres un proyecto realizado con versiones anteriores al que usas actualmente.
Lo que hay que hacer, es borrar los archivos que se generan durante la compilación y dejar solo los del programa.
Si se trata de un único archivo, deja solamente el archivo *.C, ábrelo y compilalo nuevamente.
 
Como siempre D@rkbytes gracias por solucionar mis problemas con los compiladores, me mudé a C, espero encontrar mayor disponibilidad que con proton IDE :D
 
Que tal! de nuevo yo jaja, bueno, tengo el siguiente programa, pero no logro mostrar el valor del TMR0 en el PORTC, dado que también quiero utilizar la bandera T0IF para activar el PORTD.0 cuando esta se active
Código:
/*
      PROGRAMA PARA ENCENDER UNA CARGA MEDIANTE EL DESBORDAMIENTO DEL
      TMR0 JUNTO CON LA ACTIVACIÓN DE LA BANDERA T0IF, EL DESBORDAMENTO
      SE PRODUCIRÁ CON EL CONTEO DE FLANCOS DE SUBIDA EN EL PIN T0CKI.
*/ 

   #include <16F887.h>  // PIC a utilizar.
   #use delay (clock = 8000000)  // Frecuencia de trabajo.
   #fuses XT, NOWDT
   
/* Se define el modo de gestión de los puertos B, C y D con #use fast_io(X)
   donde X = A, B, C. D, E.
   El usuario debe configurar las terminales de los puertos mediante
   set_tris_X (valor), donde X es A, B, C, D, E y valor es un entero
   de 8 bits.
 */
 
   #use fast_io(a)
   #use fast_io(d)
   #use fast_io(c)
   #bit bendera=0x0B.2
   
   int1 bandera=0;   // Se agrega a "bandera" el bit T0IF
   int8 valor=0;

VOID main() {
   set_tris_a(0b11111111);
   set_tris_d(0b00000000);
   set_tris_c(0b00000000);
   output_c(0);
   output_d(0);
   SET_TIMER0(0);
   SETUP_TIMER_0(RTCC_EXT_L_TO_H|RTCC_DIV_1);
   set_timer0(0);
   if (bandera == 1) output_high(pin_d0);
   else (bandera == 0) output_low(pin_d0);
   valor = get_timer0();
   output_c(valor);   // La variable led es llevada al portc
   delay_ms(200); 
}
 
Última edición:
Que tal! de nuevo yo jaja, bueno, tengo el siguiente programa, pero no logro mostrar el valor del TMR0 en el PORTC, dado que también quiero utilizar la bandera T0IF para activar el PORTD.0 cuando esta se active
En tu programa no utilizas ningún bucle para comprobar si se han ingresado pulsos por el pin T0CKI.
De esa forma el programa se ejecutará hasta la instrucción delay_ms(200); y ahí se detendrá.
También date cuenta que declaras bendera y otra llamada bandera. (Te debiste haber equivocado)

Mira si con las varias modificaciones que le hice al código, es como querías que funcionara.

Saludos.
 

Adjuntos

  • 16F887 Desborde de TMR0 usando T0CKI.rar
    28.2 KB · Visitas: 82
Que tal compañeros, pues yo tengo el problema de que mando una simple línea al Hyperterminal y nada, salen puros símbolos sin sentido.

Código:
   #include <16f887.h>
   #use delay(clock=16M)
   #fuses HS, NOWDT
   #use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8) // RS232

     
   #use fast_io(c)         // Modo de gestión del puerto C
   #use fast_io(d)

//-----------------------------------------------------------------------------   
   
   void main(){
   
   while(1){            
   
   
   set_tris_d(0b00000000);
   output_d(0b00000001);
   printf("\rVoltaje de linea");
   delay_ms(1000);
   output_d(0);
   delay_ms(1000);
   
   }                       // Fin del while
   }                       // Fin de la función main


y esto es lo que e sale, lo simulé en proteus y todo bien pero montado en el pic no sale nada bien. Si alguien le ha pasado y sabe por que le agradecería mucho.
 

Adjuntos

  • Captura de pantalla 2014-04-15 11.34.37.png
    Captura de pantalla 2014-04-15 11.34.37.png
    1.2 KB · Visitas: 10
Que tal compañeros, pues yo tengo el problema de que mando una simple línea al Hyperterminal y nada, salen puros símbolos sin sentido.

¿Qué te parece este código a mi me ha funcionado? Tiene adicional un display LCD

Código:
//Envia un dato desde la Pc al pic por el puerto serie y envía "recibido"

#include<16F887.h>
#fuses INTRC_IO,NOWDT
#use delay(clock=4000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)
#include<LCD.c>

char ch;

#int_rda
void serial_isr(){
 ch=getchar();
 printf(lcd_putc,"\n Recibido: %ch"ch);    //Muestra en LCD
}

void main()
{

lcd_init();  
 enable_interrupts(global);
 enable_interrupts(int_rda);

for(;;){
 delay_ms(1000);
 printf(lcd_putc,"\n Enviando... ");   //Muestra en LCD
 printf("\n Cadena de caracteres");    //Envia por puerto serie
 delay_ms(1000);
 }
}
 
Última edición por un moderador:
Que tal compañeros, he estado experimentando con la recepción de caracteres en un pic16F887, lo que pasa es que envío la posición de un slider que va de 0 a 255 al puerto serial en forma de caracteres, en fin si el slider está en la posición 0 me manda el carácter '0', si esta en la posición 142 me manda el carácter '142', lo que necesito es que estos caracteres aparezcan en una LCD y tengo lo siguiente código, pero sólo funciona para caracteres de 3 dígitos:

Código:
while(1==1){            // Ciclo infinito  
      
      x = getc();
                    
      if(x >= '0' && x <= '9'){

      printf(lcd_putc,"%c",x);
      val[k]=x;                      
      k=k+1;                      
      
      }
      if(k==4){
         lcd_putc('\f');      // Se borra la pantalla
         k=0;
      }
    
   }

No sé como puedo hacer para que cuando entre un caracter '1', aparezca en la pantalla un 1 y que cuando mande un caracter 2 aparezca un '2' y NO un 12, debido a que ya había un 1. Desde ya muchas gracias por la ayuda.
 
Atrás
Arriba