Autor Tema: Ayuda con puertos en ejercicio  (Leído 4306 veces)

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

Desconectado Thulsa Doom

  • PIC24F
  • *****
  • Mensajes: 771
    • https://electronicadicto.wordpress.com/
Ayuda con puertos en ejercicio
« en: 07 de Junio de 2010, 15:28:15 »
Hola a todos, soy muy nuevo en la programación de microcontroladores en lenguaje C, con el ASM si tengo experiencia pero con C muy poco.

 Estoy haciendo unos ejercicios que tengo en un libro y uno de esos ejercicios es encender y apagar un led por medio de un interruptor, el puerto utilizado es el B, en el B0 está el interruptor y en el B1 el LED.

El PIC utilizado es el PIC16F876

Pues bien, el problema que tengo es que quiero modificar la práctica para utilizar el puerto A como entrada del interruptor (RA0), pero no me funciona

 Si utilizo los puertos B y C el código me funciona perfectamente.

Llevo un par de días trabado con esto y no consigo sacarlo.

La verdad es que el libro va demasiado rápido y para alguien que empieza desde 0 en C se hace un poco difícil.

Para complementar tengo que utilizar otro libro de programación en C.

Si alguien me puede echar una mano y decir en que estoy fallando lo agradecería.

El código que he modificado es este



#include <16F876.h>  //Librería del pic16f876
#fuses XT,NOWDT
#use delay( clock = 4000000 )  //Configuramos el relog a 4MHz
#BYTE TRISA = 0x85            //Define la posición de TRISA en la dirección 85h
#BYTE TRISB = 0x86            //definimos la posicion de TRISB en 86h
#BYTE PORTA = 0x05            //Define la posición de PORTA en la dirección 05h
#BYTE PORTB = 0x06            //definimos la posicion de PORTB en 06h
#BYTE OPTION_REG = 0x81       //definimos la posición de OPTION en 0x81

// zona de programa

void main () {
       bit_clear(OPTION_REG,7);      /*Habilitación del pull-up, poniendo a 0 el bit 7
                                       del registro OPTION que su variable es RPBU*/
       bit_set(TRISA,0);             //Se configura el pin RA0 como entrada
       bit_clear(TRISB,1);           //Se configura el pin RB1 como salida
       bit_clear(PORTB,1);           //Apagamos el led en la salida RB1

       while (TRUE){
  
         if (bit_test(porta,0) == 1 )  //si RA0 es 1, apaga el LED que está en el puerto RB1
                 bit_clear(portb,1);
   else
         bit_set(portb,1);      //si RA0 = 0, enciende el LED
   }
}


Gracias a todos por la ayuda
« Última modificación: 07 de Junio de 2010, 15:33:58 por Thulsa Doom »
Más códigos y desarrollos en https://electronicadicto.wordpress.com/ date una vuelta y curiosea un rato...

Desconectado Thulsa Doom

  • PIC24F
  • *****
  • Mensajes: 771
    • https://electronicadicto.wordpress.com/
Re: Ayuda con puertos en ejercicio
« Respuesta #1 en: 08 de Junio de 2010, 12:16:18 »
¿nadie me puede orientar a ver por que me está fallando este código?
Más códigos y desarrollos en https://electronicadicto.wordpress.com/ date una vuelta y curiosea un rato...

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Ayuda con puertos en ejercicio
« Respuesta #2 en: 08 de Junio de 2010, 14:55:44 »
Hola, en la hoja de características dice cómo configurar el puerto A como entradas digitales. Creo que en ese pic, RA0 se inicializa como analógico por default.

Desconectado willynovi

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 546
Re: Ayuda con puertos en ejercicio
« Respuesta #3 en: 08 de Junio de 2010, 15:55:15 »
como regla general cuando se trabaja con un micro controlador que dispone de conversores A/D es conveniente inicializarlos como entradas digitales, y luego a necesidad inicializar cada conversor o conjunto de A/D.

No especificas bien que C es el que usas, en caso que sea el C18 te recomiendo las siguientes lecturas
MPLAB C18 C COMPILER USER´S GUIDE http://ww1.microchip.com/downloads/en/DeviceDoc/51288c.pdf
MPLAB C18 C COMPILER LIBRARIES http://ww1.microchip.com/downloads/en/devicedoc/mplab_c18_libraries_51297f.pdf

Lo que a continuacion expongo no estoy 100% seguro, habra que investigar un poco pero creo que te ayudará.

Código: [Seleccionar]
#include<p16cxxx.h>
//si incluyes esta linea, luego no te es necesario definir cada registro y puerto por su dirección,
//sino que ya estan definidos, entonces tienes acceso de la siguiente forma.

