PIC12F629 Pin de Reset MCLR

Hola, estoy programando un PICF12629 (8 Pines) y el pin cuatro es mi entrada a3 por asi decirlo pero tmb es MCLR, que codigo tengo que poner en lenguaje C para que ese pin no me trabaje como MCLR sino como Pin de Entrada/Salida?

Estoy usando el compilador CCS C... Que tengo que poner para que el siguiente codigo me funcione usando la Entrada/Salida a3 que tambien es el MCLR del Pic!!!

Saludos & Gracias !!! :D

Código:
#include <12f629.h>
#use delay(clock=4000000)
#fuses XT,NOWDT,PROTECT
#use fast_io(a)

void main()
{
   set_tris_a(0b00000000);
   output_a(0x0);
   
   while(1)
   {
      output_high(pin_a3);
      delay_ms(1000);
      output_low(pin_a3);
      delay_ms(1000);
   }
}
 
Hola, deberias poner en los fuses " NOMCLR " pero el GP3 o A3 se puede utilizar solo como entrada. segun su hoja de datos : GP3 = TTL -- Input port w/ interrupt-on-change. Jamas funcionara como salida. Espero haberte sido de utilidad. SUERTE. Sergio....
[/SIZE]
#include <12f629.h>
#use delay(clock=4000000);
#fuses XT,NOWDT,PROTECT, NOMCLR;
#use fast_io(a);

void main()
{
set_tris_a(0b00000000);
output_a(0x0);

while(1)
{
output_high(pin_a3);
delay_ms(1000);
output_low(pin_a3);
delay_ms(1000);
}
}
 
Hola, una consulta estoy utilizando el PIC12F683, y el pin MCLR lo utilizo como entrada para un pulsador, pero noto que en proteus no inicia el programa del PIC, una vez que preciono el boton si, osea que recibe la masa como que se resetea algo y listo, pero porque no inicia? , o es falla del proteus y en la vida real si funciona? gracias
 
Aqui subo el programa, cuando preciono en boton que esta en la entrada de la pata MCLR comienza a ejecutarse y enciende o apaga el led de la pata GP1, las optras patas estan en un RS485 por eso estan todas ocupadas.
En pocas Palabras Preciono el Boton y me enciende en Proteus y apaga el led, Pero cuando se inicia el programa, EL RS485 tiene una de las patas como en otro estado como que no es ni cero ni uno que es justo la que recibe que va a la INT del PIC, no se inicia bien parece. por lo tanto no recibe datos. al precionar el boton se normaliza todo y funciona todo bien

Código:
#include <12F683.h> //<16F628A.h>

#ignore_warnings  201, 216

#FUSES NOMCLR
#FUSES NOWDT
#FUSES INTRC_IO
#FUSES NOBROWNOUT               //No brownout reset

//#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O


/*
#FUSES NOWDT
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES INTRC_IO
*/

#use delay(internal=8MHz)
#define sal1   PIN_A1
#define key1   PIN_A3

//port1
#define tope_array 10
int RS_ID=23;
#define RS485_USE_EXT_INT TRUE
#define RS485_RX_PIN PIN_A2
#define RS485_TX_PIN PIN_A5
#define RS485_ENABLE_PIN   PIN_A4     // Controls DE pin.  RX low, TX high.
#define RS485_RX_ENABLE PIN_A0        // Controls RE pin.  Should keep low.
#define RS485_RX_BUFFER_SIZE tope_array
#define RS485_ID RS_ID
#include <rs485.c>//NOTE: only one RS485 port is supported by the driver


#ZERO_RAM
int1 flag_rs485=0;
char msg[tope_array];
int8 i;
#define cual_luz   21
#define cual_addr  23

//#INT_EXT
//void  EXT_isr(void) 
//{
//}
#INT_TIMER1
void  TIMER1_isr(void) 
{
   if(rs485_get_message(msg, FALSE))
      flag_rs485 = 1;
}

void clean_msg (void)
{
   for(i=0;i<sizeof(msg);i++)
   {
      msg[i] = 0x00;
   }
}

void RS485send(char* s, int8 id)
{
   int8 size;
   for(size=0; s[size]!='\0'; ++size);
   rs485_wait_for_bus(FALSE);
   while(!rs485_send_message(id, size, s))
      delay_ms(1);
}

