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

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

Desconectado Xelene

  • PIC12
  • **
  • Mensajes: 81
RE: Microcursillo en C
« Respuesta #270 en: 20 de Abril de 2005, 03:09:00 »
Holas! Os dejo aqui un programita que he hecho q os puede resultar interesante en el uso del pwm y señales analógicas. El programa en cuestión trabaja a una frecuencia fija de 500 Hz, el duty se varía mediante un potenciometro y el resultado lo podemos ver en un led y además en la pantalla lcd.

Nota: Para q funcione fisicamente tendreis q cortocircuitar RC2 con RB1  o algun apaño parecido

Codigo:
#include <16F877.H>
#fuses HS,NOWDT,NOPROTECT,NOPUT,NOBROWNOUT,NOLVP
#use Delay(Clock=4000000)
#include <lcd-picdem.c>

#use fast_io(B)
#byte PORTB=6

const float escala = 255;
const float d_max = 2000;

void calcula_duty (int val, float &duty)
 {
 duty=(val*d_max)/escala;
 }


main()
{

    int valor;
    float duty;

    PORTB=0b00000010;

    lcd_init();
    lcd_gotoxy(1,1);
    lcd_putc(" f=500Hz->T=2ms ");
    lcd_gotoxy(1,2);
    lcd_putc("duty =        us");


    setup_ccp1(CCP_PWM);                          // Configura CCP1 como PWM
    setup_timer_2(T2_DIV_BY_16,124,1);            // f=500Hz (T=2ms)
   
    setup_adc(adc_clock_div_32);                  // Selecciona Reloj
    setup_adc_ports(AN0);                         // RA0 analogico
    set_adc_channel(0);

    while(1)
    {
        valor=read_adc();                                // Lee valor RA0
        set_pwm1_duty(valor);                     // Establece duty como valor
        calcula_duty(valor,duty);                 // Escala el duty
        lcd_gotoxy(8,2);
        printf(lcd_putc,"%3.2f",duty);            // Muestra el resultado
    }
}



Espero q os sirva de ayuda. Saludos y gracias a este foro xq todo lo q he aprendido lo he aprendido aqui!!




Desconectado squallmx

  • PIC10
  • *
  • Mensajes: 40
RE: Microcursillo en C
« Respuesta #271 en: 18 de Mayo de 2005, 15:58:00 »
Hola a todos, muchas gracias por este microcursillo que ya es todo un curso para los que apenas estamos en esto de C, la verdad no habia querido cambiar de ensamblador porque es mucho  mas fino y preciso para las aplicaciones que hago pero al ser mas complejas cada ves pues no queda de mas.

Una pregunta en CCS de PCW se puede simular el programa como en el MPLAB con el sim que trae el mplab o solo se puede con el proteus???? y si se puede usar el CCS para programar directo los pics con el picstar plus???

de antemano mil gracias y de verdad que se van a ir al cielo con este curso, espero poder pronto aportar en los proyectos.

Saludos

Desconectado hhpp

  • PIC12
  • **
  • Mensajes: 99
RE: Microcursillo en C
« Respuesta #272 en: 18 de Mayo de 2005, 17:52:00 »
Hola ahora por favor  alghuien me podria dar una pista  o idea , algo de  como convertir RS-232 a RS-485 full-duplex?

hp

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
RE: Microcursillo en C
« Respuesta #273 en: 19 de Mayo de 2005, 00:17:00 »
Hola Squallmx, la verdad es que con ganas y los ejemplos que aparecen en el microcursillo, uno puede iniciarse en C, sí Sonrisa Gigante

Con respecto a tu pregunta, que yo sepa PCW no simula. Cuando lo he necesitado lo he hecho en Proteus.
¿Cómo grabas con PicStart Plus? supongo que tendrás un software de grabación: ICProg, Winpic,... Si es así, podrás enlazarlo en PCW y asignarlo a una tecla de función con el menú Options -> Debugger / Programer.

Hola hhpp, creo que tu pregunta tendría una más rápida respuesta si la pones en un hilo nuevo.

Desconectado oriolba0007

  • PIC10
  • *
  • Mensajes: 23
RE: Microcursillo en C
« Respuesta #274 en: 20 de Mayo de 2005, 06:48:00 »
Hola a todos !

He llegao al final del subtema !!!

Felicidades por este manual que me ha enseñado a programar un PIC en C ( casi no tenia idea de programar un PIC, y menos con C ).

Dejo aqui una pregunta que no he encontrado solucionada en el manual :

Hay alguna manera de que una rutina devuelva como resultado 3 variables a la vez ( 2 o mas )? Me explico :

Algo asi como :

int hola () {

a=3;
b=2;
c=4;
return(a,b,c);}

