Autor Tema: Empezando en C  (Leído 5575 veces)

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

Desconectado Amarice_BA

  • PIC10
  • *
  • Mensajes: 25
RE: Empezando en C
« Respuesta #15 en: 03 de Mayo de 2005, 08:15:00 »
El caso era que como había que meter...
BCF STATUS, RP0
BCF STATUS, RP1
CLRF PORTA
BSF STATUS, RP0
MOVLW 0x06
MOVWF ADCON1
...antes del trisa, puse tal cual lo que venía en el manual.

Al final he puesto...
#byte adcon1=0x9F
adcon1=0x06;
set_tris_a(0xFF);

¿Es lo mismo que lo que está arriba en ensamblador?

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2569
RE: Empezando en C
« Respuesta #16 en: 03 de Mayo de 2005, 09:31:00 »
El adcon1=6,  no es necesario meterlo, ya toma las entradas como digitales por omisión.

Un saludo

Desconectado Amarice_BA

  • PIC10
  • *
  • Mensajes: 25
RE: Empezando en C
« Respuesta #17 en: 04 de Mayo de 2005, 08:42:00 »
Gracias. Ya que estamos, si no os importa, os copio el programa en cuestión que no hago funcionar y no sé por qué.
El reloj es un cristal externo de 20Mhz (¿con uno menor iría mejor?) así que al programar le digo que el oscilador es XT, y también habilito el wathdogtimer, aunque no sé si es necesario.

El programa lo unico que hace es esperar a que se pulsen uno de los tres pulsadores y en función del que ha sido pulsado incrementa o decremente la salida.


#include <16F870.h>

#use delay(clock=20000000)

#use fast_io(A)
#use fast_io(B)
#use fast_io(C)

#byte port_b=0x06
#byte port_c=0x07

void main()

    {

    typedef short bit;

    bit e0, e1, e2;
    int nivel, estado;
    int const tension[6]={0x20,0x30,0x3F,0x4B,0x55,0x6D};

    set_tris_a(0xFF);
    set_tris_b(0x00);
    set_tris_c(0x00);

    nivel=0x00;
    estado=0x20;

    e0=input(PIN_A0);
    e1=input(PIN_A1);
    e2=input(PIN_A2);

    port_b=estado;
    port_c=estado;


    while(TRUE)

        {

        restart_wdt();

        if(e0!=input(PIN_A0))

            {

            nivel++;
            if (nivel==6) { nivel=0; }
            estado=tension[nivel];
            port_b=estado;
            port_c=estado;
            e0=input(PIN_A0);

            }


        if(e1!=input(PIN_A1))

            {

            estado++;
            port_b=estado;
            port_c=estado;
            e1=input(PIN_A1);

            }


        if(e2!=input(PIN_A2))

            {

            estado--;
            port_b=estado;
            port_c=estado;
            e2=input(PIN_A2);

            }

        }

    }

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18310
    • MicroPIC
RE: Empezando en C
« Respuesta #18 en: 04 de Mayo de 2005, 09:17:00 »
Sin entrar a valorar a fondo tu programa, en el que hay cosas que no acabo de entender, te diré un par de cosas que podrías ir probando:
1.- el fuse XT es para cristales de 4MHz. Si quieres poner un cristal de 20MHz el fuse adecuado es HS. Cuidado porque hay micros que admiten un cristal de 20MHz y otros que no; tendrás que estar seguro que tu micro lo aguanta.
2.- Veo que no has incorporado en tu programa ningún mecanismo antirrebotes, por lo que sólo acercar el dedo a un pulsador hará que se incremente o decremente a toda leche la variable estado.

Desconectado Amarice_BA

  • PIC10
  • *
  • Mensajes: 25
RE: Empezando en C
« Respuesta #19 en: 05 de Mayo de 2005, 06:32:00 »
Mil Gracias.
Estáis en lo cierto. He bajado el reloj a 10Mhz y añadido #fuses HS,NOWDT,NOPUT,NOLVP,NOBROWNOUT,NOWRT

Ahora va pero peta al tocar el interruptor. Metí un retraso de 100 milisegundos al inicio del "if"para evitar el rebote pero parece que eso no funciona.

Otra cosa que he notado, a la primera fue, luego quité la alimentación ,la volví a poner pero noiba, esperé un tiempo, lo conecté y lo hizo bien, pero al quitarle alimentación otra vez y volver a probar siguió sin ir.
¿Tiene algún buffer o algo que se queda en memoria o tengo que deshabilitar algo para que se finalice en condiciones al quitar la alimentación?

Voy a ver si encuentro algo antiRebotado

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18310
    • MicroPIC
RE: Empezando en C
« Respuesta #20 en: 05 de Mayo de 2005, 06:49:00 »
Prueba a aumentar ese retraso, por ejemplo a 250 ms. Es una burrada, pero te permitirá confirmar si funciona bien o no.

Lo que cuentas de los reinicios no es normal. ¿Seguro que ese micro está preparado para correr a 10MHz?

Desconectado Amarice_BA

  • PIC10
  • *
  • Mensajes: 25
