TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: pablocabrera en 26 de Octubre de 2009, 00:34:53
-
Estimados amigos del foro me estoy iniciando en el lenguaje C, este es un programa que lo he sacado de varias partes, es un secuencial de luces y el tema es que me compila bien en CCS y luego cuando simulo en el proteus no pasa nada. si alguien me puede ayudar se lo agradeceria, les dejo el codigo.
#include <16f88.h>
#fuses INTRC_IO, NOWDT, NOLVP, NOCPD, NOWRT, NODEBUG, NOPROTECT, NOFCMEN, NOIESO, MCLR, NOBROWNOUT
#use delay(clock=8000000)
#use fast_IO(B)
#use fast_IO(A)
#byte PORTB = 0x6 //Direccion del PORTB
void delay(unsigned long tiempo);
void setup(void);
void secuencia1(void);
void secuencia2(void);
void secuencia3(void);
void secuencia4(void);
void secuencia5(void);
void secuencia6(void);
void main(void){
{
int a;
output_b(0x0); // Borra las salidas
set_tris_a(0b00111111); // RA0-RA5 se configuran como entradas
set_tris_b(0b00000000); // Puerta B se configura como salidas
setup_oscillator(OSC_INTRC | OSC_8MHZ | OSC_STATE_STABLE);
while(TRUE){ //ciclo eterno XD
a=input_a(); //almaceno el valor del puerto a
switch(a){ //de acuerdo a su valor selecciono la funcion
case 1: // si la entreda es (0b00000001)-->funcion1
secuencia1();
break;
case 2: // si la entreda es (0b00000010)-->funcion2
secuencia2();
break;
case 4: // si la entreda es (0b00000100)-->funcion3
secuencia3();
break;
case 8: // si la entreda es (0b00001000)-->funcion1
secuencia4();
break;
case 16: // si la entreda es (0b00010000)-->funcion2
secuencia5();
break;
default:
secuencia6();
break;
}
}
}
}
void secuencia1(void)
{
portb = 0b10000000;
delay_ms(1000);
portb = 0b11000000;
delay_ms(1000);
PORTB = 0b11100000;
delay_ms(1000);
PORTB = 0b11110000;
delay_ms(1000);
PORTB = 0b11111000;
delay_ms(1000);
PORTB = 0b11111100;
delay_ms(1000);
PORTB = 0b11111110;
delay_ms(1000);
PORTB = 0b11111111;
delay_ms(1000);
PORTB = 0b01111111;
delay_ms(1000);
PORTB = 0b00111111;
delay_ms(1000);
PORTB = 0b00011111;
delay_ms(100);
PORTB = 0b00001111;
delay_ms(1000);
PORTB = 0b00000111;
delay_ms(1000);
PORTB = 0b00000011;
delay_ms(1000);
PORTB = 0b00000001;
delay_ms(1000);
PORTB = 0b00000000;
delay_ms(1000);
}
void secuencia2(void)
{
PORTB = 0b00000001;
delay_ms(1000);
PORTB = 0b00000011;
delay_ms(1000);
PORTB = 0b00000111;
delay_ms(1000);
PORTB = 0b00001111;
delay_ms(1000);
PORTB = 0b00011111;
delay_ms(1000);
PORTB = 0b00111111;
delay_ms(1000);
PORTB = 0b01111111;
delay_ms(1000);
PORTB = 0b11111111;
delay_ms(1000);
PORTB = 0b11111110;
delay_ms(1000);
PORTB = 0b11111100;
delay_ms(1000);
PORTB = 0b11111000;
delay_ms(1000);
PORTB = 0b11110000;
delay_ms(1000);
PORTB = 0b11100000;
delay_ms(1000);
PORTB = 0b11000000;
delay_ms(1000);
PORTB = 0b10000000;
delay_ms(1000);
PORTB = 0b00000000;
delay_ms(1000);
}
void secuencia3(void)
{
PORTB = 0b00011000;
delay_ms(1000);
PORTB = 0b00111100;
delay_ms(1000);
PORTB = 0b01111110;
delay_ms(1000);
PORTB = 0b11111111;
delay_ms(1000);
PORTB = 0b00000000;
delay_ms(1000);
}
void secuencia4(void)
{
int i=0;
while(i<120)
{
PORTB = 0b11110000;
delay_us(120);
PORTB = 0b00000000;
delay_us(120);
i++;
}
i=0;
while(i<120)
{
PORTB = 0b00001111;
delay_us(120);
PORTB = 0;
delay_us(120);
i++;
}
}
void secuencia5(void)
{
int i=0;
while(i<120)
{
PORTB = 0b11000011;
delay_us(120);
PORTB = 0;
delay_us(120);
i++;
}
i=0;
while(i<120)
{
PORTB = 0b00111100;
delay_us(120);
PORTB = 0;
delay_us(120);
i++;
}
}
void secuencia6(void)
{
PORTB =0;
}
-
Hola, cómo andás???
el código está mal en un simple punto...
Leyendo creí que estaba bien, pero no...
Me he tomado el trabajo de armar un circuito en proteus y simular tu code...
para la próxima sube también tu esquemático o el archivo del proteus, pues puedes tener algún problema allí en lugar de en el programa ;-)
Tu pones en los fuses MCLR por lo tanto al simular debes poner a positivo(+) el pin 4 correspondiente a RA5/MCLR y nunca mejor llamada así, ya que aunque la usas como MCLR, sigue siendo RA5...
Luego en tu programa preguntas por el puerto a de la siguiente forma:
a=input_a(); //almaceno el valor del puerto a
Esta instrucción te lee el 1 lógico de RA5... ergo, cuando tu piensas que introduces 1,2,4,8,16 en realidad el pic lee 21h,22h,24h,28h,30h
La soluciones más rápidas:
1) usar los valores 21h,22h,24h,28h = 33,34,36,40,48
2) usar una máscara sobre el puerto a para tomar sólo los bits que te interesan
3) preguntar bit por bit en lugar de leer el puerto A completo.
Saludos...
-
Muchas Gracias Menta, estoy en revisando y te cuento te mando el esquematico que tengo.
muchas gracias
-
Bueno, se nota que eras nuevo programando pics... pero mucho ánimo que así empezamos la mayoría. Mi primer programa fue en asm y prendía 4 leds amarillos secuencialmente. Una tontería que me llenó de felicidad cuando veía las lucesitas prenderse justo como yo lo había imaginado...
El archivo dsn no era necesario ahora, te lo comentaba para que lo hagas en otra ocación, no lo pude ver porque está hecho con otra versión de la que tengo instalada yo (7.2 sp6)
Igualmente es un esquema muy simple el de un secuenciador, pero cuando tengas una duda en un circuito más complejo la cosa se complica para la gente que pretende ayudar...
Exitos con el proyecto!!!
-
Muchas gracias Menta = sigo con la duda po que no cacho donde y como colocar lo que tu me comentas es que ya me tiene chato me funciona prediendo un led o haciendo giro pero nada mas.... ha y tengo el mismo en asm pero con el 16F84a pero este lo quiero por el oscilador interno...
muchas gracias :-/
-
Cuál es tu versión de PICC?
Cuál es tu versión de proteus ISIS?
Vas a usar un botón de reset en tu circuito?
Te he enviado un mail al correo que figura en tu perfil (gmail)
Contiene un poco de info gratuita sobre el lenguaje C
Te recomiendo mirar los hilos destacados de este subforo, especialmente los ejemplitos en C de Vszener (http://www.todopic.com.ar/foros/index.php?topic=4530.0)
-
sii bueno uso el CCS 4.093 (creo)
el ISIS 7.5 sp3
y no voy a usar reset
he recivido tu mail y la verdad hasta ahora no he podido interiorizarme mucho pero cuando pueda le arranco...
muchas gracias amigo...