Autor Tema: Duda básica programación PICS en C  (Leído 2846 veces)

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

Desconectado ppalou

  • PIC10
  • *
  • Mensajes: 36
Duda básica programación PICS en C
« en: 17 de Diciembre de 2004, 04:51:00 »
Estoy intentando programar ejemplos en una PIC 16F876 pero no hay manera de hacerlos funcionar, solo me ha funcionado algún ejemplo con leds que he copiado de por internet. Por ejemplo el siguiente código tendria que cambiarme los pins del portb cuando activo el pin1 del porta pero no me hace nada, no se si hago mal las comparaciones o que puede pasar. De todas maneras si lo hago directamente, sin tener en cuenta ninnguna comparación tampoco  funcionan bien las salidas del portb. Alguna sugerencia? Estoy usando el C2C pero he visto que aquí usais el CCS, me lo he bajado y lo probaré a ver si me va mejor.

Gracias


#include <system.h>

void esperar( void )
{
    char i = 0, j;
    while( i++ < 150 )
    {
        j = 0;
        while( j++ < 200 )
        {
            nop();
        }
    }
}

main()
{
    disable_interrupt( GIE );

        trisa = 1;
        trisb = 0; //marcam el trisb com a sortida
        portb = 0;
   
    while( 1 ) {
                if(porta == 1){
                        if(portb == 0){
                                portb &= 255;
                        } else if(portb == 255){
                                portb &= 0;
                        }
                        esperar();
                } else {
                        esperar();
                }

    }
}

Desconectado cHiPmAn

  • PIC16
  • ***
  • Mensajes: 110
RE: Duda básica programación PICS en C
« Respuesta #1 en: 17 de Diciembre de 2004, 05:38:00 »
Hola Ppalou,

Algunos pines del puertoA pueden usarse como entradas analógicas para el conversor.
Así pues, tienes que configurar el pin del puertoA como digital. Esto se hace con el registro ADCON1= 0b00000110;

Sort i salutacions!!

Desconectado tornar

  • PIC18
  • ****
  • Mensajes: 342
RE: Duda básica programación PICS en C
« Respuesta #2 en: 18 de Diciembre de 2004, 06:55:00 »
Hola ppalou para iniciarte en la programacion de PIC"s en CCS, te recomiendo el libro "An Introduction to Programming the Microchip PIC in CCS C", que te viene con numerosos ejemplos, empezando con cosas basicas y aumentando el nivel de los ejemplos poco a poco. Ya que me parece que es una locura empezar a programar PIC"s en C, y meterte de lleno en las interrupciones como en el codigo que adjuntas.

Un saludo  Navidad

Desconectado Ignite

  • PIC16
  • ***
  • Mensajes: 107
RE: Duda básica programación PICS en C
« Respuesta #3 en: 18 de Diciembre de 2004, 07:24:00 »
Como dice cHiPmAn, el problema está en que tines que configurar el puerto A para que sea un puerto de I/O. Para poder desconectar los conversores tines que modificar el registro ADCON1 según sean tus necesidades (mira el datasheet).

Desconectado juan_marcos

  • PIC10
  • *
  • Mensajes: 7
RE: Duda básica programación PICS en C
« Respuesta #4 en: 19 de Diciembre de 2004, 02:17:00 »
Por cierto, ¿Donde y cómo podría conseguir el libro An Introduction to Programming the Microchip PIC in CCS C? , me interesa mucho. Gracias.

Desconectado ppalou

  • PIC10
  • *
  • Mensajes: 36
RE: Duda básica programación PICS en C
« Respuesta #5 en: 20 de Diciembre de 2004, 06:54:00 »
Y como modifico el registro ADCON1? Mediante código en ensamblador, o mediante los FUSES del principio de los programas en CCS?


Escrito originalmente por Ignite
Como dice cHiPmAn, el problema está en que tines que configurar el puerto A para que sea un puerto de I/O. Para poder desconectar los conversores tines que modificar el registro ADCON1 según sean tus necesidades (mira el datasheet).

Desconectado cHiPmAn

  • PIC16
  • ***
  • Mensajes: 110
RE: Duda básica programación PICS en C
« Respuesta #6 en: 20 de Diciembre de 2004, 07:46:00 »
Ppalou,

Dentro del programa main, cuando inicializas los puertos, puedes poner la linia de codigo:

ADCON1= 0b00000110;   // En binario

o bien

ADCON1= 0x06;   // En hexadecimal

o bien

ADCON1= 6;      // En decimal

Sort!

Desconectado ppalou

  • PIC10
  • *
  • Mensajes: 36
