Autor Tema: Explicacion de Programa en C...  (Leído 4372 veces)

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

Desconectado georgemtv

  • PIC10
  • *
  • Mensajes: 7
Explicacion de Programa en C...
« en: 20 de Noviembre de 2013, 22:14:55 »
podrian explicarme las lineas de este programa es un ejemplo de CCS. Gracias..


#if defined(__PCM__)

#include <16F877.h>

#fuses HS,NOWDT,NOPROTECT,NOLVP

#use delay(clock=20000000)

#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)  // Jumpers: 8 to 11, 7 to 12


#elif defined(__PCH__)

#include <18F452.h>

#fuses HS,NOWDT,NOPROTECT,NOLVP

#use delay(clock=20000000)

#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)  // Jumpers: 8 to 11, 7 to 12

#endif


#define BUFFER_SIZE 32

BYTE buffer[BUFFER_SIZE];

BYTE next_in = 0;

BYTE next_out = 0;



#int_rda

void serial_isr() {

   int t;


   buffer[next_in]=getc();

   t=next_in;

   next_in=(next_in+1) % BUFFER_SIZE;

   if(next_in==next_out)

     next_in=t;           // Buffer full !!
}


#define bkbhit (next_in!=next_out)


BYTE bgetc() {

   BYTE c;


   while(!bkbhit) ;

   c=buffer[next_out];

   next_out=(next_out+1) % BUFFER_SIZE;

   return(c);
}


void main() {


   enable_interrupts(global);

   enable_interrupts(int_rda);

   printf("\r\n\Running...\r\n");


               // The program will delay for 10 seconds and then display

               // any data that came in during the 10 second delay


   do {

      delay_ms(10000);

      printf("\r\nBuffered data => ");

      while(bkbhit)

        putc( bgetc() );

   } while (TRUE);

}

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7912
Re: Explicacion de Programa en C...
« Respuesta #1 en: 21 de Noviembre de 2013, 00:20:47 »
Linea por linea ??
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado georgemtv

  • PIC10
  • *
  • Mensajes: 7
Re: Explicacion de Programa en C...
« Respuesta #2 en: 21 de Noviembre de 2013, 14:36:19 »
se que el programa carga un bit y vuelve a cargar otro bit sustituyendo el anterior, si es que no estoy mal, pero si me pudieran explicar un poco a fondo del programa se los agradeceria... no todas las lineas pero si lo mas que se pueda para entender mejor....

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7912
Re: Explicacion de Programa en C...
« Respuesta #3 en: 21 de Noviembre de 2013, 15:11:07 »
El programa muestra como funciona la recepcion de Usart por interrupciones.

En el programa principal se habilita esa interrupcion (RDA) y luego cada 10 segundos se envia a imprimir (en C se puede imprimir en puerto serie y tambien a un display LCD) el resultado de los ultimos (hasta 32) bytes recibidos.

La rutina demuestra como se puede recepcionar en forma desatendida, un string de hasta 32 bytes.
Mientras se recepciona ese string, se puede estar haciendo otra tarea.
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado georgemtv

  • PIC10
  • *
  • Mensajes: 7
