Autor Tema: Microcursillo en C  (Leído 178971 veces)

0 Usuarios y 5 Visitantes están viendo este tema.

Desconectado vszener

  • Moderador Local
  • PIC24H
  • *****
  • Mensajes: 2395
Re: Microcursillo en C
« Respuesta #420 en: 26 de Diciembre de 2006, 17:11:19 »
Míralo en la help del compilador, de todas formas, ponlo todo directamente:
Código: C
  1. if(bit_test (estado, 1)==1)
  2.        portd = 0xFF;


Suerte!!! ;)
· Nos vemos en los bares!!!!!
· Mi Blog: Aqueronte

Desconectado Fer_TACA

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4069
Re: Microcursillo en C
« Respuesta #421 en: 26 de Diciembre de 2006, 17:58:33 »
Hola Vszener: :-/ :-/ :-/ FUNCIONA  :-/ :-/
Pongo el código y una pequeña explicacion de las conclusiones que he sacado y ya me direis si son correctas:

VOID main()
{
   byte estado;

   set_tris_a (0xFF);                                                         // Puerto_A como entrada
   set_tris_b (0xFF);                                                         // Puerto_B como entrada
   set_tris_d (0x00);                                                         // Puerto_D como salida
   set_tris_e (0x00);                                                         // Puerto_E como salida

   setup_adc_ports (NO_ANALOGS);                                              // Puerto A configurado como digital
   disable_INTERRUPTS (GLOBAL);                                               // Desactivamos todas las interrupciones

   output_d (0x00);                                                           // Se borra el puerto d
   output_e (0x00);                                                           // Se borra el puerto e

   WHILE (TRUE)
{
      estado = portb;

   SWITCH (estado)
   {
      CASE 0b00000001:
           IF (!bit_test (estado, 1))
               portd = 0xFF;
               Parpadeo();
               portd = 0x00;
               delay_ms (1000);

               
      BREAK;

      CASE 0b00000010:
           IF (!bit_test (estado, 2))
               portd = 0xAA;
               Parpadeo();
               portd = 0x00;
               delay_ms (1000);
           
         BREAK;

   }
}
}

Seguro que estoy equivocado con lo siguiente, ya me contareis:
1º No funcionaba por que faltaba "{"  entre el while y el case. Se opuede ver al principio del primer código.
2º Al poner case 0, case 1..... al ser un byte no se ejecutaban los case por que el valor 0 es decimal y no se correspondia con su valor en binario del puerto b.
3º El puerto de entrada lo tengo de lconectado con cada pin una resistancia a masa y el correpondiente interruptor a +5V, pero para que funcionara tengo que poner if(!bit_test(estado,1).De esta forma al accioar el interruptor seria=como es distinto de 0 entonces pongo el puerto d=0xFF. Lo que no entiendo es como con if (bit_test(estado,1) al actuar el interruptor no ejecuta portd=0xFF pues la explicacion seria si el pin es 1 entonces portd=0xFF.

Bueno seguiré profundizando en esto del C.
Todos los días se aprende algo nuevo.

Desconectado vszener

  • Moderador Local
  • PIC24H
  • *****
  • Mensajes: 2395
Re: Microcursillo en C
« Respuesta #422 en: 26 de Diciembre de 2006, 18:43:53 »
Me alegro que funcione jeje a tus preguntas:
1. Al no estar todo el bucle cerrado entre corchetes, el pic hacia un reset continuo, no creo que fuese esa la razón, quizás es la declaración que tenias dentro del bucle while.

2. Te dejo como ejercicio que lo realices con el 0 y el 1, da igual cual pongas, ya que lo que especificamos es la base del número, pero no su cantidad 1 en base decimal, equivale a 00000001 en base binario. Aparte, como ejercicio también, sería bueno que hicieras tú programa con las funciones que trae consigo el compilador, no hace falta declarar ningún puerto para leerlo ni escribirlo, para leerlo usa la instrucción input_x(); donde la x indica la letra del puerto a leer.

3. Mira en la help del compilador, que resultado te dá la función bit_test.


Suerte!!! ;)
· Nos vemos en los bares!!!!!
· Mi Blog: Aqueronte

Desconectado Fer_TACA

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4069
Re: Microcursillo en C
« Respuesta #423 en: 26 de Diciembre de 2006, 19:32:17 »
Pues eso es lo grave que si miro en el help del compilador la instruccion bit_test no me funciona como he descrito en el post anterior punto 3 y eso es lo que me confude.
Bueno mañana  y com mas tiempo, reducire al maximo el programa y es esquema de proteus para probar solo la funcion bit_test.

Gracias por las indicaciones , aunque más adelante me saldran otras pegas.
Fermín

Todos los días se aprende algo nuevo.

Desconectado vszener

  • Moderador Local
  • PIC24H
  • *****
  • Mensajes: 2395
Re: Microcursillo en C
« Respuesta #424 en: 26 de Diciembre de 2006, 20:12:54 »
Mira a ver el pin de entrada, a ver como está definido, si activo en bajo o en alto.


Suerte!!! ;)
· Nos vemos en los bares!!!!!
· Mi Blog: Aqueronte

