TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: MINDFIELD en 11 de Agosto de 2015, 22:10:51
-
No entiendo o no puedo ver que esta mal pero este codigo tan simple no funciono con dos 18f2450 ni con un 18f2455 :? :? la simulacion en isis funciona bien!
#include <18f2455.h>
#FUSES XT,NOWDT,NOPROTECT,PUT,NOBROWNOUT,NOLVP
#use delay(clock=4000000)
#define LCD_ENABLE_PIN PIN_B0
#define LCD_RS_PIN PIN_B1
#define LCD_RW_PIN PIN_B2
#define LCD_DATA4 PIN_B4
#define LCD_DATA5 PIN_B5
#define LCD_DATA6 PIN_B6
#define LCD_DATA7 PIN_B7
#include <lcd.c>
int16 distancia, tiempo;
#define trig pin_A1
#define echo pin_A0
#USE standard_io(b)
void main()
{
lcd_init();
delay_ms(250);
printf(LCD_PUTC, "\f Iniciando");
output_high(PIN_A2);
delay_ms(500);
printf(LCD_PUTC, "\f Iniciando .");
delay_ms(500);
printf(LCD_PUTC, "\f Iniciando ..");
delay_ms(500);
printf(LCD_PUTC, "\f Iniciando ...");
delay_ms(500);
output_low(PIN_A2);
while(true)
{
}
-
Bueno recien recorde que lalibreria lcd.c tenia algunos problemas, asi que solo comente la libreria y ahora pone A2 en estado alto y bajo 14 veces y despues no hace más nada! porque hace eso?
-
Hola MINDFIELD, tu código no hace nada, pues porque no hace nada, cuando llega al while(true) se queda hay permanentemente sin hacer nada, no tiene interrupciones ni nada por esl estilo que llame ha hacer nada.
Lo de que pone en alto 14 veces el pin A2 pues eso debería hacerlo solo una vez, o se esta reiniciando 14 veces o sepa dios lo que esta haciendo CCS por dentro.
Cuelga el esquemático a ver si hay algo raro. O prueba a meter cosas en el while para ver si esta funcionando el micro.
-
Hola juaperser1 justamente quiero que prenda y apague un led, ya que no saca ningun mensaje por el lcd y amodo de prueba hice el codigo asi a proposito! el codigo original está acá Codigo (http://www.todopic.com.ar/foros/index.php?topic=44929.0)
-
bueno, para empezar tienes que colocar una resistencia en el led o lo quemaras, pon una resistencia en serie de unos 330 por ejemplo, los condensadores de desacoplo del cristal van a masa? no se aprecia bien, pero deben de ir a masa, y en circuito físico, debes de haber seguido unas reglas, por ejemplo los condensadores lo mas cerca posible del cristal, ademas de el cristal lo mas cerca del micro, colocar condensadores de desacoplo en las alimentaciones del micro... etc etc.
prueba este código para saber si esta bien:
#include <18f2455.h>
#FUSES XT,NOWDT,NOPROTECT,PUT,NOBROWNOUT,NOLVP
#use delay(clock=4000000)
#USE standard_io(A)
void main()
{
while(true)
{
output_high(PIN_A2);
delay_ms(500);
output_low(PIN_A2);
delay_ms(500);
}
}
no me acuerdo casi nada del CCS pero creo que asi te debe de parpadear el led. pruebalo y te aseguras de que el el micro va bien.
-
Hola! gracias por tú ayuda, todo lo que me aconsejas ya estaba listo desde que lo arme! el circuito en proteus es el mismo salvo la r que va al led que no está, los condensadores si van a masa! voy a probar tú codigo, recien llego pero en brebe lo pruebo y te comento, el codigo primero deveria pasar por el main verdad?
...
Bien ya lo probe y funciona prende y apaga 4 veces y espera elmismo tiempo que el total de las 4 veces que prende y apaga y vuelve a repetir todo! :huh: ahora que ago?
-
Hice otra prueba de esta forma:
#include <18f2455.h>
#FUSES XT,NOWDT,NOPROTECT,PUT,NOBROWNOUT,NOLVP
#use delay(clock=4000000)
#USE standard_io(A)
void main()
{
while(true)
{
output_high(PIN_A2);
}
}
ahora solo prende y apaga continuamente ! :huh:
-
Hay otra cosa mal ahi, no puede prender y apagar si solo tenes para encenderlo. Algo lo debe estar reseteando al micro.
-
hoy me voy a fijar de nuevo, tengo un par de soldaduras que van al lcd tal vez este paso a mejor vida pero hasta hoy a la noche no voy a saber...
-
Como dice killer si el código que te puse y ese que tu has puesto no funcionan el problema es de hardware, puede que se haya producido un corto, que calentaras demasiado un componente, la placa es casera, una pista este medio suelta, alguna soldadura mala pfff mil cosas.
Pero ese micro se enciende y se apaga constantemente.
-
si pero este es el tercer pic que pruebo, el circuito es simple! y si es el problema de hardware presumo que es el lcd en un par de minutos me fijo
-
Bueno mi experiencia es limitada pero despues de hacer unas pruebas hice que el led encienda y hasta ahi todo bien! despues use de nuevo el codigo original con el que empeze la cuestion pero con el lcd sin conexion alguna y para mi sorpresa el circuito no hace nada de nada... ahi pongo el codigo aunque para mi el problema es la libreria del lcd! pero tambien probe con la libreria flex
#include <18f2455.h>
#FUSES XT,NOWDT,NOPROTECT,PUT,NOBROWNOUT,NOLVP
#use delay(clock=4000000)
#USE standard_io(A)
#USE standard_io(b)
#include <lcd.c>
int16 distancia, tiempo;
#define trig pin_A1
#define echo pin_A0
void main()
{
lcd_init();
delay_ms(250);
output_high(PIN_A2);
delay_us(750);
output_low(PIN_A2);
printf(LCD_PUTC, "\f Iniciando");
delay_ms(500);
printf(LCD_PUTC, "\f Iniciando .");
delay_ms(500);
printf(LCD_PUTC, "\f Iniciando ..");
delay_ms(500);
printf(LCD_PUTC, "\f Iniciando ...");
delay_ms(500);
output_high(PIN_A2);
delay_ms(500);
output_low(PIN_A2);
delay_ms(500);
setup_timer_1(T1_INTERNAL|T1_DIV_BY_8);
while(true)
{
output_high(trig);
delay_us(20);
output_low(trig);
while(!input(echo))
{
}
set_timer1(0);
while(input(echo))
{
}
tiempo=get_timer1();
distancia=(tiempo*10)/(58.0);
printf(LCD_PUTC, "\fTiempo :%Lu \nDistancia = %Lu",tiempo,distancia);
delay_ms(500);
}
}
y para confirmar mi "corazonada" este codigo si funciono!
#include <18f2455.h>
#FUSES XT,NOWDT,NOPROTECT,PUT,NOBROWNOUT,NOLVP
#use delay(clock=4000000)
#USE standard_io(A)
#USE standard_io(b)
//#include <lcd.c>
int16 distancia, tiempo;
#define trig pin_A1
#define echo pin_A0
void main()
{
//lcd_init();
delay_ms(250);
output_high(PIN_A2);
delay_us(750);
output_low(PIN_A2);
/*printf(LCD_PUTC, "\f Iniciando");
delay_ms(500);
printf(LCD_PUTC, "\f Iniciando .");
delay_ms(500);
printf(LCD_PUTC, "\f Iniciando ..");
delay_ms(500);
printf(LCD_PUTC, "\f Iniciando ...");
delay_ms(500);*/
output_high(PIN_A2);
delay_ms(500);
output_low(PIN_A2);
delay_ms(500);
setup_timer_1(T1_INTERNAL|T1_DIV_BY_8);
while(true)
{
output_high(trig);
delay_us(20);
output_low(trig);
while(!input(echo))
{
}
set_timer1(0);
while(input(echo))
{
}
tiempo=get_timer1();
distancia=(tiempo*10)/(58.0);
//printf(LCD_PUTC, "\fTiempo :%Lu \nDistancia = %Lu",tiempo,distancia);
delay_ms(500);
}
}
-
Puede ser error del pickit2 clone o de ccs???? :huh:
-
Si el problema no es de hardware seguramente es de software, MINDFIELD.
Tu codigo funciona al agregarle unas pequeñas cocitas tan solo, por lo menos desde la simulacion :D
Te adjunto el codigo y simulacion, espero te aclare algunas cosas!
Saludos
-
Gracias RALF2 si puedo lo pruebo ya! apenas llego de trabajar y en unos minutos tengo que salir! tú codigo a simple vista tiene en los fuses XT,NOWDT,NOPBADEN,PUT,NOBROWNOUT,NOLVP, MCLR, agregaste NOPBADEN y MCLR no se que funcion cumple NOPBADEN y MCLR pensaba que con la r de 10k deberia ser NOMCLR, ademas veo que escribiste una coma y yo no! porque ami no me dio ningun error??
En la simulacion que hace el push button en RA0? porque no me funciona! y tampoco saca ningun mensaje por el lcd... sera mi pc que anda como yo? :mrgreen:
-
Veamos la coma que comentas esta demas, para ver que son cada fusible ve arriba donde dice VIEW -> config bits, alli de acuerdo al pic utilizado te aparecen todos los fuses y con el apoyo del data sheet sabras que es cada cosa.
En tu caso NOPBADEB configura el puerto B como I/O digitales que es lo que necesitamos; MCLR activa este pin como reset por lo que debes colocarlo a Vcc a traves de una resistencia (no fue colocado en la simulacion).
En la simulacion que hace el push button en RA0? porque no me funciona! y tampoco saca ningun mensaje por el lcd... sera mi pc que anda como yo?
jajajaj eso lo deberias saber tu, porque en tu programa, colocastes esto: #define echo pin_A0
y lo utilizas para poder avanzar o no en el programa dependiendo si ese pin esta en uno o cero por eso es lo de la resistencia de pull up en este pin.
En la simulacion se ve el programa corriendo perfectamente, primero muestra iniciando . . .
y luego se queda alli hasta que pulso el boton conectado a RA0, toma el valor del timer...
Sino te funciona debes tener un problema con tus programas.
Saludos
-
Buen dia, gracias por tú ayuda desinteresada, Valoro mucho lo que haces y he aprendido mucho :mrgreen: lo del push button no me di cuenta por el apuro que tenia :oops: ando a 1000 estos dias! y es cierto la simulacion no me corre voy a ver que esta pasando en mi pc... o en proteus...
-
Si MINFIELD, seguro son los programas que estan corruptos; desinstala todo, borra registros limpia la pc y luego vuelve a reinstalar todo de nuevo.
Y vuelves a probar y nos comentas.
Trata de hacer las cosas con calma porque si lo haces a la carrera se te complicara todo :?
Saludos
-
Estoy haciendo algunas pruebas va todo bien! gracias Ralf2! si semecomplica en algo de nuevo comento si no me corren antes de acá :D
-
Me alegro que te este funcionando :mrgreen:
Si puedo y tengo tiempo con gusto te ayudare ;-)
Saludos