Colaboracion con codigo fuente de pic 12f629

Hola amigos.
No sé mucho de pics, pero estoy tratando de hacer un programa en pic c compiler para hacer funcionar cuatro pasos de un motor paso a paso unipolar cuando se oprima un pulsador.
He logrado hacer la secuencia y me funciona, pero no he podido incluir el pulsador para dar inicio a la misma. Estoy trabajando con el 12f675

Aquí les posteo donde voy y resalto la parte del código con el que tengo el inconveniente.
Código:
//proyecto de secuenciador de motor paso a paso con un pulsador
#include <12F629.h>
#fuses intrc_io,NOWDT,NOBROWNOUT,PUT,NOMCLR
#use delay(clock=4M)
//#use standard_io(A)

#define PUSH_A PIN_A0
#define PUSH_B PIN_A3

#define Sal_GREEN_PINOUT PIN_A5
#define Sal_RED_PINOUT   PIN_A1
#define Sal_WHITE_PINOUT PIN_A4
#define Sal_BLUE_PINOUT  PIN_A2
void  main()
{
while (true)
{
[B]if (input(pin_A0)==0)
{
Then[/B]
output_high(pin_A1);
delay_ms(150);
output_low(pin_A1);
delay_ms(5);
output_high(pin_A2);
delay_ms(150);
output_low(pin_A2);
delay_ms(5);
output_high(pin_A4);
delay_ms(150);
output_low(pin_A4);
delay_ms(5);
output_high(pin_A5);
delay_ms(150);
output_low(pin_A5);
delay_ms(5);
}
}
}
Les agradezco cualquier aporte.
Gracias.
 
Última edición por un moderador:
No se mucho de programación de pics amigo Nuyel estoy comenzando con pequeños programas en pic c compiler y por eso recurro a ustedes,



la parte del codigo que no consigo resolver es declarar el pin A1 como entrada para colocar un pulsador y que este inicie la secuencia
 
Última edición:
Tan solo quita el Then de tu código, en C no se utiliza.
Al parecer lo demás está bien sin tomar en cuenta las definiciones que no se están usando.

Tampoco necesitas declarar el pin GP0 (PIN_A0) como entrada, por defecto todos los pines se mantienen como entrada si no se especifica que serán usados como salida.
 
Ya quité then y lo ensamblé en un protoboard y no me funciona, pero si reformo el código y quito la parte correspondiente al pulsador, arranca funcionando tan pronto como lo conecto, pero no tengo forma de controlar el inicio.


Así funciona:

Código:
//proyecto de secuenciador de motor paso a paso con un pulsador
#include <12F629.h>
#fuses intrc_io,NOWDT,NOBROWNOUT,PUT,NOMCLR
#use delay(clock=4M)
//#use standard_io(A)

#define PUSH_A PIN_A0
#define PUSH_B PIN_A3

#define Sal_GREEN_PINOUT PIN_A5
#define Sal_RED_PINOUT   PIN_A1
#define Sal_WHITE_PINOUT PIN_A4
#define Sal_BLUE_PINOUT  PIN_A2
void  main()
{
while (true)
{

output_high(pin_A1);
delay_ms(150);
output_low(pin_A1);
delay_ms(5);
output_high(pin_A2);
delay_ms(150);
output_low(pin_A2);
delay_ms(5);
output_high(pin_A4);
delay_ms(150);
output_low(pin_A4);
delay_ms(5);
output_high(pin_A5);
delay_ms(150);
output_low(pin_A5);
delay_ms(5);
}
}

Gracias
 
Última edición por un moderador:
Ya quité then y lo ensamblé en un protoboard y no me funciona, pero si reformo el código y quito la parte correspondiente al pulsador, arranca funcionando tan pronto como lo conecto, pero no tengo forma de controlar el inicio.
Así como está tu código anterior debería funcionar con tan solo quitar el Then, pero estás declarando en los fuses no usar el pin GP3 (MCLR) como entrada de reset.
Este PIC es algo especial, digamos defectuoso en cuanto a no usar ese pin como reset.
A veces se llega a borrar el valor de calibración de fábrica y deja de funcionar o lo hace mal.