Desconectado Fer_TACA

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4069
Re: Microcursillo en C
« Respuesta #425 en: 27 de Diciembre de 2006, 13:06:17 »
esto es lo que aparece en el Help de CCs para la funcion bit_test.

if( bit_test(x,3) || !bit_test (x,1) ){

         //either bit 3 is 1 or bit 1 is 0

}

Entiendo que si tengo puesto en mi programa:IF (bit_test (estado,1)) y tengo unido a +5v el pin entonces se ejecutará la sentencia siguiente=portd = 0xFF;
Y si dejo a masa el pin entonces se sale del case dado que existe el break
Y es que me está funcionando justo al reves.
pero si doy la vuelta a la conexion del pin y de la sentencia, entonces es que ni me funciona. :x :x :x
Todos los días se aprende algo nuevo.

Desconectado Fer_TACA

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4069
Re: Microcursillo en C
« Respuesta #426 en: 27 de Diciembre de 2006, 13:27:17 »
Me respondo a mi mismo:
Resr un capu.....
Estaba testeando el bit 1 cuando en realidad tenia conectado el interruptor al bit 0 del puerto. Esto me pasa por ser un yogurin en esto de C. En fin vale la pena haber perdido 2 dias.
Gracias por ayudarme.
fermin
Todos los días se aprende algo nuevo.

Desconectado vszener

  • Moderador Local
  • PIC24H
  • *****
  • Mensajes: 2395
Re: Microcursillo en C
« Respuesta #427 en: 27 de Diciembre de 2006, 16:27:35 »
Jeje me alegro que te funcione!!! ahora solo falta que pruebes hacer el código con las instrucciones propias del CCS (no es difícil)


Suerte!!! ;)
· Nos vemos en los bares!!!!!
· Mi Blog: Aqueronte

Desconectado Fer_TACA

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4069
Re: Microcursillo en C
« Respuesta #428 en: 27 de Diciembre de 2006, 16:58:38 »
VSZENER:
Solo por curiosidad a que funciones del CCs te refieres?
fermin
Todos los días se aprende algo nuevo.

Desconectado vszener

  • Moderador Local
  • PIC24H
  • *****
  • Mensajes: 2395
Re: Microcursillo en C
« Respuesta #429 en: 28 de Diciembre de 2006, 08:58:09 »
Me refiero a que no hace falta definir los puertos del pic, ya que para leer los puertos est´ña la instrucción input_x(); y para escribir en los mismos está la instrucción output_x(); donde x es la letra del puerto donde actuaremos. Aparte te puedes ahorrar la declaración de la variable estado.

Prueba este código, a ver si funciona:

