# Curso de programación en C para microcontroladores PIC



## Andres Cuenca (Nov 10, 2007)

Presentación donde se explica de una manera muy didáctica el entorno de programación en C para microntroladores PIC, usando como ejemplo la familia 16f87xx.

*Contenido:*

1. IDES
2. BOOTLOADER
3. PLATAFORMAS DESARROLLO DE PROYECTOS
4. RECORDATORIO DE C
5. PROGRAMACIÓN EN C DE LOS MÓDULOS DEL PIC16F8XX.

ENTRADA/SALIDA DIGITAL.
COMUNICACIONES RS232.
INTERRUPCIONES.
CONVERTIDOR A/D.
CCP (PWM).

Espero que les sea de utilidad.

Saludos.


----------



## Guachuchon (Dic 29, 2007)

Andaba buscando un cursillo de c para programar pics ya que en un curso que tuve ahora nos enseñaban a programar en assembler y aunque ya no me molesta, hay muchas cosas que son mucho mas fáciles con C.

de paso quiero compartir con ustedes un tutorial que encontré sobre lo mismo

Espero que sirva y complemente al otro

Saludos


----------



## PICMIND (Ene 15, 2008)

Realmente te felicito. Muy buen tutorial, de los mejores que he visto en español.

Hace poco mas de un año que uso el C y la verdad me dio mucha lata al principio por que me tocaba traducir los tutoriales en ingles y el help del CCS.

Te quería preguntar si me permitirías publicarlo en mi web. Agradezco de antemano tu rta.


----------



## Andres Cuenca (Ene 15, 2008)

Claro, siempre y cuando no tenga fines comerciales.

Saludos.


----------



## macraig (Mar 25, 2008)

No conozco mucho de programacion en C sobre pics, pero un consejo q no esta nunca de mas y sirve para cualquier procesador, sea un pic o un pentium itanium...

Q tu compilador de C sea ESTANDARD ... Esto te permitira portar tus programas entre microcontroladores con mayor facilidad. ( si te cansas del pic y quieres cambiar al avr por ejemplo .

Leete este manual: 

http://www.crasseux.com/books/ctut.pdf

Suerte, y buena lectura 

Salu2


----------



## emmanuelgdz (Oct 13, 2009)

hola, primeramente, soy nuevo en este foro, mi problema es lo siguiente:

tengo que crear el codigo en "c" del siguiente problema
se supone que cada vez que presione un push botton , se va realizando un conteo hasta que llegue a nueve reflejandolo en un display

es decir que si orpimo una vez el push botton en el display me marque 1, si lo oprimo una segunda vez me marque 2, uan tercera vez un 3, asi sucesivamente

la parte del display ya la tengo solucionada mi problema es lo del push botton

mi logica es la siguiente


if(input(pin_a0)==true)
contador++;

if (contador==0)
 output_b(63);

if (contador==1)
 output_b(6);

if (contador==2)
 output_b(91);

y asi hasta llegar al nueve

no simula correctamente y no funciona al momento de cargarlo al pic
me dicen que necesito crear un codigo para evitar el rebote
para ser algo tan sencillo, se ma ha complicado el asunto
porfavor ayuda


----------



## Chico3001 (Oct 14, 2009)

es simple... cuando leas el cambio de estado en el puerto solo pon el micro a contar un retardo de 5mS y vuelve a leer al finalizar... si ambas lecturas son identicas entonces consideras que el boton esta presionado y levantas una bandera de advertencia para el resto del programa...


----------



## Electrodopaje (Nov 20, 2009)

Saludos, tengo una pregunta.

Es el lenguage C el mejor lenguange de programacion para microcontroladores?
muchas gracias


----------



## Flunitracepan (Nov 24, 2009)

Bueno, el lenguage C es muy poderoso, con una sola instruccion puedes hacer lo mismo que en Ensamblador pero hecho en varias lineas; sin embargo C ocupa mas memoria en el micro. Tambien se dice que con Ensamblador se tiene un accceso mas directo a los recursos del micro. Yo prefiero C, y un buen compilador (para mi) es el CCS. Ademas que tiene un plug-in para trabajar en MPLAB.
Un saludo.


----------



## agustinzzz (Nov 29, 2009)

Flunitracepan dijo:


> Bueno, el lenguage C es muy poderoso, con una sola instruccion puedes hacer lo mismo que en Ensamblador pero hecho en varias lineas; sin embargo C ocupa mas memoria en el micro. Tambien se dice que con Ensamblador se tiene un accceso mas directo a los recursos del micro. Yo prefiero C, y un buen compilador (para mi) es el CCS. Ademas que tiene un plug-in para trabajar en MPLAB.
> Un saludo.



Con respecto a la memoria: si escribes un programa corto, sí, puede ocuparte más memoria, pero cuando escribes un programa extenso, el resultado final es que terminas ocupando menos ya que el compilador te reduce mucho la cantidad de instrucciones necesarias (claro, a no ser que seas un guru de la programación en assembler).

Saludos


----------



## jose bilbo (Nov 30, 2009)

Hola gente, os escribo en este post, aunque se que no es exactamente lo que busco, pero qiza sepais informarme.
El tema es que nocesito programar en C, y en el programa codewarrior una dsp de motorola, no se si podriais ayudarme o facilitarme algun tutorial de codewarrior.
Un saludo y gracias de antemano


----------



## yesalucard (Dic 5, 2009)

Muchas gracias por el curso, me declaro un aficionado a la electrónica y a la programación en PIC, desde ya hace varios años tenia esto olvidado, por cuestiones de trabajo, pero quiero retomarlo porque quiero empezar a trabajar en lo que me gusta. Aprendí a programar en assembler y confieso que lo de C en microcontroladores es un poco nuevo para mi, pero se que con la ayuda de estos foros volvere a retomar la forma rapidamente.
Gracias


----------



## superpato (Dic 12, 2009)

hola queria saber de donde obtener el compilador ccs..puesto q he coseguid uno en la web..per no pued instalarlo si alguien me brinda informacion desde ya agradecido


----------



## COSMICO (Dic 23, 2009)

Amigos..
Ya que estamos en esto del c..
alguno de ustedes sabe como crear librerias para mikroc.
o modificar las ya existentes,,


----------



## Meta (Dic 29, 2009)

Hay un curso muy bueno de 
*MPLAB C18 desde 0.*


La verdad qu eel 16F876A y 16F877A no los fabrica www.microchip.com no los vende, ahora su sustituto es el 16F886 y 16F887. La verdad que programar C con estos PIC no valen la pena, para ello están los 18F como 18F2550 y 18F4550 con USB 2.0 incluido. _(Ya aparecerán PIC de USB 3.0)._ La verdad que veo que hasta algunas tiendas los 18F son más baratos que los 16F, los 16F son para ensamblador (ASM).

Mejor usar 18F para C que están diseñados para ellos. Voy a escribir algo que parece contradictorio. Han sacado nuevos PIC16F que si están un poco orientado a programarlo a C aunque su base es ASM ya que estos PIC mejoraron su núcleo, más RAM y con nuevas 14 instrucciones, sobre todo por primera vez hay una instrucción de RESET por software cosa que no se había visto antes y muchos lo pedía.

http://www.elektor.es/noticias/prim..._source=ES&utm_medium=email&utm_campaign=news

http://www.elektor.es/noticias/los-..._source=ES&utm_medium=email&utm_campaign=news

Ojalá se hagan manuales de eso.
http://www.micropic.es/index.php?option=com_smf&Itemid=63&topic=869.0


Saludo.


----------



## Hernan83 (Dic 29, 2009)

Hola Meta,si irme del tema,estaba pensando seriamente en aprender el C18,te parece que es una buena opcion? ya que siempre programe pic en la gama 16f en ASM,y quiero pasar a la familia 18F en la cual,usar ensamblador se hace mas pesadito,una pregunta importante? si bien programoa algo en CCS,seguro que el C18 es mucho mejor para esta familia verdad?


----------



## Nepper (Dic 29, 2009)

gran aporte colegas!
tengo que retomar el tema de los pics sea como sea.... me estoy oxidando y se me vence el "conocimiento"... no quiero decir que perdí 3 años de la secundaria....


----------



## Meta (Dic 29, 2009)

No está dañado.

http://electronicapic.iespana.es/manual/mplab_c18_desde_cero.pdf

EL C18 es una opción, dicen que el CCS está mejor por algo será. 
https://www.forosdeelectronica.com/f24/ccs-vs-c18-css-mas-c18-15690/

Saludo.







*Edito:*

Aquí hay un curso de 10 páginas sobre CCS.

http://www.aquihayapuntes.com/programacion-pic-en-c.html

Saludo.


----------



## Destripador (Feb 24, 2010)

Hola a todos

estoy programando en C un 16f877a y la cosa es que necesito leer los bits del puerto E individualmente, tengo conectadas ahi resistencias y botones y de ahi a la fuente, tengo algo como esto


   port_e_pullups(TRUE);
   set_tris_E=(0b00000111);
   if(bit_test(9,1)) 
   {
  // aqui irian las instrucciones en caso de que se este presionando el boton conectado    al pin RE0
   }
   while(true){}
  }

se que estoy haciendo algo mal porque no me sale o no se que me falte o que onda

mucho agradecere su ayuda


----------



## ferneydavid (Mar 5, 2010)

lo bueno se c es q se puede escribir partes de codigo en assembler ademas en c existen librerias anterior mente creadas. en consecuencia nuestro codigo sera mas resumido


----------



## Nepper (Mar 14, 2010)

Buenas! una pregunta... ¿la famila 18f, la que tiene USB, tambien es posible programarla en C o es más conveniente C++, y el assembler? no sabía donde preguntarlo, así que lo pregunté acá...

En realidad, quiero preguntar ¿El C me sirve para todos los PIC's? o sea, ¿lo único que tengo que encontrar es el compilador que lo traduzca a hex no?


----------



## Nepper (Mar 14, 2010)

Buenas colegas!
La verdad es que no quería abrer este tema, pero ya estoy muy quemado, no se que más hacer para entender cómo programar en C..
Muchos dirán "Flaco, ¿usaste el buscador del foro?
yo les respondería: Si, fué lo primero que hice, y tras 5 horas de buscar información, de instalarme el MPLAB y descargarme 10 archivos CCSC que no se que c*** hace y nunca 2 paquetes son iguales, ya me pudrió... no cazo una con esto del MPLAB y el lenguaje C

Todos hablan felices de que es muy facil, inclinate por C, yo ya hise 5 programas, etc... pero nadie dice como m***a se instala!!!
Nunca en mi vida vi el MPLAB, tampoco se programar en C, pero no soy ignorante, sin duda nada me sirve...

La semana que viene me compro el 18f2550 para empezar a practicar, y quería tirarme ha acer 2+2 en C para ir viendo el tema, luego, quería ver como se programa para el PIC, entonces me descargué el MPLAB...
Todos los tutoriales son para ASM o, si bien son para C, ya les funciona todo, en cambio, mi CCS C me aparece con una crucesita roja...
Me descargué como 10 rar distintos de nombre CCS o CCSC, todos con contenidos distintos, algunos de 900kb y otros de 100MB...
Supongancé que le haya pegado a uno de esos archivos, el programa me acepta cualquier cosa para ponerle a la parte de compilador C.. o sea, le pongo un BMP que me tira que está todo OK 

Alguien me puede explicar cómo se trabaja??? 
Lo que me imagino es que uno escribe el programa en C y despues se compila, pero ¿en que ventana tengo que escribir?

por acá hay mucha bronca...

en fin, noté que el compilador CCS hay que comprarlo, por eso pienso que me resulta dificl conseguirlo... entonces...
¿existe una forma de programar en C sin pasar por MPLAB o sin comprarlo?

