Autor Tema: iniciacion con PIC 18f4550  (Leído 7902 veces)

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

Desconectado rbpkirow

  • PIC10
  • *
  • Mensajes: 21
iniciacion con PIC 18f4550
« en: 01 de Abril de 2011, 09:47:17 »
Hola a tod@s.
Estoy empezando un pequeño proyecto con el pic 18f4550 y estoy teniendo una serie de problemas que no veo solucion.
Estoy empezando con el pic, de modo que lo primero que necesito es configurar el pic correctamente y encender/apagar un par de led's y comprobar el funcionamiento de un pulsador.
Para lo primero, tengo el siguiente codigo programado en PICC:
Código: [Seleccionar]
#include <htc.h>
__CONFIG (2, VREGEN & PWRTDIS & BOREN & BORV20 & WDTDIS & WDTPS32K);
__CONFIG (3, CCP2RC1 & PBADDIS & LPT1DIS & MCLREN);
__CONFIG (4, STVREN & LVPDIS & XINSTDIS & DEBUGDIS);

#define LED_1 RA0
#define LED_2 RA1
#define LED_3 RA2


void init_PIC();

void main()
{
long int i = 0;
long int j = 0;

// inicializacion de PIC.
init_PIC();

LED_1 = 1;
LED_2 = 1;
LED_3 = 0;

while(1)
{
LED_1 = 1;
LED_2 = !LED_2;
LED_3 = !LED_3;

for(i=0;i<65000;i++)
{
}
}
}



void init_PIC()
{

TRISA = 0b00000000; // 0 = salida ==
TRISB = 0b00000000; // 1 = entrada == SENSORES
TRISC = 0b00000000; // 0 = salida ==
TRISD = 0b00000000; // 0 = salida ==

// OSCCON
OSCCON = 0b01100110;

}


Como ven, simplemente es un parpadeo de 3 led, pero no me funciona, alguien me puede ayudar a saber porqué no funciona?

un saludo
Muchas gracia
rbpkirow

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: iniciacion con PIC 18f4550
« Respuesta #1 en: 01 de Abril de 2011, 10:00:14 »
  Los pines que has elegido para manejar los leds también pueden funcionar como entradas analógicas. También veo que te está faltando la configuración de los mismos, es decir, si es que van a trabajar como entrada o como salida. Para configurar ello debes modificar el valor del registro TRIS correspondiente.

  Lo ideal sería leer bien detenidamente el datasheet del PIC, para poder saber sus posibilidades de configuración.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado rbpkirow

  • PIC10
  • *
  • Mensajes: 21
Re: iniciacion con PIC 18f4550
« Respuesta #2 en: 01 de Abril de 2011, 11:35:18 »
Hola AngelGris.
Primero queria agradecerte el tiempo dedicado a leer y responder a mi tema.

Por otro lado, creo que la configuracion es correcta, evidentemente no lo es, porque sino funcionaría como debe.
Los diodos LED los tengo conectados a los pines RA0, RA1 y RA2, pines que pueden funcionar como entrada/salida segun este configurado el puerto TRISA, como bien indicas.

Si te fijas, lo primero que hago en el codigo es llamar a una funcion Init_PIC en la que configuro el oscilador interno como oscilador principal y a una frecuencia de 4MHz. Tambien configuro el puerto A como salida (TRISA = 0b00000000) para los led.
Una vez hecho esto, es cuando activo los diodos.

No se si se me ha olvidado algo, porque con un pic16f886 tengo que indicarle que los datos son digitales con el puerto ANSEL = 0, pero en el datasheet del 18f4550 no he visto este registro en ningun banco.

muchas gracias
rbpkirow

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: iniciacion con PIC 18f4550
« Respuesta #3 en: 01 de Abril de 2011, 12:01:13 »
  Uy, perdón, no había visto la parte del init_pic

  Creo que el problema está en que debes indicar en los bits de configuración que vas a utilizar el oscilador interno. Para ello hay que configurar la primer palabra.

  Fijate en el datasheet en la configuración de la palabra "CONFIG1H" los bits FOSC3 a FOSC0, con ellos se determina el tipo de oscilador.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado alvaro2043

  • PIC10
  • *
  • Mensajes: 41
