Programas para Pic C Compiler (Tutorial)

Muy buenas kapotik, el codigo .hex se genera al momento de compilar el programa que has hecho o presionando la tecla F9 (compile).

Si esta bien lo que haces pero tu cuando hagas tu programa con el pic wizar no pongas nada solo donde lo vas a guardar y ya, lo que te ponga en la pantalla borralo TODO y pon el programa tal y como lo posteo yo (leelo comprendendelo y claro has las modificaciones necesarias si usas otro pic) a continuacion presiona compili o F9 y en la direccion donde guardaste tu archivo te generara como 7 archivos mas uno de ellos el el .HEX que andas buscando.

Mucho ojo kapotik si leiste todo esto es porque sabes que muchos de mis programas traen algo que se llama bootloader y lo tienes que borrar en caso de que tu no lo estes usando si no no te va a funcionar.

casi en todos los preogramas son estas lineas

Código:
#build (reset=0x200)
#build (interrupt=0X208)
#ORG 0X0000, 0X01FF

void BOOTLOADER() {
      #ASM
         NOP
      #ENDASM
}

Eso es lo que debes de borrar si no estas usando el botlooader que ya explique antes. Ya borrado ahora si genera tu archivo .HEX y cargalo de la manera que mas te guste mi buen.

Para cualquier otra cosa aqui ando.
 
Pues bueno colegas estoy de nuevo despues de un largo tiempo de sin estar por aqui, pues como lo prometi, pndre como hacer el programa de elevador en 2 formas, asi mismo como pondre ya control avanzado con microprocesadores para muchas funciones como control de motores por PID y Control de Estados, tambien sobre control de temperatura por PID, todo esto explicado cmo debe de ser. Haciendo calculos y observando antes de que funcione nuestro sistema que este es estable, todo esto analizandolo con matlab. y en momneot s espero poder llegar a control de procedsadores para crear un pequeño sistema operativo para controles robustos.
La meta que logren hacer su pendulo invertido. Y pues sera escencial el manejo del pic.
 
Buen dia compañeros del foro:
Estoy utlizando una rutina que encontre PIC C ... sin emabargo este utliza TODO el puerto B.... Pero necesito saber como se puede CREAR un PUERTO_0X que utlice 4 terminales del puerto A y 4 terminales del puerto B..... que utilice laconfigracion TRIS_X y PORT_X

Agradeceria la colaboracion
 
Hola a todos, Frivoldeux, estoy interesado en el tema de control PID, para el control de un pendulo invertido. Encontre algo de info en la pagina de microchip, acerca de como desarrollar el programa para dicho control. Tenes algo de información que me pueda ayudar en la programación y ajuste del control?
Muchas gracias.
Saludos.
 
Muy buenas tengan todos ustedes lectores de Foros de electronica, eh bajado mucha información de este lugar y eh aprendido mucho aqui, soy estudiante de ing. electromecanica y estoy en mi segunda especialidad de Automatizacion y acabo de llevar microcontroladores. Todo esto pues quisiera compartirlo con ustedes. Estare posteando varios programas en Pic C por su simplicidad, tambien programo en Assambler y empiezon con matlab para hacer controles sofisticados para misiles y posionamiento de cosas muy complejas a las cuales no me metere (porque todavia no soy un erudito en esos temas)

Bueno el dia de hoy empezare con programas sencillos como prender y apagar un led por un pin del microcontrolador sere muy especifico en los comentarios y estare trabajando con el pic 18f452 i/p , claro a lo largo del tuto sabras que en pic C y sabiendo leer los datasheets (hojas de datos) cualquier pic lo hacen jalar. OJO, me perdonaran que ponga los programas ya hechos, ya que esto es antietico porque ustedes deben de pensar para hacer las cosas, pero espero que aqui se comparta mucho conociento y verlo en aplicaicones reales.

Bueno sin mas por el momento empecemos: (mucho ojo con los comentarios porque ocupan muchas lineas en algunos casos para la explicacion).

1.- //Programa para prender y apagar un led sin timer.

Código:
#include <18F452.h>                                     //Libreria del pic a usar aqui se pondra el pic que se usara de aqui que        dependera la configuracion de los puertos y de los bytes

#fuses HS,NOWDT,NOPROTECT,NOLVP         //tipo de cristal externo high speed, perro guardian off, sin proteccion etc..

#use delay(clock=20000000)                       //Cristal de 20 Mhz leer datasheet para conexión de capacitores se puede usar difereentes cristales ver datasheet una vez mas

#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7) //declaro esta libreria ya que usaremos mas adelante la comunicacion serial del pic, la explico de una vez, el pin Rc6 (patita 25 del pic) sera la de transmision y la Rc7 de recepcion (patita 26) estas van conectadas a un max 232 que aqui en el foro encontraran su conexión, a una velocidad de 9600 baudios esto se vera mas adelante para la configuracion de la PC y del monitor que viene incluido en el programa (Pic C compiler PCHW) para ver lo que transmitimos y recivimos, les pasare un bootloader para estar programndo directamente del PC sin necesidad de programar con tarjetas (esto lo explico mas adelante)

