Autor Tema: Paso de valores desde y hacia funciones  (Leído 8167 veces)

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

Desconectado aitopes

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5100
    • uControl
Paso de valores desde y hacia funciones
« en: 29 de Agosto de 2007, 14:58:19 »
Hola!
Al fin me decidi, y estoy haciendo los primeros pinitos en CCS. Como no podia ser de otra manera, tengo un pequeño problema:

Tengo un programa que debe secuenciar las salidas del puerto B dependiendo del estado de A0 y A1 (que me permiten elegir el programa 1, 2, 3 o 4 y del estado de A2 y A3, que me permiten elegir cuatro velocidades distintas.

He programado todo con funciones, pero ponga como ponga los jumpers en A0, A1, A2 y A3, me toma el programa 0 con velocidad 0, por lo que deduzco que no me esta leyendo el PORTA, o bien las funciones que escribi para leer el puerto no funcionan como quiero.

El codigo es algo extenso, pero lo posteo completo por que puedo haber metido la pata en las directivas de principio, o dios sabe donde.

Por ultimo: el programa lo pruebo sobre el pic mismo, ya que como estoy aprendiendo, tome un proyecto que tenia terminado en BASIC, que funcionana ok, y lo estoy reprogramando en CCS.

Este es el codigo. Me gustaria me reten un poco, y vean si encuentran el error. Gracias!  :mrgreen:

Código: [Seleccionar]
//------Directivas para el compilador--------
#include <16f627a.h>              //PIC utilizado         
#fuses INTRC,NOWDT,NOPROTECT,PUT  //Configuramos los fuses
#use delay (clock=4000000)        //Oscilador a 4Mhz
#use fast_io(a)                   //Optimizamos E/S del PORTA
#use fast_io(b)                   //Optimizamos E/S del PORTB
#byte portb = 0x6                 //Direccion del PORTB
//#define CCP_OFF                   //Desabilito comparadores

//------Prototipos de funciones-----
int leo_prog(void);
int leo_demora(void);
void prog1(int demora);
void prog2(int demora);
void prog3(int demora);
void prog4(int demora);
void salidas_off( void);

//------------------------------------------------------------------------------
//------Programa principal----------
//------------------------------------------------------------------------------

void main(void)
{
   int programa = 0, demora = 10, tiempo = 10;
   
   set_tris_a(0xFF);            //Todo el puerto como entrada.
   set_tris_b(0x00);            //Todo el puerto como salida.
   disable_interrupts(GLOBAL);  //todas las interrupciones desactivadas
   
   //Comienzo el bucle infinito.
   do{   
      programa = leo_prog();    //Guardo en programa el numero de prog. selecc.
      demora = leo_demora();    //Guardo en demora el tiempo de demora elegido (en segundos)
     
      //----ejecuto el programa elegido---
      if (programa == 0) prog1(demora);
      if (programa == 1) prog2(demora);
      if (programa == 2) prog3(demora);
      if (programa == 3) prog4(demora);
     
   }while(TRUE);                //Repito el bucle
}

//------------------------------------------------------------------------------
//Funcion leo_prog. Lee el estado de los switchs
// 1 y 2 (PIN_A0 y PIN_A1)
int leo_prog(void) {
   int programa_aux=0;
   
   if (PIN_A1==1) programa_aux = programa_aux++;
   if (PIN_A0==1) programa_aux = programa_aux+2;   
   return programa_aux;
}

//Funcion leo_demora. Lee el estado de los switchs
// 3 y 4 (PIN_A2 y PIN_A3)
int leo_demora(void) {
   int demora_aux=0;
   int tiempo;
   
   if (PIN_A3==1) demora_aux = demora_aux++;
   if (PIN_A2==1) demora_aux = demora_aux+2;   
   
   switch (demora_aux) {
      case 0: tiempo = 1;
         break;
      case 1: tiempo = 3;
         break;
      case 2: tiempo = 6;
         break;
      case 3: tiempo = 12;
         break; }
 
   return tiempo;
}

//Funcion Prog1. Ejecuta el programa numero 1 con la
//demora que recive como parametro.
void prog1(int demora) {
   portb = 0x01;
   delay_ms(demora);
   portb = 0x02;
   delay_ms(demora);
   portb = 0x04;
   delay_ms(demora);
   portb = 0x08;
   delay_ms(demora);
   portb = 0x10;
   delay_ms(demora);
   portb = 0x20;
   delay_ms(demora);
   portb = 0x40;
   delay_ms(demora);
   portb = 0x80;
   delay_ms(demora);
}

//Funcion Prog2. Ejecuta el programa numero 2 con la
//demora que recive como parametro.
void prog2(int demora) {
   portb = 0x03;
   delay_ms(demora);
   portb = 0x0C;
   delay_ms(demora);
   portb = 0x30;
   delay_ms(demora);
   portb = 0xC0;
}


//Funcion Prog3. Ejecuta el programa numero 3 con la
//demora que recive como parametro.
void prog3(int demora) {
   portb = 0x81;
   delay_ms(demora);
   portb = 0x03;
   delay_ms(demora);
   portb = 0x06;
   delay_ms(demora);
   portb = 0x0C;
   delay_ms(demora);
   portb = 0x18;
   delay_ms(demora);
   portb = 0x30;
   delay_ms(demora);
   portb = 0x60;
   delay_ms(demora);
}


//Funcion Prog4. Ejecuta el programa numero 4 con la
//demora que recive como parametro.
void prog4(int demora) {
   portb = 0x0F;
   delay_ms(demora);
   portb = 0xF0;
}

//Funcion salidas_off. Apaga todas las luces.
void salidas_off(void) {
   portb = 0x00;
}


Si cualquier habilidad que aprende un niño será obsoleta antes de que la use, entonces, ¿qué es lo que tiene que aprender? La respuesta es obvia:
La única habilidad competitiva a largo plazo es la habilidad para aprender
“. Seymour Papert

Desconectado PalitroqueZ

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5490
    • Electrónica Didacta
Re: Paso de valores desde y hacia funciones
« Respuesta #1 en: 29 de Agosto de 2007, 15:06:49 »
Hola Ariel. y bienvenido al bando de los que usamos el C  :mrgreen:

me parece que hay un error cuando intentas poreguntar por RA[0,1]

if (PIN_A1==1) programa_aux = programa_aux++;
if (PIN_A0==1) programa_aux = programa_aux+2; 

deberia ser:

if (input(PIN_A1)) programa_aux = programa_aux++;
if (input(PIN_A0)) programa_aux = programa_aux+2; 


La propiedad privada es la mayor garantía de libertad.
Friedrich August von Hayek

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Paso de valores desde y hacia funciones
« Respuesta #2 en: 29 de Agosto de 2007, 15:08:29 »
Hola Ariel.

No se mucho de CCS yo, pero para leer el estado de un PIN se usa bit_test(pin aquí)  me parece...

O ahí pedro te lanzó otra posibilidad.
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado Modulay

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 2651
Re: Paso de valores desde y hacia funciones
« Respuesta #3 en: 29 de Agosto de 2007, 15:09:26 »
Esto no furula:

if (PIN_A1==1)

PIN_A1 es una constante,así que ese if siempre hará lo mismo.Lo mismo pasa con el siguiente:

if (PIN_A0==1)

La forma de hacerlo sería:

if input(PIN_A1)....

Voy a seguir mirando

Desconectado Modulay

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 2651
Re: Paso de valores desde y hacia funciones
« Respuesta #4 en: 29 de Agosto de 2007, 15:10:01 »
Os adelantanteis pendejos!!!! jajaaj

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Paso de valores desde y hacia funciones
« Respuesta #5 en: 29 de Agosto de 2007, 15:10:46 »
jaja es que las preguntas facilongas tientan a muchoss...aznos! :D :D(entiendase el sarcásmo de la "z" en lugar de la "s")
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado gONzAO

  • PIC10
  • *
  • Mensajes: 38
Re: Paso de valores desde y hacia funciones
« Respuesta #6 en: 29 de Agosto de 2007, 15:12:00 »
Cuando haces (PIN_A1 == 1) siempre es true porque pin_XX son constantes que define CCS para utilizar en sus funciones.

Para leer un Pi debes usar INPUT(PIN) como indico en la imagen.



A ver si hay suerte!!


Un saludo
gONzAO

Desconectado Modulay

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 2651
Re: Paso de valores desde y hacia funciones
« Respuesta #7 en: 29 de Agosto de 2007, 15:12:56 »
Anda Ariel,para que te quejes.Respuesta por triplicado,por si con una o con dos no tequeda claro jaaj

Desconectado Modulay

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 2651
Re: Paso de valores desde y hacia funciones
« Respuesta #8 en: 29 de Agosto de 2007, 15:13:24 »
Que digo triplicado....cuadriplicado!!

Desconectado gONzAO

  • PIC10
  • *
  • Mensajes: 38
Re: Paso de valores desde y hacia funciones
« Respuesta #9 en: 29 de Agosto de 2007, 15:13:47 »
Guauu, que velocidad, jaja, yo estaba dándole al arteYcreación con el paint y casi sale mi mensaje en la segunda hoja,
jajaj
Taluegoo

Desconectado PalitroqueZ

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5490
    • Electrónica Didacta
Re: Paso de valores desde y hacia funciones
« Respuesta #10 en: 29 de Agosto de 2007, 15:14:38 »
Hola Ariel.

No se mucho de CCS yo, pero para leer el estado de un PIN se usa bit_test(pin aquí)  me parece...

O ahí pedro te lanzó otra posibilidad.

también es válido usar el bit_test(portx, pin_del_puerto)
La propiedad privada es la mayor garantía de libertad.
Friedrich August von Hayek

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Paso de valores desde y hacia funciones
« Respuesta #11 en: 29 de Agosto de 2007, 15:15:44 »
Sisisi. Eso, eso, eso Pedrito! :D :D gracias por la correccion.!
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado Modulay

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 2651
Re: Paso de valores desde y hacia funciones
« Respuesta #12 en: 29 de Agosto de 2007, 15:17:11 »
[grenli mode]

 :mrgreen:

[/grenli mode]

Desconectado aitopes

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5100
    • uControl
Re: Paso de valores desde y hacia funciones
« Respuesta #13 en: 29 de Agosto de 2007, 15:18:34 »
IMPRESIONANTE VELOCIDAD DE RESPUESTA!!!!!!! :shock: :shock:

Gracias a todos.

Cambie a

   if (input(PIN_A1==1)) programa_aux = programa_aux++;
   if (input(PIN_A0==1)) programa_aux = programa_aux+2;

Pero el resultadoes el mismo....

QUE TARADO! Acabo de ver los ==1, que me quedaron de gusto.

Y funciona de maravillas! ¿Quien dijo que el C era complicado?

Realmente...es maravilloso esto de las funciones. Lo escribi super rapido. En el BASIC que usaba no tenia funciones, asi que era bastante mas rebuscado todo.

Gracias por la ayuda y la bienvenida! :)

Si cualquier habilidad que aprende un niño será obsoleta antes de que la use, entonces, ¿qué es lo que tiene que aprender? La respuesta es obvia:
La única habilidad competitiva a largo plazo es la habilidad para aprender
“. Seymour Papert

Desconectado aitopes

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5100
    • uControl
Re: Paso de valores desde y hacia funciones
« Respuesta #14 en: 29 de Agosto de 2007, 15:24:10 »
Otra mas, y no molesto mas!

Esto funcionara? Deberia hacer una pause de "demora" segundos:

//Funcion pausa_seg. Hace una pausa de un segundo.
//demora que recibe como parametro.
void pausa_seg(int demora) {
   int i;
   for (i=0; i<=demora; i++) {
       delay_ms(1000); }
   
}


(es que el for-next escrito asi me da escalofrios todavia... :D)
Si cualquier habilidad que aprende un niño será obsoleta antes de que la use, entonces, ¿qué es lo que tiene que aprender? La respuesta es obvia:
La única habilidad competitiva a largo plazo es la habilidad para aprender
“. Seymour Papert