Re: iniciacion con PIC 18f4550
« Respuesta #4 en: 01 de Marzo de 2015, 02:34:59 »
Buenas noches he iniciado de nuevo a programar el PIC18f4550 para comenzar estoy utilizando un pulsador para hacer que un LED se encienda hasta que se suelte y despues de suelto hacer otra accion, pero he tenido problemas ya que veo que el pulsador no me esta realizando NADA. El pulsador esta conectado de la siguiente manera. Una de sus patillas esta conectada a GND la otra esta conectada a una resistencia de 10K y al Pin RD1 del micro, la otra punta de la resistencia esta conectada a Vdd. No entiendo porq el pulsador no me esta realizando lo que yo quiero. Anexo el codigo.

Lo que deberia de suceder cuando pulso SW1 es que el led me quede en 1 (Encendido) y cuando lo suelte parpadeé-

Código: [Seleccionar]
/*Configuracion de Bits*/

#pragma config PLLDIV = 2  //Cristal de 8Mhz lo dividimos entre 2 para tener los 4Mhz
#pragma config CPUDIV = OSC1_PLL2  //Los 96Mhz de PLL lo dividimos entre 2 para tener los 48Mhz con lo que vamos a trabajar
#pragma config USBDIV = 2  /////Tomar el reloj para USB desde el PLL- 48Mhz
#pragma config FOSC = HSPLL_HS
#pragma config FCMEN = OFF
#pragma config IESO = OFF
#pragma config PWRT = OFF
#pragma config BOR = OFF
#pragma config BORV = 0
#pragma config VREGEN = OFF
#pragma config WDT = OFF
#pragma config WDTPS = 16384
#pragma config MCLRE = OFF
#pragma config LPT1OSC = OFF
#pragma config PBADEN = ON
#pragma config CCP2MX = OFF
#pragma config STVREN = OFF
#pragma config LVP = OFF
#pragma config ICPRT = OFF
#pragma config XINST = OFF
#pragma config DEBUG = OFF
#pragma config CP0 = OFF,CP1 = OFF,CP2 = OFF,CP3 = OFF
#pragma config CPB = OFF
#pragma config CPD = OFF
#pragma config WRT0 = OFF,WRT1 = OFF,WRT2 = OFF,WRT3 = OFF
#pragma config WRTB = OFF
#pragma config WRTC = OFF
#pragma config WRTD = OFF
#pragma config EBTR0 = OFF
#pragma config EBTR1 = OFF,EBTR2 = OFF,EBTR3 = OFF

#include <p18f4550.h>
#include <delays.h>

#define LED1 LATDbits.LATD0
#define SW1  LATDbits.LATD1

void main(){
   
    TRISDbits.RD0=0; //Definimos el pin RD0 como salia.
    TRISDbits.RD1=1; //Definimos este pin como entrada.
 
    while (1){

        while(SW1){

            LED1=1;
            Delay10KTCYx(60);
            LED1=0;
            Delay10KTCYx(60);
        }
        LED1=1;

    }

}

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: iniciacion con PIC 18f4550
« Respuesta #5 en: 01 de Marzo de 2015, 05:50:09 »
Cambia el

Código: [Seleccionar]
#define SW1  LATDbits.LATD1
por

Código: [Seleccionar]
#define SW1  PORTDbits.RD1
Regla que simplifica el uso:
usa el PORTx para leer y el LATx para escribir.

Explicacion de que estas leyendo:
Si observas el diagrama el LATx modifica el flip flop D que el PIN, y de leer este registro estarias leyendo la salida de ese flip flop, es decir el terminal Q. Con lo que estas leyendo el valor del latch salida ( no su pin )
Si quisieras realmente saber que tension / estado esta el pin, usas PORTx, si observas el diagrama este toma del pin y lo lleva al bus de datos. Si quisieras cambiar la salida tambien podes hacerlo desde el PORTx escribiendo el mismo.

Es decir:
Salida:
Escribir LATx o PORTx

Entrada:
Leer de PORTx

Explicacion del por que realizarlo de esa manera:
Pero para que complicarla asi y no hacerlo como los PIC16?