Estube leyendo mucho, y necesito un compilador en C, pero no cualquier compilador C, si no uno que esté preparados para pics...
Pero por ahí cuentan que se pueden programar en C, C++, ASM, Assembler, VB, Delphi, Visual C, etc.. ¿todos usas un compilador especifico para PIC? no entiendo...

yo me acuerdo que en el colegio, agarrabamos un txt, el winPC y listo.. ¿por que acá tengo que hacer tanto quilombo?

¿Que necesito para programar por USB un pic 18F2550?


----------



## Chico3001 (Mar 14, 2010)

Basicamente para programar en cualquier lenguaje necesitas 2 cosas.... 1 editor y un compilador... en el caso del ensamblador es facil identificar cual es cual, el MPLAB incorpora ambos, el editor es el mismo MPLAB y el compilador es el MPASM

En el caso del C (o de cualquier otro lenguaje) es lo mismo, la mayoria de las veces bajas un compilador especifico para el microcontrolador que quieres ocupar y se instala bajo la mismo suite del fabricante (MPLAB en el caso de Microchip), y otras te instala su propia suite

Y para comenzar a programar es lo mismo, abres tu MPLAB, creas tu proyecto, tu archivo nuevo con extension .C y comienzas a escribir codigo en la ventana en blanco, despues compilas y simulas como normalmente haces....

En mi caso uso medios alternativos, me baje un programa llamado Programmers Notepad que te colorea el codigo y te permite instalar el compilador y compilarlo presionando una secuencia de botones, muchas veces trabajo con el programmers notepad y el AVR Studio abiertos(el equivalente del MPLAB pero en ATMEL), programo y compilo en uno y despues simulo el programa en el otro...


----------



## Nepper (Mar 15, 2010)

Primero que todo
Gracias chico3001 por aclararme las idéas... será que llego a un punto  que me satur y dejo de entender cualquier cosa XD

Segundo...


			
				Nepper dijo:
			
		

> Buenas colegas!
> La verdad es que no quería *abrer este tema*, pero ya estoy muy quemado,  no se que más hacer para entender cómo programar en C..


es muy extraño... yo había creado un post, le puse título y  todo, arriba me decía "Nuevo tema" pero extrañamente mi mensaje se  guardó aca...

pero bueno... gracias por los conceptos, ahora me voy a buscar un editor de C y aprender a usarlo tranquilo... el compilador lo buscaré luego... pienso que con el tiempo entenderé que es el MPLAB en su totalidad...


----------



## Chico3001 (Mar 15, 2010)

Nepper dijo:


> es muy extraño... yo había creado un post, le puse título y  todo, arriba me decía "Nuevo tema" pero extrañamente mi mensaje se  guardó aca...



Creaste un nuevo tema... pero yo lo uni con este tema por que tienen mucho que ver... de echo deje una redireccion que me imagino que fue la que usaste sin darte cuenta para llegar a este tema...


----------



## Nepper (Mar 17, 2010)

Disculpenmé por molestarlo otra vez con mi persona, pero...
quiero el manual del PIC18F2550 
Me agarró un atonjo de manual del pic... pero no quiero el PDF (ya empezamos con los caprichos) quiero el manual original de Microchip

Si, quiero esa biblia... me lo puse a leer en PDF y me encantó cómo está explicado, además que tiene todo... pero me molesta leer en pantalla... el problema es que me resulta muy dificil imprimirlo... y varias casas de imprentas no me lo hacen (que extraño )
Estube viendo si lo podía encargar desde la página de Microchip, pero no encuentro lectura al respecto..

¿álguien sabe cómo conseguirlo?

Estaría muy agradecido si me dicen cómo conseguirlo nuevo 0Km


----------



## Chico3001 (Mar 17, 2010)

Antiguamente Microchip si los tenia impresos y te los podia enviar gratis hasta tu casa o trabajo, pero me parece que ya tiene un tiempo que no lo hacen

La unica opcion que veo es pagar la impresion en un cafe internet y que te lo engargolen...


----------



## jkapitan (Abr 11, 2010)

Gracias por este magnífico manual. Soy profesor de programación con experiencia en C y ahora debo explicar a mis alumnos la programación de PIC´s. Conozco algo de ensamblador pero optaré por aprender en C y creo que este manual me será de mucha ayuda. GRACIAS


----------



## yack (Abr 21, 2010)

ola como estan veo que les gusta programar en C y quisiera su opinion yo estoy realiando una tesis profesional y tengo algunos ejemplos sobre C y quisiera q alguine mas me diera su opinion de que tan buenos son los adjunto todos los codigos y simulaciones para el circuito armado espero sus comentarios y ademas en youtube pueden buscar videos de multiyack y ai estan ya fisicamente dejen comentarios para mejorarlos gracias mas adelante espero poder subir el manual  de CCS que estoy armando coomo parte de lo mismo


----------



## KARAPALIDA (Abr 22, 2010)

Excelente Yack.

Saludos


----------



## Bazookao (Abr 22, 2010)

Hola a todos
pues bien molestando otra vez por aqui

uso un PIC16F628A el cual programo con PIC C ya tengo varios programas hechos
y mas o menos le entiendo, ya que programo mucho C (aparte de otros lenguajes)

el problema que tengo ahorita es que necesito guardar un dato (un int) dentro del pic
para que cuando se apague y vuelva a encender se que este valor en memoria

digamos lo que tengo hasta ahorita es un programa inicia con un int valor =5

y mediante dos botones se le suma uno o se le resta uno, ahora lo que quiero es que

cuando haga este procedimiento de aumnetar o decrementar se salve en la memoria del PIC que isntruccion puedo utilizar, es que lo he buscado pero solo me sale para ensamblador y de eso no se nada

tambien aprovechando es que apenas estoy viendo como se llenan datos a un LCD y bueno hasta ahorita bien, salvo que cuando quiero que despligue un entero no hace nada
digamos:

si le pongo


```
lcd_putc('1');
```

si lo hace

pero si le pongo 

```
lcd_putc(1);
```

no lo hace

mis preguntas son:
¿se puede convertir el tipo int a char?
y si es posible, ¿no consume muchos recursos del PIC? es que bueno, este es muy basico

de antemano muchas gracias


----------



## george.manson.69 (Abr 22, 2010)

Si se puede utilizando la libreria stdlib.c

algunas funciones existentes en esa libreria son como convertir de un numero a string, o viceversa...si deseas puedes bajar el manual  de CCS.
Ahi viene todo referente a la libreriaque te menciono.


----------



## 1jabato1 (Abr 22, 2010)

Puedes usar la eeprom del pic para guardar y recuperar los datos. 

```
write_eeprom(direccion,valor);//guarda el dato valor int en la eeprom en la dirección dada
valor =read_eeprom(direccion);//recupera el dato
```
Un saludo.


----------



## yack (Abr 24, 2010)

ola como estan mira bazookao para guardar datos es som lo menciona 1jabato1 es con esas instrucciones y si deseas cambiar estre valor int y valor char solo debes poner el nuemro o el dato entre comillas simples por ejemplo el '1' es el valor tipo char si deseas como tipo decimal seria 49 en hexadecimal seria 31 y asi con los demas 

Referente a tu problema de la LCD es que la instruccion lcd_put(); se utiliza para imprimir valores de limpieza de LCD, tabulador y otras mas si deseas imprimir un mensaje en la LCD la libreria del CCS trae una instruccion que se llama printf(lcd_putc,"Mensaje"); pero el detalle es que solo sirve para LCD de 2*16

Y si lo que quieres es mandar a imprimir un valor entero este primero debe ser asigando a una variable por ejemplo:

Int valor=5;

printf(lcd_putc,"%d",valor); y con esto el valor de la variable sera impreso en la LCD.


----------



## gaba (Abr 30, 2010)

esta estupendo el aporte.. pero voy a complementarlo con dos videotutoriales k tratan el mismo tema.. lo hago pork a mi me sirvieron de verdad..ya k de estar en pelotas ahora me considero alguin con conocimiento medio avanzado .. esto requiere mucho compromiso 

1ra part  http://depositfiles.com/files/toq73oe31
2da part  http://depositfiles.com/files/mwhsxd2pb


----------



## roggers (May 12, 2010)

tengo unos problemas, yo programo en assembler con el mplab y un grabador basico serial pero me funciona bien con los pic 16fxx (84-628-870-877-873)
para programar en c que programas voy a necesitar y si tengo que cambiar el programador


alguien me puede dar los link de descarga de los programas porfavor


----------



## iDan (May 12, 2010)

Hola roggers


Mira aqui te dejo el link del compilador MikroC:

http://www.mikroe.com/eng/product_downloads/download/

Sinceramente compilador que recomiendo ya que tiene muy buenas librerias y la programacion es faci... pero hay mas... tambien puedes buscar el HI-TECH C - HI-TIDE o tambien con MPlab...


Saludos...


----------



## FRYCK (May 12, 2010)

hola  roggers  para comenzar  a programar en c para  microcontroladores uno de los mas utilizados es el PIC C Compiler de CCS  y cuenta con gran cantidad de ejemplos en internet es muy fácil de utilizar e  implementa muy bien el código   pero  también  hay  otros buenos  compiladores como MikroC de microelectrónica   el  HI-TECH C. con muchas  funciones y fáciles de aprender 
saludos


----------



## COSMICO (May 12, 2010)

Saludos roggers
Tambien trabajo con asembler y probe el mikroc
Ahora estoy con pic c ccs , Ambos son muy buenos.
Pruebalos y tu decides..


----------



## Bazookao (May 14, 2010)

Hola molestando de nuevo por aqui lo que pasa es que tengo un codigo en C, ya funciona bien en el proteus y todo pero el problema es que tiene la siguiente forma

```
while(true)
{
instruccion
instruccion
instruccion
instruccion
instruccion
muestra LCD
Pausa para que se vea  el LCD
if(input(PIN_B4))
      Funcion();
}
```

entonces cuando lo simulo en el proteus si funciona bien, pero digamos que aveces no pasa nada cuando pulso un boton que esta conectabo (en este caso al Pin b4) como que tengo que atinarle para que se vaya a la subrutina

pensaba que me podria ayudar manejar interrupciones, por lo que he leido
seria mas o menos asi
cunado capture el pin b4 salte a una rutina de interrupcion, y ahi pongo el codigo que necesite

el problema es que no he comprendido muy bien lso ejemplos, en tema de  Proyectos completos en C solo hay un ejemplo y pues no me queda muy claro, y un PDF que baje en este foro bien uno mas simple pero no me funciona

si me pudieran dar un ejemplo lo mas sencillo posible, se los agradeceria mucho

el pic en le que trabajo es el 18F4520

gracias de antemano


----------



## roggers (May 14, 2010)

en un manual lei que se podia generar una rutina y mientra tener el TMR funcionando
yo genero los delay asi:

bsf   porta,0
call   delay_1ms
call   send_dato

fue lo primero que se me ocurrio pero en el ejemplo antes de enviar el dato tendria que perder el tiempo en  esperar que el delay se cumpliera
pero con lo que entendi mientras espero que el tiempo avance podira enviar el dato sin ningun problema

Pd: voy a buscar si encuentro lo que intento explicar para copiarlo textualmente

salu-2


----------



## yack (May 17, 2010)

bazookao mira para manejar interrupciones lo puedes ver como cuando tomasvas o tomas clases y el profesor esta dando su clase ese seria el programa principal lo que el micro debe hacer siempre, y en cierto momento llega alguien e interrumpe la clase el profesor tendria que atender a quien interrumpio y despues regresa a clases o lo que seria el programa principal

si deseas ver ejemplos de en paginas anteriores de este tema yo subi un archivo llamado Envio.Zip qeu contiene algunos ejemplos de interrupciones y otros checalos y si tines dudas te puedo ayudar a entenderlos mejor


