TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: agobiadox1000 en 04 de Junio de 2009, 14:18:33

Título: PIC12F675 con HYPERTERMINAL
Publicado por: agobiadox1000 en 04 de Junio de 2009, 14:18:33
Buenas tardes.

He ingresado en este foro porque siempre he encontrado solución a todos los problemas que he tenido pero es que este me desborda completamente porque he probado de todo y no hay maneras.

Os explico, estoy haciendo un proyecto con el pic12F675 y intento transmitir tramas al hyperterminal a traves del RS232 y no soy capaz ed ver ni un simple printf en el hyperterminal.

Os pongo el programa a ver si algun alma caritativa me puede ayudar lo antes posible.

#include <12F675.h>

#fuses NOWDT,XT, NOCPD, NOPROTECT, NOMCLR, PUT, NOBROWNOUT
#use delay(clock=60000000) //TENEMOS UN CRISTAL EXTERNO DE 60 M
#use rs232(baud=9600,xmit=PIN_A1,rcv=PIN_A2,bits=8)
#use fast_io(A)

#int_RA
void RA2_isr()
{
   output_high(PIN_A0);
   delay_us(1000);
}


void main()
{
   char ch;
   set_tris_a(0xfC);       // a0, a1, and a2 : outs; a3 : in
   setup_comparator(NC_NC_NC_NC);
   setup_adc_ports(NO_ANALOGS|VSS_VDD);
   setup_adc(ADC_OFF);
   setup_timer_1(T1_DISABLED);
   enable_interrupts(INT_RA2);
   enable_interrupts(GLOBAL);

   ch = 'x';                     // default char
   while(TRUE)
   {
      output_low(PIN_A0);
      if(kbhit())
      {
         ch = getc();            // get char
         printf("%c ", ch);      // print char
      }
   }
}

COMO VEIS EL PROGRAMA NO HACE UNA  MIERDA Y ES LO MAS BASICO DEL MUNDO PERO SOY TAN TONTO QUE NO SOY CAPAZ DE VER EL ERROR. POR FAVOR AYUDARME.

GRACIAS A TODOS DE VERDAD.
Título: Re: PIC12F675 con HYPERTERMINAL
Publicado por: QIQE en 04 de Junio de 2009, 14:40:10
porque no usas un printf("hola"); y descartas que sea problema hardware, la sentencia KBhit se suele emplear dentro de la interrupción del puerto serie.
Título: Re: PIC12F675 con HYPERTERMINAL
Publicado por: MLO__ en 04 de Junio de 2009, 15:01:43
El cristal es a 60MHz???? Creo que el 12F solo llega a 20MHz, ademas eso no seria XT si no HS.

Título: Re: PIC12F675 con HYPERTERMINAL
Publicado por: agobiadox1000 en 04 de Junio de 2009, 18:48:24
ya si lo de XT tienes razon...k solo llega asta 8 Mhz....pero el sigue sin verse lo del printf...
el kbhit lo pongo xk lo voy a poner como interrupcion serie para utilizar el hyperterminal como un mando a distancia que va a mandar a mi dispositivo ordenes pero e sk no entra en la interrupcion...ni escribe nada...y es k estoy despesperado con esto...

si alguien pudiera decirme algo mas...

Ah por cierto si estas seguro k solo soporta hasta 20 Mhz hazmelo saber...aunke otros dispositivos han funcionado con ese cristal...

KIERO K ENTRE EN LA INTERRUPCION Y ACABAR YAAAAA JAJAJA.

Gracias d eantemano
Título: Re: PIC12F675 con HYPERTERMINAL
Publicado por: setshomaru en 04 de Junio de 2009, 21:36:29
no creo que el pic aguente 60MHz prueba con un cristal mas bajo, creo que deberias colocarle uno de 4Mhz
Título: Re: PIC12F675 con HYPERTERMINAL
Publicado por: MLO__ en 04 de Junio de 2009, 22:30:49
Hola.

(http://img38.imageshack.us/img38/5694/cristal.png)

Ahi está. El XT solo llega a 4MHz.

El PIC12F no tiene interrupcion por serial, pero puedes implementarla con la interrupcion GP2, no es dificil hacerlo.

Saludos
Título: Re: PIC12F675 con HYPERTERMINAL
Publicado por: agobiadox1000 en 05 de Junio de 2009, 06:40:21
No tiene? es que he visto en muxos ejemplos del 12F675 que ponen la funcion KBHIT para detectar una interrupcion por hardware y yo lo que quiero es que con el teclado del pc y el hyperterminal pues cuando pulse una tecla, entre en la interrupcion y pueda almacenar lo que viene del hyperterminal.

Pense en hacerla con un la externa pero es k la externa la utilizo para detectar los cruces por cero de una sinusoide de 50 hz.

Joder pues me acabas de romper con lo de que no admite un cristal de mas de 20 Mhz porque consegui con este crsital hacer una onda cuadrada de 120kH y con el cristal de 4 Mhz no soy capaz. Alguna sugerencia para hacerla?



Alguien con el programa que puse puede variarme la configuracion para conseguir que entre en la interrupción por favor?es que he visto que hay una configuracion para realizar la interrupcion usart mediante software pero no he conseguido ver ningun ejemplo...alguno lo tiene o lo ha hecho?

Gracias de antemano a todos.
Título: Re: PIC12F675 con HYPERTERMINAL
Publicado por: MLO__ en 05 de Junio de 2009, 11:45:47
Hola.

A ver, si admite el cristal de 20MHz, ese es el valor maximo. Lo que no admite es el de 60MHz que mensionas anteriormente.

Interrupcion por software? no creo que eso exista, las interrupciones son eventos hardware, pero el PIC12 solo tiene una: la el GP2, es decir usas esa interrupcion para detectar el cambio de estado de la linea de transmision del PC y de ahi ya gestionas por software la recepcion del byte enviado.

Si lo haces con otro pin que no tenga interrupcion, siempre vas a necesitar estar testeando en el programa principal el estado de ese pin para determinar el cambio de estado del pin de recepcion para adquirir el dato, el problema: que cuando detectes el cruce por cero, se va a ver interrumpida la parte de recepcion y por ende el valor del byte recibido te va a cambiar.

Solucion: Trabajarlo a 20MHz y disminuir el valor del baud rate ... pero pierdes 2 pines de I/O

Saludos
Título: Re: PIC12F675 con HYPERTERMINAL
Publicado por: agobiadox1000 en 05 de Junio de 2009, 12:03:25
Entonces con la iupcion externa detecto los cruce por ceros y con polling en otro pin detecto el cambio de estado???es eso?

es k claro con la interrupcion INT_ RA que la he visto en muxos sitios...pues con un simple getc podriamos conseguir el dato y con put c visualizarlo pero al probarlo nada de esto funciona...entonces nose si puedes darnos algun ejemplo que funcione y sea un inicio para nosotros...es que sin las funciones getc .....pues como almaceno y proceso todo lo que recibo....

gracias de antemano de nuevo
Título: Re: PIC12F675 con HYPERTERMINAL
Publicado por: MLO__ en 05 de Junio de 2009, 12:21:47
El getc() siempre vas a usarlo.

Con interrupcion:

Código: C#
  1. #int_EXT
  2. void serial_isr(void)
  3. {
  4.         DatoRx=0;
  5.         if(kbhit())
  6.         {
  7.                 DatoRx=getc();
  8.         }
  9. }

Con polling:

Código: C#
  1. rcvchar=0x00;
  2. while(true)
  3. {
  4.   if(kbhit())
  5.  {
  6.     rcvchar=getc();
  7.   }
  8. }