Esto tiene una explicacion y es como funciona el PIC, el PIC funciona con el principio de "leer - modificar - escribir" cada intruccion hace eso.

Ahora suponete lo siguiente.
Ponemos a 1 el RD0 y la siguiente instruccion ponemos a 1 RD1.
Tambien imagina que en RD0 existe una gran capacidad en el pin, lo que hace que la tension se eleve lentamente.

PIC16:
1era instruccion: leo el PORTD ( 0000 0000 ) , modifico ( 0000 0001 ) y escribo
2da  instruccion: leo el PORTD ( 0000 0000 ) , modifico ( 0000 0010 ) y escribo

Pero que paso ? por que lei 0000 0000 cuando yo habia puesto en 1 antes a RD0? al crecer lentamente la tension cuando se ejecuto la otra instruccion el nucleo del PIC lee de nuevo el PORTD y se encuentra con un 0 logico. Terminando con el puerto el con el valor 0000 0010 y no 0000 0011 como uno queria. Y es el error que intenta evitarse

El PIC18 soluciona esto ya que no esta leyendo desde el pin, sino desde el latch de salida. asi que por mas crezca lentamente la tension en un pin, el latch esta puesto a 1 y no va a ocurrir lo anterior.
« Última modificación: 01 de Marzo de 2015, 06:32:29 por KILLERJC »

Desconectado elgarbe

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2178
Re: iniciacion con PIC 18f4550
« Respuesta #6 en: 01 de Marzo de 2015, 11:03:05 »
Cambia el

Código: [Seleccionar]
#define SW1  LATDbits.LATD1
por

Código: [Seleccionar]
#define SW1  PORTDbits.RD1
Regla que simplifica el uso:
usa el PORTx para leer y el LATx para escribir.

Explicacion de que estas leyendo:
Si observas el diagrama el LATx modifica el flip flop D que el PIN, y de leer este registro estarias leyendo la salida de ese flip flop, es decir el terminal Q. Con lo que estas leyendo el valor del latch salida ( no su pin )
Si quisieras realmente saber que tension / estado esta el pin, usas PORTx, si observas el diagrama este toma del pin y lo lleva al bus de datos. Si quisieras cambiar la salida tambien podes hacerlo desde el PORTx escribiendo el mismo.

Es decir:
Salida:
Escribir LATx o PORTx

Entrada:
Leer de PORTx

Explicacion del por que realizarlo de esa manera:
Pero para que complicarla asi y no hacerlo como los PIC16?

Esto tiene una explicacion y es como funciona el PIC, el PIC funciona con el principio de "leer - modificar - escribir" cada intruccion hace eso.

Ahora suponete lo siguiente.
Ponemos a 1 el RD0 y la siguiente instruccion ponemos a 1 RD1.
Tambien imagina que en RD0 existe una gran capacidad en el pin, lo que hace que la tension se eleve lentamente.

PIC16:
1era instruccion: leo el PORTD ( 0000 0000 ) , modifico ( 0000 0001 ) y escribo
2da  instruccion: leo el PORTD ( 0000 0000 ) , modifico ( 0000 0010 ) y escribo

Pero que paso ? por que lei 0000 0000 cuando yo habia puesto en 1 antes a RD0? al crecer lentamente la tension cuando se ejecuto la otra instruccion el nucleo del PIC lee de nuevo el PORTD y se encuentra con un 0 logico. Terminando con el puerto el con el valor 0000 0010 y no 0000 0011 como uno queria. Y es el error que intenta evitarse

El PIC18 soluciona esto ya que no esta leyendo desde el pin, sino desde el latch de salida. asi que por mas crezca lentamente la tension en un pin, el latch esta puesto a 1 y no va a ocurrir lo anterior.


+1! siempre tuve esa duda y siempre me daba fiaca ponerme a buscar, jeje, de casualidad estoy leyendo la respuesta acá!!!

Sds.
-
Leonardo Garberoglio

Desconectado alvaro2043

  • PIC10
  • *
  • Mensajes: 41
Re: iniciacion con PIC 18f4550
« Respuesta #7 en: 01 de Marzo de 2015, 13:24:07 »
+1! Gracias solucionado el problemita  :-/