Introduccion a la programacion de PICS en lenguaje C (CCS)

Iniciado por MARCO_RECARGADO, 26 Julio 2007, 17:47 PM

0 Miembros y 1 Visitante están viendo este tema.

ncoliv

Encontre este foro y tambien algo que estoy buscando. El programa que me muestra por el lcd el tiempo del RTC Hora y fecha. me podrias pasar la circuiteria del pic F877A y el rtc 1307? Por favor me sería de mucha utiliadad muchas gracias

Meta

Hola:

Podrían poner el compilador de C, CCS, ahora su versión es la 4.080, al menos que casi llegue a ella.

Y si pueden también el Proteus más nuevo.

Un cordial saludos.
Tutoriales Electrónica y PIC: http://electronica-pic.blogspot.com/

alondra_celeste

Hola a todos, ando buscando informacion sobre comunicacion por RF, tengo los transmisores LAIPAC TLP434A & RLP434A, lo que no se como es que debo enviar informacion de un PIC- TLP434A - RLP434A - PIC, es decir, informacion de un PIC a otro PIC mediante este transmisor y receptor inalambricos, con el Lenguaje C (CCS), me urge mucho  :-[ , ya he buscado sin exito, por favor, alguien puede ayudarme????

Gracias.

Liz

MARCO_RECARGADO

Cita de: alondra_celeste en 19 Octubre 2008, 05:26 AM
Hola a todos, ando buscando informacion sobre comunicacion por RF, tengo los transmisores LAIPAC TLP434A & RLP434A, lo que no se como es que debo enviar informacion de un PIC- TLP434A - RLP434A - PIC, es decir, informacion de un PIC a otro PIC mediante este transmisor y receptor inalambricos, con el Lenguaje C (CCS), me urge mucho  :-[ , ya he buscado sin exito, por favor, alguien puede ayudarme????

Gracias.

Liz
Hola que tal disculpa pero este post se hizo especialemente para poner programas de PICS en C o resolver dudas sobre programas, por lo que pido a todos los usuarios en gral que posteen sus dudas unica y exclusivamente acerca de programacion de pics en c   no deseo que este comentario se tome como ofensivo solo es para tener un orden en nuestros posts y para que aquel que quiera aprender a programar pics en c no se vea afectado con temas de otra indole.

bueno despues de sermon te puedo decir, los transmisores que tu tienes son transmisores que envian todo lo que tu pongas en sus pines de salida/entrada respectivamente es decir si tu pones un "1" logico eso mismo mandara, sin embargo solos te pueden acarrear muchos problemas porque no tienes un protocolo de counicacion para detectar o filtrar posibles errores o lo que es lo mismo no tienes la certeza de que estas recibiendo, para eso yo te recomendaria usar un codificador y decodificador respectivamente. sin embargo los puedes conectar directamente al PIC. aunque yo no lo recomiendo mucho por que estan sujetos a muchos disturbios, estos son unos ejempolos de como conectar tus dispositivos de rf.








yo te recomendaria los decoficadores  HT12E y HT12D aqui esta el lnik de como puedes utilizarlos, estos chips ya contienen su propio protocolo de comunicaciones y a mi en lo personal me han sido de mucha utilidad, espero haber sido de ayuda , SALUDOS

www.datasheetcatalog.org/datasheets/37/467327_DS.pdf
"Desde muy chico tuve que interrumpir mis estudios para ir a la escuela"  Gabriel García Márquez

MARCO_RECARGADO

El software de proteus y picc estan publicados al inicio de este post y son las versiones mas recientes  que yo tengo en cuanto tenga mas actuales los publico, SALUDOS
"Desde muy chico tuve que interrumpir mis estudios para ir a la escuela"  Gabriel García Márquez

Meta

Cita de: MARCO_RECARGADO en 19 Octubre 2008, 06:16 AM
El software de proteus y picc estan publicados al inicio de este post y son las versiones mas recientes  que yo tengo en cuanto tenga mas actuales los publico, SALUDOS

Esperando respuesta mi muy distinguido amigo.

Proteus está la v7.4
Tutoriales Electrónica y PIC: http://electronica-pic.blogspot.com/

Juan_elec

olas a todos que tal me parece muy interesante este foro ya que puedes compartir muxas ideas y cosas mas weno io queria contar y preguntar a la vez es que io hice una tarea en mi univ de un controlador de velocidad de un motor dc la velocidad es vista en un lcd y mi velocidad de referencia la escojo con un potenciometro ,mediante el pic16f876A corrijo el error  ante  una perturbacion en el eje mediante un pid programado en el pic weno el trabjo si me flipa pero mi problem es que mi valor de refencia que me aparece en el lcd de mi trabajo no es igual ami valor de salida de mi lcd mm y no se si seran los parametros de mi motor que esten mal o sera mis valores kp ki kd habe si alguien me dice alguito de como corregir esto pls mayor inf les puedo pasar mi simulacion en proteus si entienden mi idea gracias ahi les va el programa de formacion del pid.

#include <16F876A.h>
#device adc=10
#FUSES NOWDT                    //No Watch Dog Timer
#FUSES HS                       //High speed Osc (> 4mhz)
#FUSES PUT                      //Power Up Timer
#FUSES NOPROTECT                //Code not protected from reading
#FUSES NODEBUG             
     //No Debug mode for ICD
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD                    //No EE protection

#use delay(clock=20000000)
#include <lcd.c>
#define  factor   3000/1023
#define  f2       0.23
#use fast_io(a)
#use fast_io(c)
#use fast_io(b)

float rpm,vel_m;
int   cont_t0;
int16 vel,vref,duty,aux;
signed long duty_c,uk_int;
float uk,uk_1,ek,ek_1,ek_2,f_vref;
int Kp,Ki,Kd;

void set_pwm1_dc(unsigned long duty_pwm);

#int_TIMER0
void TIMER0_isr()
{
   set_timer0(61);      // para contar 10 ms
   cont_t0++;
   if(cont_t0==10)
   {
      cont_t0=0;
      vel=get_timer1();   // contamos cuanros pulsos pasaron
      vel=vel*6;        // son 100 pulsos por revolucion
                        // asi obtenemos en revoluciones cada 100 milisegundos
                        // vel = #p/deci * 1rev/100p * 10 deci/1 seg * 60 seg/min
                        // vel esta en rpm
      lcd_gotoxy(9,2);
      printf(lcd_putc,"Vm=%Lu",vel);
      set_timer1(0);
   }
}

void main()
{
   set_tris_a(0xff);
   
   setup_adc(ADC_CLOCK_DIV_8);
   
   setup_adc_ports(AN0);
   set_adc_channel(0);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_256);
   setup_timer_1(T1_EXTERNAL|T1_DIV_BY_1);
   setup_timer_2(T2_DIV_BY_4,0XFF,4);
   setup_ccp1(CCP_PWM);
   set_pwm1_duty(0);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);
   set_timer0(61);
   set_timer1(0);
   clear_interrupt(INT_TIMER0);
   enable_interrupts(INT_TIMER0);
   enable_interrupts(GLOBAL);
   
   set_tris_c(0b11111011);
   set_tris_b(0);
   output_b(0);
   lcd_init();
   set_pwm1_dc(700);
   lcd_putc("   CONTROL PID\n");
   delay_ms(1000);
   output_b(0);
   
   uk=0;
   uk_1=0;
   ek=0;
   ek_1=0;
   ek_2=0;
   
   Kp=10;
   Ki=10;
   Kd=5;
   for(;;)
   {
      aux=read_adc();
      if(aux!=vref)
      {
         vref=aux;
         f_vref=vref;
         rpm=vref*factor;
         lcd_gotoxy(1,2);
         printf(lcd_putc,"Vr=%4.0f",rpm);     
      }
      vel_m=vel;
      ek=rpm-vel_m;
     
      uk=Kd*ek_2+(Kp+2*Kd)*ek_1+(Kp+Ki+Kd)*ek-uk_1;   // controlador pid
      ek_1=ek;
      ek_2=ek_1;
      uk_1=uk;
      uk_int=uk;
      duty_c=uk_int*f2;
      if(duty_c>1023)
         duty_c=1023;
      else if(duty_c<=0)
         duty_c=0;
      duty=duty_c;
      set_pwm1_dc(duty);       
   }
   
}

