PIC18f452 y CCS

Cómo andan?
Ando programando con el PIC18f452 y utilizando sus conversores ADC.
Estoy teniendo un inconveniente ya que tengo que usar el AN7 y al configurar setup_adc_ports no puedo poner este puerto como analógico. Mis líneas de código para configurar el ADC son las siguientes:

setup_adc(ADC_clock_internal);
setup_adc_ports(All_analog);
set_adc_channel(7);

Con estas líneas se traba todo el programa.
Me di cuenta que anulando la línea de setup_adc_ports el programa corre normalmente
¿Qué estoy haciendo mal?

Muchas gracias!!!
 
setup_adc(ADC_clock_internal);
setup_adc_ports(All_analog);
set_adc_channel(7);

Con estas líneas se traba todo el programa.
Me di cuenta que anulando la línea de setup_adc_ports el programa corre normalmente
¿Necesitas que todos los pines con ADC estén modo análogo?
¿Qué estoy haciendo mal?
Como no podemos ver tu programa, es muy difícil dar opiniones.
 
es que debes recordar que el CCS da muchos bugs ami me los genero igual
la forma que encontre como hacerlo fue esto en un 18f4550

setup_adc_ports(AN0_to_AN1);

pero si yo quiero poner para solo el AN0 no funciona no se por que pero su uso _to_ si funciona
setup_adc_ports(AN0);

setup_adc_ports(AN0_to_AN1);

la ventaja es que uso 2 analogicos en este proyecto

pero lei en algunos foros que es por la vercion del CCS que tengas

//------------DECLARO LOS ANALOGICOS-------//
setup_adc_ports(AN0_to_AN1);
setup_adc(ADC_CLOCK_INTERNAL);
//------------DECLARO LOS ANALOGICOS-------//
 
Hola, ... dos mil lineas de código... no cero haber llegado a tantas lineas de código.
... con mas o menos esa cantidad de código, hay que como lo esta tratando el CCS, puede ser que por error del compilador no este apuntando correctamente a los bankos de la Ram o quizá no esta manejando las pajinas de "Rom" de modo correcto, para determinar esto habría que ver todo el programa, a la vez ver el asm que esta generando y un buen depurador de código, aun asi seria "todo un trabajito".
Por otro lado podrías utilizar al adc insertando código en asm(por lo meno al asm nunca falla).
 
No hace falta que todos sean analógicos... sólo el AN7
Tampoco podrías, con poner ALL_ANALOGS se está configurando todos los pines como entrada análoga, fisicamente no es posible en el PIC (ver hoja de datos)...
Con set_adc_channel() estás diciendo al PIC, que canal quieres que trabaje con el ADC... ahún así el resto sigue siendo análogo.

Si es muy necesario usar el AN7 podrias hacer un cambio constante entre análogo y digital... cada vez que se requiera el AN7 se cambia a análogo y luego a digital para usar el resto de pines...claro, siempre y cuando que el cambio no afecte al resto del circuito.

Como dijo TRILO-BYTE puede ser por la versión, asegurate viendo el archivo de cabecera del PIC *.h... que configuraciones soporta y como se escriben.
 
Tampoco podrías, con poner ALL_ANALOGS se está configurando todos los pines como entrada análoga, fisicamente no es posible en el PIC (ver hoja de datos)...
Con set_adc_channel() estás diciendo al PIC, que canal quieres que trabaje con el ADC... ahún así el resto sigue siendo análogo.

Si es muy necesario usar el AN7 podrias hacer un cambio constante entre análogo y digital... cada vez que se requiera el AN7 se cambia a análogo y luego a digital para usar el resto de pines...claro, siempre y cuando que el cambio no afecte al resto del circuito.

Como dijo TRILO-BYTE puede ser por la versión, asegurate viendo el archivo de cabecera del PIC *.h... que configuraciones soporta y como se escriben.

Resuelto gente!!! Como dijo ByAxel paso de analógico a digital todo el puerto pero sólo a la hora de tener que utilizar el ADC... FUNCIONÓ MUY BIEN!!!