De esta manera podriamos llenar una tabla o una matriz ...etc

He encontrado solucion pero pasa por hacer 3 rutinas, una por resultado.

Seguir asi fieras Giño

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
RE: Microcursillo en C
« Respuesta #275 en: 20 de Mayo de 2005, 06:55:00 »
Que yo sepa sólo se puede devolver un valor, aunque siempre podrás utilizar variables globales que sean modificadas en tu función y visibles desde el programa principal.

Desconectado squallmx

  • PIC10
  • *
  • Mensajes: 40
RE: Microcursillo en C
« Respuesta #276 en: 20 de Mayo de 2005, 17:01:00 »
Hola muchas gracias nocturno exactamente era lo que buscaba para no estar pasandome con el mplab, lo programa directo con el mplab y el picstar  es mucho mas rapido y tiene mucho mas funciones por mplab que por icprog, y pues aqui estamos aprendiendo gracias a uds.

Saludos

Desconectado albert.fabregat

  • PIC10
  • *
  • Mensajes: 3
RE: Microcursillo en C
« Respuesta #277 en: 20 de Mayo de 2005, 20:26:00 »
Si que hay varias maneras para poder "retornar 2 o mas variables a la vez".
Una de ellas es pasandole el offset de la variable por referencia, es decir.

void hola(int *a,int *b, int *c)
{

*a=4;
*b=3
*c=2;

}

y luego llamandolo por ejemplo desde el main

void main()

{
int d,e,f;

hola(&d,&e,&f);

}

En este caso esto haria que:

d=4;
e=3;
f=2;

Otra de las maneras es hacer que retorne un array o un puntero a un array. Pero la forma mas comoda es la que te he dicho al principio. Espero que te ayude.

Saludos.

Desconectado oriolba0007

  • PIC10
  • *
  • Mensajes: 23
RE: Microcursillo en C
« Respuesta #278 en: 22 de Mayo de 2005, 16:04:00 »
Pues si, Gracias por la respuesta albert !!

Ahora me meto a llenar una matriz de 4x3  de esta manera


Desconectado antspa

  • PIC10
  • *
  • Mensajes: 5
RE: Microcursillo en C
« Respuesta #279 en: 27 de Mayo de 2005, 08:37:00 »
Hola a todo/as
Necesito programar un PIC en en lenguaje C para que me de una salida de -25 a 75 grados. Utilizando un sensor de temperatura LM35 me da unos valores de salidas de 0 a 5 v (0=-25 grados y 5= a+75 g). Estos Valores han de entrar en el adc.
Mi pregunta es : como programar el PIC para que me de los resultados que pido e introducirlos en el PC via RS485?. Lo del Pc lo tengo controlado con el programa Labwindows.
Muchisimas gracias espero
un alma caritativa.

Desconectado gustav03

  • PIC10
  • *
  • Mensajes: 31
RE: Microcursillo en C
« Respuesta #280 en: 14 de Junio de 2005, 11:55:00 »
hola alguien sabe que es esto ?

#define OUR_ID 1
byte checksum,len,to;

      checksum=len^OUR_ID^to; ///  <----que es esto ??????????????

y esto ?
   if(kbhit())

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
RE: Microcursillo en C
« Respuesta #281 en: 14 de Junio de 2005, 18:47:00 »
Salu2 fans del lenguaje C

Ahora les comparto un programa que trabaja las 2 terminales PWM del PIC16F877A.

Lo utilicé para controlar 2 servos PWM que dependiendo el ancho del pulso, toman una posición en grados con un rango de 0° a 180°.

Este programa empieza enviando un ancho de pulso (ambos canales) y mediante Push buttons uno incremente o decrementa ese ancho de pulso.

Me sirvió mucho para checar los rangos de trabajo de los servos y saber con que cantidad de milisegundos a qué posición se iba el servo.

Usa LCD y 4 push buttons, 2 para cada servo, uno incremente el ancho de pulso y el otro lo decrementa.

La desventaja de mi programa es que usa cristal de 1.25MHz... algo difícil de conseguir :)




//Este programa da un periodo PWM de 13.1ms
//Santiago Villafuerte
//migsantiago

//Sirve para encontrar el rango de trabajo del DUTY time
//inicia en 2.5ms y el usuario sube o baja bit a bit ese rango

//Puede operar 2 señales PWM al mismo tiempo CCP1 y CCP2

//El DUTY actual saldrá en la LCD en hexadecimal

// Conexiones de la LCD:
//     D0  enable
//     D1  rs
//     D2  rw
//     D4  D4
//     D5  D5
//     D6  D6
//     D7  D7
//
//   LCD pins D0-D3 are not used and PIC D3 is not used.