void set_pwm1_dc(unsigned long duty_pwm)
{
#byte   CCP1CON=0x17
#byte   CCPR1L=0x15

   bit_clear(CCP1CON,4);
   bit_clear(CCP1CON,5);
   if(bit_test(duty_pwm,0))
         bit_set(CCP1CON,4);
   if(bit_test(duty_pwm,1))
         bit_set(CCP1CON,5);
   duty_pwm>>=2;                 //rota dos veces
   duty_pwm&=0x00FF;             // dejamos solo un byte
   CCPR1L=duty_pwm;     
}

graxias ojala me puedan ayuda xD

MARCO_RECARGADO

Juan_elec

espero que no sea muy tarde, creo que un diagrama de lo que tienes serviria un poco puesto que dices que tienes un pid pero como es que retroalimentas al pic para hacer el ajuste de velocidad? con un tacometro o con que?


segun entiendo en tu programa utilizas el adc para saber la velocidad, yo creo que te ha de variar mucho, porque el voltaje de salida no debe ser constante, aunque paraciera, lo que yo te recomendaria es que hicieras una serie de promedios, es decir que tomes unas 10 muestras del adc y las promedies y asi sucesivamente para que salga lo mas exacto posible, obviamente que entre mas muestras tengas mas cerca estaras del valor, el mismo metodo aconsejo para cuando estas muestreando el valor del pwm que mandas, en gral yo pienso que por eso no coinciden tus valores,
pero en definitiva un diagrama electrico estaria mucho mejor
"Desde muy chico tuve que interrumpir mis estudios para ir a la escuela"  Gabriel García Márquez