Gracias por la ayuda a todos!!!
 
me alegra
como el CCS tiene muchos ejemplos en internet y todos afirman que funciona pero a la hora de hacer un proyecto o no compila o hace cosas que no dberia de hacer.

un bug reciente que encontre lo comparto para quienes les llegue a pasar y no se arranquen el cabello
:LOL:
este bug se crea cuando declaramos variables globales fuera del main

char cadena[20];
int numero=-12;
....
//varias variables int, char ,y codigo

printf("%d",numero);

aqui el CCS por una extraña razon en el puerto serie escribe cualquier cosa menos el -12

pero si lo cambio a

unsigned char *cadena;
int numero=-12;
....
//varias variables int, char ,y codigo

printf("%d",numero);

aqui el puerto serie si imprime el -12

¿por que?

no tengo idea tengo la vercion 4.108

otros compiladores no generan este bug pero si el CCS y mi codigo era de 2000 lineas de codigo encontrarlo fue una pesadilla
 
me alegra
como el CCS tiene muchos ejemplos en internet y todos afirman que funciona pero a la hora de hacer un proyecto o no compila o hace cosas que no dberia de hacer.

un bug reciente que encontre lo comparto para quienes les llegue a pasar y no se arranquen el cabello
:LOL:
este bug se crea cuando declaramos variables globales fuera del main

char cadena[20];
int numero=-12;
....
//varias variables int, char ,y codigo

printf("%d",numero);

aqui el CCS por una extraña razon en el puerto serie escribe cualquier cosa menos el -12

pero si lo cambio a

unsigned char *cadena;
int numero=-12;
....
//varias variables int, char ,y codigo

printf("%d",numero);

aqui el puerto serie si imprime el -12

¿por que?

no tengo idea tengo la vercion 4.108

otros compiladores no generan este bug pero si el CCS y mi codigo era de 2000 lineas de codigo encontrarlo fue una pesadilla

Buenísimo el dato!!!
Cada vez que me pasa algo raro en mi programa (de 2000 líneas!!!!) es cuestión de revisarlo compleeeeeetamente y termino resolviendo el inconveniente cambiando de lugar líneas o renombrando los tipos de variables como dijiste.

Creo que es cuestión de práctica y hacerlo con gusto!!!!
 
yo estoy aun muy verde en esto de los micros
XC8 nunca lo he probado dicen que esta bueno

pero este que sugieres ¿es de paga , gratis vercion de prueba?

yo digo que cuando un compilador abarca muchas familias ahi es donde se generan los problemas
 
Yo estoy aún muy verde en esto de los micros.
XC8 nunca lo he probado, dicen que está bueno.
En lo personal, no me gusta su sintaxis.
Pero este que sugieres, ¿es de paga, gratis, versión de prueba?
Sip, igual que la mayoría de compiladores, es de paga.
La licencia no es cara y tiene buena asesoría.
Yo digo que cuando un compilador abarca muchas familias, ahí es dónde se generan los problemas.
Cierto, pero este es un entorno de desarrollo con compiladores independientes.

Se puede bajar un demo con limitación de líneas de código, pero sirve para probar.
 
Gente, tengo una consulta: ¿hay posibilidad de trabajar con un mismo puerto pero dividiéndolo por nibble, haciendo que uno de ellos se configure como entrada y el otro como salida? El tema es que tengo que manejar las entradas de control de un multiplexor mediante los bits 4-5-6-7 del portB, lo que implica que necesito incrementar un contador pero sin modificar los bits 0-1-2-3
Qué dicen ustedes?
Gracias!!!!
 
Si se puede...
en primer lugar al menos que sea de super velocidad el asunto, no hace falta andar dicendo que pines son OUT o IN en CCS, de eso se encarga el compilador.

Podes emplear operaciones a nivel bit, el clásico XOR (si mal no recuerdo).
Fijate la libreria "lcd.c" en las versiones anteriores a la 5.00, ahí lo hacen maestramente, inician definiendo un "struct" para un nible. La cosa pasa por conocer al lenguaje C.
 
