Autor Tema: Problema. Led que no se enciende con pulsador.  (Leído 9741 veces)

0 Usuarios y 2 Visitantes están viendo este tema.

Desconectado edu1989

  • PIC18
  • ****
  • Mensajes: 275
Re: Problema. Led que no se enciende con pulsador.
« Respuesta #15 en: 11 de Noviembre de 2010, 16:47:12 »
En los 18 no, quedan configurados como entradas analogicas :)

O eso creo claro, porque aqui nunca se puede decir nada seguro jej

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Problema. Led que no se enciende con pulsador.
« Respuesta #16 en: 11 de Noviembre de 2010, 17:05:04 »
Si, estaba viendo el datasheet.

Creo que puede haber algún error en tu #define PORTBIT(adr,bit)((unsigned)(&adr)*8+(bit) porque te falta cerrar un paréntesis y está todo junto.

tal vez probar así

#define PORTBIT(adr,bit) (unsigned)&adr*8 +bit

de esa manera lo use en unas funciones y trabajó bien.

Pero yo haría algo más fácil aún, escribiría el código así...


while (1)
{
  if (RA1 == 0) RB1 = 1;
  else
    RB1 = 0;
}
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Problema. Led que no se enciende con pulsador.
« Respuesta #17 en: 11 de Noviembre de 2010, 17:49:33 »
Instalé el Hitech para PIC 18 e hice este programita. Funciona bien simulado en proteus, pero por supuesto falta toda la configuración de los FUSES. Tuve que utilizar una resistencia de 10K entre el pin MCLR y VDD, seguramente será porque por defecto dicho pin funciona como MCLR y no como RE3.

Código: C
  1. #include <htc.h>
  2.  
  3. void main (void)
  4. {
  5.   ADCON1 = 0x0F;
  6.   TRISB = 0;
  7.   TRISA = 2;
  8.   while (1)
  9.   {
  10.     if (RA1 == 0) RB1 = 1;
  11.     else
  12.       RB1 = 0;
  13.   }
  14. }
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado edu1989

  • PIC18
  • ****
  • Mensajes: 275
Re: Problema. Led que no se enciende con pulsador.
« Respuesta #18 en: 11 de Noviembre de 2010, 19:18:40 »
Puedes adjuntarme la simulacion de proteus si no te sabe mal?
Muchas gracias eh, macho te has bajado hasta el Hi-tech.. te lo agradezco mucho d verdad ;)

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Problema. Led que no se enciende con pulsador.
« Respuesta #19 en: 11 de Noviembre de 2010, 19:38:53 »
No hay drama, aunque es tan sencillo que no le veo demasiado utilidad el subirlo pero....

Está hecho con el Protesu 7.7 sp2. Si no te corre te lo subo pero como foto así lo armás vos. Acordate que al pic hay que cargarle el programa, hay que usar el archivo .cof generado por tu compilador.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado edu1989

  • PIC18
  • ****
  • Mensajes: 275
Re: Problema. Led que no se enciende con pulsador.
« Respuesta #20 en: 12 de Noviembre de 2010, 05:26:23 »
Angel, una pregunta:

 
       ADCON1 = 0x0F; // Esta linea pone como digitales R0 R1 R2 R4
  
       TRISB = 0; / esta linea no lo entiendo, lo estas poniendo en decimal no? Porque a trisb le pones un 0 y a trisA un 2 si las dos estan conectados a RA1 o RB1( en todo caso a la pata 1)
  
       TRISA = 2;
  
   Es que quiero que me quede clarisimo! Muchas gracias de antemano.

Edito1: Yo para dar alimentacion a la pata donde va el pulsador tenia una fuente de tension dc. Como haces eso de VCC? coges una entrada y pones vcc pero como sabes a quantos voltios esta?

Edito2: El registro ADCON1 no habria que usarlo en el pulsador en vez de en el led? O en todo caso en los dos lugares no?
« Última modificación: 12 de Noviembre de 2010, 05:33:14 por edu1989 »

Desconectado edu1989

  • PIC18
  • ****
  • Mensajes: 275
Re: Problema. Led que no se enciende con pulsador.
« Respuesta #21 en: 12 de Noviembre de 2010, 08:29:21 »
Sigo con mas dudas... tengo muchas eh!
Quiero hacer un timer para controlar bien el tiempo de delay ( quiero que sea de 1 segundo)