Código: C
  1. #include <16F877.h>                                                           // Tipo de microcontrolador utilizado
  2. #fuses XT,NOWDT,NOPUT,NOLVP,NOBROWNOUT,NOWRT                                  // Cofiguración de fusibles
  3. #use delay(clock=4000000)                                                     // Frecuencia  Fosc=4Mhz
  4.  
  5. #use fast_io(a)
  6. #use fast_io(b)
  7. #use fast_io(c)
  8. #use fast_io(d)
  9. #use fast_io(e)
  10.  
  11.  
  12. VOID Parpadeo(void);                                                          // Rutina de parpadeo de puerta E
  13. VOID Parpadeo(void)
  14.       {
  15.    output_high (PIN_E0);                                                      // Pin E0 = 1
  16.    delay_ms (1000);                                                           // delay 1 segundo.
  17.    output_low (PIN_E0);                                                       // Pin E0 = 0
  18.    delay_ms (1000);                                                           // delay 1 segundo.
  19.    output_high (PIN_E1);                                                      // Pin E1 = 1
  20.    delay_ms (1000);                                                           // delay 1 segundo.
  21.    output_low (PIN_E1);                                                       // Pin E1 = 0
  22.    delay_ms (1000);                                                           // delay 1 segundo.
  23.    output_high (PIN_E2);                                                      // Pin E2 = 1
  24.    delay_ms (1000);                                                           // delay 1 segundo.
  25.    output_low (PIN_E2);                                                       // Pin E2 = 0
  26.       }
  27.  
  28. VOID main()
  29. {
  30.    set_tris_a (0xFF);                                                         // Puerto_A como entrada
  31.    set_tris_b (0xFF);                                                         // Puerto_B como entrada
  32.    set_tris_d (0x00);                                                         // Puerto_D como salida
  33.    set_tris_e (0x00);                                                         // Puerto_E como salida
  34.  
  35.    setup_adc_ports (NO_ANALOGS);                                              // Puerto A configurado como digital
  36.    disable_INTERRUPTS (GLOBAL);                                               // Desactivamos todas las interrupciones
  37.  
  38.    output_d (0x00);                                                           // Se borra el puerto d
  39.    output_e (0x00);                                                           // Se borra el puerto e
  40.  
  41.    WHILE (TRUE)
  42. {
  43.  
  44.    SWITCH (input_b())
  45.    {
  46.       CASE 1:
  47.            IF (!bit_test (estado, 1))
  48.                output_d(0xFF);
  49.                Parpadeo();
  50.                output_d(0x00);
  51.                delay_ms (1000);
  52.  
  53.                
  54.       BREAK;
  55.  
  56.       case 2:
  57.            if (!bit_test (estado, 2))
  58.                output_d(0xAA);
  59.                Parpadeo();
  60.                output_d(0x00);
  61.                delay_ms (1000);
  62.            
  63.            break;
  64.  
  65.    }
  66. }
  67. }

El tema de definir regisros, pines e incluso puertos, es a gusto de cada programador (cada uno tenemos nuestro librillo), pero a veces es bueno conocer las funcionalidades del propio compilador, ya que en muchos códigos donde hay bastantes definiciones se hace tedioso leer para otros programadores.


Suerte!!! ;)
· Nos vemos en los bares!!!!!
· Mi Blog: Aqueronte

Desconectado Fer_TACA

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4069
Re: Microcursillo en C
« Respuesta #430 en: 28 de Diciembre de 2006, 12:51:12 »
Hola vszener:
gracias por la ayuda que estás prestando. Creí que te referias a instrucciones especificas de CCS que no venian en su manual. Esas ya las conocia. El caso es que procedo del ASm y en su dia realizé un programa para el control de un grupo motocompresor y ahora que empezé con C pretendo hacerlo de nuevo en este lenguaje y aunque en principio estoy practicando con el 877, pretendo despues utilizar uno de la serie 18F y poder colocarle todo el tratamiento de averias  y ordenes de marcha-paro, por comunicaciones ( a ser posible por RS485). pero voy despacito con el C.
El no haber utilizado al principio del post las instrucciones de CCS era por que el funcionamiento del programa pense que fuera "una maquina de estados". Asi segun el bit del puerto de entrada, así seria la accion a realizar, pero seguro que los maestros de C se les ocurre alguna otra forma de realizarlo. En fin es lo que tiene ser principiante.
El codigo último que pusiste si funciona, pero como vers mi código ya avanzó un poco más. Ahora trataré de reducir la rutina de parpadeo asi como manejar los temporizadores dado que los necesitaré para los casos siguientes. Ahí va el codigo qu elo adjunto para no hacer el post muy grande y si tienes ganas y tiempo me dices com lo ves.
Un saludo
Fermín
Todos los días se aprende algo nuevo.

Desconectado Renatox_

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 541
    • máquinas cnc