----------



## Bazookao (May 19, 2010)

Muy buen material yack, quisiera saber si ¿armaste estos circuitos en tu protoboard?

es que un problema que yo tengo con mi progrma es que en proteus si anda bien pero en el PIC no. yo uso un 18f4520 de heco hice un post https://www.forosdeelectronica.com/f24/problemas-al-grabar-pic-codigo-c-36586/

es que tengo sospechas que tengo algo mal en mi cofiguracion
de ser que si tengas los circuitos armados en protoboard me ayudaria mucho saber como se debe configura por ejemplo tu siempre (o en los que vi mas detenidamente)

tienes algo asi


```
#include "18f4550.h"
#fuses HSPLL,NOWDT,NOBROWNOUT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN,MCLR,NOPBADEN,WRTB
#use delay(clock=48000000)
#build(reset=0x800, interrupt=0x808)
#org 0x000, 0x7ff { }
```

que es la libreria los fuses el use delay, si los tenia en mi programa, pero el build y el org no. me podrias decir para que los utilizas.

y si acaso sabes como debo configurar mi pic o que parte del datashhet tengo que leer para saber como configurarlo, te lo agradeceria mucho

en el link esta mi codigo, que por cierto aun no funciono, no lo pongo aqui para no hacer mas bulto en el foro


de antemano muchas gracias

saludos


----------



## yack (May 23, 2010)

hola bazookao

veras la instruccion build y la instruccion org son para establecer una espacion de memoria que no se ocupara por el codigo de los programas, en esta pocicion esta guardado un firware llamado bootloader el cual permite grabar el micro controlador de forma automatica sin necesidad de desconectarlo del proto o de un equipo fisico, aora bien el micro controlaor que estas ocupando es por decirlo asi el primo del 18f4550 lo mismo que el 2550 son similares en cuanto a la configuracion de los fuses te recomiendo adquirir aunque sea la version demo del compilador CCS y en la barra de menus busca la opcion fuses y en esta opcion encontraras todos los posibles fuses que puedes activar en tu micro

Tambien todos los codigos los arme y continuo haciendolo, puedes entrar a Youtube.com y buscar "videos de multiyack" y encontraras los primeros circuitos probados durante estos dias continuare subiendo mas para que se puedan checar com funcionan


----------



## Mapcec (Jun 19, 2010)

Hola, tengo un par de preguntas muy básicas...y es que soy noob en esto de los pics:

1. ¿Es lo mismo editar el programa en C que en C++?
2. Para editar el programa para un pic 18F ¿puedo hacerlo digamos en BOrland C++ o necesito un editor específico para pics?


----------



## vichwi (Jun 21, 2010)

en muy poca experiencia creo q1ue si es necesario un compilador especial para pics como mikroc picbasic microcode studio  o algun soft de code warrior claro tambien depende del tipo de pic que vayas a programar y ps  para c ++  puede ser ccs...


----------



## THE ONE ANDRES (Jun 22, 2010)

THE ONE ANDRES dijo:
			
		

> Hola compañeros,
> 
> Alguien sabe como realizar un codigo para 16f84 en C en Multisim? tengo conocimientos de C aunque no mucho ahi me defiendo, y el hardware esta listo en la simulacion de multisim, solo me falta el codigo pero no se por donde empezar... gracias y buen dia



Hola, para dar respuesta a mi misma pregunta jejeje... les comento que la ultima version de multisim no tiene para simular no mas solamente el PIC 16F84, lastimosamente, ya que desde el punto de vista academico es una excelente herramienta que integra todo en uno por asi decirlo, incluso programar en C, puedes cambiar el codigo y analizar la simulacion en el mismo programa, ademas con la extencion NI ELVIS II puedes en el software cablear la protoboard con una opcion de check de errores, lo que podras llevar a la protoboard despues de que la simulacion halla dado bien, con un minimo casi nulo de errores, otro contra es que las librerias no son tan extensas pero igual seria super si se pudiera simular una gran cantidad de PIC como en proteus... Conclusion, lo que me dijeron los de NI fue que no habia de mas, que habria que esperar, aja... ya que...

Si alguien sabe de algun programa de simulacion de PICs gratis, seria super que lo compartiera... aca dejo un enlace de una pagina que tiene una cantidad de programas de simulacion de circuitos, pero ninguno gratis y para PIC...

http://www.yoreparo.com/foros/laboratorios_virtuales/programas-de-diseno-electronico-y-simulacion-t316534.html

Saludes...


----------



## yack (Jul 1, 2010)

Mapcec si deseas aprender a programar pics on C no puedes hacerlo con un compilador comoo lo es borlan ya que estos son para aplicaciones informaticas el compilador que necesitas es un o para microcontroladores y uno de ellos es el CCS y por lo tanto no puedes utilizar cualquier compilador para C debe ser uno especifico para microcontroladores


----------



## jaimenube (Jul 2, 2010)

cual es el mejor compilador C para pic


----------



## Meta (Jul 2, 2010)

CCS y para escapar, C18. Mejor no te digo, pero si de los mejores.


----------



## sbjcm (Jul 29, 2010)

He encontrado este otro curso gratis de programación de microcontroladores en C que puede servir en http://www.cursomicros.com


----------



## nietzche (Ago 2, 2010)

Buenas, estoy haciendo un proyecto que transmite y recibe datos por rf a travez del modulo usart, uso 2 pic16f876a, y de acuerdo con lo que lei aca http://www.todopic.com.ar/foros/inde...;topic=30837.0 programe el pic para realizar una codificacion manchester en tx y decodificacion manchester en rx, el problema no es la codificacion, si no el problema es que no se como enviar 2 bytes completos y sin interrupciones por el transmisor, ya que es lo que quiero hacer, en el manual habla de back to back, lo que hice fue cargar el registro txreg 2 veces seguidas para mandar 2 bytes completos pero no se si funcione asi.

En el receptor es el problema porque debo de recibir esos 2 bytes seguidos y cargarlos en registros, la duda es que usando interrupciones en el receptor, cada vez que un byte entra entonces se interrumpe y se debe de leer el rcreg, o en realidad entran los 2 bytes y despues se interrumpe ?????


----------



## efreyre (Sep 12, 2010)

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 

http://www.grupovalpe.com/capacitacion/estudio_pics/

Gracias por su respuesta.

A propósito, si alguien está interesado esta es la página donde subí mi tesis entera:

http://www.grupovalpe.com/capacitacion/tesis_pendulo_invertido/


Es un sistema de control para un péndulo invertido.

Saludos

Ernesto


----------



## carapuma (Sep 12, 2010)

bueno primero que nada cual es la apliacion que realizara el micro, haber si cumple las espectativas necesarias para un pleno funcionamiento, yo recomiendo micro c for pic, un programa que se utiliza para casi toda la famila de 16f y 18f que son muy aplicables. En tanto a la configuracion de una respuesta deacuerdo a una entrda simplemente configuras tus puertos para decirles que van a ser sus fuciones, como entrada o salida, luego declarado esto tu deacuerdo a tu entrada configuas tu salida con una simple funcioncita o directamente con lo configuracion de los puertos.. Espero que sea un poco de ayuda.

busca micro c pro pic o solamente microC, creo que ese Pic esta en su libreria.


----------



## vulquiro (Sep 28, 2010)

como puedo cambiar el vector de reset, necesito que el programa se ejecute desde otra parte al presionar mclr en forma física y no desde main.
utilizo ccs y proteus. 
cualquier aporte, gracias.


----------



## ByAxel (Sep 28, 2010)

vulquiro dijo:


> como puedo cambiar el vector de reset, necesito que el programa se ejecute desde otra parte al presionar mclr en forma física y no desde main.
> utilizo ccs y proteus.
> cualquier aporte, gracias.



Has probado al directiva *#ORG* ?, revisa eso en el Help y en la carpeta del ccs hay un ejemplo "loader.c" te puede ser de ayuda.

saludos.


----------



## wilsonserna (Nov 26, 2010)

hola que tal , soy nuevo en el foro, tengo el siguiente problema: deseo hacer un contador de 0 a 99 con pic 16f84a, pero hay una condicion que al desconectar Vcc y volverla a conectar el micro continue donde se quedo al desconectar Vcc. Cabe aclarar que yo programo en CCS C .Agradezco mucho su asesoria y pronta respuesta.

Atte,

wilson serna


----------



## ByAxel (Nov 26, 2010)

wilsonserna dijo:


> hola que tal , soy nuevo en el foro, tengo el siguiente problema: deseo hacer un contador de 0 a 99 con pic 16f84a



Bienvenido...
Cada cuanto tiempo incrementas el conteo? puedes usar ese tiempo para guardar la cuenta en la memoria EEPROM del PIC, de ese modo no se borra.
Intenta, tienes unos 10ms para grabar la cuenta en la memoria EEPROM...

saludos.


----------



## wilsonserna (Nov 26, 2010)

hola que tal, por favor me podria indicar como grabar en la eeprom del pic en ccs c
gracias, por la atencion prestada.


----------



## ByAxel (Nov 26, 2010)

En el archivo Help del CCS está todo... busca en el ítem BUILT-IN-FUNCTIONS
y para leer/escribir usa

*read_eeprom()
write_eeprom()*


----------



## COSMICO (Nov 26, 2010)

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..


----------



## wilsonserna (Nov 26, 2010)

muchas gracias por su asesoria, voy a realizar pruebas y les estare comentando.


----------



## bondadoso (Nov 27, 2010)

como puedo poner en ceros el MSB de una variable cualquiera de 8 bits?


----------



## ByAxel (Nov 27, 2010)

bondadoso dijo:


> como puedo poner en ceros el MSB de una variable cualquiera de 8 bits?



Usa operaciones lógicas, por ejemplo
0x8E and 0x0F = 0x0E, el MSB ahora es cero.

en C tienes &, ^, | que son and, exclusive or, inclusive or respectivamente... entre otros.

saludos


----------



## delilara (Nov 29, 2010)

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


----------



## Hector Daniel (Dic 8, 2010)

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


----------



## Psyco83 (Ene 17, 2011)

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


----------



## sdel (Ene 18, 2011)

Psyco83 dijo:


> 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.


----------



## Psyco83 (Ene 18, 2011)

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


----------



## COSMICO (Ene 18, 2011)

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..


----------



## Hector Daniel (Ene 18, 2011)

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.


----------



## sdel (Ene 19, 2011)

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


----------



## Neybero (Mar 1, 2011)

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?


----------



## Rmata (Mar 1, 2011)

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


----------



## josb86 (Mar 3, 2011)

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.



```
#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); 
}
}
```


----------



## Unikfriend (Mar 3, 2011)

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
  } 
}
}


----------



## josb86 (Mar 3, 2011)

Unikfriend dijo:


> 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,
> ...



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.


----------



## Unikfriend (Mar 3, 2011)

Hi Josb,

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


----------



## josb86 (Mar 3, 2011)

Unikfriend dijo:


> 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


----------



## Unikfriend (Mar 3, 2011)

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?


----------



## josb86 (Mar 3, 2011)

Unikfriend dijo:


> 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.
> ...




en pin_b2 tiene conectado un interruptor normal y el pin_b0 es en verdad un sensor con salida de frecuencia mas adelante voy agregarle cosas a la rutina para que me guarde la cuenta de los pulsos en una variable, del resto todo esta bien como lo entendiste. no lo he probado en board solo en ISIS mañana voy a montarlo ya hice el programa completo lo unico malo es que se me vuela un pulso que no se de donde sale.
cuando lo monte te digo a ver si pasa lo mismo fisicamente


----------



## Jey1124 (Mar 4, 2011)