while (1)
 {
retardo(delay);
RB1=j;
retardo(delay);
    if (RA1 == 0)
      j=j^1; //porta xor valors iguals 0, valors dif 1

  }

retardo es una funcion que la tengo a medio hacer...:

void retard(unsigned delay)
{
T08BIT=1; //Configurar el timer0 a 8 bits
TOCS=0; // Seleccionamos el oscilador interno
PSA=0; // Habilitamos el prescaler
T0PS2=
T0PS1=                   //Para configurar el preescalado...
T0PS0=

//SE QUE AL FINAL TIENE QUE HABER UNA SENTENCIA DE ESTE TIPO QUE NOS DE EL DELAY REAL.
delay=delay+retardo_extra;

}

Como hago la cuenta para saber que preescalado necesito?
La frequencia de operacion es la frequencia de reloj?

Los calculos que tengo hechos ya.. es que el ciclo de instruccion son 83.30ns ( (1/48x10^6)/4). Considerando la freq de reloj igual a la frequencia de operacion (48Mhz). Una vez aqui se que delay x 2^n (bits timer)> 1segundo. Se que aqui es donde cometo el error porque no tengo en cuenta el preescalado...

Tengo un lio mental importante...

Gracias de antemano.

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Problema. Led que no se enciende con pulsador.
« Respuesta #22 en: 12 de Noviembre de 2010, 09:42:35 »
Angel, una pregunta:

 
       ADCON1 = 0x0F; // Esta linea pone como digitales R0 R1 R2 R4
  
       TRISB = 0; / esta linea no lo entiendo, lo estas poniendo en decimal no? Porque a trisb le pones un 0 y a trisA un 2 si las dos estan conectados a RA1 o RB1( en todo caso a la pata 1)
  
       TRISA = 2;
  
   Es que quiero que me quede clarisimo! Muchas gracias de antemano.

Edito1: Yo para dar alimentacion a la pata donde va el pulsador tenia una fuente de tension dc. Como haces eso de VCC? coges una entrada y pones vcc pero como sabes a quantos voltios esta?

Edito2: El registro ADCON1 no habria que usarlo en el pulsador en vez de en el led? O en todo caso en los dos lugares no?

  Vayamos por partes....

  En la página 176 del documento DS39760B -que es el datasheet que tengo del 18F2550 y 18F4550- muestra que los bits PCFG0 a PCFG3 (que son el nibble bajo) del registro ADCON1 sirven para determinar si los pines servirán como entradas analógicas o como pines digitales. En mi caso configuré para que todos los pines funcionen como digitales.

  TRISB = 0 : Sí, está en decimal. Puesto en binario sería 0b00000000, es decir que todos los pines del puerto B se van a comportar como salida.

  TRISA = 2 : También está en decimal. Puesto en binario sería 0b00000010, es decir que el único pin del puerto A que va a funcionar como entrada es RA1.

  Recordá que cada puerto tiene su correspondiente registro TRIS y sirve para configurarlo como entrada o salida. Para recordar fácilmente cuando se configura como entrada y cuando como salida yo pienso en lo siguiente 1nput  0utput.

  Todo esto que acabo de escribir está en el datasheet, por ello mi insistencia en su lectura.

  Con respecto al punto "Edito1" Sí le ponés una fuente de alimentación directo al pin, cuando presiones el pulsador -que queda conectado a GND- vas a provocar un cortocircuito.
La resistencia que yo conecté desde el pin del pulsador a VCC se denomina resistencia de "Pull-up", porque "empuja" a dicho pin a tener un valor positivo.
Como la entrada del pic consume muy poca corriente, el valor de tensión que se termina desarrollando en dicho terminal es VCC (o infinitamente cercano). Excepto cuando presiono el pulsador, momento en el cual el pin queda conectado a GND y no se produce corto porque no tengo una fuente directa sino que está la resistencia de pull-up.

  También se pueden utilizar resistencias de "Pull-Down" que irían de un pin determinado hacia GND en lugar de positivo.


  Te recomiendo que hagas algo bien sencillo, armá en el Proteus un ciruito tan simple como 2 resistencias en serie con una fuente VCC de 5V y midas tensión en una de las resistencias.
Te lo describo más o menos en modo texto. RA de 10K y RB de 1M. RA_pin1 a VCC, RA_pin2 a RB_pin1, RB_pin2 a GND. Y medí la tensión entre RB_pin1 y RB_pin2.... vas a ver que te da 5V o un valor muy muy cercano.
En este ejemplo RA sería la de Pull-up y RB sería la interna del pic.

