Autor Tema: Ayuda con un secuencial  (Leído 2203 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado pablocabrera

  • PIC10
  • *
  • Mensajes: 20
Ayuda con un secuencial
« 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.

Código: [Seleccionar]
#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;
}



Desconectado Menta

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 607
Re: Ayuda con un secuencial
« Respuesta #1 en: 26 de Octubre de 2009, 02:01:53 »
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...
« Última modificación: 26 de Octubre de 2009, 02:06:24 por Menta »
     

Desconectado pablocabrera

  • PIC10
  • *
  • Mensajes: 20
Re: Ayuda con un secuencial
« Respuesta #2 en: 26 de Octubre de 2009, 12:23:48 »
Muchas Gracias Menta, estoy en revisando y te cuento te mando el esquematico que tengo.


muchas gracias

Desconectado Menta

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 607
Re: Ayuda con un secuencial
« Respuesta #3 en: 26 de Octubre de 2009, 15:33:57 »
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!!!
     

Desconectado pablocabrera

  • PIC10
  • *
  • Mensajes: 20
Re: Ayuda con un secuencial
« Respuesta #4 en: 26 de Octubre de 2009, 22:35:18 »
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   :-/

Desconectado Menta

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 607
Re: Ayuda con un secuencial
« Respuesta #5 en: 27 de Octubre de 2009, 00:48:27 »
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
« Última modificación: 27 de Octubre de 2009, 01:12:47 por Menta »
     

Desconectado pablocabrera

  • PIC10
  • *
  • Mensajes: 20
Re: Ayuda con un secuencial
« Respuesta #6 en: 02 de Noviembre de 2009, 20:18:05 »
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...