Re: Explicacion de Programa en C...
« Respuesta #4 en: 21 de Noviembre de 2013, 21:25:07 »
ok. gracias... si no es mucha molestia podras informarme de las lineas principales del programa..

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7912
Re: Explicacion de Programa en C...
« Respuesta #5 en: 21 de Noviembre de 2013, 23:36:43 »
Ahi va:
Las siguientes lineas le dicen al compilador segun cual version sea elegida, que compile el codigo para un PIC17F877 o para un PIC18F452.
Esta forma de programar se denomina Compilacion Condicional, y permite en un mismo codigo tener alternativas diferentes de PIC a utilizar.
Ademas del PIC en este caso se determina los Fusibles a usar (fuses) , la frecuecia de oscilacion del PIC (#use delay) y la velocidad y pines del puerto serial (#use rs232).


Código: C
  1. #if defined(__PCM__)
  2.  
  3. #include <16F877.h>
  4.  
  5. #fuses HS,NOWDT,NOPROTECT,NOLVP
  6.  
  7. #use delay(clock=20000000)
  8. #use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)  // Jumpers: 8 to 11, 7 to 12
  9.  
  10.  
  11. #elif defined(__PCH__)
  12.  
  13. #include <18F452.h>
  14.  
  15. #fuses HS,NOWDT,NOPROTECT,NOLVP
  16.  
  17. #use delay(clock=20000000)
  18.  
  19. #use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)  // Jumpers: 8 to 11, 7 to 12
  20.  
  21. #endif

La siguiente seccion declara las variables a usar en el programa.
Define un buffer (cadena del tipo string) de 32 bytes en las dos primeras lineas y luego declara dos variables tipo Byte y en el mismo mometo las pone en cero.

Código: C
  1. #define BUFFER_SIZE 32
  2.  
  3. BYTE buffer[BUFFER_SIZE];
  4.  
  5. BYTE next_in = 0;
  6.  
  7. BYTE next_out = 0;

Esta seccion es la interrupcion del puerto serie, que ocurrira toda vez que u nuevo byte entre al puerto USART.
El codigo dentro de la funcion siguiente se ejecutara cada vez que ocurra la interrupcion.
Dentro del codigo se verifica no superar el tamaño del buffer, ya que eso produciria un desborde del micro y error fatal del programa.


Código: C
  1. #int_rda
  2.  
  3. void serial_isr() {
  4.  
  5.    int t;
  6.  
  7.  
  8.    buffer[next_in]=getc();
  9.  
  10.    t=next_in;
  11.  
  12.    next_in=(next_in+1) % BUFFER_SIZE;
  13.  
  14.    if(next_in==next_out)
  15.  
  16.      next_in=t;           // Buffer full !!
  17. }


Lo siguiente declara que ambos bytes deben ser diferentes para que la bandera bkbhit se ponga e uno.
La funcion que sigue controla y pone dentro del buffer cada caracter nuevo que ingresa por el puerto serial.

Código: C
  1. #define bkbhit (next_in!=next_out)
  2.  
  3.  
  4. BYTE bgetc() {
  5.  
  6.    BYTE c;
  7.  
  8.  
  9.    while(!bkbhit) ;
  10.  
  11.    c=buffer[next_out];
  12.  
  13.    next_out=(next_out+1) % BUFFER_SIZE;
  14.  
  15.    return(c);
  16. }

El resto es el programa principal que habilita la interrupcion y cada 10 segundos imprime lo que entro por el puerto serial...

Código: C
  1. void main() {
  2.  
  3.  
  4.    enable_interrupts(global);
  5.  
  6.    enable_interrupts(int_rda);
  7.  
  8.    printf("\r\n\Running...\r\n");
  9.  
  10.  
  11.                // The program will delay for 10 seconds and then display
  12.  
  13.                // any data that came in during the 10 second delay
  14.  
  15.  
  16.    do {
  17.  
  18.       delay_ms(10000);
  19.  
  20.       printf("\r\nBuffered data => ");
  21.  
  22.       while(bkbhit)
  23.  
  24.         putc( bgetc() );
  25.  
  26.    } while (TRUE);
  27.  
  28. }
« Última modificación: 21 de Noviembre de 2013, 23:47:04 por MGLSOFT »
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado georgemtv

  • PIC10
  • *
  • Mensajes: 7
Re: Explicacion de Programa en C...
« Respuesta #6 en: 22 de Noviembre de 2013, 12:39:38 »
Muy agradecido... Saludos.... y nuevamente gracias....

Desconectado georgemtv

  • PIC10
  • *
  • Mensajes: 7
por favor ayudame y explicame un poco de este programa en C...
« Respuesta #7 en: 27 de Noviembre de 2013, 22:20:40 »
Amigo me podrias explicar la funcion de este programa y las lineas principales q es lo que hacen....

#include <16F877A.h>
#device adc=8
#FUSES NOWDT
#FUSES HS
#FUSES PUT
#FUSES NOPROTECT
#FUSES NODEBUG
#FUSES NOBROWNOUT
#FUSES NOLVP
#FUSES NOCPD
#FUSES NOWRT
#use
delay(clock=20000000)
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)
#define LCD_TYPE 1
#include <lcd.c>
#include <kbd.c>
char k;
void main()
{
setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_OFF);
setup_psp(PSP_DISABLED);
setup_spi(F
ALSE);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
lcd_init();
lcd_putc("
\
fReady...
\
n");
while (TRUE)
{
k=kbd_getc
();
if(k!=0)
if(k=='*')
lcd_putc('
\
f');
else
lcd_putc(k);
}
}

Desconectado martin12as

  • PIC10
  • *
  • Mensajes: 36
Re: Explicacion de Programa en C...
« Respuesta #8 en: 28 de Noviembre de 2013, 00:55:52 »
eso lee un teclado, si se pulsa el asterisco borra la pantalla lcd, y sino muestra los números que vas apretando en el lcd

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: por favor ayudame y explicame un poco de este programa en C...
« Respuesta #9 en: 28 de Noviembre de 2013, 09:04:39 »
Amigo me podrias explicar la funcion de este programa y las lineas principales q es lo que hacen....



  Sin ninguna duda te va a convenir leer algún libreo de programación en C. Ya que en tu caso estás viendo programas hechos para el compilador CCS te pueden servir los siguientes libros (yo los bajé de internet)

"Compilador C CCS y simulador Proteus para microcontroladores PIC"
"An introduction to programming PIC in CCS"

  Ya que si no sabes lo básico de la programación estarás consultando constantemente cualquier programa que se te cruce por delante. Y yendo un poco más lejos, si no entiendes los básico tampoco podrás crear tus propios programas.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7912
Re: Explicacion de Programa en C...
« Respuesta #10 en: 28 de Noviembre de 2013, 09:21:33 »
Yo te recomiendo otra cosa, y es que si te inicias, veas programación en alguno de los lenguajes Basic, assembler y también el C.

Lo mejor que te puede pasar es que encuentre la horma de tu zapato, es decir, que encuentres un lenguaje que te haga sentir cómodo, ya que te permitirá desarrollarte mucho mejor.

Luego tendrás tiempo para aprender otros lenguajes que hoy no te sienten tanto....
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado georgemtv

  • PIC10
  • *
  • Mensajes: 7
Re: Explicacion de Programa en C...
« Respuesta #11 en: 28 de Noviembre de 2013, 20:48:44 »
Gracias y agradesco la sugerencia, pero en la carrera llevo "C" y tengo que aprenderlo... asi que por eso me apoyo en alguine mas... pero gracias... por la asesoria.. saludos...


 

anything