Con respecto al punto "Edito2" creo que ya quedó respondido.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Problema. Led que no se enciende con pulsador.
« Respuesta #23 en: 12 de Noviembre de 2010, 10:13:21 »
Sigo con mas dudas... tengo muchas eh!
Quiero hacer un timer para controlar bien el tiempo de delay ( quiero que sea de 1 segundo)

while (1)
 {
retardo(delay);
RB1=j;
retardo(delay);
    if (RA1 == 0)
      j=j^1; //porta xor valors iguals 0, valors dif 1

  }

retardo es una funcion que la tengo a medio hacer...:

void retard(unsigned delay)
{
T08BIT=1; //Configurar el timer0 a 8 bits
TOCS=0; // Seleccionamos el oscilador interno
PSA=0; // Habilitamos el prescaler
T0PS2=
T0PS1=                   //Para configurar el preescalado...
T0PS0=

//SE QUE AL FINAL TIENE QUE HABER UNA SENTENCIA DE ESTE TIPO QUE NOS DE EL DELAY REAL.
delay=delay+retardo_extra;

}

Como hago la cuenta para saber que preescalado necesito?
La frequencia de operacion es la frequencia de reloj?

Los calculos que tengo hechos ya.. es que el ciclo de instruccion son 83.30ns ( (1/48x10^6)/4). Considerando la freq de reloj igual a la frequencia de operacion (48Mhz). Una vez aqui se que delay x 2^n (bits timer)> 1segundo. Se que aqui es donde cometo el error porque no tengo en cuenta el preescalado...

Tengo un lio mental importante...

Gracias de antemano.

 
  El delay real en C es muy difícil porque no tenemos una manera de controlar el tiempo que insumen las instrucciones. En assembler es otro cantar y ahí si podemos ir viendo el tiempo con extrema precisión.

  En la página 284 del datasheet dice TCY = 4/Fosc. Sería que el ciclo de instrucción insume un tiempo de 4/Frecuencia de oscilación. En tu caso serían los 83.3nS.

  Para calcular el prescaler tendrías que dividir el tiempo que querés contar (1S en tu caso) sobre el tiempo de instrucción. Si hacemos la cuenta da 12 millones y moneda....

  Si hacés trabajar el timer0 en 8 bits (va a poder contar hasta 256 y se va a reiniciar y activar el flag de interrupción) multiplicalo por un prescaler de 256 da una cuenta de 256 * 256 *83.3ns = 5.459 mS.
  O sea que no es suficiente. Entonces hay que implementar una variable que vaya aumentando cada vez que se produzca una interrupción del timer0. Cuando tu variable llegue a un valor X es que vas a haber contado 1 segundo. Mas o menos sería cuando la variable llegue a 184.

  No estoy familiarizado con la programación de los 18Fxxx.

  Yo creo que sería bueno empezar con algo más sencillo que no te implique tanto cálculo. O tal vez hacer cuentas menores para llegar más fácilmente.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado lopb

  • PIC12
  • **
  • Mensajes: 77
    • contactos lopb
Re: Problema. Led que no se enciende con pulsador.
« Respuesta #24 en: 12 de Noviembre de 2010, 12:27:49 »
Uso el Hi-tech picc18. El pic es el 18f4550, a ver si podeis ayudarme..
Gracias
sorry, no se de hi-tech, ya desconocia el codigo,por eso te preguntaba,
suerte

Desconectado edu1989

  • PIC18
  • ****
  • Mensajes: 275
Re: Problema. Led que no se enciende con pulsador.
« Respuesta #25 en: 16 de Noviembre de 2010, 18:17:10 »
Muchas gracias por vuestras respuestas.

Me estoy planteando ya ( aunque voy a seguir haciendo algun programita mas..) el objetivo con el que empece con esto de los PICS, usar el puerto serie.
Les dejo un pequeño programita de puerto serie a ver que les parece, esta compilado sin errores pero aun no he probado si funciona o no.. seguro que me faltan cosas..
Simplemente se trata de que se vaya enviando " Hola mundo" por el puerto serie. Posteriormente hare tambien que se puedan recibir..

#include <htc.h>
#include <stdlib.h>
//#include <pic18f4550.h>

