Autor Tema: Problemas RS232-PIC16F873  (Leído 2260 veces)

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

Desconectado Arvydas

  • PIC10
  • *
  • Mensajes: 8
Problemas RS232-PIC16F873
« en: 14 de Mayo de 2008, 07:26:29 »
Bueno, estoy haciendo un proyecto de carrera y estamos teniendo muchos problemas. Lo primero de todo, os copio el código. Es muy simple, sólo se verifica el envío y el recibo de datos.

Código: [Seleccionar]
#include "C:\Archivos de programa\PICCNUEV\Projects\TestLeds.h"
#int_RDA
void RDA_isr()
{
   PORT_B=0b11111101;
   delay_ms(1000);
   PORT_B=0b00000000;
}



void main()
{

   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_OFF);
   enable_interrupts(INT_RDA);
   enable_interrupts(GLOBAL);

   // TODO: USER CODE!!
   set_tris_b(0b00000000);
   set_tris_c(0b10000000);
   
   PORT_B=0b11111111;
   delay_ms(1000);
   PORT_B=0b00000000;
   
   printf("hola");
   sleep();
}

Código: [Seleccionar]
#include <16F873.h>
#device adc=8

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES XT                       //Crystal osc <= 4mhz
#FUSES PUT                      //No Power Up Timer
#FUSES NOPROTECT                //Code not protected from reading
#FUSES BROWNOUT                 //Reset when brownout detected
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD                    //No EE protection
#FUSES NOWRT                    //Program memory not write protected
#FUSES NODEBUG                  //No Debug mode for ICD

#byte port_B=6

#use standard_io(c)
#use delay(clock=4000000)
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)

Los problemas son los siguientes:

Si no ponemos set_tris_x y set_tris_b no funciona al contrario de los ejemplos que hay por aquí.
Si desactivamos el WDT, no funciona el recibo por RS232, pero si el envío.
Si lo activamos, se reinicia constantemente.

¿Que podemos hacer?

Desconectado jfh900

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3595
Re: Problemas RS232-PIC16F873
« Respuesta #1 en: 14 de Mayo de 2008, 07:38:50 »
Por qué en vez de mandar a dormir el micro con sleep no lo encierras en un bucle infinito while.

Un saludo
* Cuando hables, procura que tus palabras sean mejores que el silencio.
* 'Todos somos ignorantes, lo que ocurre es que no todos ignoramos las mismas cosas.' Albert Einstein.
* No hay nada peor que un experto para evitar el progreso en un campo
* "La vida es como una novela. No importa que sea larga, sino que esté bien narrada" Seneca
* La vida no se vive por las veces que respiras, sino por los momentos que dejan sin aliento.
* Dios dijo: ∇·E=ρ/ε0 ; ∇·B=0 ; ∇xE=-dB/dt ; ∇xB= μ0ε0dE/dt..y la luz se hizo..!!..

Desde España Jesús

Desconectado Arvydas

  • PIC10
  • *
  • Mensajes: 8
Re: Problemas RS232-PIC16F873
« Respuesta #2 en: 14 de Mayo de 2008, 09:35:08 »
Por qué en vez de mandar a dormir el micro con sleep no lo encierras en un bucle infinito while.

Un saludo

Se reinicia constantemente :S, bueno, mas que nada no surte ningun efecto, ocurre lo mismo.

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: Problemas RS232-PIC16F873
« Respuesta #3 en: 14 de Mayo de 2008, 10:57:22 »
Si no ponemos set_tris_x y set_tris_b no funciona al contrario de los ejemplos que hay por aquí.
SetTris de qué? comparado con qué? El TRISC debe ser 0b11000000;


Si desactivamos el WDT, no funciona el recibo por RS232, pero si el envío.
Probaron verificar el bit RCSTA.OERR?? y resetear la usart en caso de que esté activo? es muy probable que tengan por ahí el problema.

Si lo activamos, se reinicia constantemente.

Claro porque no hacen un clrwdt en ningún lado.  Además , les sugiero usar un bucle while(1) como les sugirió Jesús (jfh900) sino cuando termine el main no hay garantía de qué pueda hacer el micro.

Saludos
- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2568
Re: Problemas RS232-PIC16F873
« Respuesta #4 en: 14 de Mayo de 2008, 15:32:12 »
Conforme lo tienes al recibir un caracter ejecutará la interrupción, se saldrá de la interrupción y continuará en la instrucción que viene después del SLEEP y como no hay nada ahí acabará todo.

Puedes probar con:

main()
{
.
.
.
while(1)
    sleep();
}

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: Problemas RS232-PIC16F873
« Respuesta #5 en: 14 de Mayo de 2008, 16:59:35 »
Ademas de lo que han dicho los muchachos, agrego que deberias tener cuidado en el delay de 1 segundo que tienes en la interrupcion, es mucho tiempo y la interrupcion quedaria deshabilitada. Es mejor colocar un flag y hacer la rutina de visualizacion con los leds dentro de un ciclo infinito (ya no seria necesario el sleep(); )

Saludos
El papel lo aguanta todo

Desconectado Arvydas

  • PIC10
  • *
  • Mensajes: 8
Re: Problemas RS232-PIC16F873
« Respuesta #6 en: 14 de Mayo de 2008, 19:08:48 »
Bueno muchas gracias por la ayuda, al final el problema estaba en que si se usa el WDT se reinicia constantemente como antes he explcado, así que hicimos un nuevo proyecto con project wizard seleccionando NO WDT y se pusieron los setup correctamente. El caso es que al entrar en rda_isr, al no recoger el byte, al salir de la interrupción volvería a saltar, y así infinitamente, porque siempre tendríamos un byte available al no limpiar el buffer con getc().

Por si alguien que lea esto le interesa, hemos dejado la explicación y todo el código aquí: http://proiektutaldea.wordpress.com/2008/05/14/ejemplo-test-uart-pic16f873-en-ccs/

gracias!


 

anything