Sí: solo tienes que indicar en el registro TRISB qué bit serán de entrada (1) y cuáles de salida (0).

En cuanto a la disposición de los bit, si vas a necesitar un contador, yo usaría los bit más bajos, porque de esa manera podría incrementar el contador en el propio puerto, sin necesidad de tener una variable aparte. Los bits de entrada no quedarán afectados.
 
si puedes andar cambiando a voluntad el TRIS de los puertos
como entrada o salida eso es un hecho, que la gente lo ponga en la declaracion por ensima del main
no es fuerza que sea asi.

la forma mas facil es hacer funciones de mascaras como AND ,OR ,XOR ,NOT para hacernos la vida mas facil

un autor escribio una libreria llamada FLEXLCD.h que lo que hace es remapear los pines de la LCD a cualquier pin del micro
¿como le hiso?
con las mascaras asi uno puede enmascarar el bit que necesita uno y reflejarlo en un puerto

si el puerto escribe 11110110
uno le puede aplicar una OR donde yo quiero escribir un bit en el la pocicion 4
asi

11110110
OR
00001000

quedando asi
11111110

donde ese bit lo podemos rotar para que quede en esa posicion lo rotamos 3 veces a la izquierda
digamos que es 1
lo rotamos a la izquierda 1 quedando asi 1000
ahi es donde uno puede ya hacer la mascara para tener el resultado anterior

uno debe aprender estos trucos pues son mas rapidos que hacerlos de modo suma resta o jugar con los numeros
 
si puedes andar cambiando a voluntad el TRIS de los puertos
como entrada o salida eso es un hecho, que la gente lo ponga en la declaracion por ensima del main
no es fuerza que sea asi.

la forma mas facil es hacer funciones de mascaras como AND ,OR ,XOR ,NOT para hacernos la vida mas facil

un autor escribio una libreria llamada FLEXLCD.h que lo que hace es remapear los pines de la LCD a cualquier pin del micro
¿como le hiso?
con las mascaras asi uno puede enmascarar el bit que necesita uno y reflejarlo en un puerto

si el puerto escribe 11110110
uno le puede aplicar una OR donde yo quiero escribir un bit en el la pocicion 4
asi

11110110
OR
00001000

quedando asi
11111110

donde ese bit lo podemos rotar para que quede en esa posicion lo rotamos 3 veces a la izquierda
digamos que es 1
lo rotamos a la izquierda 1 quedando asi 1000
ahi es donde uno puede ya hacer la mascara para tener el resultado anterior

uno debe aprender estos trucos pues son mas rapidos que hacerlos de modo suma resta o jugar con los numeros

Muy buena TRILO-BYTE!!!

Gracias!!!



Gente, lo solucioné de una forma más simple y no modifiqué nada del circuito ni del programa : para incrementar el nibble superior (bits 4-5-6-7) sin modificar el inferior (bits 0-1-2-3) incrementé una variable sumándole a sí misma 16, es decir:

y=0;
for(x=1;x<=10;x++)
{
y=y+16;
portb=y;
}

Así obtengo en el puerto B la siguiente modificación:

00010000
00100000
00110000
01000000
01010000
01100000
01110000
10000000
10010000
10100000

Qué les parece????
 
Última edición:
jeje esta bien pero pudiste haberlos rotado

pero mientras funcione no hay problema

diagmos que tenemos un bit asi:

int bit=1;

ahora en el puerto se veria asi:

00000001

pero queremos dezplazarlo al la cuarta casilla asi se hace

bit=bit<<4;

ahora se veria asi:
00010000

con 2 instrucciones hicimos lo que sumar 16

igualamos y desplazamos ;)
 
Gente, una consulta referido a este mismo tema: a la par que programo voy simulando con el proteus el cual me dió muy buenos resultados; pregunto: ¿hay manera de ver como evoluciona una cierta variable?. Es decir, supongamos que quiero ver como va evolucionando una variable que está dentro de un for o cuando se entra en una interrupción externa...
 
Última edición:
Atrás
Arriba