Por favor ayudenme con este codigo


```
#include <pic.h>
#include "delay.c"
#include "delay.h"

const unsigned char display[]={0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6f};

void main (void)
{
	unsigned char i;

	for(i=0;i<=9;i++)
	{
		
		mostrar(i);
		retardos(1000);
	
	}
}

void mostrar(unsigned char i)
{
	PortB=display[i];
}

void retardos(unsigned char time)
{
	unsigned char k;
	
	do{
		k++;
		DelayMs(250);
		DelayMs(250);
		DelayMs(250);
		DelayMs(250);
	}while(k < time);
}
```

Cuando lo compilo en MPLAB con Hitech C Compiller me sale error:


```
Executing: "C:\HT-PIC\bin\picc.exe" -C -E"Display_Directo.cce" "Display_Directo.c" -O"Display_Directo.obj" -Zg9 -O -ASMLIST -Q -MPLAB -16F877A
Halting build on first failure as requested.
BUILD FAILED: Fri Mar 04 17:42:30 2011
```


----------



## Palvulito (Abr 19, 2011)

Hola, no entiendo como configuarar el oscilador interno en ccs se hace con #byte osccon=0x8F o con setup_oscillator(OSC_32MHZ); o #OCS 20 MHz, ¿Cual de estas es la correcta?, espero que me puedan ayudar.


----------



## COSMICO (Abr 19, 2011)

#fuses INTRC,NOWDT,NOCPD,PROTECT,NOMCLR,NOPUT

este ejemplo sirve para 12f629 y 16f628.

INTRC, define oscilador interno
XT, cristal externo
Usa el tutorial del CCS para mas informacion


----------



## jrbbravo (Jul 7, 2011)

buena soy alumno del 5 semestre de electronica de la unefa venezuela creo q tener la solucion a tu problema en vez de colocarle if utiliza lo siguiente


while(input(pin_a0)){
contador++;

}
utiliza el while, este while indica que mientras tengas una entrada por el pin_a0 ba a pasar la condicion que coloques de hay hacia abajo,  yo hice uno que contara hasta 9 y volviera a empezar de 0  a medida q fuera pulsando.

te comento que tambien tiene q ver el tipo de display que uses si es anodo comun es decir positivo comun como es en mi caso tienes que entonces negar esa entrada ya que la configuracion de ese display es 1 para obtener el numero que deseas debes apagar los bits que no deseas usar... para negar dicha entrada solo se agrega un sigo de exclamacion 

while(!input(pin_a0)){
contador++;

}

este signo solo dice que mientras que no haiga una entrada por ese pin_a0 sucedera la condicion que coloques dentro de las llaves

cualquier duda pues abisarme y te envio el programa y el proteus ya listo para que verifiques y te oritentes espero te sirva de algo


----------



## Palvulito (Jul 11, 2011)

Hola estoy tratando de saber como utilizar las interrupciones externas y lo flancos pero cuando compilo dise que las #INT_EXT1 E #INT_EXT2 son invalidas las disrectivas anexo mi codigo para que me puedan ayudar.


```
#include <16F648A.H>      //Libreria del PIC Implementado.
#fuses HS, NOWDT, NOLVP, PUT, MCLR   //Osclador Externo, Deshabilita el Doggy.
#use delay( clock = 20M )   //Frecuencia de Reloj.
#byte port_B = 0x06      //Direccion del Puerto B.
#bit CERO = 0x06.4        //Variable en RB4.
#bit UNO = 0x06.5        //Variable en RB5.
#bit DOS = 0x06.6        //Variable en RB6.

//RB7   RB6   RB5   RB4   RB3   RB2   RB1   RB0

#INT_EXT               //Interrupcion Externa0.
void isr( void )
   {
      CERO = 1;//output_high( PIN_B4 );      //RB4 en Alto.
      delay_ms( 500 );            //Espera 500mseg.
      CERO = 0;//ouput_low( PIN_B4 );        //RB4 en Bajo.
   }
   
#INT_EXT1
void isr1( void )
   {
      UNO = 1;//output_high( PIN_B5 );      //RB5 en Alto.
      delay_ms( 500 );            //Espera 500mseg.
      UNO = 0;//ouput_low( PIN_B5 );        //RB5 en Bajo.
   }
   
#INT_EXT2
void isr2( void )
   {
      DOS = 1;//output_high( PIN_B6 );      //RB6 en Alto.
      delay_ms( 500 );            //Espera 500mseg.
      DOS = 0;//ouput_low( PIN_B6 );        //RB6 en Bajo.
   }
   
void main( void )
   {
      set_tris_B( 0x00 );   //Puerto B como Salida.
      port_B = 0x00;      //Inicializa el Puerto B.
      
      ext_int_edge( 0, L_TO_H );   //Interrupcion 0 por Flanco de Subida.
      ext_int_edge( 1, L_TO_H );   //Interrupcion 1 por Flanco de Subida.
      ext_int_edge( 2, L_TO_H );   //Interrupcion 2 por Flanco de Subida.
      
      enable_interrupts( INT_EXT );   //Habilita la Interrupcion Externa0.
      enable_interrupts( INT_EXT1 );   //Habilita la Interrupcion Externa1.
      enable_interrupts( INT_EXT2 );   //Habilita la Interrupcion Externa2.
      enable_interrupts( GLOBAL );   //Habilita la Interrupcion Global.
      
      while( 1 )
         {
         }
   }
```


----------



## javierbrite (Sep 6, 2011)

Hola presento una inquietud ya que este tuturia es para programar microcontroladores en C
Sucede que en mi universida nos enseñan C con el programa Codeblocks (que aparte es gratuito) que aqui ni lo mencionan, me serviria para programar un microcontrolador ese programa? Que referencias tienen de ese programa? Es como para saber donde estoy parado


----------



## josb86 (Sep 6, 2011)

javierbrite dijo:


> Hola presento una inquietud ya que este tuturia es para programar microcontroladores en C
> Sucede que en mi universida nos enseñan C con el programa Codeblocks (que aparte es gratuito) que aqui ni lo mencionan, me serviria para programar un microcontrolador ese programa? Que referencias tienen de ese programa? Es como para saber donde estoy parado



hola como estas mira el c con el cual se programa en codeblocks o en devc es exactamente el mismo. cambian algunas cosas como algunas rutinas que se le agregan para manejar puertos interrupciones etc pero si sabes codeblocks ccs no va a ser ningún problema es mas a continuación te voy a pasar un pdf muy bueno cuando lo leas veras que es lo mismo que ya sabes


----------



## Unikfriend (Sep 6, 2011)

javierbrite dijo:


> Hola presento una inquietud ya que este tuturia es para programar microcontroladores en C
> Sucede que en mi universida nos enseñan C con el programa Codeblocks (que aparte es gratuito) que aqui ni lo mencionan, me serviria para programar un microcontrolador ese programa? Que referencias tienen de ese programa? Es como para saber donde estoy parado



Hi Javier,

La mayoria de los microcontroladores actuales acepta lenguaje ANSI C, 
esto facilita la migracion de las aplicaciones de un microcontrolador a otro.
Pero depende del micro que quieras utilizar y de tu aplicacion.


----------



## javierbrite (Sep 22, 2011)

Gracias por las respuestas; como dije es una asignatura de la carrera y la carrera se orienta al control electrico


----------



## COSMICO (Oct 31, 2011)

Estaran de acuerdo conmigo, que es el mejor foro sobre temas de electrónica y micros
Creo que a todos quienes estamos aqui inscritos, nos sirve siempre que que lo necesitamos.
Un saludo a los moderadores ya a todos los miembros del mismo..


----------



## Pinchuu (Nov 6, 2011)

Hola a todos,

Me ha surgido una duda en cuanto al lenguaje C. Pongo mi duda aquí porquéno sé dónde ponerla. Es la siguiente:

- Tengo entendido que utilizar variables globales puede dar problemas, por qué?

Saludos!


----------



## josb86 (Nov 7, 2011)

no es que den problemas es que hay que saberlas utilizar, mas bien tener mucho cuidado de cuando vas a hacer los cambios. voy a buscar un fragmento del Deitel donde habla de esto y te lo coloco


----------



## Chico3001 (Nov 7, 2011)

No genera problemas... simplemente hay que saberlas usar.... 

Recuerda que un PIC no es un procesador grande y tiene los recursos muy limitados, las variables globales nunca pierden su valor ya que deben ser accesibles desde cualquier parte del programa, esto obliga al compilador a reservar una localidad de memoria (y hasta 4 si la declaras flotante) por cada variable global que uses, asi que la memoria se agotaria pronto

En cambio si las declaras locales, la variable se destruye al salir de la subrutina, por lo tanto el compilador puede reusar la RAM y meter mas variables en una sola localidad....


----------



## QuimCri (Dic 14, 2011)

yack dijo:


> ola como estan veo que les gusta programar en C y quisiera su opinion yo estoy realiando una tesis profesional y tengo algunos ejemplos sobre C y quisiera q alguine mas me diera su opinion de que tan buenos son los adjunto todos los codigos y simulaciones para el circuito armado espero sus comentarios y ademas en youtube pueden buscar videos de multiyack y ai estan ya fisicamente dejen comentarios para mejorarlos gracias mas adelante espero poder subir el manual  de CCS que estoy armando coomo parte de lo mismo



Gracias, ahora me voy a poner a estudiar la programación en C.

Pregunta:

¿El lenguaje C es indistinto al compilador usado? Me pregunto si un código hecho en C puede ser compilado en C18 y en CCS sin problemas, o cada uno tiene sus cosas diferentes.

Gracias por la atención.


----------



## josb86 (Dic 15, 2011)

es diferente QuimCri no puedes compilar uno en otro, muchas de las instrucciones no son las mismas solo las basicas como los while y eso


----------



## tomvg100 (Feb 25, 2012)

hola saludos alguien me puede ayudar con un programa de interrupcion externa en el pic 18f4550 el programa lo quisiera en CSS Compiler.???
quiero hacer un contador del 0 al 99. quiero que se active un numero ala ves por cada interrupcion.(si le doy un pulso a la interrupcion, que se active un "1" en un display, si doy otro pulso, que se active el siguiente numero "2" y asi susesivamente hasta al 99)

si pudieras aportarme algun ejemplo por lo menos del 1 al cinco...graxiaz


----------



## josb86 (Feb 25, 2012)

int8 contador=0; // variable global

#int_EXT
void  EXT_isr(void) 
{
   contador ++
   lcd_init();
   lcd_putc('\f');
   printf(lcd_putc,"Contador = %u",contador);
}


void main()
{

   enable_interrupts(INT_EXT);
   enable_interrupts(GLOBAL);
   ext_int_edge(L_TO_H);

while(){
if(contador >= 100){contador = 0;}

}

}

en resumen es algo asi. aunque faltan cosas.
de todos modos te recomiendo un manual que coloque aqui es el comentario 104 leelo con calma.


----------



## judex (Mar 12, 2012)

os dejo uno de una termocupla para controlar un horno







