Autor Tema: Ayuda para programar PIC16F877 en C  (Leído 6743 veces)

0 Usuarios y 2 Visitantes están viendo este tema.

Desconectado Clemen89

  • PIC10
  • *
  • Mensajes: 30
Ayuda para programar PIC16F877 en C
« en: 29 de Abril de 2012, 16:51:13 »
Hola

Voy a usar el PIC16F877 en el proyecto de final de carrera, y me gustaría programarlo en C porque solamente he usado ensamblador y me gustaría aprender a usar el C que en ocasiones es necesario.

Ya tengo el MPLAB y por lo visto para este pic no tengo que descargarme ningun compilador aparte, ya que MPLAB trae de serie el Hi-Tech que por lo visto es lo que necesito para programar este pic en C.

He hecho la placa en Eagle, aquí dejo el esquema por si alguien le ve algun problema asi a simple vista o alguien quiere echarle un vistazo:



Bien ahora he de decir que lo que quiero es que por un puerto RS232 se conecte un modem GSM y al otro lado una estación meteorologica, el pic debe de ser el intermediario entre los dos.

Me gustaria ver programas ya hechos para este pic porque jamas he hecho ningun programa en C para pics y no tengo ni idea. Mi primera idea es hacer un programa de prueba con el que probar ya de paso la placa, por ejemplo cada vez que pulse el pulsador que le he metido por un puerto ( el de reset no obviamente ) que envie por los puertos RS232 una letra, y asi poder ver en el hiperterminal de window si funciona la placa y aparte aprendo poco a poco a programar en C.

A ver si alguno me echa una mano a empezar a programar en C con alguna recomendación o algun ejemplo hecho para esta familia de pics.

Un saludo y muchas gracias de antemano por la ayuda.

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Ayuda para programar PIC16F877 en C
« Respuesta #1 en: 29 de Abril de 2012, 22:24:04 »
  Yo comencé leyendo un par de libros de programación en C....

  "An introduction to programming PIC in C"
  "Programming 8 bit PIC microcontroller in C"

  También, en www.microchipc.com hay varios ejemplos y librerías para HiTech
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado Clemen89

  • PIC10
  • *
  • Mensajes: 30
Re: Ayuda para programar PIC16F877 en C
« Respuesta #2 en: 01 de Mayo de 2012, 16:51:07 »
Gracias por la respuesta, me apunto los libros.

Le he estado echando un ojo y tengo una duda, voy a usar el Hi tech, me gustaría saber una cosa.

#use parece que es del CCS y no se puede usar en el Hi tech, ¿para usar la función delay en microsegundos o milisegundos en el Hi tech que tendría que hacer?

He buscado bastante pero no encuentro nada que me lo aclare bien, ¿tendría que bajarme un header que he visto por ahí y poner #include "delay.h"?¿Ese header vale para cualquier reloj que uses? Lo digo porque como he puesto en el esquema tengo un cristal de 10MHz...

Un saludo y muchas gracias de nuevo

EDITO: Ah y otra duda, aparte de la libreria htc.h, ¿tengo que poner también #include "16F877.h"?¿Por que?
« Última modificación: 01 de Mayo de 2012, 18:11:36 por Clemen89 »

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Ayuda para programar PIC16F877 en C
« Respuesta #3 en: 01 de Mayo de 2012, 20:06:31 »
Gracias por la respuesta, me apunto los libros.

Le he estado echando un ojo y tengo una duda, voy a usar el Hi tech, me gustaría saber una cosa.

#use parece que es del CCS y no se puede usar en el Hi tech, ¿para usar la función delay en microsegundos o milisegundos en el Hi tech que tendría que hacer?

He buscado bastante pero no encuentro nada que me lo aclare bien, ¿tendría que bajarme un header que he visto por ahí y poner #include "delay.h"?¿Ese header vale para cualquier reloj que uses? Lo digo porque como he puesto en el esquema tengo un cristal de 10MHz...

Un saludo y muchas gracias de nuevo

  Si mal no recuerdo, para usar las funciones de delay de Hitech, basta con definir la frecuencia a utilizar....

Código: C
  1. #define _XTAL_FREQ 10000000
  2. __delay_ms(100)

EDITO: Ah y otra duda, aparte de la libreria htc.h, ¿tengo que poner también #include "16F877.h"?¿Por que?

  No, basta con solo incluir la librería htc.h
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado Clemen89

  • PIC10
  • *
  • Mensajes: 30
