Curso de programación en C para microcontroladores PIC

Este es un ejemplo de lectura escritura

if (input(PIN_B0)==1){
write_eeprom(0,0);// aqui grabo en la posicion 0x00 el estado de RB0
delay_ms(500);
}
if ((read_eeprom(0)==0x01)){//aqui lo leo
output_high(PIN_A2);
}
Adaptalo a tu codigo, cada vez que escribas el valor en el port del pic
tambien hazlo en la eeprom..:apreton:
 
gracias, yo siempre había programado en ensamblador pero ahora que necesito usar el modulo usb necesitaba aprender c, los tutoriales estan muy buenos :)

Hola, estoy iniciando un proyecto para usar el PCI18F2550 pero quiero saber si puedo usar C para programarlo.

Por si alguien está interesado, lo estoy armando poco a poco para mi tesis y estoy dejando registro de avance en la página

me ha gustado mucho, estoy haciendo algo parecido también para mi tesis ;)
 
hola
Tengo problema con el tratamiento a un lcd, el problema es que no se que salidas del pic conectar al lcd lm016 para que se pueda inicializar el lcd y luego escribir en el.
Por si no me entienden tengo que escribir en un LCD un valor de una medicion con el pic18f4550, pero no se que terminales del pic conectar al LCD, estoy hablando de conexion fisica para cuando balla a simularlo en proteus se escriba correctamente. espero haberme explicado bien.
Se les agradece cualquier ayuda.
Sludos
 
Una consulta.... al hablar de programar en C, si lo hago con uno u otro compilador (llámese CCS, MikroC, etc...) son compatibles sus archivos? es decir si hago un código fuente en uno y veo que el otro se me hace más fácil, puedo cargar y compilar ese código fuente en el otro compilador?

P.D. Aun no me decido por el compilador de CCS o el MikroC, estoy recién aprendiendo lenguaje C, el assembler lo domino pero ya se hace un tanto pesado para PICs más potentes.

Saludos
 
Una consulta.... al hablar de programar en C, si lo hago con uno u otro compilador (llámese CCS, MikroC, etc...) son compatibles sus archivos? es decir si hago un código fuente en uno y veo que el otro se me hace más fácil, puedo cargar y compilar ese código fuente en el otro compilador?

P.D. Aun no me decido por el compilador de CCS o el MikroC, estoy recién aprendiendo lenguaje C, el assembler lo domino pero ya se hace un tanto pesado para PICs más potentes.

Saludos

hola Psyco83, no no son compatible los compiladores, si escribis codigo para ccs, no lo podes compilar en mikroc o viceversa, tendrias que traducir a mano el codigo.
yo tengo los dos compiladores pewro me quedo toda la vida con mikroc, saludos.
 
Gracias sdel, el que no sean compatibles los códigos, corresponde a que cada programa tiene librerías, que aunque manejan iguales cosas, están escritas de otra manera? o cual es la razón porque se supone que el lenguaje C es eso y punto... Corrígeme si me equivoco.
Podrías explicar, si no es molestia, porque prefieres MikroC más que CCS.

Saludos
 
Yo probe mikroc y ccs y la verdad me quede con ccs, aunque fue mas por mi trabajo
ambos diría yo son buenos, es cosa de cada quien cual se le adapte mejor..
 
Como dice COSMICO los dos (mikroc y ccs) son buenos pero en mikroc ponen ejemplos con fotos de como van las conexiones de los distintos metodos. Por ejemplo, yo estaba buscando como conectar el pic 18F4555 a un lcd, es que no sabia que patas del pic iban al lcd, en el mikroc pude ver un ejemplo con foto de que patas iban conectadas, con el ccs no pude ver nada. Conclucion, para mi mikroc es mejor por la gama de ejemplos que posee.
 
Claro, cada compilador tiene sus librerias y maneja las cosas como quiere, por ejemplo para setear los bits en un puerto.
el lenguaje c si, es uno solo, pero enrealidad lo que es uno solo es el ansi c, el standart, todas las funciones del c standart las vas a encontrar en ambos compiladores, cosas como manejos de strings o funciones matematicas, yo prefiero mikroc por costumbre nada mas, ya me acostumbre a usarlo y me siento comodo, si aprendes uno no vas a tener problemas con el otro, a mi lo que no me gusta de ccs es que se necesitan usar muchas directivas de configuracion, pero es cuestion de costumbres. saludos
 
No pude leer todos los temas anteriores.
Soy tecnico electricista con algunos conocimientos de electronica. Mi deseo es tener conocimientos sobre los PIC, todo lo posible. Hay algun curso o manual que me permita conocer bien este tema?
 
Hola Neybero, pues primero que nada bienvenido a la programación de PICs

Para empezar te sugiero que definas las características del microcontrolador con el que deseas comenzar (puertos análogos, comparadores, timers, etc, etc) yo te recomiendo por supuesto que busques las hojas de datos directamente de microchip, y si gustas al mismo tiempo programar y practicar tus circuitos, pues busca el libro "COMPILADOR C CCS Y SIMULADOR PROTEUS PARA MICROCONTROLADORES PIC", tiene muchos ejemplos que con un poco de imaginación podras desarrollar a tus necesidades
 
Última edición:
buenas como están miren nunca había utilizado lo que son las interrupciones del pic en mi caso el 16F876A, me puse a leer un poco y bueno logre entender mas o menos como funcionan.
Mi caso es el siguiente tengo el pic con los pines RB0 a RB6 como entradas y RB7 como salida, lo que quiero es activar lo que es la interrupción externa pin RB0 solo cuando el pin RB2 este presionado cuando se recibe una interrupción se prende un led en la pata 7 por 200ms.
Mi problema es que cuando el interruptor que esta en RB2 no esta activado y presiono RB0 se acciona una interrupción, eso si una sola vez pero no se porque, según veo en este caso no debería prender ni una sola ves es como si se colara una interrupción.
Les agradecería su ayuda.