#define mInitSwitch1()      TRISAbits.TRISA0=1;      //Define el RA0 como entrada
#define sw1                 PORTAbits.RA0            //Define sw1 como RA0
#define mInitLED_1()        LATBbits.LATB1=0; TRISBbits.TRISB1=0;     //Inicia RB1 como salida a en nivel bajo (Led apagado)
#define mLED_1              LATBbits.LATB1           //Define mLED_1 como RB1
#define mLED_1_On()         mLED_1 = 1;              //Funcion para encender LED 1
#define mLED_1_Off()        mLED_1 = 0;              //Funcion para apagar LED 1
#define mLED_1_Toggle()     mLED_1 = !mLED_1;        //Cambiar estado de LED 1

Luego en tu programa no haces mas que escribir:

Código: [Seleccionar]
void main ()
{
   bit_clear(OPTION_REG,7);      /*Habilitación del pull-up, poniendo a 0 el bit 7
                                   del registro OPTION que su variable es RPBU*/
   mInitSwitch1();
   mInitLED_1();

   while (TRUE)
   {
      if(sw1 == 1)
         mLED_1_Off();
      else
         mLED_1_On();
   }
}

Quizas al principio te resulte incomodo, pero con el tiempo veras que tus programas resultan mas simples para leer y poder depurar errores.
Intento enseñarte a pescar, si solo quieres pescados, espera que un pescador te regale los suyos.

Desconectado Thulsa Doom

  • PIC24F
  • *****
  • Mensajes: 771
    • https://electronicadicto.wordpress.com/
Re: Ayuda con puertos en ejercicio
« Respuesta #4 en: 08 de Junio de 2010, 18:20:40 »
Muchas gracias por la ayuda, pido perdón por no haber puesto toda la información de un principio, pero pensaba que todos los compiladores utilizan los mismos códigos de programación, pero por lo que estoy dándome cuenta,  no es así (más difícil me lo ponen), el compilador que uso es el CCS C.

 La verdad es que estoy muy verde en C y es más, por lo que veo es diferente el C general que el C para microcontroladores.
Entiendo mejor el ASM pero me quiero pasar al C por la potencia que dicen que tiene.
 Se me está haciendo muy complicado porque el tipo de información que encuentro, está más bien orientada a gente que ya tiene un cierto nivel, y para los novatos como yo se nos hace muy difícil
 Como he comentado en el primer post, me he comprado un libro que supuestamente te introduce a la programación de microcontroladores en lenguaje C, el problema es que da muchas cosas por sentadas, pero hay cosas que las entiendo un poco porque he dominado el ASM y hay cosas que no hace falta que me expliquen,  pero a la hora de traspasar eso a C se me complica.
No sé si me explico bien.
Voy a hacer los consejos que me comentan pero sé que me costará mucho.
Gracias a todos por vuestra paciencia y ayuda
Más códigos y desarrollos en https://electronicadicto.wordpress.com/ date una vuelta y curiosea un rato...

Desconectado willynovi

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 546
Re: Ayuda con puertos en ejercicio
« Respuesta #5 en: 08 de Junio de 2010, 19:11:11 »
no creo que los C sean muy diferentes uno a otros, por ahi el uso de librerias si, pero lo basico es igual.

Quizas te conviene ver algun ejemplo de un programa funcional, por lo general esta comentado asi vas viendo que es lo que hace.

Y cualquier duda, por mas tonta que pienses que sea, no dudes en consultar, aqui estaremos para ayudarte, desde mi humilde experiencia con los micros.

Saludos
Intento enseñarte a pescar, si solo quieres pescados, espera que un pescador te regale los suyos.

Desconectado Thulsa Doom

  • PIC24F
  • *****
  • Mensajes: 771
    • https://electronicadicto.wordpress.com/
Re: Ayuda con puertos en ejercicio
« Respuesta #6 en: 09 de Junio de 2010, 14:56:59 »
Les doy las gracias por el interés mostrado, seguiré practicando y si tengo alguna duda lo posteo
Más códigos y desarrollos en https://electronicadicto.wordpress.com/ date una vuelta y curiosea un rato...

Desconectado Thulsa Doom

  • PIC24F
  • *****
  • Mensajes: 771
    • https://electronicadicto.wordpress.com/
Re: Ayuda con puertos en ejercicio
« Respuesta #7 en: 09 de Junio de 2010, 18:37:49 »
Ya sé cuál es el problema, lo que pasa es que yo estaba cargando el hex en el proteus y al parecer le pasa algo por que el puerto A no funciona, hago un código que utilice el puerto A y este se vuelve loco y no funciona.
Al final si que estaba haciendo bien las cosas
¿Alguien sabe cómo arreglar el proteus para que no pase esto?

EDITADO:

Como el problema que tengo ya no pertenece a esta sección, he abierto otra sección comentando éste problema que tengo
http://www.todopic.com.ar/foros/index.php?topic=30977.0

saludos
« Última modificación: 10 de Junio de 2010, 12:57:08 por Thulsa Doom »
Más códigos y desarrollos en https://electronicadicto.wordpress.com/ date una vuelta y curiosea un rato...