Re: Ayuda para programar PIC16F877 en C
« Respuesta #4 en: 01 de Mayo de 2012, 20:15:06 »
Gracias por la respuesta, me apunto los libros.

Le he estado echando un ojo y tengo una duda, voy a usar el Hi tech, me gustaría saber una cosa.

#use parece que es del CCS y no se puede usar en el Hi tech, ¿para usar la función delay en microsegundos o milisegundos en el Hi tech que tendría que hacer?

He buscado bastante pero no encuentro nada que me lo aclare bien, ¿tendría que bajarme un header que he visto por ahí y poner #include "delay.h"?¿Ese header vale para cualquier reloj que uses? Lo digo porque como he puesto en el esquema tengo un cristal de 10MHz...

Un saludo y muchas gracias de nuevo

  Si mal no recuerdo, para usar las funciones de delay de Hitech, basta con definir la frecuencia a utilizar....

Código: C
  1. #define _XTAL_FREQ 10000000
  2. __delay_ms(100)

EDITO: Ah y otra duda, aparte de la libreria htc.h, ¿tengo que poner también #include "16F877.h"?¿Por que?

  No, basta con solo incluir la librería htc.h

Muchas gracias por la ayuda y por la rapidez, intentare hacer un programilla muy sencillo y cuando lo tenga todo acabado lo dejaré por aquí el código por si le sirve a alguien de ayuda :).

Desconectado marqueses

  • PIC12
  • **
  • Mensajes: 80
    • Alberto Marqueses Blog
Re: Ayuda para programar PIC16F877 en C
« Respuesta #5 en: 02 de Mayo de 2012, 04:54:31 »
Hola Clemen,

te aconsejo encarecidamente que rehúses de usar hi-tech y vayas a por CCS. Es un lenguaje mas fácil de aprender y sobre todo su mayor ventaja es la gran comunidad que tiene detrás. Tienes ejemplos a doquier y muchísimas dudas resueltas. Existe un libro con el que yo aprendí (y seguramente muchos más) que se llama "Compilador C Ccs Y Simulador Proteus Para Microcontroladores Pic".

Por otro lado, te aconsejo que uses un micro de una gama más alta, quizás el 18F4550, pues ya hay mucha información y supera con creces las características del 16F877.

Espero serte de ayuda, un saludo.
Alberto Aragón Marqueses
albertomarqueses.wordpress.com

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Ayuda para programar PIC16F877 en C
« Respuesta #6 en: 02 de Mayo de 2012, 09:59:04 »
  Si bien es sabido que CCS tiene muchos mas ejemplo y mayor facilidad de uso, también son muy conocidos sus bugs infinitos  :D

  Algo que me molesta mucho de CCS es que con sus funciones es mucho mas molesto acceder directamente a los registros. Incluso, para mi gusto, es menos intuitivo que un compilador ANSI C, o al menos mucho mas ANSI que CCS.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado Clemen89

  • PIC10
  • *
  • Mensajes: 30
Re: Ayuda para programar PIC16F877 en C
« Respuesta #7 en: 02 de Mayo de 2012, 13:11:38 »
Gracias por las respuestas.

La causa por la que he decidido usar el Hi Tech es porque me han comentado que el paso de Hi Tech al C18 es mucho mas fácil, además de que al no ser todo tan automático y ser tan novato podré ver todo lo que hago mas fácilmente, por eso me he decidido por aprender a usar este ya que me tengo que poner igualmente.

Ahora me surge otra duda... seguramente sea una chorrada porque no encuentro nada que me lo aclare totalmente, por lo que deduzco que es algo muy trivial. Como veis en mi esquema voy a usar para la programación del PIC el modo ICSP, el problema es que no tengo ni idea de como hacerlo, si es sencillo...¿me podríais decir que tendría que hacer para hacerlo? Si es complicado con algún link donde pueda mirarmelo lo agradecería mucho ya que no encuentro nada que me lo aclare totalmente.

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Ayuda para programar PIC16F877 en C
« Respuesta #8 en: 02 de Mayo de 2012, 14:15:33 »
  Creo que en el sitio de microchip hay una guia respecto del ICSP. De todos modos, un programador como PicKit2 o PicKit3 son ICSP, así que conectando cada pin en su sitio se programaría sin inconvenientes.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5883
    • Picuino