//Los resultados que obtuve son:

//Servo KRAFT KPS-21K
//Periodo=13.1ms
//DUTY para 0° = 0.6784ms (0x35)
//DUTY para 90° = 1.408ms (0x6e)
//DUTY para 180° = 2.112ms (0xa5)
//Resolución
//0xa5-0x35=0x70=112
// 180°/112=1.6071°

#include "16f877.h"

#use delay(clock=1250000)
#fuses xt,nowdt,noput,nobrownout,nolvp,noprotect

#include "lcd.c"
#use standard_io (D)

#use fast_io (c)
#use fast_io (b) //PB para subir o bajar DUTY time

   //B7 sube PWM1
   //B6 baja PWM1

   //B5 sube PWM2
   //B4 baja PWM2

void main (void)
{
   long duty_pwm1; //duty pwm1
   long duty_pwm2; //duty pwm2
   set_tris_c (0x00); //Todo salida
   set_tris_b (0xff); //todo entrada

   //Duty inicial
   duty_pwm1=0xc8; //200d
   duty_pwm2=0xc8; //200d
   //D=(0xc8)(1/1.25MHz)(16)=2.5ms

   //Rutina LCD
   lcd_init(); //Inicia LCD
   lcd_putc("f"); //Limpia LCD
   lcd_putc("Presione PB
+ o -"); //rtc
   delay_ms(3000);
   lcd_putc("f");

   setup_timer_2(T2_DIV_BY_16,255,1); //PR2 = 255
   //T=(PR2+1)4.Tosc.PRStm2
   //T=(255+1)4.(1/1.25MHz)(16)=13.1ms
   setup_ccp1(CCP_PWM); //PWM
   setup_ccp2(CCP_PWM); //PWM

   while(1)
   {
   if( input(PIN_B7) )
      {
      duty_pwm1++; //incrementa duty time PWM1
      delay_ms(100); //espera se suelte PB
      }
   if( input(PIN_B6) )
      {
      duty_pwm1--; //decrementa duty time PWM1
      delay_ms(100); //espera se suelte PB
      }
   if( input(PIN_B5) )
      {
      duty_pwm2++; //incrementa duty time PWM2
      delay_ms(100); //espera se suelte PB
      }
   if( input(PIN_B4) )
      {
      duty_pwm2--; //decrementa duty time PWM2
      delay_ms(100); //espera se suelte PB
      }

   lcd_putc("f"); //Limpia LCD
   lcd_putc("PWM1 = ");
   printf(lcd_putc,"%x",duty_pwm1); //escribe DUTY1 en hexadecimal
   lcd_putc("
");
   lcd_putc("PWM2 = ");
   printf(lcd_putc,"%x",duty_pwm2); //escribe DUTY2 en hexadecimal
   delay_ms(200); //Usuario lee

   set_pwm1_duty(duty_pwm1); //saca duty actual
   set_pwm2_duty(duty_pwm2); //saca duty actual
   }
}



Desconectado gustav03

  • PIC10
  • *
  • Mensajes: 31
RE: Microcursillo en C
« Respuesta #282 en: 15 de Junio de 2005, 23:14:00 »
tengo un problema en ccs las operaciones con variables float no da lo que deberia
float temp_vuelta=0,num_pasos=0,temp;

temp=temp_vuelta*num_pasos //me da cualquier cosa Llorando
temp=temp_vuelta/num_pasos //mi hablar !!!

como se trabaja con estas variables ?

Desconectado Modulay

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 2651
RE: Microcursillo en C
« Respuesta #283 en: 16 de Junio de 2005, 06:59:00 »
Al dividir por 0 me parece normal que obtengas un comportamiento inesperado,aunque la multiplicación debería marchar bien.
Prueba a declarar las variables y después de eso las inicializas.

float temp_vuelta,num_pasos,temp;
temp_vuelta = 0;
num_pasos = 0;
........

Desconectado electronando

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 427
RE: Microcursillo en C
« Respuesta #284 en: 24 de Junio de 2005, 08:53:00 »
Bueno la verdad , yo solo e programado en basic y asembler pero queria aprender el lenguaje C que por lo que veo hay un cursillo que ya esta siendo cursote , antes de empezar en C no despejo la duda de para que vale eso de poner primero
main()
void main()
void (,..$%%&%$%$%)
y no se cuantas cosas mas no se si se pone por moneria por favor quiero empezar en C pero primero quisiera saber como se come lo anterior o que significado tiene le agradeceria a los que dominan el tema me resuelvan esta encrucijada pues quiero entrarle al C le agradecere bastante a toda la gente que hace grande el curso de C para pics


 

anything