Re: Microcursillo en C
« Respuesta #431 en: 02 de Enero de 2007, 21:05:37 »
 Hola a todos los del grupo, yo programaba en full asembler hasta hace una semana, pero me comentaron que programar en C era mejor hasta que di en este microcursillo y decidí aprendérmelo, asi que me grabé las 28 páginas y en mi casa me puse a leer y prácticar, y en solo una semana aprendí lo que en asembler me tomó 6 meses. ´

 El CCS hace maravillas con los pics y de ahora en adelante voy a programar en C, y aportar aquí lo que he aprendido y mis dudas también, nos vemos.
control de movimiento

Desconectado Renatox_

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 541
    • máquinas cnc
Re: Microcursillo en C
« Respuesta #432 en: 02 de Enero de 2007, 21:27:03 »
 Hola otra ves, por la página 5 de ese microcursillo TONIo publicó su código de ADC pero lo he reducido y me funciona pero tengo un problema en la parte final, cuando lo implementé en protoboard el pin B0 no basculaba solo se mantenía prendido, será porque no se puede chequear si un pin del puerto es uno o cero si se mantiene como salida..?

El programita,  es este.
control de movimiento

Desconectado Renatox_

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 541
    • máquinas cnc
Re: Microcursillo en C
« Respuesta #433 en: 02 de Enero de 2007, 21:32:39 »
 Mejor lo pongo aquí:


#include <16F876.h>
#fuses XT,NOWDT,NOPROTECT,NOLVP
#use delay(clock=4000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7,bits=8)
#use fast_io(B)
#device adc=10

const int escala = 1023;      // Escala del conversor ADC (10 bits)
const float v_max = 4.9;     // Voltaje máximo que entrega mi fuente

// Como se observa en la cabecera, los nombres de los parámetros no tienen por qué
//ser iguales que los de la llamada ( calcula_voltaje(valor,voltaje) ),pero sí deben
//estar en el mismo orden. "voltaje",al ser de entrada-salida,debe llevar el símbolo
//"&" delante
void calcula_voltaje(int val,float &voltaje)
{
// "escala" y "v_max" son parámetros globales,por eso son visibles dentro
// de esta rutina(y en todo el código).Si no lo fueran,al no estar declarados dentro
//de ella ni y al no ser parámetros de entrada ó entrada-salida como los de la cabecera,
//se produciría error al compilar
voltaje = (val*v_max)/escala;
}

void main()
{  int   valor;        //declaración de variables
   float voltaje;     //valor=(0 a 1023), voltaje=(0 a 4.9)volt.

   set_tris_b(0x00);    // Aquí declaro al PORTB como salida
   setup_adc_ports(AN0);
   setup_adc(ADC_CLOCK_INTERNAL);
   setup_spi(FALSE);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);

output_low(PIN_B0);
printf("Presione cualquier tecla para empezar la conversión ADC");
getc();

while (1)
     {
      set_adc_channel(0);     // Seleccionamos el canal 0 (RA0)
      valor = read_adc();    // Capturamos señal analógica que entra por el canal AN0
      // Le mandamos el parámetro "valor" y nos devuelve "voltaje"
      calcula_voltaje(valor,voltaje);
      putc(voltaje);
     
      //prende y apaga el pin B0

      if ((PIN_B0)==1)          //puedo hacer esto..? B0 está como salida
         output_low(PIN_B0);
      else
         output_high(PIN_B0);

      delay_ms(400);
     }
}


control de movimiento

Desconectado johnnybravo

  • PIC12
  • **
  • Mensajes: 76
Re: Microcursillo en C
« Respuesta #434 en: 03 de Enero de 2007, 14:06:35 »
Saludos amigos de este microcursillo de c
bueno la verdad que yo soy nuevo en esto de la programacion en c, pero bueno estoy tratando de aprender de sus ejemplos y empesando a programar mis propias aplicasiones

tengo una duda... estuve leyendo las primeras notas d este curso.. hay unas notas de Nuestro amigo modulay.. que por cierto son muy explicativas.. pero algo que no entinedo ... por ejemplo en sus notas sobre las variables globales y localizadas .. mas especificamente en su codigo en la ultima linea
for(; :wink:    {} 
que significa esa linea... es acaso algun tipo bucle infinito como
while(true) {
puedo remplasarlo por este... esque saben.. cuando trato de compilar el codigo original, me bota un error en esa linea de codigo....

ojala puedan resolver mi duda... la verdad ya estoy un poco cabezon .. con esto.... gracias de antemano por su antencion..

Atte.
Johnny Bravo