TODOPIC

Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: washi_w_z_r en 28 de Marzo de 2009, 16:13:23

Título: UN PROBLEMILLA CON PIC16F877 Y RS232
Publicado por: washi_w_z_r en 28 de Marzo de 2009, 16:13:23
weno amigos: ante todo mil disculpas alos entendidos en la materia por el codigo que les presento , como veran son un novato en esto  :( estuve investigando y desarrolle el siguiente codigo


Código: [Seleccionar]
#include<16f877A.h>
// fuses y ajuste del clock
#fuses XT,NOWDT,NOPROTECT,NOPUT,NOBROWNOUT
#use delay(clock=4M)
// canal de comunicacion : USART
#define TTL_TX PIN_C6
#define TTL_RX PIN_C7
#use RS232(baud=9600, xmit=TTL_TX, rcv=TTL_RX)

void main()
{
 char rec;
 printf("TyP_Serio_TTL\r\n");
 do
  {
  if(kbhit())
   {
   rec=getc();
   putc(rec);
   #asm
       ADDR_L equ 0x20

    DATA_L equ 0x21

org 0x00

    nop

    nop

 

    bcf STATUS,RP0 ;Ir banco 0

    bcf STATUS,RP1

 

    movlw b'01000001' ;A/D conversion Fosc/8

    movwf ADCON0

 

    bsf STATUS,RP0 ;Ir banco 1

    bcf STATUS,RP1

 

    clrf TRISA ;PORTA salida

    clrf TRISB ;PORTB salida

    clrf TRISC ;PORTC salida

    clrf TRISD ;PORTD salida

    clrf TRISE

 

    movlw b'00001110' ;A/D Port AN0/RA0

    movwf ADCON1

 

    bsf TRISA,0 ;Canal AN0 como entrada

 

    bcf TRISC,6 ;RC6/TX salida, pin de transmisión

    movlw d'12' ;2400 baud rate Xtal=4Mhz

    movwf SPBRG

    bcf TXSTA,BRGH ;Selección de baja velocidad

    bcf TXSTA,SYNC ;Modo asíncrono

 

    bcf STATUS,RP0 ;Ir banco 0

    bcf STATUS,RP1

 

    bsf RCSTA,SPEN ;habilita el puerto serie

 

    bsf STATUS,RP0 ;Ir banco 1

    bcf STATUS,RP1

 

    bcf TXSTA,TX9 ;8 bits de datos a transmitir

    bsf TXSTA,TXEN ;Activa la transmisión serial, TXIF = 1

 

    bcf STATUS,RP0 ;Ir banco 0

    bcf STATUS,RP1

_adc

    bsf ADCON0,GO ;Start A/D conversion

_espera

    btfsc ADCON0,GO ;ADCON0 es 0? (la conversion esta completa?)

    goto _espera ;No, ir _espera

    movf ADRESH,W ;Si, W=ADRESH

    movwf TXREG ;TXREG = W

    movwf PORTC ;PORTC = W

_esperatx

    btfss PIR1,TXIF ;Espera hasta que transmisión culminó

    goto _esperatx

    goto _adc ;Ir adc
   #endasm
   }
  }
 while(TRUE);
}


lo que intento en mi proyecto es recibir datos por el pin 2 (datos analogicos de un tarjeta que desarrolle), y enviarlos mediante rs232 .


tengo un prog en visual c# y otro en matlab que recibe datos por el puerto serial, pero he ahi el problema , necesito una algo como un codigo , es decir envio desde la pc un "a" el pic lo lee y empieza a enviar datos masivamente hasta que la pc envie un "b" y se detenga el envio de datos, y cuando envie otr vez "a" envie y asi sucesivamente.

este no es ni el 10% de mi proyecto , pero a paso lento y seguro jajajaa, asi que les agradecere un monton vuestra ayuda en mejorar este codigo, tratare de mejorar mi codigo  :lol:
Título: Re: UN PROBLEMILLA CON PIC16F877 Y RS232
Publicado por: RedPic en 29 de Marzo de 2009, 17:00:01
Te ruego que leas las Reglas del Foro (http://www.todopic.com.ar/foros/index.php?action=globalAnnouncements;id=1). Entre ellas se indica expresamente que no se permite escribir todo en mayúsculas. Gracias.
Título: Re: UN PROBLEMILLA CON PIC16F877 Y RS232
Publicado por: washi_w_z_r en 30 de Marzo de 2009, 19:32:09
weno aqui modifique un poquillo mi codigo ,, ya toy en el 10.01% de mi proyecto

Código: C#
  1. #include<16f877A.h>
  2. #fuses XT,NOWDT,NOPROTECT,NOPUT,NOBROWNOUT
  3. #use delay(clock=4M)
  4. #use standard_io(b)
  5. #use RS232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)
  6.  
  7. char rec=' ';
  8. char adc_dato=' ';
  9. char KEY=' ';
  10. // PROTOTIPO DE FUNCION ///////
  11. void ADC_START();
  12. void ADC_STOP();
  13. ////////////////////////////////
  14. #int_rda
  15. void rda_isr()
  16. {
  17.  KEY=0x00;
  18.  if(kbhit())
  19.  {
  20.   KEY=getchar();
  21.  }
  22. }
  23. // FUNCIONES ////////
  24.  
  25. void ADC_START()
  26. {
  27.  // LECTURA CANAL A0
  28.  set_adc_channel(0);
  29.  delay_us(100);
  30.  adc_dato=read_adc();
  31.  delay_us(100);
  32.  putchar(adc_dato);
  33. }
  34.  
  35. void ADC_STOP()
  36. {
  37.  #asm
  38.   bcf RCSTA,SPEN
  39.   bcf ADCON0,ADON
  40.  #endasm
  41. }
  42. void main()
  43. {
  44.   setup_adc(ADC_CLOCK_DIV_32);
  45.   setup_adc_ports(RA0_RA1_ANALOG);
  46.  
  47.   enable_interrupts(int_rda);
  48.   enable_interrupts(global);
  49.  
  50.   do
  51.    {
  52.     if(KEY!=0x00)
  53.     {
  54.      switch(KEY)
  55.      {
  56.       case '13': ADC_START();
  57.                break;
  58.       case 'S': ADC_STOP();
  59.                break;
  60.      }
  61.      KEY=0X00;
  62.     }
  63.    }while(TRUE)
  64. }

necesito vuestra ayuda para disminuir mi codigo , ya que controlare muchas mas cosas, saludos a todos