```
/*********************************************************************
**Control analógico de  un horno  de reflujo para soldadura SMD y   **
**BGA, este código está  implementado  para el componente MAX6675 y   **
**un microcontrolador PIC16F876A, utilizando el protocolo SPI por   **
**hardware + la entrada analógica digital del micro, donde conectamos**
**un potenciómetro con el cuál regularemos el ancho de pulso de     **
**una señal en PWM                                                  **
**El autor y propietario del código Thulsa_Doom autoriza su libre   **
**distribución, copia y modificación del mismo siempre y cuando se  **
**mencione al autor                                                      **
**********************************************************************
-------------------------------PATILLAJE-------------------------------------
--PIN-2;A0 = Entrada analógica donde conectamos el potenciómetro           --
--PIN-6;A4 = Donde conectamos el pulsador por medio de resistencias Pull-UP--
--PIN-7;A5 = Señal CS o bit-select hacia el MAX6675 PIN-6                  --
--PIN-13;C2 = Salida de la señal PWM                                       --
--PIN-14;C3 = Salida de reloj para el MAX6675 PIN-5                        --
--PIN-15:C4 = Entrada de dato de temperatura que proviene PIN-7 MAX6675    --
-----------------------------------------------------------------------------
*/

// Declaraciones de Post-Procesado
      #include <16f876a.h>
      #device adc=10
           
      #FUSES xt,nowdt,noprotect
      #USE delay(clock=4000000)

      #define use_portb_lcd TRUE
      #include <LCD.C>
     
      #use standard_io (A)
      #use standard_io (B)
      #use standard_io (C)
      #use SPI(MASTER,FORCE_HW,MODE=0,BITS=16)
     
     

//****************************Definición de pines**********************************
      #define CS PIN_A5
     
//******************************Variables Globales***********************************

long ad,buffer;                 //Variable que proviene del modulo analógico/digital
                                 //con el dato del potenciómetro y lo cargamos la función PWM
int msec=0,sec=0,min=0;
int swicht;
float temperatura=0;






//***************************Interrupciones de los timers**************************

#int_TIMER1
     
   void imprimir_cronometro(){
     set_timer1(55661);
     
       if(swicht==1){   //Si la variable swicht es igual a 1, se ejecuta el cronómetro
         if(msec++>99){       //incrementa el valor de msec y si es mayor a 99
              msec=0;               //pone msec a 0.
          if(sec++>58){       //incrementa el valor de sec y si es mayor de 59
                sec=0;             //ponesec a 0.
           if(min++>60){
                 min=0;
           }
         }
         }
       }
    else{      //Si la variable siwcht no es igual a 1 se pone a 0 mse, sec, min
    msec=0;
    sec=0;
    min=0;
    }
   }

   
//****************************Inicialización**************************************

void inicializar(){           //Ejecutamos una rutina de inicialización para que
                             //los valores se estabilizan antes de mostrarlo en pantalla
  printf(lcd_putc,"\fInicializando\n   Sistema");
  delay_ms(500);
  }

//******************************Subprogramas************************************



     
void leer_termocupula(){
        int16 temp;
        int cadena1,cadena2;  //declaramos las variables donde se guardaran el dato que viene del max6675
                                         //el dato viene en dos paquetes separados de 8 bits, por eso se guardan en dos cadenas                         
        delay_ms(200);
        output_low(CS);               //Se activa la señal de bit_select(CS) a 0 para que el max se active
        cadena1 = spi_read(0);  //Lee el primer byte que viene del max6675
        cadena2 = spi_read(0);  //Lee el segundo byte, con eso ya tenemos los 16bits de la lectura del max7765
        output_high(CS);              //Se pone a 1 la señal de bit_select(CS) para que el max tome otra lectura
       
                 
     //  buffer = ((cadena1 * 256) + cadena2);  //Se unen las dos cadenas de 1 byte que viene del max6675 y se
                                                         //guardan en una variable int16 llamada buffer de 16 bits
           buffer = cadena2; // Cargo Byte LB
*((char *)&buffer+1)=cadena1; // Cargo Byte HB.  y los uno los dos en una palabra de 16 bits que se llama buffer         

                      temp = (buffer & 0b0111111111111000)>>3;    //Seleccionamos los bits que nos interesan haciéndole lo que se llama
                                                           //Una máscara, se le hace un AND al dato con un número en binario, los unos significan los bits que queremos utilizar y los 0 los que desechamos
                                                           //Luego le hacemos un >>3 que significa que rodamos los 1 a la derecha 3 posiciones para eliminar los 0 del final                                                         
          temperatura = (temp * 0.25);  //12 bits en decimal equivalen a 4095, para que de los 1023,75 ºC se tiene que multiplicar por 0.25 que es la resolución de cada bit del MAX6675
         
         
         
}         
 
void modulo_AD(){         //Rutina del módulo analógico digital
          ad = 0;                     //Inicializamos la variable del dato del potenciómetro y la limpiamos para una nueva lectura
       
          delay_us(30);                  //Retraso necesario para la medida
          ad = read_adc();               //Captura del valor transformado a digital que entra por AN0 que viene del valor del potenciómetro
         
}

  float modulacion(float pwm){    //Rutina para la modulación de un pulso
 
    pwm=0;                 //inicializamos la variable
   
    if(swicht==1){
    setup_timer_2(T2_DIV_BY_16,255,1);  //configuración del timer_2 para la señal PWM
    setup_ccp1(CCP_PWM);               //Activamos el CCP ósea PWM por hardware
   
    set_pwm1_duty(ad);               //función donde cambiaremos el ancho del pulso, se cambiará en función del valor de ad que luego se pasa a dato
    pwm=(ad/10.23);                 //al dividir el entero por esto, hacemos que en pantalla aparezca 100.0 cuando la PWM  esté a tope
   }                               
   
    else{                              //Si swicht no es igual a 1
    setup_timer_2(T2_DISABLED,255,1);  //Desactivamos el timer2
    setup_ccp1(CCP_OFF);               //Apagamos el módulo ccp1
  }
    return pwm;
}
       
   
    void pulsador (void){   //Rutina para transformar un pulsador en un pulsador con enclavamiento
    int limite=2;

    if(input(PIN_A4)==0){     //Si la entrada A4 está a 0
    swicht++;                 //Se incrementa la variable swicht
    delay_ms(20);           //Un retraso para evitar rebotes del pulsador
    }
    if(swicht > (limite-1)){   //Si la variable swicht es mayor que límite -1
    swicht = 0;                // se pone la variable swicht a 0
    }
   }
 
   
//******************************Función Principal*********************************
   
main(){
                   
          float pwm,pwm1;            //Variables locales para la señal pwm
         
         
          lcd_init();
          inicializar();  //Llamamos a la función inicializar y ejecutamos el código de la función
                 
      port_b_pullups(TRUE); //Seleccionamos la resistencias de pull-ups internas para el puerto B
     
      setup_spi(SPI_MASTER | SPI_L_TO_H); //   Configuramos el SPI por hardware del micro, sin esto no rula   
                         
     setup_timer_1(T1_INTERNAL|T1_DIV_BY_1);  //Configuración del timer1 para el cronómetro
     set_timer1(55661);  //Carga del buffer del timer1 para que el salto sea a 1 ms
   
     setup_adc_ports(AN0);          //Seleccionamos que pin estará tomando las muestras
     setup_adc(ADC_CLOCK_INTERNAL); //Configuración del módulo A/D por hardware
     set_adc_channel(0);            //Canal del micro o pin de entrada en el micro para la conversión A/D
     
     enable_interrupts(INT_TIMER1); //Activamos las interrupciones del timer1
     enable_interrupts(global);   //Activamos las interrupciones globales
           
     do{
         
           leer_termocupula();   //Llamamos al la rutina para leer la temperatura
           pulsador();    //Llamamos a la función pulsador
           
           termocupula_error = (buffer & 0b0000000000000100)>>2; //Seleccionamos el bit D2, nos indica si el termopar está
                                                                         //conectado o no                                                                     
          if(bit_test(buffer,2)){ // Si el bit D2 es igual a 1, se ejecutan las sentencias siguientes             
              lcd_putc('\f');  //Limpiamos la pantalla LCD
              lcd_gotoxy(5,1); //Posición del LCD para imprimir el siguiente comando
              printf(lcd_putc,"Termopar"); //Se muestra en pantalla que el termopar está desconectado
              lcd_gotoxy(3,2);
              printf(lcd_putc,"Desconectado"); //Se muestra en pantalla, en la posición 3,2
               
                setup_timer_2(T2_DISABLED,255,1);  //Desactivamos el timer2
                setup_ccp1(CCP_OFF);               //Apagamos el módulo ccp1
                 }
                else{                 // si no está pulsado - modulamos la señal PWM, medimos le resistencia del potenciómetro y medimos temperatura
                   pwm1 = modulacion(pwm);     //Llamamos a la rutina de PWM y guardamos el dato en pwm1
                   modulo_AD();                //Llamamos a la rutina de modulación A/D para capturar el valor del potenciómetro
                   lcd_putc('\f');             //Limpiamos la pantalla LCD para una nueva escritura
                   lcd_gotoxy(1,1);                           
                    printf(lcd_putc,"Temp=%f C",temperatura); //mostramos en pantalla la temperatura en la posición 1,1
               
                    if(swicht==1){                          //Si el pulsador está activado
                       
                       lcd_gotoxy(1,2);                      //Designamos la posición en el display     
                       printf(lcd_putc,"%02u:%02u",min,sec);//y mostramos el tiempo
                       lcd_gotoxy(6,2);                      //Designamos la posición del valor PWM
                       printf(lcd_putc,"  PWM=%3.1f",pwm1);//mostramos en pantalla el valor de la señal PWM
                       }
                       else{                           //Si NO
                         lcd_gotoxy(1,2);             //designamos la posición en pantalla
                         printf(lcd_putc,"TimeStop");     //mostramos stop, y paramos el tempo
                         lcd_gotoxy(9,2);
                         printf(lcd_putc," PwmStop");      //así como paramos la PWM
                         }
            }             
       }
      while(TRUE);
}
```


----------



## Mikepower (Abr 19, 2012)

Hola
Estoy tratando de hacer un programa que me controle 5 leds con un pic12629 y con un push button cambien entre distintas secuencias cada que sea pulsado, el problema es que lo compilo y no me manda ningun error pero al probar en el protoboard no funciona, no hace nada, este es mi programita; ojala y alguien me pudiera decir en que estoy mal gracias 



```
#include <luces 2.h>
#int_EXT

int boton=0;
void  EXT_isr(void) 
{
  If (!input (PIN_A3))          // Si la entrada es 0
      {  delay_ms(20);             // esperamos 20 ms
      If (!input (PIN_A3))       // comprobamos otra vez la entrada sea 0, por temas de rebote
         {  boton++;
            if(boton>3)
            {
            boton=0;
            }
         }
      }
  return;
}


void main()
{
   enable_interrupts(INT_EXT);
   enable_interrupts(GLOBAL);

   while(TRUE)
   {
    switch(boton)
    {
    case 0: sleep();
            break;
    case 1: int x;
            for(x=0;x<5;x++)
            {
            output_high(PIN_A0);
            output_high(PIN_A1);
            delay_ms(60);
            output_low(PIN_A0);
            output_low(PIN_A1);
            delay_ms(60);
            }
            delay_ms(50);
            output_high(PIN_A2);
            delay_ms(150);
            output_low(PIN_A2);
            int n;
            for(n=0;n<5;n++)
            {
            output_high(PIN_A4);
            output_high(PIN_A5);
            delay_ms(60);
            output_low(PIN_A4);
            output_low(PIN_A5);
            delay_ms(60);
            }
            delay_ms(50);
            output_high(PIN_A2);
            delay_ms(150);
            output_low(PIN_A2);
    case 2: int j;
            for(j=0;j<2;j++)
            {
            output_high(PIN_A0);
            output_high(PIN_A1);
            delay_ms(120);
            output_low(PIN_A0);
            output_low(PIN_A1);
            delay_ms(120);
            }
            delay_ms(50);
            output_high(PIN_A2);
            delay_ms(120);
            output_low(PIN_A2);
            delay_ms(50);
            output_high(PIN_A2);
            delay_ms(120);
            output_low(PIN_A2);
            int k;
            for(k=0;k<2;k++)
            {
            output_high(PIN_A4);
            output_high(PIN_A5);
            delay_ms(120);
            output_low(PIN_A4);
            output_low(PIN_A5);
            delay_ms(120);
            }
            delay_ms(50);
            output_high(PIN_A2);
            delay_ms(120);
            output_low(PIN_A2);
            delay_ms(50);
            output_high(PIN_A2);
            delay_ms(120);
            output_low(PIN_A2);        
    case 3: output_high(PIN_A0);
            output_high(PIN_A1);
            delay_ms(600);
            output_low(PIN_A0);
            output_low(PIN_A1);
            delay_ms(50);
            output_high(PIN_A2);
            delay_ms(120);
            output_low(PIN_A2);
            delay_ms(50);
            output_high(PIN_A2);
            delay_ms(120);
            output_low(PIN_A2);
            output_high(PIN_A4);
            output_high(PIN_A5);
            delay_ms(600);
            output_low(PIN_A4);
            output_low(PIN_A5);
            delay_ms(50);
            output_high(PIN_A2);
            delay_ms(100);
            output_low(PIN_A2);
            delay_ms(50);
            output_high(PIN_A2);
            delay_ms(100);
            output_low(PIN_A2);
            
    }
    
   }

}
```