Para usar los pines con comparadores analógicos como digitales, se debe establecer el registro CMCON con el valor 0x07 (0b00000111)
Pero el compilador de CCS lo hace por uno y establece ese valor que por defecto en el POR (Power On Reset) es de 0b00000000

Para saber si tu PIC no ha perdido el valor de calibración, verifica que en la ultima dirección de memoria flash (memoria de programa) no exista el valor 0x3FFF
Si lees este valor quiere decir que el PIC ha perdido el valor de calibración y ya no funcionará como debe. (Si funciona).
En la última dirección tienes que leer algo así por ejemplo: 0x3432
Dónde 34 es un RETLW y el 32 el valor OSCCAL de fábrica para el oscilador interno. (Cambia en cada PIC)

Coméntanos acerca de esto que te comenté si no has logrado hacer que funcioné con el pulsador.

Suerte.
 
Última edición:
Lee la hoja de datos, personalmente no me gusta usar librerias especificas de compiladores por que luego son problemáticos al trabajar, mira, este código solo mantiene el delay_ms() y configura el resto simplemente, te dejo un código a como estoy acostumbrado a programar.
Código:
//proyecto de secuenciador de motor paso a paso con un pulsador
#include <12F629.h>
#fuses intrc_io,NOWDT,NOBROWNOUT,PUT,NOMCLR
#use delay(clock=4M)
//#use standard_io(A)

#define PUSH_A PIN_A0
#define PUSH_B PIN_A3

#define Sal_GREEN_PINOUT PIN_A5
#define Sal_RED_PINOUT   PIN_A1
#define Sal_WHITE_PINOUT PIN_A4
#define Sal_BLUE_PINOUT  PIN_A2

//definiciones de bits
#define BIT_PUSH_A 0x01; //GPIO0
#define BIT_PUSH_B 0x08; //GPIO3
#define BIT_RED 0x02;    //GPIO1
#define BIT_BLUE 0x04;   //GPIO2
#define BIT_WHITE 0x10;  //GPIO4
#define BIT_GREEN 0x20;  //GPIO5
void  main()
{
    /*****************************************************
    TRISIO es el registro para configurar configuración
    de entrada/salida, un 0 es salida, 1 es entrada
    *****************************************************/
    TRISIO = BIT_PUSH_A | BIT_PUSH_B;
    GPIO = 0; //borrado de puerto

    while (1)
    {
        /**************************************************
        Realizar peración AND con GPIO y la entrada a leer
        esto filtra los bits y da como resultado el valor
        del bit de la entrada si es alta o cero si es baja
        en caso de querer if verdadero cuando es alta basta
        usar if(GPIO & VALOR_DE_PIN), como nos interesa en
        este caso if verdadero cuando es baja comparamos
        if((GPIO & VALOR_DE_PIN) == 0)
        ***************************************************/
        if ((GPIO & BIT_PUSH_A) == 0)
        {
            /**************  Notas de programación  **************
            output_high(pin) es equivalente a: REGISTRO |= VALOR_DE_PIN
            output_low(pin) es equivalente a: REGISTRO &= ~(VALOR_DE_PIN)
            En este caso el registro en memoria es GPIO
            Es conveniente activar dos bobinas simultaneamente
            antes de desactivar para evitar perdidas de torque
            ******************************************************/
            GPIO |= BIT_RED;
            delay_ms(150);
            GPIO &= ~BIT_RED;
            delay_ms(5);
            GPIO |= BIT_BLUE;
            delay_ms(150);
            GPIO &= ~BIT_BLUE;
            delay_ms(5);
            GPIO |= BIT_WHITE;
            delay_ms(150);
            GPIO &= ~BIT_WHITE;
            delay_ms(5);
            GPIO |= BIT_GREEN;
            delay_ms(150);
            GPIO &= ~BIT_GREEN;
            delay_ms(5);
        }
    }
}
Prueba con esto :unsure:
 
Atrás
Arriba