RE: Duda básica programación PICS en C
« Respuesta #7 en: 21 de Diciembre de 2004, 03:47:00 »
Cogiendo un ejemplo del Microcursillo en C que hay en los foros he creado este programa y me funciona perfecto en la pic 16F84A pero no en la 16F876 o 16F872.
Estas dos últimas tienen conversores A/D internos, por lo que puede que no me funcione el programa por lo que me decís, lo del registro ADCON1, pero lo tengo puesto: primero defino en que byte está y luego le doy el valor de todos los pins como salidas digitales, ...  cuando decís salidas digitales os referis a entradas y salidas digitales o para entradas hay que poner otro valor?¿

Gracias


////////////////////////////////////// PREPROCESADO ///////////////////////////////////

#include <16F84a.h> //#include <16F876.h>
#use delay(clock=4000000)
#fuses RC,NOWDT//,NOPUT,NOLVP,NOBROWNOUT,NOWRT

#use fast_io(A)
#use fast_io(B)
#byte port_b=6
#byte ADCON1=0x9F

////////////////////////////////////// RUTINAS ///////////////////////////////////////

int entrada_activa()
  {
  if(input(PIN_A0))
    {
    // Esto se ejecuta si RA0 está a 1
    return(0);  // Devolvemos un 0
    }else if(input(PIN_A1)) {
    // Esto se ejecuta si RA1 está a 1
    return(1);  // Devolvemos un 1
    }else if(input(PIN_A2)) {
    // RA2 está a 1
    return(2);  // Devolvemos un 2
    }else if(input(PIN_A3)) {
    // RC3 está a 1
    return(3);
    }else if(input(PIN_A4)) {
    // RA4 está a 1
    return(4);
    }/*else if(input(PIN_A5)) {
    // RA5 está a 1
    return(5);
    }*/else {
    // Si entramos aquí es que no se dió ninguno de los casos anteriores (todas a 0)
    return(6);
    }
  }


////////////////////////////////////// PRINCIPAL //////////////////////////////////////


void main()
   {
   int pin_activo;
   ADCON1 = 0x06; // Configurar todos los pins como salidas digitales
   set_tris_b(0);           //// declaramos el puerto B como salidas
   port_b=0;
   set_tris_a(0xff);  // Puerto A configurado como entrada  

   while(TRUE) // Bucle infinito
     {
     pin_activo = entrada_activa();  /
     if(entrada_activa() > 4)  
       {      
       port_b=0x00;
       }else {    
       port_b=0xff;
       }
     }    
   }
 

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2568
RE: Duda básica programación PICS en C
« Respuesta #8 en: 21 de Diciembre de 2004, 05:46:00 »
No sé en C2C, pero con CCS no es necesario decirle al compilador que tome las entradas como digitales, lo asume por defecto.

Desconectado ppalou

  • PIC10
  • *
  • Mensajes: 36
RE: Duda básica programación PICS en C
« Respuesta #9 en: 21 de Diciembre de 2004, 05:50:00 »
Este último ejemplo que he posteado está hecho con CCS. Y yo me supongo que los tiros debian ir por el tema de las entradas digitales porqué sino no sé porque no me funciona en un módelo de PIC y en otro sí.

Escrito originalmente por pocher
No sé en C2C, pero con CCS no es necesario decirle al compilador que tome las entradas como digitales, lo asume por defecto.

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2568
RE: Duda básica programación PICS en C
« Respuesta #10 en: 21 de Diciembre de 2004, 06:00:00 »
Te has percatado que en FUSES tienes RC en lugar de XT?

Desconectado ppalou

  • PIC10
  • *
  • Mensajes: 36
RE: Duda básica programación PICS en C
« Respuesta #11 en: 21 de Diciembre de 2004, 06:07:00 »
Sí, es que he pasteado el código pero cuando hago la prueba en una u otra PIC modifico los FUSES para que funcione correctamente. Lo de RC lo probé por si hacia algo mal usando el XTAL pero tampoco era eso, es que el oscilador me funciona bien con las 2 combinaciones, RC y XT.

Escrito originalmente por pocher
Te has percatado que en FUSES tienes RC en lugar de XT?

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2568
RE: Duda básica programación PICS en C
« Respuesta #12 en: 21 de Diciembre de 2004, 06:32:00 »
Pués el código está bien, puedes quitarle las referencias al ADCON1 que no hacen falta.

El funcionamiento es: si no pulsas ninguna entrada ----> salidas en 0
Si pulsas alguna entrada -----> salidas en 1

Repasa las conexiones.


 

anything