----------



## Edwardjusto (May 30, 2012)

Que tal, estoy buscando como saltar la paginacion en el pic 16f877a, mi programa ya paso los 2k y quiero metener mas rutinas, estoy haciendo un programa para abrir una cerradura electrica, con clave que se ingresa a travez de un teclado y mostrado por un lcd 2 x16, aqui les cuelgo el programa:

 //Proyecto de cerradura con clave
           void main()
           {
           unsigned short clave[4]={1,5,9,2}, teclado[4]={0,0,0,0}, a, b;
           trisb=0x0f; trisc=0; trisa.f4=0; trisd.f1=0; adcon1=0x06;
           x5:
           porta.f4=0;
           portd.f1=0;
           keypad_init(&portb);
           lcd_config(&portc,1,0,2,7,6,5,4);
           lcd_cmd(lcd_clear); lcd_cmd(lcd_cursor_off);
           lcd_out(1,3,"Ingrese Clave"); lcd_chr(2,6,' ');
           for(a=0;a<4;++a)
           {
           x1:
           b=keypad_read();
           if(b==0)
           goto x1;
           teclado[a]=b;
           lcd_chr_cp('*');
           x2:
           b=keypad_read();
           if(b!=0)
           goto x2;
           }
           for(a=0;a<4;++a)
           {
           if(clave[a]!= teclado[a])
           goto x3;
           }
           lcd_cmd(lcd_clear);
           lcd_out(1,5,"clave");
           lcd_out(2,4,"correcta");
           delay_ms(1000);
           lcd_cmd(lcd_clear);
           lcd_out(1,6,"ACCESO");
           lcd_out(2,4,"AUTORIZADO");
           porta.f4=1;
           delay_ms(2000);
           porta.f4=0;
           goto x5;
           x3:
           lcd_cmd(lcd_clear);
           lcd_out(1,5,"clave");
           lcd_out(2,3,"incorrecta");
           delay_ms(2000);


           portd.f1=1;
           delay_ms(2000);
           lcd_cmd(lcd_clear);
           portd.f1=0;

           goto x5;
           }

cuando meto mas mensajes al lcd y lo simulo, la pantalla sale en blanco, por eso quiero ponerlo con sub-rutinas, pero guardarlas en otro pagina, agradeceria mucho si me podrian ayudar.... gracias


----------



## MORFOMEN14 (Jul 30, 2012)

Andres Cuenca dijo:


> Gracias a la colaboración de "El nombre"  podemos ofrecer a todos los miembros de nuestra comunidad una presentación donde se explica de una manera muy didáctica el entorno de programación en C para microntroladores PIC, usando como ejemplo la familia 16f87xx.
> 
> 
> 
> ...



antes que todo saludos he leidos tus comentarios y me intereza obtener ese curso que describes no tengo mucho conocimiento en c solo en asembler y me gustaria menejar el lenguaje c te agradeceria si me puedes permitir obtenerlo de antemano muchas gracias sin importar tu decision la cual respetare ok saludos


----------



## Takina91 (Ago 18, 2012)

como sumo dos variables, lo he hecho de varias formar pero siempre me tira un error, lo he puesto así 

x=z+y;

pero aun así me sigue tirando error
ya le di los valores a las variables y todo, pero nada me tira error
ayúdenme por favor 
gracias


----------



## jorger53 (May 15, 2013)

Buenas tardes amigos del foro, estoy estudiando un código para usar el conversor analógico digital de un pic, la verdad no tengo mucha experiencia en C como me gustaría, en fin que hay una línea que no entiendo bien que hace y espero alguien me la pueda explicar, saludos.


		PORTB = (8>>(x>>6));	// Use the 2 MS Bits of the result to
                                // select the bit position of the LED on PORTB


----------



## cosmefulanito04 (May 15, 2013)

Suponé que x=0xFF, entonces:

x>>6 = desplazar 6 bits a la derecha => 0xFF>>6 = 0b1111 1111 >> 6 = 0b0000 0011 = 0x03

(8>>(x>>6)) = (8>>0x03) = (8>>3) = 0x08 >> 3 = 0b0000 1000 >> 3 = 0b0000 0001 = 0x01 = 1


----------



## morta (May 15, 2013)

Operadores a nivel de bit 

Nombre del operador	                                                  Sintaxis	Sobrecargable	Incluido en C
Desplazamiento a la izquierda	                                    a << b	          Sí	              Sí
Asignación con desplazamiento a la izquierda	            a <<= b	   Sí	               Sí
Desplazamiento a la derecha	                                     a >> b	            Sí	               Sí
Asignación con desplazamiento a la derecha	             a >>= b	    Sí	               Sí


----------



## jorger53 (May 16, 2013)

Muchísimas gracias por la respuesta, la verdad no era para nada obvio y tuve que analizar bien lo que me explicaban, lo que me preocupa es que estos operadores con Bits no los tengo muy arraigados por lo que es posible que esté programando de manera nada eficiente y es algo que como ya mencioné, me preocupa.

P.D. Supongo que mi post lo unieron con este hilo, me desconcerté al entrar XD.


----------



## sheyson1001 (Jul 9, 2013)

Estimado.

favor de  subir a otro servidor el libro de prog.  para PIc, he intentadode todas formas pero no puedo  bajar del servidor depositefiles.

de antemano las gracias.

saludos





gaba dijo:


> esta estupendo el aporte.. pero voy a complementarlo con dos videotutoriales k tratan el mismo tema.. lo hago pork a mi me sirvieron de verdad..ya k de estar en pelotas ahora me considero alguin con conocimiento medio avanzado .. esto requiere mucho compromiso
> 
> 1ra part  http://depositfiles.com/files/toq73oe31
> 2da part  http://depositfiles.com/files/mwhsxd2pb


----------



## D@rkbytes (Jul 9, 2013)

sheyson1001 dijo:


> Estimado.
> 
> favor de  subir a otro servidor el libro de prog.  para PIc, he intentadode todas formas pero no puedo  bajar del servidor depositefiles.
> 
> ...


Los links funcionan bien, pues lo acabo de comprobar, sin embargo hay que esperar 30 minutos para poder descargar el segundo archivo, ya que la pagina de DepositFiles tiene un limite de descargas.

Intenta descargar los archivos desde otra PC, pues los enlaces aún funcionan.

Saludos.


----------



## luis1234567890 (Dic 18, 2013)

muy buen post hace un mes e estado aprendiendo por cuenta propia lenguaje C ya que  un día por curiosidad me compre Modulo Joystick  Palanca De Control  uno identico ala imagen que dejare  y para controlarlo necesito un pic ,el cual ya tenia por que  antes empleaba lenguaje asm asi que se lo basico ,por eso no se si me pudieran facilitar un ejemplo simple con este  Palanca De Control  aka unos datos :2 potenciometros lineales 4k7 y un pulsador digital, los cuales son controlados por el movimiento de la palanca. Ideal para proyectos de robotica con arduino.
Dimensiones: 3.7 x 2.5 x 3.2 cm
5Pines:  Gnd, +5v, VRx, VRy, SW lo unico que encontre por la red .


----------



## redox92 (May 1, 2014)

hola que tal, estoy interesado en el curso de "c18 desde 0" pero el enlace ya no sirve. alquien podría ayudarme a adquirirlo? saludos!!!


----------



## D@rkbytes (May 1, 2014)

Tal vez esto te sirva:*

**Programas hechos en C18 compiler*

*Búsqueda en Google*

Suerte.
https://www.forosdeelectronica.com/posts/318058/


----------



## redox92 (May 1, 2014)

vale, lo checare. gracias!


----------



## vdb877a (Abr 4, 2016)

hola buenas tardes gente del foro...
queria preguntarles estoy programando en ccs y funcion realmente bien
pero necesito optimizar los tiempos y queria preguntarles como manejar los puertos y de mas en asm dentro del ccs si existe algun tutorial donde pueda ver como configurar en asm las interrupciones 
estoy usando el pic 18f452

muchas gracias ...


----------



## COSMICO (Abr 4, 2016)

En la ayuda del ccs encuentras todo lo necesario con respecto al tema


----------



## vdb877a (Abr 4, 2016)

muchas gracias por tu respuesta cosmico...
lo estoy leyendo en estos momentos ... voy a ver si resulta...


----------



## TRILO-BYTE (Abr 5, 2016)

pero no tiene caso prender un led en ASM

optimizando tiempo pues no se a que te refieras.

es cierto que los pic18f usan el registro LAT por que al ser micros mas rapidos que los 16f necesitan hacer un latch por en puerto.

esto se debe a que en procesamiento son mas rapidos para escribir en el puerto.

no voy a decir que son super PIC no lo son solo son una gama diferente.

¿ASM?
para un led pues yo solo lo uso para remapear vectores cuando uso bootloader fuera de eso no uso para nada el ASM.

eso pasa cuando trabajan en ASM y desconocen el poder del C.

es cierto que el C ocupa mas lineas de codigo, si no lo sabes usar, pero si conoces a fondo el C no tiene caso usar ASM.

en ese caso los Arduinos lo programarian mas en ASM que en lenguaje prossesing


----------



## vdb877a (Abr 5, 2016)

hola trilo-byte
el tema es que estoy manejando un ccd de sony ilx554b... y hace mucho que no programo en asm.
y lo unico que programe en asm es 16f...
cuando conocí el c no toque mas el mplab asm me quede con el ccs
pero ahora necesito hacer parte del programa en asm y no tenia idea como hacerlo
por eso empece por lo mas basico...
agradezco a este foro ya he podido adelantar algo...

gracias


----------



## TRILO-BYTE (Abr 5, 2016)

pero es que no tiene caso digo el titulo dice :

*Curso de programación en C para microcontroladores PIC*

no tiene caso volver atras con el ASM, es cierto que C es mas lento SI y solo SI no lo sabes usar.

pero si ya estas trabajando en C no tiene caso usar ASM , he visto codigos horrorosos en ASM donde usan rutinas *DELAY*.


----------



## COSMICO (Ago 21, 2016)

En CCS C pcw y otros, se puede incluir código asembler.
con la directiva, por ejemplo
#ASM
bsf portb,0
#ENDASM
Tal vez sirva para el caso.


----------



## cosmefulanito04 (Ago 21, 2016)

De todas formas, cuando se mezclan assembler y C, hay que tener en cuenta el estado de los registros al momento de llamar a una función en assembler desde C, porque tal vez el código en C utilizaba algunos registros. Eso dependerá del uC y tal vez del compilador, pero hay que tenerlo en cuenta.


----------



## COSMICO (Ago 22, 2016)

En el manual de CCS PCW, esta toda la ayuda, para estos casos.


