TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: totpic en 29 de Septiembre de 2006, 16:11:18

Título: Quiero la pata a 0V
Publicado por: totpic en 29 de Septiembre de 2006, 16:11:18
Hola a todos, una vez mas por aqui, estoy haciendo un pequeño trasponder para una tonteria con el coche pero necesito que la pata de transmision este a nivel bajo  "0V" mientras no transmito nada. Querria descartar la opcion de invertir la tension por hardware extreno al pic o invertir la señal con el use rs232 y la directiva invert.
El programa es un bucle ciclico que envia PEPE 5 veces y descansa (el descanso lo he puesto antes porque pensaba que iva a funcionar al reves mejor), en ese descanso es cuando necesito la pata de TX a 0V.
En lugar de un while reinicia porque es mejor para sincronizxacion de tramas.

Gracias a todos y os pego el codigo.

Código: [Seleccionar]
#include <16f628A.h>
#fuses HS,NOWDT,NOPROTECT,PUT
#use delay (clock=4000000)
#use rs232(baud=240, xmit=PIN_B2, rcv=PIN_B1)

#define led1 PIN_A1
#define led2 PIN_A0
#define bot1 PIN_A3
#define bot2 PIN_A2
#define TX PIN_B2
#define RX PIN_B1


///PROGRAMA
void main(void){

int i=0;

   disable_interrupts(GLOBAL);

   output_bit(led1,0);
   output_bit(TX,0);
   delay_ms(1000);
   output_bit(led1,1);
   while(i<5){
               printf("PEPE");
               i++;
               delay_ms(2);
    }
    reset_cpu();
}
Título: Re: Quiero la pata a 0V
Publicado por: maunix en 29 de Septiembre de 2006, 16:24:24
Hola a todos, una vez mas por aqui, estoy haciendo un pequeño trasponder para una tonteria con el coche pero necesito que la pata de transmision este a nivel bajo  "0V" mientras no transmito nada.
El programa es un bucle ciclico que envia PEPE 5 veces y descansa (el descanso lo he puesto antes porque pensaba que iva a funcionar al reves mejor), en ese descanso es cuando necesito la pata de TX a 0V.
En lugar de un while reinicia porque es mejor para sincronizxacion de tramas.

Gracias a todos y os pego el codigo.

Código: [Seleccionar]
#include <16f628A.h>
#fuses HS,NOWDT,NOPROTECT,PUT
#use delay (clock=4000000)
#use rs232(baud=240, xmit=PIN_B2, rcv=PIN_B1)

#define led1 PIN_A1
#define led2 PIN_A0
#define bot1 PIN_A3
#define bot2 PIN_A2
#define TX PIN_B2
#define RX PIN_B1


///PROGRAMA
void main(void){

int i=0;

   disable_interrupts(GLOBAL);

   output_bit(led1,0);
   output_bit(TX,0);
   delay_ms(1000);
   output_bit(led1,1);
   while(i<5){
               printf("PEPE");
               i++;
               delay_ms(2);
    }
    reset_cpu();
}


Si usas la usart por hardware, la única forma de que se te ponga el pin en 0 durante un tiempo mayor a lo que tarda en transmitire un byte, es la de configurarlo como pin genérico (apagar la usart) y dejarlo en bajo.

Sino, como usa el protocolo NRZ (no retorno a cero) el estado de reposo es un 1, osea 5V o Vdd depende del caso.

Saludos
Título: Solucionado
Publicado por: totpic en 29 de Septiembre de 2006, 21:01:02
Simplemente forzando a usart por hardware me ha funcionado, gracias por todo, la verda es que no se me ocurrio.
Título: Re: Solucionado
Publicado por: maunix en 30 de Septiembre de 2006, 14:24:34
Simplemente forzando a usart por hardware me ha funcionado, gracias por todo, la verda es que no se me ocurrio.

¿Cómo? Que sería "forzar usart por hardware" ?