Código:
#INT_EXT         //Atención a interrupción por cambio en RB0
void ext_isr(void){            //Función de interrupción
   output_high(PIN_B7);
   delay_ms(200);
   output_low(PIN_B7);
   return;
}



void main( void )
{



SET_TRIS_A(0x00);
SET_TRIS_B(0x7F);// de porb0 a portb6 entradas y portb7 salida
SET_TRIS_C(0x00);

OUTPUT_C(0);
OUTPUT_B(0);
OUTPUT_A(0);

while(1){


      disable_interrupts (INT_EXT); // Desactiva interrupciones en RB0.
      disable_interrupts(GLOBAL); 
      
      while (!input(PIN_B2))      {
                 
                       
                  enable_interrupts(int_ext);          //Habilita int. RB0…
                  ext_int_edge(L_TO_H);              //por flanco de subida
                  enable_interrupts(GLOBAL);    //Habilita int. general
                  
      } 
      disable_interrupts (INT_EXT); // Desactiva interrupciones en RB0.
      disable_interrupts(GLOBAL); 
}
}
 
Última edición:
Hi josb,
RB0 y RB2 estan normalmente a 5V o GND?
Ahorita no tengo IDE ni un modulo para probarlo pero
trataria de hacer algo como esto,

#INT_EXT //Atención a interrupción por cambio en RB0
void ext_isr(void){ //Función de interrupción
disable_interrupts(INT_EXT); //Desactiva interrupciones en RB0.
disable_interrupts(GLOBAL); //Desactiva interrupciones general

output_high(PIN_B7);
delay_ms(200);
output_low(PIN_B7);
while (!input(PIN_B0)) //mientras sea cero

enable_interrupts(int_ext); //Habilita int. RB0…
ext_int_edge(L_TO_H); //por flanco de subida
enable_interrupts(GLOBAL); //Habilita int. general
}

void main( void )
{
SET_TRIS_A(0x00);
SET_TRIS_B(0x7F); //de porb0 a portb6 entradas y portb7 salida
SET_TRIS_C(0x00);
OUTPUT_C(0);
OUTPUT_B(0);
OUTPUT_A(0);
while(1)
{
if (!input(PIN_B2))
{
enable_interrupts(int_ext); //Habilita int. RB0…
ext_int_edge(L_TO_H); //por flanco de subida
enable_interrupts(GLOBAL); //Habilita int. general
while (!input(PIN_B2))delay_ms(5); //mientras sea cero
}
else
{
disable_interrupts(INT_EXT); //Desactiva interrupciones en RB0.
disable_interrupts(GLOBAL); //Desactiva interrupciones general
while (input(PIN_B2))delay_ms(5); //mientras sea 1
}
}
}
 
Hi josb,
RB0 y RB2 estan normalmente a 5V o GND?
Ahorita no tengo IDE ni un modulo para probarlo pero
trataria de hacer algo como esto,

#INT_EXT //Atención a interrupción por cambio en RB0
void ext_isr(void){ //Función de interrupción
disable_interrupts(INT_EXT); //Desactiva interrupciones en RB0.
disable_interrupts(GLOBAL); //Desactiva interrupciones general

output_high(PIN_B7);
delay_ms(200);
output_low(PIN_B7);
while (!input(PIN_B0)) //mientras sea cero

enable_interrupts(int_ext); //Habilita int. RB0…
ext_int_edge(L_TO_H); //por flanco de subida
enable_interrupts(GLOBAL); //Habilita int. general
}

void main( void )
{
SET_TRIS_A(0x00);
SET_TRIS_B(0x7F); //de porb0 a portb6 entradas y portb7 salida
SET_TRIS_C(0x00);
OUTPUT_C(0);
OUTPUT_B(0);
OUTPUT_A(0);
while(1)
{
if (!input(PIN_B2))
{
enable_interrupts(int_ext); //Habilita int. RB0…
ext_int_edge(L_TO_H); //por flanco de subida
enable_interrupts(GLOBAL); //Habilita int. general
while (!input(PIN_B2))delay_ms(5); //mientras sea cero
}
else
{
disable_interrupts(INT_EXT); //Desactiva interrupciones en RB0.
disable_interrupts(GLOBAL); //Desactiva interrupciones general
while (input(PIN_B2))delay_ms(5); //mientras sea 1
}
}
}

hay algo que no entiendo en el código colocas "while (!input(PIN_B2))delay_ms(5)" eso es un do while o es así solo, no sabia que eso se podía hacer. La verdad no entiendo muy bien tu código.
 
Última edición:
Hi Josb,

lo dices porque faltan los brackets?,
o cual es la duda?


:)

me parecio algo interesante esto
"
else
{
disable_interrupts(INT_EXT); //Desactiva interrupciones en RB0.
disable_interrupts(GLOBAL); //Desactiva interrupciones general
while (input(PIN_B2))delay_ms(5); //mientras sea 1
} "
la verdad no lo entiendo por que no colocas lo {} del while

otra cosa es que intente asi pero hace lo mismo
 
lo brackets los uso solamente cuando es mas de una instruccion
para for o while, igual los puede poner no hace diferencia.
Dime si entendi bien, Tu quieres que la interrupcion este
habilitada solo cuando PIN_B2 = 0, que supongo es un push button.
la interrupcion entra solo cuando el PIN_B0 va de 0 a 1, que es otro push button.
y un LED parpadea controlado por el PIN_B7
el board tu lo hiciste?
:)
 
Atrás
Arriba