----------



## Nuyel (Feb 23, 2017)

Una pregunta, estoy usando XC8, me gusta la programación más universal y siempre he tenido mis momentos de discusión con los PIC y el acceso a sus registros de una forma que no es tan estándar, cosa que obliga a reescribir medio programa si pasas a otro.

Mi problema es que quería ejecutar una simple instrucción PORT ^= PIN para hacer destellar el LED, esto funciona en MSP430, AVR y ARM, pero por algún motivo, no lo hace en el PIC, no se si es cosa del compilador o que, siento que no traduce la instrucción. ¿hay algo que haga mal? básicamente solo es eso en bucle while(1) y un delay. ¿no se puede usar bitwise directamente en los puertos?


----------



## D@rkbytes (Feb 23, 2017)

A mi me pasó lo mismo, y he visto que los compiladores no siempre interpretan las instrucciones de la misma forma.

En XC8 un bit toggle, me funcionó con las siguientes instrucciones:
Ejemplo para el bit RB4.
PORTBbits.RB4 ^= 1;
Y esta otra forma también funciona:
PORTBbits.RB4 = PORTBbits.RB4 ^ 1;


----------



## Dr. Zoidberg (Feb 25, 2017)

No se en XC8, pero en CCS el modo de operacion por defecto de los puertos es algo medio raro, y para que funcione "como uno espera que lo haga" hay que cambiar el modo de operacion con la directiva #fast_io  (o algo parecido)


----------



## Nuyel (Feb 25, 2017)

creo que tiene que ver mucho con el modo de operación de los PIC, eso de tener que mover todo a W, así está el programa, en GP5 si destella, pero en GP4 no lo hace


```
/* 
 * File:   Main.c
 * Author: nuyel
 *
 * Created on 21 de febrero de 2017, 11:08 PM
 */

#include <stdio.h>
#include <stdlib.h>
#include <xc.h>

// PIC12F675 Configuration Bit Settings

// 'C' source line config statements

// CONFIG
#pragma config FOSC = INTRCIO   // Oscillator Selection bits (INTOSC oscillator: I/O function on GP4/OSC2/CLKOUT pin, I/O function on GP5/OSC1/CLKIN)
#pragma config WDTE = OFF       // Watchdog Timer Enable bit (WDT disabled)
#pragma config PWRTE = OFF      // Power-Up Timer Enable bit (PWRT disabled)
#pragma config MCLRE = OFF      // GP3/MCLR pin function select (GP3/MCLR pin function is digital I/O, MCLR internally tied to VDD)
#pragma config BOREN = OFF      // Brown-out Detect Enable bit (BOD disabled)
#pragma config CP = OFF         // Code Protection bit (Program Memory code protection is disabled)
#pragma config CPD = OFF        // Data Code Protection bit (Data memory code protection is disabled)

// #pragma config statements should precede project file includes.
// Use project enums instead of #define for ON and OFF.


/*
 * 
 */
#define LEDBIT _GPIO_GPIO4_MASK
#define _XTAL_FREQ 4000000

//__CONFIG(MCLRE_OFF & CP_OFF & BOREN_OFF & WDTE_OFF & FOSC_INTRCIO & PWRTE_ON);

void main() {
    TRISIO = 0;
    GPIO = 0;
    while(1){
        GPIObits.GP4 ^= 1;
        GP5 = 1;
        __delay_ms(500);
        GP5 = 0;
        __delay_ms(500);
    }
}
```

Supongo que no podré escribir un código más universal sin tener que agregar toda una HAL para manejar esas peculiaridades de los PIC, ahora recuerdo el por qué nunca quise aprender de ellos realmente.

Agrego, es un PIC12F675.


----------



## D@rkbytes (Feb 25, 2017)

Olvidaste algo muy importante... Establecer el registro ANSEL en 0.


----------



## Nuyel (Feb 25, 2017)

Cada ves mas problemáticos, normalmente cuando algo no se usa en otro microcontrolador se inicia desactivado como predeterminado, supongo que el error viene por que el PIC opera con Read-Modify-Write, con ANSEL sin configurar los pines devolvían 0 por lo que el bitwise operaba en 0 siempre.

Ahora ya funciona el PORT ^= PIN;


----------



## D@rkbytes (Feb 25, 2017)

Nuyel dijo:


> Cada ves mas problemáticos, normalmente cuando algo no se usa en otro microcontrolador se inicia desactivado como predeterminado, supongo que el error viene por que el PIC opera con Read-Modify-Write, con ANSEL sin configurar los pines devolvían 0 por lo que el bitwise operaba en 0 siempre.


Pues no es así.
En los compiladores en donde puedes manipular los registros, cómo el caso de XC Compiler, hay que tener eso en cuenta al inicializar los registros.
Mira la hoja de datos y verás cómo se inicia el registro ANSEL en un Power On Reset (POR) y en el Brown Out Detect (BOD)
​Entonces sin configurar ANSEL, se tendrá: 0b0000*1*111 = 0x15, por defecto.
Lo que establece a GP4 (ANS3) como entrada análoga.


En cambio, el compilador PCWHD de CCS, establece todo digital por defecto.
Y por lógica, al ser de alto nivel, establece muchas cosas más para una inicialización adecuada.
Sin embargo, tenemos la opción de declarar los registros y configurarlos cómo uno quiera. ​


----------



## wasausky (Mar 6, 2017)

saben anteriormente eh trabajado con el BASIC la cual contiene la funcion SERIN la cual me permite obtener un dato serial LA CUAL LO ESPERO CIERTO TIEMPO pero en el caso del ccs no sè si tiene una funcion parecida,por que con la funcion GETCH se me queda indefinidamente esperando el dato y no me permite continuar con las tareas o saber si el pic sigue en funcionamiento


----------



## D@rkbytes (Mar 6, 2017)

Si se puede, pero lo debes especificar en la configuración de #USE RS232 (Usando timeout = xxx en ms)
Lee la ayuda y busca: getc_timeout. No es una instrucción, pero encontrarás un ejemplo.


----------



## wasausky (Mar 7, 2017)

ahh cuando hablas de esos registros en los mensajes anteriores el ccs tiene funciones que acceden a los registros ya sea de interrupciones o flags sin embargo no creo que contenga todos los que dispone un pic ,por ello mi pregunta en el caso del ansel como puedo acceder a este registro y a los demás por que en el ccs no me deja declararlo como el programa de NUYEL el cual esta en otro compilador ,pienso que al declararlo ¿deberia estar en forma de assembler? bueno por que sino no me pueden funcionar bien los pines analógicos si los quiero utilizar como digitales ,de antemano gracias por su respuesta


----------



## Nuyel (Mar 7, 2017)

Eso es raro, por que xc.h solo es un link al correspondiente picxxx.h de microchip y esas generalmente siempre son iguales, ANSEL es un puntero, lo que si me es incomodo es el como se declaran los valores en las cabeceras y luego no funcionan a como uno está acostumbrado, prácticamente los PIC usan un C muy diferente, de hecho he pensado en hacer mi propia cabecera para usar un C más normalizado al programar.

En mi cabecera viene como:

```
extern volatile unsigned char           ANSEL               @ 0x09F;
#ifndef _LIB_BUILD
asm("ANSEL equ 09Fh");
#endif
```


----------



## D@rkbytes (Mar 7, 2017)

wasausky dijo:


> Cuando hablas de esos registros en los mensajes anteriores, el CCS tiene funciones que acceden a los registros ya sea de interrupciones o flags, sin embargo no creo que contenga todos los que dispone un PIC, por ello mi pregunta en el caso del ANSEL.
> ¿Cómo puedo acceder a este registro y a los demás?


Declarándolo de esta forma que es más sencillo que buscar su dirección:
#byte ANSEL = getenv ("SFR:ANSEL") // Nombre del registro.
Y sus bits correspondientes se pueden declarar a partir del mismo:
#bit BITX = ANSEL.X


wasausky dijo:


> Porque en el CCS no me deja declararlo como el programa de NUYEL, el cual está en otro compilador.
> Pienso que al declararlo ¿Debería estar en forma de ensamblador?
> Bueno, porque sí no, no me pueden funcionar bien los pines analógicos si los quiero utilizar como digitales.


La forma de declaración que mostré, es válida.
Pero también se pueden declarar los registros de ésta forma:
#byte PORTA = 0x05 // Dirección del registro
Y por defecto, el compilador de CCS (PCWHD) configura todo como digital al compilar.


----------



## wasausky (Mar 9, 2017)

ahh bien me han funcionado tus aportes, sin embargo al manipular usb-cdc solo veo ejemplos por polling 
y trato de poner la #int_usb  pero no me compila e investigado y hay una libreria para eso,pero al final no se como usarlo(es para comunicarme al labview por puerto serial para adquirir datos ) un ejemplo de referencia por fa


----------



## MaShicO (Dic 1, 2019)

Buen día a todos los del foro , les comparto mi código fuente  y el circuito de cruce por cero , estoy tratando de variar y con esto la idea es controlar el angulo de disparo del triac, pero al momento de variar el angulo de disparo que esta dentro del while no responde , si alguien pudiera hecharme una mano o idea se le agradeceria mucho.

```
#include <xc.h>
#define _XTAL_FREQ 12000000
#include "CONFIG.h"
#define LED RD0

int T;
int angle;
//int estado;

//#define Pulso RB0


void interrupt inicio()
{
    if(INTF==1){
        
    T=(angle*16.6)/360;
    __delay_ms(T);
      LED=1;
    __delay_ms(1);
      LED=0;
  
     INTF=0;
    }
}

void main(void) {
    TRISD=0x00;
    PORTD=0;
    TRISB=0xFF;
    
    OPTION_REG=0b00000000;
    GIE=1;
    PEIE=1;
    INTE=1;
    
    //estado=0;
    //INTCONbits.GIE=1;
    //INTCONbits.INTE=1;
    //OPTION_REGbits.INTEDG=1;
    
    while(1)
    {
      angle=30;   
    }   
}
```

Aquí les muestro la imagen en proteus, el disparo se queda solo en ese punto mas no varía nose donde puede estar el error .


----------



## D@rkbytes (Dic 1, 2019)

No entiendo tu esquema.
¿Por qué está conectado el generador AC (VSIN) de esa forma?
¿Dónde está la carga para el TRIAC?
¿Por qué parece que existen dos generadores? (Lo que está detrás del osciloscopio)
¿Qué hay dentro de la librería faltante, "CONFIG.h"?

Se supone que debes sincronizar el pulso para el TRIAC con V2, no con otro generador.
¿Qué caso tiene que dentro del bucle principal la variable "angle" siempre tenga el mismo valor?
Aparte de lo mal del esquema... ¿Será por eso que nunca varía el ángulo del pulso?

Por eso siempre es mejor subir el proyecto completo dentro de un archivo comprimido.
Y también explicar más cómo es que pretendes que funcione el circuito de esa forma.


----------



## MaShicO (Dic 2, 2019)

Hola Dark  toda observación es bienvenida y me sirve para poder mejorar y no cometer los mismos errores. 
Al referirte de por qué esta conectado de esa forma el generador te refieres al 220VAC que esta al lado del triac? Esta mal conectado por qué?  
La carga del triac le puse la resistencia de 10k o no puedo ponerle ese tipo de carga a un triac ? 
El generador que está detrás del osciloscopio es la misma red de 220VAC que ingresa a un puente de diodos y luego a un optoacoplador (este es el circuito detector de cruce por cero ) . Este circuito lo vi en varios post y subido por Fogonazo , dime si puedo mejorar el circuito o quizás deba realizar otro circuito para el detector de cruce por cero.
La librería "CONFIG.h" es una cabecera,  dentro de ésta se encuentra las configuraciones de los bits , lo añadí como librería para no tener muchas líneas de programa.
Al parecer esta mal que la variable "angle" vaya sólo dentro del while . Podrías sugerirme cómo podría mejorar todas las observaciones amigo  Dark ?