/*
;******** Configuracion del Oscilador **********
CONFIG FOSC = XT_XT         ;Osc XT, XT usado para el USB

;******** Otros bits de configuracion **********
CONFIG PWRT = ON ;PWRT habilitado
CONFIG BOR  = OFF ;Brown out resete deshabilitado
CONFIG WDT = OFF ;Watch dog deshabilitado
CONFIG  MCLRE = OFF ;MCLR como entrada
CONFIG PBADEN = ON ;Todos los pines como entradas analogicas
CONFIG LVP = OFF ;programacion en bajo voltaje deshabilitado

;********* Bits de proteccion ******************
CONFIG CP0 = OFF ;los bloques del codigo de programa
CONFIG CP1 = OFF ;no estan protegidos
CONFIG CP2 = OFF
CONFIG CP3 = OFF
CONFIG CPB = OFF ;Sector Boot no esta protegido
CONFIG CPD = OFF ;La EEPROM no esta protegida
*/
void serial_setup(void);
void putch(unsigned char);


void main (void)
{
 
 
 serial_setup();
 while(1)
 {
  char c="Hola mundo";   
 putch(c);
 
 }
 
  
}



void serial_setup(void)
{
SYNC=0; //Asincrono
SPEN=1; // ENABLE SERIAL PORT

CREN=0; // DESACTIVAR RECEPCION
TXIE=1; // ACTIVAR INTERRUPCIONES TX
RCIE=0; // DESACTIVAR INTERRUPCIONES RX

TX9=0; // 8 BITS TRANSMISION
TXEN=1; // ACTIVAR TRANSMISOR

unsigned char dummy;

#define clear_usart_errors_inline
      if (OERR) // // Overun Error Bit ( forma parte del registro RCSTA)
      {
         TXEN=0; //DESACTIVAR TRANSMISOR
         TXEN=1;//ACTIVAR TRANSMISOR
         CREN=0; // DESACTIVAR RECEPCION
         CREN=1; // ACTIVAR RECEPCION
      }

      if (FERR) // Framing Error Bit
      {
         dummy=RCREG; // se guarda el bit que esta mal en dummy
         TXEN=0; //DESACTIVAR TRANSMISOR
         TXEN=1;//ACTIVAR TRANSMISOR
      }



}

void putch(unsigned char c)
{
   while(!TXIF) // 1 si el registro esta vacio
   {
      clear_usart_errors_inline;
      CLRWDT();
   }
   TXREG=c;

}

Muchas gracias a todos por vuestra ayuda. La verdad es que estoy entiendo muchas cosas que no entendia antes ccon vuestra ayuda

Edito: He probado el programa con el proteus poniendo un terminal virtual y no funciona... he conectado la tx al rc6 y la rx al rc7. Estos pins tengo que declarlos como salida? mas que nada el rc6 ( transmissor) ya que solo transmito.
« Última modificación: 16 de Noviembre de 2010, 18:43:28 por edu1989 »

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Problema. Led que no se enciende con pulsador.
« Respuesta #26 en: 16 de Noviembre de 2010, 20:16:33 »
  Yo te recomiendo que habrás un nuevo post con ésta última duda. Igualmente siempre es conveniente usar el buscador del foro porque tal vez ya esté tratado este tema y encuentres la solución rápidamente.