Re: Ayuda para programar PIC16F877 en C
« Respuesta #9 en: 02 de Mayo de 2012, 14:57:52 »
Ya que tienes comunicación por RS232 puedes probar con un Bootloader.

Saludos.

Desconectado Clemen89

  • PIC10
  • *
  • Mensajes: 30
Re: Ayuda para programar PIC16F877 en C
« Respuesta #10 en: 02 de Mayo de 2012, 17:53:10 »
Vale ya he visto mas o menos como programarlo, voy a darle caña a la programación.

Una duda que me ha surgido, ¿hay que tener en cuenta los bancos? Es decir si el registro PIR1 esta en el banco 1 ¿tengo que elegir el banco 1 en el registro STATUS o el cambio de bancos en C es automático?

Gracias de nuevo por las respuestas :)

EDITO: Vale, parece que si hay que cambiar de bancos, o por lo menos no afecta que los vayas cambiando tu manualmente para que funcionen correctamente. He hecho un programilla muy fácil, mañana lo colgaré por si llega alguien tan novato como yo para que vea un ejemplo super simple en Hi tech. Y ya de paso me podréis echar un cable en posibles mejoras o si hay algun fallo que no haya visto, en la simulación con MPLAB funciona bien.
« Última modificación: 02 de Mayo de 2012, 21:46:53 por Clemen89 »

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Ayuda para programar PIC16F877 en C
« Respuesta #11 en: 03 de Mayo de 2012, 08:33:42 »
  No, no es necesario hacer el cambio de bancos expresamente. El compilador los hace automáticamente.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado Clemen89

  • PIC10
  • *
  • Mensajes: 30
Re: Ayuda para programar PIC16F877 en C
« Respuesta #12 en: 03 de Mayo de 2012, 11:43:32 »
Gracias AngelGris por toda la ayuda. Aquí dejo el programa por si algún novato quiere ver un ejemplo super sencillo con el Hi tech para ir empezando, es una chorrada, uso uno de los Timers para que envié por la USART '1' y '0' alternos de 8 en 8. Para poder probar mi placa con el hyperterminal e ir introduciendome con el Hi tech, así ya de paso me podeis comentar algún error o alguna mejora. El timer genera una interrupción cada 200 milisengundos, con una variable de contador consigo que cada 5 veces que entra en la interrupción envíe la secuencia por la UART.

Los bits de configuración no los he puesto en el programa porque parece que en el MPLAB se pueden poner en una pestañita, los he puesto allí, aunque no se si para programar el pic hace falta ponerlos...

Al grano, aquí lo dejo:

Código: [Seleccionar]
#include "htc.h"
#include "stdio.h"
#define _XTAL_FREQ 10000000

int contador=0;

void interrupt isr(void){
if(TMR1IE && TMR1IF){
TMR1IF=0;
contador++;
if(contador==5){
while(TXIF==0);
TXREG=0b10101010;
contador=0;
}
TMR1H=0b00001011;
TMR1L=0b11011100;
}
}



void main()
{
GIE=1;
PEIE=1;
INTE=1;
INTEDG=1;
TMR1H=0b00001011;
TMR1L=0b11011100;
T1CKPS1=1;
T1CKPS0=1;
RP0=1;
TRISB=0b11111101;
TRISC=0b11111101;
BRGH=1;
TMR1IE=1;
TXEN=1;
SPBRG=64;
RP0=0;
SPEN=1;
CREN=1;
TMR1ON=1;
while(1);
}

Desconectado Clemen89

  • PIC10
  • *
  • Mensajes: 30
Re: Ayuda para programar PIC16F877 en C
« Respuesta #13 en: 23 de Mayo de 2012, 16:43:18 »
Hola de nuevo!

Bueno finalmente me he hecho yo mismo un programador JDM, y funciona bastante bien de momento.

He probado el programilla ese que os he puesto, lo unico que le he añadido es una linea de codigo con los bits de configuración nada importante.

He abierto el hiperterminal de windows y tengo un problema, yo le he dicho que envie el '10101010', que en asci parece ser el '¬', sin embargo me aparece el '*', que seria '101010'. Casi siempre nada mas conectarlo si que me sale un '¬' pero a partir de ahi vuelve a salir '*'. He pensado que seria la velocidad, así que lo he configurado para que el pic vaya a una velocidad un pelin menor ( 9400 y pico largos baudios, antes 9615 ).

Pero nada, siguen los '*'... ¿por qué puede ser?



 

anything