----------



## D@rkbytes (Dic 2, 2019)

MaShicO dijo:


> Al referirte de por qué está conectado de esa forma el generador te refieres al 220VAC que esta al lado del triac? Esta mal conectado por qué?


Sí, a ese. Y está mal conectado porque debe haber un solo generador de CA.
Si la referencia de AC se toma de un transformador, no hay problema, pero en tu esquema existen dos fases.
Es más conveniente y simple usar un circuito con optoacopladores, uno para tomar la referencia del cruce por cero y otro para disparar el TRIAC, que en este caso sería un optotriac.
Para el de cruce por cero puedes usar una simple resistencia o un divisor de tensión para alimentar al LED.
Algo así:

El circuito de arriba es un detector de cruce por cero de media onda.


El circuito de arriba es un detector de cruce por cero de onda completa.

Se debe tener en cuenta el tipo de detector a usar porque en el de onda completa se obtendrá el doble de pulsos que en el de media onda.
Y eso se debe tener en cuenta en el programa.

Y este otro es el que mencioné con transformador, también de onda completa:




MaShicO dijo:


> La librería "CONFIG.h" es una cabecera, dentro de ésta se encuentra las configuraciones de los bits , lo añadí como librería para no tener muchas líneas de programa.


¿De cuáles bits? Si son los de la palabra de configuración únicamente te estás ahorrando una línea para ese PIC. (16F877A)


MaShicO dijo:


> Al parecer está mal que la variable "angle" vaya sólo dentro del while . Podrías sugerirme cómo podría mejorar todas las observaciones amigo Dark ?


Está mal si siempre mantiene el mismo valor, o sea: angle = 30;
Por eso te dije que estando con un valor fijo, no tiene sentido que esté dentro del bucle principal.
Y es que mencionas que angle no cambia, obviamente no cambiará porque tiene un valor fijo en 30.
Si esta variable fuera modificada por pulsadores, un potenciómetro u otra cosa, pues sí que debería estar ahí.

Edit:
En dado caso que yo quisiera tratar de compilar tu programa y ver lo que hace, tendría que cambiar algunas cosas.
Ya que por la sintaxis que veo para el servicio de interrupciones, estás usando una versión vieja de XC8
El __delay_ms(); ahora ya no permite variables como parámetro.
Y es que en las versiones actuales han cambiado muchas cosas, y si tratara de compilarlo seguramente obtendría errores.


----------



## MaShicO (Dic 2, 2019)

Hola de nuevo Dark,  gracias por la sugerencia de los esquemas,  están interesantes,  veo que en proteus funcionan solo faltaría implementar con todo el PIC . 
Con respecto al compilador XC8 (Uso MPLAB como entorno de desarrollo)es una versión actual ya que lo volví a descargar desde la página de Microchip hace 1 mes , es la versión actualizada que está en su página oficial. Para el uso de interrupciones puedo  escribirlo por ejemplo  como INTCONbits.GIE=1 asi como GIE=1 igual me lo permite así como colocar dentro del __delay_ms () una variable. 
Que versión de compilador usas ? Usas MPLAB para programar en C ?


----------



## D@rkbytes (Dic 2, 2019)

MaShicO dijo:


> Con respecto al compilador XC8 (Uso MPLAB como entorno de desarrollo)es una versión actual ya que lo volví a descargar desde la página de Microchip hace 1 mes , es la versión actualizada que está en su página oficial


Por eso te digo, MPLAB ya es obsoleto, Microchip ya no da soporte desde hace algunos años, la última versión fue la 8.92.
Ahora el entorno usado (IDE) es MPLABX, pero eso no es lo importante, sino la versión de ToolSuite, que para esta fecha es XC8 v2.10


MaShicO dijo:


> Para el uso de interrupciones puedo escribirlo por ejemplo como INTCONbits.GIE=1 asi como GIE=1 igual me lo permite así como colocar dentro del __delay_ms () una variable.


No me refiero a eso, sino a la sintaxis actual.
En XC8 v2.10 el servicio de interrupciones ya no es soportado como se hacía antes: "void interrupt nombre_x (void)"
Ahora debe ser algo así: "void __interrupt () nombre_x (void)"
Si compilo tu programa con la versión actual esto es lo que sucederá:

Entonces tendría que solucionarlo cambiando la sintaxis por la actual.

Y lo mismo pasaría con __delay_ms() como lo mencioné...

Esto lo resolvería creando una función similar pero que sí me acepte variables como parámetro.


MaShicO dijo:


> ¿Qué versión de compilador usas?


MPLABX v5.30 con XC8 v 2.10


MaShicO dijo:


> ¿Usas MPLAB para programar en C?


No, el MPLAB solo lo uso para programar en ensamblador.

Y aunque MPLAB y MLABX soporten plugins para trabajar con otros compiladores, prefiero usar el IDE del creador.
No me gustan las cosas complicadas para llegar a un mismo fin, por eso mi compilador favorito es PIC C Compiler de CCS


----------



## asherar (May 2, 2021)

Electrodopaje dijo:


> Saludos, tengo una pregunta.
> 
> Es el lenguage C el mejor lenguange de programacion para microcontroladores?
> muchas gracias



Hola, ... mis saludos a los foristas ... 
A lo que ya se ha dicho, sólo quería agregar que en aplicaciones donde se requiere el uso de variables de punto flotante, el lenguaje C permite operar directamente. Hacer lo mismo en assembler sería un trabajo tedioso. 
Ahora, que lo pienso: ¿ cómo sería guardar una variable de punto flotante en la EEPROM ? Por ejemplo coeficientes de algún control PID, o algo similar que tenga redes neuronales. 
La EEPROM es un recurso propio de los pic, que no tiene que ver con el lenguaje de programación. 
¿ Tal vez separando mantisa y exponente y guardando por separado para rearmar al leer ? 
Habrá alguna función ya definida. Hasta ahora nunca tuve que hacerlo ...


----------



## AleSergi (May 2, 2021)

los micros de Microchips cada día tienen menos EEPROM, incluso ahora los AVR, los recortaron y parecen pic con míseros 128 ó 256 de eeprom, en vez de mejorar empeoran.

A tu duda...  básicamente es falta  de conocimiento del lenguaje C, es fácil, los números flotantes suelen ser de 32, 64 ó 80 bits, o más con las arquitecturas de 32bits o 64! ,  entonces con un puntero encontrás la dirección de la variable flotante, con un sizeof, de cuantos bytes es, ahora lees sucesivamente el número de bytes requeridos, y los guardas, uno a uno en la eeprom.

 La lectura es lo mísmo, pero desde la eeprom a la ram,  pensando siempre en sucesión de bytes, y punteros que indican donde están guardados.


----------



## Eduardo (May 2, 2021)

asherar dijo:


> ...
> ¿ Tal vez separando mantisa y exponente y guardando por separado para rearmar al leer ?
> Habrá alguna función ya definida. Hasta ahora nunca tuve que hacerlo ...


Depende con qué programes. 
Si fuera CCS tenés las funciones write_eeprom(addr,val)  y read_eeprom(addr). 

Como escriben de a 1 byte , podés usar un union , ej:


```
union FLN { float f ; struct {int8 b3,b2,b1,b0;};} ;
union FLN float1 , float2 , float3 ;    // las que uses...

....

    float1.f = 4.1 ;    // la trabajás como punto flotante

    // pero la guardás/leés de a byte
    write_eeprom(  0, float1.b3 );  
    write_eeprom(  1, float1.b2 );
    write_eeprom(  2, float1.b1 );
    write_eeprom(  3, float1.b0 );

    float1.b3 = read_eeprom( 0) ;
    float1.b2 = read_eeprom( 1) ;
    float1.b1 = read_eeprom( 2) ;
    float1.b0 = read_eeprom( 3) ;
```


----------



## asherar (May 2, 2021)

AleSergi dijo:


> los micros de Microchips cada día tienen menos EEPROM, incluso ahora los AVR, los recortaron y parecen pic con míseros 128 ó 256 de eeprom, en vez de mejorar empeoran.
> 
> A tu duda...  básicamente es falta  de conocimiento del lenguaje C, es fácil, los números flotantes suelen ser de 32, 64 ó 80 bits, o más con las arquitecturas de 32bits o 64! ,  entonces con un puntero encontrás la dirección de la variable flotante, con un sizeof, de cuantos bytes es, ahora lees sucesivamente el número de bytes requeridos, y los guardas, uno a uno en la eeprom.
> 
> La lectura es lo mísmo, pero desde la eeprom a la ram,  pensando siempre en sucesión de bytes, y punteros que indican donde están guardados.



Gracias por la respuesta.
Hace un par de años tuve a la vista la implementación de un módulo multiplicador de p.f. de 16 bits pensado para FPGA.
Ahí trabajaban con mantisa y exponente porque esa es la norma IEEE para guardar los números de p.f.
No sabía eso de los punteros para los pics, pero resulta entendible (hasta para un "outsider" como yo).

Me han quedado algunos pics un poco obsoletos (16F877A) como para probar este tipo de cosas raras.
De hecho, a partir de este tema se me ha ocurrido una aplicación para probar hasta qué punto una red neuronal puede facilitar y/o mejorar el rendimiento de un controlador pequeño dedicado a unos sensores ópticos.
Hace unos años por aquí se planteó el problema de triangulación a partir de solo 3 sensores. Las fórmulas que surgen de la geometría son sencillas, ... hasta que uno las quiere implementar en un pic. Ahí aparecen propagaciones de errores desde cada cuenta que se hace. 
Cuantas menos cuentas mejor. 
Con redes neuronales "debería" ser más simple de implementar y hasta me animo a decir más preciso. Digo más simple porque uno se evita las cuentas de todos los procesos intermedios, y se centra en adquirir la señal y utilizar las coordenadsa que da la RN. Digo más preciso porque las cuentas son menos y más simples. Pero no lo he hecho aún.
Lo que sí es que requiere trabajar en punto flotante, y guardar y leer los coef. en EEPROM.
La etapa de entrenamiento conviene en una pcy luego devolver al pic los coeficientes y guardarlos en EEPROM.
Ya me está agarrando ganas de probar ...
Un saludo !

... y siempre recuerden que "Yo sólo sé ce, no ce más más, ... y no sé más ..."


Eduardo dijo:


> Depende con qué programes.
> Si fuera CCS tenés las funciones write_eeprom(addr,val)  y read_eeprom(addr).
> 
> Como escriben de a 1 byte , podés usar un union , ej:
> ...


Gracias Eduardo, hace años que no programo en pic ... ni  me imagino las cosas nuevas que habrá ...
En algún momento probé CCS por las bibliotecas para display grafico, pero siempre me abrí con mis propias rutinas y el viejo "HI-TECH C".


----------



## AleSergi (May 2, 2021)

asherar dijo:


> Gracias por la respuesta.
> Hace un par de años tuve a la vista la implementación de un módulo multiplicador de p.f. de 16 bits pensado para FPGA.
> Ahí trabajaban con mantisa y exponente porque esa es la norma IEEE para guardar los números de p.f.
> No sabía eso de los punteros para los pics, pero resulta entendible (hasta para un "outsider" como yo).
> ...


ja ja ja, si lo tuyo es renegar con números flotantes, y fuerza bruta por culpa de las " comas",  te conviene re-estudiar con los  ARM, son directamente de 32 bits, existen placas de desarrollo, y muchos son más económicos que los PIC (o AVR de Microchips), creeme, los ARM son la onda  por estos momentos.


----------