edito:

  Intenté compilar el programa y tira varios errores. Mirando bien el código noto que tenés definiciones de variables pero diseminadas por el programa. Las variables hay que definirlas al comienzo ya sea del main o de cada función.

  Una de esas variables (c) la definís del tipo char pero la querés inicializar con una cadana de caracteres. Char genera variables de 8 bits así que no podés inicializarla con una cadena. Para ello tenés que definir un "puntero del tipo char" que se hace colocando la definición así:  char * c = "Hola Mundo" (tiene que estar el asterísco para indicar que es un puntero).

  Otro problema que noto es que no configurás la velocidad de transmisión.

  Amen de lo anterior parece ser que copiaste (pido disculpas de antemano si es que no es así) el código de un ejemplo que se encuentra en www.microchipc.com pero está mal el "#define clear_usart_errors_inline" ya que a ésta y las líneas siguientes hay que colocarles la barra invertida ( "\" ) al final de cada renglón.
« Última modificación: 16 de Noviembre de 2010, 23:46:43 por AngelGris »
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado edu1989

  • PIC18
  • ****
  • Mensajes: 275
Re: Problema. Led que no se enciende con pulsador.
« Respuesta #27 en: 17 de Noviembre de 2010, 05:23:21 »
AngelCris acabo de cambiar todo lo que me has dicho, compila bien pero sigue sin funcionar. Si, el ejemplo es una modificacion de un programa de microchipc.
Ahi les pongo otra vez el codigo y les adjunto la simulacion de proteus. Si sacamos algo en claro del tema abrire un nuevo post para explicarlo en todo detalle.
Muchas gracias por vuestra ayuda amigos.

#include <htc.h>
#include <stdlib.h>
//#include <pic18f4550.h>

/*
;******** Configuracion del Oscilador **********
CONFIG FOSC = XT_XT         ;Osc XT, XT usado para el USB

;******** Otros bits de configuracion **********
CONFIG PWRT = ON ;PWRT habilitado
CONFIG BOR  = OFF ;Brown out resete deshabilitado
CONFIG WDT = OFF ;Watch dog deshabilitado
CONFIG  MCLRE = OFF ;MCLR como entrada
CONFIG PBADEN = ON ;Todos los pines como entradas analogicas
CONFIG LVP = OFF ;programacion en bajo voltaje deshabilitado

;********* Bits de proteccion ******************
CONFIG CP0 = OFF ;los bloques del codigo de programa
CONFIG CP1 = OFF ;no estan protegidos
CONFIG CP2 = OFF
CONFIG CP3 = OFF
CONFIG CPB = OFF ;Sector Boot no esta protegido
CONFIG CPD = OFF ;La EEPROM no esta protegida
*/
void serial_setup(void);
void putch(unsigned char);

unsigned char dummy;

void main (void)
{
 char c ="h";
 
 serial_setup();
 while(1)
 {
  putch(c);
  }
 
 
}



void serial_setup(void)
{

SYNC=0; //Asincrono
SPEN=1; // ENABLE SERIAL PORT

CREN=0; // DESACTIVAR RECEPCION
TXIE=1; // ACTIVAR INTERRUPCIONES TX
RCIE=0; // DESACTIVAR INTERRUPCIONES RX

TX9=0; // 8 BITS TRANSMISION
TXEN=1; // ACTIVAR TRANSMISOR


#define clear_usart_errors_inline   \
if (OERR)                                       \
{                                                   \
   TXEN=0;                                       \
   TXEN=1;                                       \
   CREN=0;                                       \
   CREN=1;                                       \
}                                                   \
if (FERR)                                       \
{                                                   \
   dummy=RCREG;                              \
   TXEN=0;                                       \
   TXEN=1;                                       \
}



}

void putch(unsigned char c)
{
   while(!TXIF) // 1 si el registro esta vacio
   {
      clear_usart_errors_inline;
      CLRWDT();
   }
   TXREG=c;

}

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Problema. Led que no se enciende con pulsador.
« Respuesta #28 en: 17 de Noviembre de 2010, 09:25:52 »
  Insisto en que te falta configurar la velocidad.

  De hecho, la configuré como explica el datasheet, a 9600 y configuré el terminal virtual del proteus también a dicha velocidad y funciona joya.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado tecnic

  • PIC10
  • *
  • Mensajes: 26
Re: Problema. Led que no se enciende con pulsador.
« Respuesta #29 en: 17 de Noviembre de 2010, 17:14:32 »
Hola edu , con respecto al primer programita del led y el pulsador, si bien yo no utilizo el compilador Hi-tech , lo que me parece raro es cuando entras al while(1) infinito, vos haces lo siguiente=>

 while(1){
if(polsador==0)
LED=1;
else
LED=0;

}

vos estas preguntando por el estado del pulsador dentro del if, pero para ello , antes tendrias que leer el estado del pulsador y asignarlo a una variable previamente definida y cada ves que el loop vuelve a empezar, volver a leer el estado del pulsador y asi sucesivamente .
por ejemplo definis una variable "estado" y haces algo asi:

estado=polsador;  // esta seria la lectura antes de entrar al while
while(1)
{
if(estado==0)
LED=1;
else
LED=0;
estado=polsador; // y aca vuelvo a leer el estado del pulsador

}

es decir por cada pasada por el while, vuelvo a leer el estado del pulsador , porque si no hago esto, no sabria, cual es el valor actual del pulsador, yo creo que puede ser ese el problema, aunque no conosco el compilador hi-tech.
saludos!!
 

« Última modificación: 17 de Noviembre de 2010, 17:16:43 por tecnic »