RE: Empezando en C
« Respuesta #21 en: 09 de Mayo de 2005, 13:02:00 »
Hecho, al final uso el programa que pongo a continuación.
Va bien pero peta al tocar los interruptores.
Es decir el primer valor le saca bien y entra en el bucle infinito pero si toco una entrada con el interruptor todo se va por el agujero.
El delay de 250 tampoco me lo soluciona.
¿Pongo más delay o se debe a otra cosa?
Gracias.


#include <16F870.h>

#use delay(clock=10000000)

#fuses HS,NOWDT,NOPUT,NOLVP,NOBROWNOUT,NOWRT

#use fast_io(A)
#use fast_io(B)
#use fast_io(C)

#byte port_b=0x06
#byte port_c=0x07

void main()

    {

    typedef short bit;

    bit e0, e1;
    int nivel;
    int const tension[6]={0x6F,0x55,0x4A,0x3E,0x30,0x20};

    set_tris_a(0xFF);
    set_tris_b(0x00);
    set_tris_c(0x00);

    nivel=0x00;

    e0=input(PIN_A0);
    e1=input(PIN_A1);

    port_c=tension[nivel];
    port_b=nivel+1;


    while(TRUE)

        {

        if((e0!=input(PIN_A0)) && (nivel<5))

            {

            delay_ms(250);
            nivel++;
            port_c=tension[nivel];
            port_b=nivel+1;
            e0=input(PIN_A0);

            }

        if((e1!=input(PIN_A1)) && (nivel>0))

            {

            delay_ms(250);
            nivel--;
            port_c=tension[nivel];
            port_b=nivel+1;
            e1=input(PIN_A1);

            }

        }

    }

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18310
    • MicroPIC
RE: Empezando en C
« Respuesta #22 en: 10 de Mayo de 2005, 00:15:00 »
A ver, define "se va por el agujero"Sonrisa Gigante , vamos, describe el error

Y otra cosa. El delay_ms tiene sentido una vez que hayas procesado lo que quieres que haga el programa al pulsar el botón; si lo pones al comienzo como ahora, y es un retardo importante, notarás cierto retraso en la ejecución de tu programa.

Otra cosa. ¿Necesitas que las rutinas se ejecuten cuando pulsas y también cuando levantas el dedo?. Si es así, está correcto, pero si sólo quieres ejecutarlas cuando pulses el botón, deberías poner:
input(PIN_A0) // para lógica positiva del interruptor
o
!input(PIN_A0) // para lógica inversa del interruptor

y olvidarte de las variables temporales e0 y e1.

Sigue probando y nos cuentas, ¿vale?

Desconectado Amarice_BA

  • PIC10
  • *
  • Mensajes: 25
RE: Empezando en C
« Respuesta #23 en: 10 de Mayo de 2005, 04:12:00 »
Me refería a que es tocar un interruptor y aquello dejar de funcionar, poner todas las salidas a cero.
Las entradas son interruptores y por eso he puesto que afecten al programa siempre que cambien de posicion.
Voy a ver si cambiando el delay y poniendo más.

Es que ayer no sé que pasó con la fuente que se me quemó el pic Avergonzado

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18310
    • MicroPIC
RE: Empezando en C
« Respuesta #24 en: 10 de Mayo de 2005, 04:19:00 »
Pon por aquí el esquema de tu circuito.

Desconectado Amarice_BA

  • PIC10
  • *
  • Mensajes: 25
RE: Empezando en C
« Respuesta #25 en: 10 de Mayo de 2005, 06:29:00 »
Lo describo, que no domino el proteus.

2: RA0/AN0
3: RA1/AN1
En estas dos patas están los interruptores conectados a masa y a 5V con una resistencia de 10k de por medio.

9: OSC1/CLK1
10: OSC2/CLK0
Aquí pongo el reloj de 10MHz y en cada pata un condensador de 22pF a masa.

11-18: PORTC
Estas salidas van conectadas a las entradas del convertidor digital-analógico DAC08.

21-28: PORTB
No he puesto nada pero en un futuro espero poner un led de 8"s.

8, 19: Vss
Conectada a tierra.

20: Vdd
Conectada a +5V


Esta tarde probaré un programa sin entradas, simplemente que entre y se pase haciendo un "for" de arriba para abajo recorriendo el string con un delay de por medio.

Gracias por el interés. Chica

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18310
    • MicroPIC
RE: Empezando en C
« Respuesta #26 en: 10 de Mayo de 2005, 06:37:00 »
¿Y no tienes conectada una resistencia entre Vdd y el Pin 1 (MCLR)?, pues lo raro es que te funcione hasta que pulsas un interruptor.
Ponla, anda, verás como todo sale funcionando.

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18310
    • MicroPIC
RE: Empezando en C
« Respuesta #27 en: 10 de Mayo de 2005, 06:39:00 »
Por cierto, acabo de entrar en tu perfil y veo que mientes. O mientes con la edad o mientes con la foto Sonrisa GiganteSonrisa GiganteSonrisa Gigante

Desconectado Amarice_BA

  • PIC10
  • *
  • Mensajes: 25
RE: Empezando en C
« Respuesta #28 en: 10 de Mayo de 2005, 08:30:00 »
Muchas Gracias. Me hubiese vuelto loco sin tu ayuda.
Te debo mucho. Voy a investigar sobre esa resistencia.
¿Te molo? Sonrisa Gigante


 

anything