MARCO_RECARGADO

ha llegado el momento de agregarle una practica mas a nuestro pequeño tutorial
esta practica lo que hace es que pasa los datos recibidos por puerto serie a la lcd
utilizo la terminal virtual para simular la comunicacion con el pic

/////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////comunicacion RS232 con pic///////////////////////////////
///////////////by marco_recargado para foro.elhacker.net///////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////
#include <16F877A.h>
#fuses HS, NOWDT, NOPROTECT
#use delay(clock=8000000)

#use rs232(baud=9600,xmit=pin_c6,rcv=pin_c7) /// libreria para el manejo del
                                                                        /// puerto serie  se establece
                                                                        /// velocidad de 9600 baudios
#include <lcd.c>                          /// libreria para el manejo de la lcd
char dato_recibido[16];                /// aqui va a ir los datos recibidos por rs232


#byte porte=0x09

#int_rda                                     //// interrupcion por escritura en buffer del puerto
void rda_isr()
{
  gets(dato_recibido);                  //// esta instruccion almacena en la variable los
                                                 //// datos que se esten enviando hasta que llega
                                                 //// la tecla enter
  }
 




void main()

{
   enable_interrupts(int_rda);                    //// se habilita la interrupcion por
                                                             ////  escritura del puerto serial
   enable_interrupts(global);
 
  set_tris_d(0b00000000);
 
   lcd_init();
   lcd_gotoxy(1,1);
   lcd_putc("    com RS232   ");
   
   while(true)
   {
   lcd_gotoxy(1,2);
   printf(lcd_putc,"%s",dato_recibido);         /// se manda a lcd lo que se  recibio
   
   }
}
 
 
nuestra gloriosa imagen
"Desde muy chico tuve que interrumpir mis estudios para ir a la escuela"  Gabriel García Márquez

Meta

Muy bueno. También hice uno con PIC y RS232 pero con asm. En estos momentos estoy haciendo un manual tutorial que ya llevo más de 40 páginas en PDF y con muchas fotos.

[youtube=425,350]http://es.youtube.com/watch?v=niWAbQ-HVnY[/youtube]

https://foro.elhacker.net/electronica/rs232_con_pic16f84a_y_visual_c_net-t228116.0.html
Tutoriales Electrónica y PIC: http://electronica-pic.blogspot.com/