#build (reset=0x200)       //Como usaremos un programa interno para programar jeje tenemos que mover el reset las 
#build (interrupt=0X208) //inrrupciones y el home, poque el bootloader ocupa sus lugares establecidos y estas tres lineas
#ORG 0X0000, 0X01FF     //son para eso, para cambiar de banco al y que no se nos pierda el pic al funcionar.


void BOOTLOADER() {      //Esta subrrutina es solo para evitar el programa del bootloader cada vez que programemos 
      #ASM                            
         NOP 
      #ENDASM
}

#byte PORTA= 0XF80   //Aqui nombramos loa puertos en mi caso yo les puse PORTA PORTB etc, pero ustes les pueden 
#byte PORTB= 0XF81   //poner el nombre que quieran las direcciones de cada micro vienen el datasheet
#byte PORTC= 0XF82   // por eso muy importante leerlo para que no vallan a usar estas para todo pic que se les ocurra
#byte PORTD= 0XF83  //hay que leer antes de hacer.
#byte PORTE= 0XF84

void main(){                //En esta parte sera la declaracion de variables configuracion de puertos y configuracionde mas cosas como timers, ADC, pwm, entre otras cosas.

set_tris_B(0xff);          /*Configuracion de puertos , a mi me gusta mucho hacerlo de forma hexadecimal pero para los que no saben explicare como se sacan los valores, ya que tambine se puede poner en binario. 
Los puertos son de 8 patitas (1 byte u ocho bits) y se dividen en nibles (alto y bajo) para sacar la conversion hexadecimal yo lo hago de la siguiente manera (ya despues lo haran mentalmente):

Nible alto        Nible bajo (pensando para puerto A)
A7 A6 A5 A4    A3 A2 A1 A0    (es como se acomodan los puertos en los nibles)
 8   4   2   1      8   4   2   1     (estos son los valores decimales para los bits)
 0   0   0   0      0   0   0   0     (este sera el valor binario para los bits "0" significa output "1" sera input)
         0                     0                  (el valor hexadecimal para este sera 0x00)
 8   4   2   1      8   4   2   1     (Ahora por el puerto A yo quiero que A0, A1, A5 y A7 sean entradas y los demas salidas)
 1   0   1   0      0   0   1   1     (el codigo binario seria 0b1010011)
         A                     3            (Como sabemos en hexadecimal A=10 si sumamos 8+2=10 para la conversion de decimal a Hexadecimal tenemos A en el nible alto y 3 para el nible bajo 1+2=3, para eso sirven el 8 4 2 1) espero sea claro porque es muy tedioso explicar esto. */
set_tris_D(0x00);     //Todos  D como salida
set_tris_C(0x80);     //Pin C7 como entrada y todos los demas como salida por la transmision serial

while(1){                 //Aqui empezamos el programa While(True) es lo mismo para que simpre se cicle el programa

output_high(pin_D0);  //Aqui lo que decimos es que nos mande a 1 o prenda el pin D0 en el cual esta conectado el led con su respectiva resitencia de 330 ohms
delay_ms(100);           //Con una duracion de encendido de 100 milisegundos (ms) para nano micro segundos sera (us)
output_low(pin_D0);   //Ahora lo apagamos mandandolo a 0
delay_ms(100);           //Con una duracion en bajo de 100 ms tambien.

}    
}//Cerramos todos los corchetes que hallamos abierto
De cualquier manera el PCHW nos indicara que erroes halla en caso de que los halla pero tomen en cuanta que corrigue errores de sintaxis no de logica, por otro lado veran lo facil que son los programas ya que tambien hay que administrar la programacion para no cargar inecesariamente el pic, recordemos que por cada instruccion ocupa un ciclo de reloj y por cada salto ocupa el doble, asi que hay que hacer lo mas reducinos nuestros programas, ya veran...

En este tuto ire poniendo cada vez mas complejos (que la verdad son muy sencillos) los programas las coneciones y la imaginacion dependera de ustedes, por ejemplo para este caso se puede conectar un relevador o TRansistor para accionar alga durante unos segundos y despues apagarlo o depende de la imaginacion de cada quen, esto se vera tambien despues para controlar servomotores, es exactamente lo mismo para generar frecuencias de trabajo y posicionar nuestro servomotor.

Para los proximos programas ya no dare tanta explicacion solo esta vez para entender lo que estamos usando, ya cuando salgan cosas nuevas la explicare en su momento.

2.- Ahora pongo el programa mas facil que lo que hace es que si presiono un boton prende un led, lo suelto se apaga. super facil pero funcional.

Código:
#include<18f452.h>
#fuses hs,nowdt, noprotect,no lvp
#use delay(clock=20000000)
#use rs232(baud=9600,xmit=PIN_C6,rcv=PIN_C7)
#build(reset=0x200)
#build(interrupt=0x208)
#org 0x0000,0x01ff


void bootloader()
{
#asm
nop
#endasm
}