void envia_luz(int dir)
{
   int8 dato[tope_array];
   dato[0]='L';
   dato[1]=cual_luz;
   dato[2]=input_state(SAL1);
   RS485send(dato,10); delay_ms(20);
   RS485send(dato,cual_addr);
}

void main()
{  
   //int1 flag_inicio=FALSE;   

  // enable_interrupts(INT_EXT);
  // enable_interrupts(GLOBAL);
   setup_timer_1(T1_INTERNAL | T1_DIV_BY_1);
   
   
   output_a(0x02);
   
   enable_interrupts(INT_TIMER1);
   enable_interrupts(GLOBAL);
   rs485_init();
   
      
   while(TRUE)
   {
      if(flag_rs485){
         disable_interrupts(INT_TIMER1);
         flag_rs485 = 0;

         ///// DATOS RECIVIDOS POR BLUETOOTH
         if((msg[2]=='B')&&(msg[3]=='L'))
         {
            if(msg[4]==cual_luz) { output_toggle(SAL1); }
         }
        
         ///// DATOS RECIVIDOS POR TECLA DE OTRO DISPOSITIVO
         IF((msg[0]==cual_addr)&&(msg[2]=='L'))
            {  if(msg[3]==cual_luz)
                  output_bit(sal1,msg[4]);
            }
           
         clean_msg();
        // rs485_wait_for_bus(FALSE);
         enable_interrupts(INT_TIMER1);         
      }

      if(!input(key1)){disable_interrupts(INT_TIMER1);output_toggle(sal1);envia_luz(cual_addr); while(!input(key1)) delay_ms(20);clean_msg();enable_interrupts(INT_TIMER1);}
     
      


   }

}
 
Última edición:
En pocas palabras, presiono el botón y me enciende en Proteus y apaga el led, Pero cuando se inicia el programa, el RS485 tiene una de las patas como en otro estado, como que no es ni cero ni uno, que es justo la que recibe que va a la INT del PIC.
Ese estado se llama flotante, y es cuando el pin se encuentra como entrada.

Normalmente un pin que es entrada, debe recibir un estado lógico proveniente de algún dispositivo.
Si ese dispositivo es un pulsador o una salida con colector/drenador abierto, se debe colocar una resistencia pull-up o pull-down.

El hecho de que ese pin pase de salida a entrada, es normal y lo realiza la librería RS485.c

Precisamente en la rutina "rs485_wait_for_bus"
PHP:
void rs485_wait_for_bus(int1 clrwdt)
{
   unsigned int16 i;

   RCV_OFF();
   for(i=0; i <= (rs485_wait_time*20); ++i)
   {
      if(!input(RS485_RX_PIN))
         i = 0;
      else
         delay_us(50);

      if(clrwdt)
        restart_wdt();
   }
}
if(!input(RS485_RX_PIN)) // Convierte al pin seleccionado como entrada.

Así que, si el dispositivo esclavo no es capaz de proporcionar los dos niveles lógicos, deberás colocar una resistencia pull-up en ese pin, ya que lo que se espera es un 0.
 
a ver si entiendo! yo el boton tiene su resistencia pull-UP, si pongo entre el pic y el RS485 en la pata RO que va al INT del pic que esta en estado flotante tampoco funciona, osea no inicializa bien el programa porque quedaria tres pines en 0 y uno en alto cuando en realidad RS485 tiene los dos pines de los extremos en alto y los dos centrales en BAJO. cuando preciono el boton funciona todo perfecto, osea que como que no comienza bien el programa cuando lo simulas al principio. y si coloco una pull-up en el pin INT, no responde despues el programa se apaga la salida y no enciende mas. Sino lo que me queda es poner un flag, que cuando preciono por primera vez el boton no haga nada no envie datos ni nada solo inicia, y luego a partir del segundo que ya comience a transmitir cada vez que precione el boton otra no se me ocurre.
 

Adjuntos

  • 2017-06-10 (4).jpg
    2017-06-10 (4).jpg
    114.3 KB · Visitas: 24
Última edición:
Ese color amarillo en la terminal, está mostrando una colisión o contención lógica.
Eso se debe a que estás inicializando GP2 como salida.
Si por ese pin esperas una interrupción, debe ser entrada.
 
Última edición:
listo puse #use fixed_io(a_outputs=PIN_A5,PIN_A4,PIN_A1, PIN_A0) y se soluciono que barbaro, gracias señor por ayudar, no sabia que el amarillo estaban los dos enviando
 
Atrás
Arriba