#byte portA=0xF80
#byte portB=0xF81
#byte portC=0xF82
#byte portD=0xF83
#byte portE=0xF84     //Hasta aqui lo de siempre


void main()
{
set_tris_B(0xFF);
set_tris_D(0x00);
set_tris_C(0x80);

portD=0;
portB=1;

while(1)
{
portD=portB; /*Si presiono un boton en el puerto D; recuerden que los botones van con una resistencia pull-up o  pull-down depende del valor que quieran asegurar (1 o 0 sea el caso), me madara el valor al puerto B prendiendo el led que este ahi, ojo si pongo el boton en D0 el led tendra que ir en B0 */
}
}
Esto es para todo el puerto pero se puede hacer mas facil solo por bits con la funcion if:

Código:
While(True)
{
  if (input(pin_D0)
     output_high(b0);
  else
     output_low(b0);
}
Depende de su uso.

3.- El siguiente programa es para hacer corrimientos en los puertos, yo los uso mucho para controlar motores a pasos, este programa va a controlar el nible bajo el alto es lo mismo.
Me voy a evitar todo lo anterior ya saben que es lo que va.

Código:
void main()
{

   int m1=16;           /*Declaramos variable tipo entero (int) recuerden que solo llega hasta 255 porque es un pic de 8 bits y la igualamos a 16*/

   set_tris_D(0x00);  //Configuracion de puertos 

   PortD=0;               //Limpiamos el pueto para que no halla basura

   while(1)
   {

      PortD=m1;        /*El puerto D es = a 16 o sea que estan todos los led apagados en 15 todos estarian prendidos la explicacion es precido a la de la configuracion de los puertos*/
      delay_ms (500);     //REtardo de medio segundo entre led y led
      m1=m1>>1 | m1 <<3;   /*Logica del programa esto >> significa que corra hacia la derecha y << hacia la izquierda lo que le digo yo es que recorra 1 y que el sume tres pa el otro lado: con manzanas:

0 0 0 0  0 0 0 0 (asi empiezo) int =16 me dice que le ponga 1 y que le quite 3 recordemos que son corrimientos
1 0 0 0  0 0 0 0 (le puse hacia la derecha)
1 0 0 0  1 0 0 0 (ahora mas 3 hacia la izq) se pone ahi el 1 porque recuerden que estamos en 16 no en 15. y volvera a hacer lo mismo*/


      m1=m1 & 0x0F;   /*Todo el nible bajo lo multiplico por 1 1 1 1 para que me gurde el dato para el siguiente, si no les convece hagan las operaciones y veran que si da.*/
   } //Cerramos todo
Con este programita se puede hacer girar un motor a pasos conectado al puerto D con sus respecitivos transistores yo uso los TIP 125 por aguantar mucha corriente, son tipo darlington y estan protegidos internamente. recuerden que es el nible bajo D0, D1, D2, D3. estos van a las bases de los transistores. WUA eso no lo tengo que explicar.

Experimenten con este programa y pueden controlar 2 motores a pasos simultaneamente cambien la direccion de >> o << para que cambie el giro y si quieren visulizar los dos nibles cambien esto m1=m1 & 0x0F; por esto m1=m1 & 0xFF; y analicenlo para que vean porque. Tambien si cambian esto m1=m1>>1 | m1 <<3; por valores en ves de 3 por 5 o 7 veran lo que hace. Espero que les sirva.

Para los proximos programas veremos como contar el numero de veces que prede y apaga los led en los corrimientos esto para hacer que los motores a pasos lleguen hasta cierto punto y se paren. quiere decir que si le pongo 50, solo va a hacer 50 pasos el motor. Esto para la proxima. (y tendran que ver la resolucion de sus motores (Usamos motores Unipolares)

O si dejo el programa bootloader para que lo cargen en su pic (este solo funciona para el 18f452, despues posteo el que esta en assambler para que modifiquen el bootloader y lo usen para cualquier pic de la serie 18F, sorry no tengo para otros, pero si buscan en la red encontraran para varios pics, incluso en el PCHW, en uno de los ejemplos viene uno, no lo eh calado pero chance y funcione, Chequenlo) yo lo mando en hexadecimal para que lo carguen de volada.

PD.Perdon si hay faltas de ortografia.

Que tal amigo, necesito de tu super ayuda. En el tercer programa (el que corresponde al corrimiento de leds) y que mencionas que puede ser util para controlar motores a pasos tengo una duda. Podrias explicarme un poco mas detalladamente la parte del corrimiento de datos donde dice:

m1=m1>>1 | m1 <<3

La verdad no entiendo muy bien como es que se mandan los pulsos al motor o a los leds dependiendo de que se conecte, si me pudieras ayudar te lo agradeceria mucho, gracias.
:apreton:
 
Buenas, estoy tratando de comunicar dos pics 16f84A por medio del protocolo de comunicacion rs232, este tipo de comunicación ya lo he hecho en assembler, pero me gustaría desarrollarlo en pic c compiler, soy nuevo manejando este compilador, así que me sería de mucha ayuda tus concejos, gracias
 
Que tal amigo, necesito de tu super ayuda. En el tercer programa (el que corresponde al corrimiento de leds) y que mencionas que puede ser util para controlar motores a pasos tengo una duda. Podrias explicarme un poco mas detalladamente la parte del corrimiento de datos donde dice:

m1=m1>>1 | m1 <<3

La verdad no entiendo muy bien como es que se mandan los pulsos al motor o a los leds dependiendo de que se conecte, si me pudieras ayudar te lo agradeceria mucho, gracias.
:apreton:

Hola, y perdon por la grna tardanza a responder pero estuve ocupado estos días.

Muy bien, pues la formulita que ves (m1=m1>>1 | m1 <<3) es para hacer efectivamente para hacer corrimientos de bits y todo esto dependea de como hagas las sumas y multiplicaciones y es lo que hara el icrocontrolador, en este caso lo que tenemos es qu la varibale m1 esta igualada a 16, ntonces a nivel de bits lo que haremos es que recorreremos un bit a la derecha (m1>>1) y despues haremos una suma booleana de -3 a la iazquierda (m1<<3), esto para cumplir un corrimiento, especifico, mucho ojo en la parte donde dice m1=m1 & 0x0f; porque aqui es donde se multiplica por el nible alto o al bajo, o los dos sea el caso.
en el caso anterior (m1=m1 & 0x0f;) solo esta funcionando el nible bajo.
Realmente pense que estaba explicado muy bien n el mismo programa.

Espero y te haya ayudado cualquier duda no duden en preguntar.

gracias por el tuto!! necesito enviar un dato de 8bit de un pic esclavo a otro pic maestro!! por i2c!!!

como lo hago??? uso dos pic 18f4550

Em ayudaria muhco mas si me explicaras un poco mas que es lo que desea hacer exactamente porque puedes enviar sin necesidad de ua conexion i2c un dato de 8 bits pero si es asi como lo quieres hacer, porque la verdad si seria mucho mas provechoso podria ayudar si tuviera mas información, como su aplicación para asi poder darme un a idea.

Espero tu respusta para proporcionar mi ayuda.

Buenas, estoy tratando de comunicar dos pics 16f84A por medio del protocolo de comunicacion rs232, este tipo de comunicación ya lo he hecho en assembler, pero me gustaría desarrollarlo en pic c compiler, soy nuevo manejando este compilador, así que me sería de mucha ayuda tus concejos, gracias

Que onda giovamolina, pues efectivamente si, se puede crear una comunicacion por rs232, cin pic C compiler es mucho mas facil aun, de todos los progrmas que puse "todos" en alguna parte dice por ahí, lo unico que se necesita ahcer es cambiar el #include <18f452.h> y en tu caso pondrias #include <16f84.h> para crear la comunicacion serial por rs232 en la linea #use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7), aqui es hasta donde yo te puedo ayudar porque lo que es xmint y rcv, en el 16f84 no se cuales amneja, se que los hacen por otras patitas las conexiones hacia el max232 pero no estoy seguro me informare porque algunos compañeros lo han hecho con ese pic, y como yo casi no manejo la serie 16 no s emuhco sobre eso, pero con gusto me informo para ayudarte.

hola una vez mas compañeros de Forosdeelectronica he regrsado recargado y con nuevos proyectos para ustedes siguiendo con esto de los microcontroladores, por cuestiones practicas seguire usando el pic 18f452-i/p que es muy versatil y pues ya tenemos mucha informcion sobre este pic, en dias venideros me encargar de postear dos programas, l que les debo del elevador (jejejeje) y un programa que me funciono muy bien, que es un control de teperatua manejado con un lm35, lo interesante de este programa es que es programable por medio del puerto seria y la comunicacion 232 qiere decir que si ustedes estn n un rango de entre 22 y 24 grados celcius donde el sistema es estble, pero en determinado momento ustedes lo queiren cambiar a entre 25 y 28 lo podran hacer a traves del puerto serial, o incluso atravez del teclado matricial, cualqueira de las dos funciona muy bien, bueno por el momento stoyoun tanto ocupado, tmb posteare algunas aplicaciones con el PWM para control de iluminacion y velcidad del motor. Y hareos convinaciones de los primeros programasn de corrimientos con los ultimos programas de pwm, para hcer series de corrimientos modulas en intensidad de luz, en fin mejor postear que platicar os dejo un programita para empezar.

*****************************
Programa para prender algo que caliente un espacio (sistema) cuando la tempratura sea menor a la deseada, tambien prendera otra cosa que enfrie el mismo sistema cuando la temperatura supere el valor porpuesto, este progrma se diño para crear un control en una incubadora de huevos y a grnades rasgos lo que hace es prender un foco que calienta el espacio y lleva la temperatura hasta 39 grados celcius despues apaga el foco y prende el ventilador para move el aire caleinte dentro del sistema (porque asi debe de ser con lo huevos) y una ve que la temperatura se cae por dbajo delso 33 grados celcuis se prende una vez mas el foco. Todo esto mostrado en displays de 7segmentos (temperatura leida por el lm35)

Código:
#include <18f452.h>
#include <STDIO.h>
#fuses hs,nowdt,noprotect,nolvp
#use delay(clock = 4000000,RESTART_WDT)
#use rs232(baud=9600,xmit=pin_c6,rcv=pin_c7)
#build (reset=0x200)
#build (interrupt=0x208)
#org 0x0000,0x01ff
void bootloader()
{  #asm
   nop
   #endasm
}
#byte porta=0xf80
#byte portb=0xf81
#byte portc=0xf82
#byte portd=0xf83
#byte porte=0xf84

void main()
{ 
   int const disp [10] = /*{0x3f, 0x06, 0x5b, 0x4f,0x66,     //declaramos los vectores para el display (Catodo Común)
                          0x6d, 0x7d, 0x07, 0x7f, 0x6f};*/  
                         {0x40, 0x79, 0x24,0x30, 0x19,       //declaramos los vectores para el display (Anodo Común)
                          0x12, 0x02, 0x78, 0x00, 0x18};
                          
   int uni,uni2,unip,dec,dec2,decp,multi,multi2,k,prome;
   int b=0;
   float temp,temp2;
   float dato,dato2;
   
   SETUP_TIMER_2(t2_div_by_4,200,1);
   enable_interrupts(GLOBAL);
   setup_adc_ports(2);
   setup_adc(adc_clock_div_32);
   set_adc_channel(0);
  
   
   set_tris_B(0x00);
   set_tris_C(0x80);
   set_tris_D(0x00);
 
      while (TRUE)
      {     
         dato  = read_adc();
         delay_ms(10);
         set_adc_channel(1);
         dato2 = read_adc();
         delay_ms(10);
         
         temp   = (0.019607843 * dato);
         temp2  = (0.019607843 * dato2);
         
         multi  = temp * 100;
         multi2 = temp2*100;
         
         dec    = (multi/10);
         dec2   = (multi2/10);
         decp   = (dec+dec2)/2;
         
         uni    = (multi%10);
         uni2   = (multi2%10);
         unip   = (uni+uni2)/2;
         
         
         prome = (multi + multi2)/2;
         
// Control para encender o apagar un ventilador o un foco  
            
         if (prome < 38 && b==0 || prome > 38)          
          {
            b=1;
            output_high(PIN_D2);  //vent
            output_high(PIN_D1);  //foco
          }
         if (prome  > 37 && b==1)    
          { 
            output_high(PIN_D2); //vent
            output_low(PIN_D1);  //foco
          }  
         if(prome < 30)
          {
            b=0;
          }
//Para mostrar la temperatura en dos Displays de 7 segmentos
         for(k=0;k<=30;k++)
           {
             portb=disp[unip];
             delay_ms(10);
             portb=disp[decp] + 0x80;
             delay_ms(5);
           }
      }
}

NOTA: los valores que debn de modificarse en caso de desear otras temperaturas o la logica de control debera de ser dentro y solo dentro de //Control para encender y apagar un foco. Así mismo hay que notar que son 2 sensores lm35 conectados uno l pin A0 y el otro al Pin A1 la lectura es de los dos y se promedia su valor para encontrar la temperatura de la incubadora en mi caso, si ustedes solo quieren tener un solo lm35 pues le quitan todo el promedio.

Si tienen dudas sobre este control con muhco gusto respondo.

Estare posteando mas programas y su explicacion mas adelante. Saludos a todos
 
Última edición:
Hola

como configuro el

Código:
#use delay(clock=20000000)                       //Cristal de 20 Mhz leer datasheet para conexión de capacitores se puede usar difereentes cristales ver datasheet una vez mas

mi PIC es el 18F4520, en base a que debo modificar este valor, es que he visto que demas gente le ponen diferentes valores

gracias de antemano
 
Hola

como configuro el

Código:
#use delay(clock=20000000)                       //Cristal de 20  Mhz leer datasheet para conexión de capacitores se puede usar  difereentes cristales ver datasheet una vez mas
mi PIC es el 18F4520, en base a que debo modificar este valor, es que he visto que demas gente le ponen diferentes valores

gracias de antemano

Buenos dias tengan todos Bazookao te menciono rapidamente, el #use dalay (clock=xxxxxxx) es para darle velocidad de respuesta al pic, si tu compras un cristal de 4 Mz debera de ser #use delay(clock= 4 000 000)si compras uno de 10 Mhz pondras ese valor, todo dependera del cristal que uses, el pic que tienes acepta como maximo un cristal de 40 Mhz pero no te recomiendo usarlo porque se atonta el pic, con uno de 20 Mhz es mas que suficiente. Por otro lado comento que el valor que utilices de este Cristal servira para hacer calculos para usar por ejemplo el PWM, los timers entre algunas otras lecturas, en algunos de los ejemplos pongo formulas donde se utiliza la velicidad de oscilacion del cristal, espero haber aclarado tu duda, cualquir cosa seguimos en contacto.

Una pregunta, para que seria exactamente los dos transistores.

Con referente a que mi buen tesla, o sea a que ejercicio?

hola disculpen soy estudiante de ingenieria electronica V y quisiera saber como es la programacion de un lcd. gracias

Hola manuelato, te comento que es programar en "icd" por sus siglas en ingles es In Circuit Debugger, que significa que programas directamente el pic desde algun ordenador, todo lo que eh puesto aqui es programacion de esa manera, que quiere decir que no quitas tu microcontrolador de la placa o del proto. En otras palabras mandas la información desde la computadora haci el pic, en mi caso por el puerto serial, también se puede hacer por el puerto paralelo, o por usb que es lo mas reciente ahortia, algunos nuevos programadores tienen la capacidad de hacer eso, solo pones tu pic en el zocalo ZOIC (cero esfuerzo) y asi como compilas y programas llega a tu pic y empieza a trabajar. Mandas datos del ordenador al pic y del pic al ordenador. Espero haber aclarado tu duda...

Aqui un programa para tener un control de temperatura y al mismo tiempo poder cambiar los valores de las temperaturas maxima y minima. Si tiene alguna duda con el codigo haganmelo saber. Nota: se utilizo el CCS para programar y compilar y tambien para ver por el puerto serial el funcionamiento de las temperaturas, es un icd.
Código:
 #include   #include                                  //libreria para el atoi #fuses  hs,nowdt,noprotect,nolvp #use delay(clock = 4 000 000,RESTART_WDT) #use  rs232(baud = 9600,xmit = pin_c6,rcv = pin_c7) #build (reset=0x200)  #build (interrupt=0x208) #org 0x0000,0x01ff  void bootloader() {  #asm     nop    #endasm }  #byte porta=0xf80 #byte portb=0xf81 #byte  portc=0xf82 #byte portd=0xf83 #byte porte=0xf84   void main() {   int  const disp [10] = {0x3f, 0x06, 0x5b, 0x4f,0x66,     //declaramos los  vectores para el display                           0x6d, 0x7d, 0x07,  0x7f, 0x6f};  int dato,uni,dec,multi,k;  float temp,temperatura;  int  tmax = 0;  int tmin = 0;  int string1 [1];     //Matrix de 2 x 1 donde  se captura el valor de la temperatura maxima.  int string2 [1];      //Matrix de 2 x 1 donde se captura el valor de la temperatura maxima.   int i = 0;           //Captura de datos para string1  int j = 0;  int  go1;             //Temperatura Maxima  int go2;              //Temperatura Minima  int flag = 0;    setup_adc_ports(2);   setup_adc(adc_clock_div_32);  set_adc_channel(0);  set_tris_B(0x00);   set_tris_D(0x00);      while (TRUE)   {    dato  = read_adc();               //Se lee el adc    temp  = (0.0196078431373*dato);  //5 volts de  referencia entre 255 da el valor de 0.0196078431373    multi = temp *  100;    dec   = multi / 10;    uni   = multi % 10;    temperatura  =  temp * 100;       if(!input(PIN_A4))  //Para entrar al modo de  programación se activa el boton A4    {     while(!input(PIN_A4))    //Solo mientras A4 esta pulsado o activado, si no no funciona.     {       printf("Introdusca la temperatura maxima deseada %i\r",flag);       if(kbhit())      {       if(flag == 0)                       //Se  pregunta por la bandera para solo meter los valores a string1        {            {          tmax = getchar(); //captura del primer valor para la  matrix string1         }          if(tmax != 0x0D)           {             string1 [i] = tmax; //se mete el primer valor en [0] de string1             delay_ms(50);       //se esperan 50 milis            i++;                 //y se incrementa i para meter el segundo valor [1] de string1            }          if(tmax == 0x0D)           //introduce los valores de  la temperatura maxima ("segundo dato")           {            go1 =  atoi(string1);     //Le doy el valor de la matrix String1 a go1   Ejemplo: String = [2 8] // go1 = 28               printf("Temperatura  Max = %i\n\r",go1);                                 if( 0 < go1  go2 )    //para meter solo valores entre 0 a 99              {                   i = 0;     //mandamos i a 0 para k se acomode en [0] de string1               }             else              {               printf("Numero  fuera de rango Hommie %i\n\r",go1);               delay_ms(50);                i = 0;              }            flag = 1;   //Se cambia la  bandera a 1 para poder meter ahora los valores a String2            }                }       if(flag == 1 && tmax == 0x0D)       //Como  ahora la bandera esta en 1 se capturan los datos para string2        {          printf("Introdusca la temperatura minima deseada %iu\r",flag);          {          tmin = getchar();                //cachamos temp minima          }          if(tmin != 0x0D)           {            string2 [j] =  tmin; //se mete el primer valor en [0] de string2             delay_ms(50);       //se esperan 50 milis            j++;                 //y se incrementa j para meter el segundo valor en [1] de string2            }           if(tmin == 0x0D)      //introduce los valores de la  temperatura minma           {            go2 = atoi(string2);           //Le doy el valor de la matrix String2 a go2  Ejemplo: String =[2 0] //  go = 20               printf("Temperatura Min = %i\n\r",go2);                               if( 0 < go2  go1)         //Si la temperatura es  mas grande k go1        {        output_high(PIN_D2);         output_low(PIN_D1);       }      else                           //El  sistema se para       {        output_low(PIN_D2);         output_low(PIN_D1);       }          if (temperatura < go2)          //Prende la bomba       {        output_low(PIN_D2);         output_high(PIN_D1);       }    } //Para mostrar la temperatura en dos  Displays de 7 segmentos   for (k =0;k
 
Última edición por un moderador:
Código:
#include <18f452.h>
#include <stdlib.h>                                 //libreria para el atoi
#fuses hs,nowdt,noprotect,nolvp
#use delay(clock = 4 000 000,RESTART_WDT)
#use rs232(baud = 9600,xmit = pin_c6,rcv = pin_c7)
#build (reset=0x200)
#build (interrupt=0x208)
#org 0x0000,0x01ff

void bootloader()
{  #asm
   nop
   #endasm
}

#byte porta=0xf80
#byte portb=0xf81
#byte portc=0xf82
#byte portd=0xf83
#byte porte=0xf84


void main()
{ 
 int const disp [10] = {0x3f, 0x06, 0x5b, 0x4f,0x66,     //declaramos los vectores para el display
                          0x6d, 0x7d, 0x07, 0x7f, 0x6f};
 int dato,uni,dec,multi,k;
 float temp,temperatura;
 int tmax = 0;
 int tmin = 0;
 int string1 [1];     //Matrix de 2 x 1 donde se captura el valor de la temperatura maxima.
 int string2 [1];     //Matrix de 2 x 1 donde se captura el valor de la temperatura maxima.
 int i = 0;           //Captura de datos para string1
 int j = 0;
 int go1;             //Temperatura Maxima
 int go2;             //Temperatura Minima
 int flag = 0;
 
 setup_adc_ports(2);
 setup_adc(adc_clock_div_32);
 set_adc_channel(0);
 set_tris_B(0x00);
 set_tris_D(0x00);
 

  while (TRUE)
  {
   dato  = read_adc();              //Se lee el adc
   temp  = (0.0196078431373*dato);  //5 volts de referencia entre 255 da el valor de 0.0196078431373
   multi = temp * 100;
   dec   = multi / 10;
   uni   = multi % 10;
   temperatura  = temp * 100;
   
  if(!input(PIN_A4))  //Para entrar al modo de programación se activa el boton A4
   {
    while(!input(PIN_A4))   //Solo mientras A4 esta pulsado o activado, si no no funciona.
    {
     printf("Introdusca la temperatura maxima deseada %i\r",flag);
     if(kbhit())
     {
      if(flag == 0)                       //Se pregunta por la bandera para solo meter los valores a string1
       {  
        {
         tmax = getchar(); //captura del primer valor para la matrix string1
        }
         if(tmax != 0x0D)
          {
           string1 [i] = tmax; //se mete el primer valor en [0] de string1
           delay_ms(50);       //se esperan 50 milis
           i++;                //y se incrementa i para meter el segundo valor [1] de string1
          }
         if(tmax == 0x0D)           //introduce los valores de la temperatura maxima ("segundo dato")
          {
           go1 = atoi(string1);     //Le doy el valor de la matrix String1 a go1  Ejemplo: String = [2 8] // go1 = 28   
           printf("Temperatura Max = %i\n\r",go1);
                   
            if( 0 < go1 <= 99 && go1 > go2 )   //para meter solo valores entre 0 a 99
             {   
              i = 0;     //mandamos i a 0 para k se acomode en [0] de string1
             }
            else
             {
              printf("Numero fuera de rango Hommie %i\n\r",go1);
              delay_ms(50);
              i = 0;
             }
           flag = 1;   //Se cambia la bandera a 1 para poder meter ahora los valores a String2 
          }       
       }
      if(flag == 1 && tmax == 0x0D)       //Como ahora la bandera esta en 1 se capturan los datos para string2
       {
        printf("Introdusca la temperatura minima deseada %iu\r",flag);
        {
         tmin = getchar();                //cachamos temp minima
        }
         if(tmin != 0x0D)
          {
           string2 [j] = tmin; //se mete el primer valor en [0] de string2
           delay_ms(50);       //se esperan 50 milis
           j++;                //y se incrementa j para meter el segundo valor en [1] de string2
          } 
         if(tmin == 0x0D)      //introduce los valores de la temperatura minma
          {
           go2 = atoi(string2);          //Le doy el valor de la matrix String2 a go2  Ejemplo: String =[2 0] // go = 20   
           printf("Temperatura Min = %i\n\r",go2);
                
            if( 0 < go2 <= 99 && go2 < go1)         //para meter solo valores entre 0 a 99
             {   
              j = 0;                                //mandamos j a 0 para k se acomode en [0] de string2
             }
            else
             {
              printf("Numero fuera de rango Hommie %i\n\r",go1);
              delay_ms(50);
              j = 0;
             }
            flag = 0;
           }
       }
     }
    }
   }
  else                //Relacion de temperatura real y deseada cuando no esta ativado a4 
   {
     if (temperatura > go1)         //Si la temperatura es mas grande k go1 
      {
       output_high(PIN_D2);
       output_low(PIN_D1);
      }
     else                           //El sistema se para
      {
       output_low(PIN_D2);
       output_low(PIN_D1);
      }    
     if (temperatura < go2)         //Prende la bomba
      {
       output_low(PIN_D2);
       output_high(PIN_D1);
      }
   }
//Para mostrar la temperatura en dos Displays de 7 segmentos
  for (k =0;k<=5;k++)
         {
          portb = disp[uni];
          delay_ms(10);
          portb = disp[dec] + 0x80;
          delay_ms(5);
         }            
   }
}
 
el siguiente programa es un cronometro con una pantalla lcd, tal vez resuelva algunas dudas con este

#include <16f84a.h>
#use delay(clock=4000000)
#fuses xt,nowdt,noprotect
#use fast_io(a)
#use fast_io(b)
#include "lcd.c"//contador asendente de 99 segundos, debe mostrar continuamente la palabra tiempo y en el segundo renglon
//debe mostrar el tiempo en segundos y milesimas, tambien debe tener un reset y escrita la palabra JJ

void main()
{
int seg[4];
set_tris_a(0x00);
set_tris_b(0xff);
do
{
lcd_init();
lcd_putc("\f");
lcd_gotoxy(1,1);
lcd_putc("Tiempo:");
lcd_gotoxy(9,1);
lcd_putc("JJ");
lcd_gotoxy(7,2);
lcd_putc(":");
lcd_gotoxy(5,2);
for (seg[0]=0; seg[0]<10; ++seg[0])
{
for (seg[1]=0; seg[1]<10; ++seg[1])
{
for (seg[2]=0; seg[2]<10; ++seg[2])
{
for (seg[3]=0; seg[3]<10; ++seg[3])
{
{
printf(lcd_putc,"%u",seg[0]);
delay_ms(2);
}
{
printf(lcd_putc,"%u",seg[1]);
delay_ms(2);
}
{
lcd_gotoxy(8,2);
}
{
printf(lcd_putc,"%u",seg[2]);
delay_ms(2);
}
{
printf(lcd_putc,"%u",seg[3]);
delay_ms(2);
lcd_gotoxy(5,2);
}
}
}
}
}

}while(true);
}

la configuracion del lcd esta para funcionar en el puerto b del pic.
 
buen dia foreros, gracias por ver mi mensaje.
soy novato en pic c compiler y quisiera saber que fuses utilizo o configuro inicialmente para el pic18f4550
este es el codigo. no funciona
#include <18F4550.h> //Libreria del pic a usar aqui se pondra el pic que se usara de aqui que
#fuses HS,NOWDT,NOPROTECT,NOLVP //tipo de cristal externo high speed, perro guardian off, sin proteccion etc..

#use delay(clock=20m) //Cristal de 20 Mhz leer

#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7) //declaro esta libreria ya que usaremos mas adelante la comunicacion serial del pic
void main(){ //En esta parte sera la declaracion de variables configuracion de puertos y configuracionde mas cosas como timers, ADC, pwm, entre otras cosas.

set_tris_B(0x00);


while(1){

output_high(pin_b0);
delay_ms(100);
output_low(pin_b0);
delay_ms(100);

}
}

si alguien pudiera ayudarme.. a configurar el oscilador externo a 20mhz, y sin bootloader, por el momento uso el pickit2. el problema que tengo es a la hora de montarlo en la proto, donde el pin b0 enciende, cuando coloco el pin1 del micro a vcc con una resistencia. pero no efectua el parpadeo.
gracias por la colaboracion.
 
Última edición:
buen dia foreros, gracias por ver mi mensaje.
soy novato en pic c compiler y quisiera saber que fuses utilizo o configuro inicialmente para el pic18f4550
este es el codigo. no funciona


si alguien pudiera ayudarme.. a configurar el oscilador externo a 20mhz, y sin bootloader, por el momento uso el pickit2. el problema que tengo es a la hora de montarlo en la proto, donde el pin b0 enciende, cuando coloco el pin1 del micro a vcc con una resistencia. pero no efectua el parpadeo.
gracias por la colaboracion.

#include <18FXXXX.h> //Libreria del pic a usar aqui se pondra el pic que se usara de aqui que dependera la configuracion de los puertos y de los bytes

#fuses HS,NOWDT,NOPROTECT,NOLVP //tipo de cristal externo high speed, perro guardian off, sin proteccion etc..

#use delay(clock=20000000) // usalo de esta manera y dime a ver que pasa

inyelber dijo:
me puedes hehar una mano con un ascensor que estoy haciendo?

Tu dime en que puedo ayudar, perdón por contestar mucho después he estado muy ocupado con la chamba...
 
Última edición:
Atrás
Arriba