Autor Tema: Cursillo en C18 para PICS DESDE CERO  (Leído 300276 veces)

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

Desconectado efrenn3000

  • PIC10
  • *
  • Mensajes: 2
Re: Cursillo en C18 para PICS DESDE CERO
« Respuesta #255 en: 02 de Junio de 2010, 14:22:27 »
Hola a todos...

alguien me podria ayudar a saber como calcular la resolucion del ADC si utilizo 10 bits y otra cosa si alguien sabe utilizar bien el PWM como calculo al Duty Cycle, o si tienen algun programa sencillo que me sirva de ejemplo, estoy usando el pic18f4550 y programo en C18

muchas gracias.

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Cursillo en C18 para PICS DESDE CERO
« Respuesta #256 en: 02 de Junio de 2010, 15:44:05 »
Hola a todos...

alguien me podria ayudar a saber como calcular la resolucion del ADC si utilizo 10 bits y otra cosa si alguien sabe utilizar bien el PWM como calculo al Duty Cycle, o si tienen algun programa sencillo que me sirva de ejemplo, estoy usando el pic18f4550 y programo en C18

muchas gracias.

En el datasheet se provee de la formula para calcular resolución. Dale una revisada al foro, y con ayuda del buscador vas a encontrar bastante información de PWM.


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado dani

  • PIC10
  • *
  • Mensajes: 1
Re: Cursillo en C18 para PICS DESDE CERO
« Respuesta #257 en: 29 de Junio de 2010, 15:33:11 »
Buenos dias a todos
soy un novato en pics... he iniciado hace poco a estudiarlo y provando el pic 18f2550 y usando el compilador c18. Quiero leer un dato que recibo en serial (db9+max232), quiero realizar esta lectura tramite interrupt. Leyendo las librerias, tengo una duda, tengo que usar la uart o la usart? :shock: disculpen mi ignorancia
les agradezco de antemano por la ayuda :)


Desconectado micro_cadaver

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2102
    • blog microembebidos
Re: Cursillo en C18 para PICS DESDE CERO
« Respuesta #258 en: 30 de Junio de 2010, 12:17:56 »
Buenos dias a todos
soy un novato en pics... he iniciado hace poco a estudiarlo y provando el pic 18f2550 y usando el compilador c18. Quiero leer un dato que recibo en serial (db9+max232), quiero realizar esta lectura tramite interrupt. Leyendo las librerias, tengo una duda, tengo que usar la uart o la usart? :shock: disculpen mi ignorancia
les agradezco de antemano por la ayuda :)

hola, la ignorancia no tiene porque ser disculpada, todos nacemos con ella, lo que se tiene que disculpar es no querer dejar de serlo.

bueno a tu pregunta, tienes que utiliar UART, porque? porque tus datos sin asincronos. es decir suceden en cualquier momento (para ponerlo en terminos sencillos).
a cosechar!!!... :P
pic32... ahi voy....
aguante el micro 16f84  !!!!

visita mi pagina: http://www.microembebidos.wordpress.com

Desconectado jukinch

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 608
Re: Cursillo en C18 para PICS DESDE CERO
« Respuesta #259 en: 11 de Septiembre de 2010, 01:30:10 »
Micro_cadaver:
                   podrías subir nuevamente de ser posible el archivo que citas en la siguiente respuesta:

http://www.todopic.com.ar/foros/index.php?topic=17017.msg121438#msg121438

respuesta #84 : 28 de Junio de 2007, 03:33:39 »
todos los archivos: h**p://www.box.net/shared/1p7re3zpvj
                             Gracias .
                               Jukinch
"Divide las dificultades que examinas en tantas partes como sea posible para su mejor solución." -René Descartes

Desconectado jukinch

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 608
Re: Cursillo en C18 para PICS DESDE CERO
« Respuesta #260 en: 13 de Septiembre de 2010, 00:54:32 »
Hola amigos del foro:
                        Estoy tratando de inicializar el reloj de tiempo real ds1307 y no lo consigo.
El hardware anda bien porque en lenguaje c de ccs lo activo y puedo hacerlo funcionar correctamente.
                        El ds1307 está conectado a un pic18f4550 mediante los pines rb0 en sda y rb1 en scl. Uso un cristal de 4mhz.
                        El código que estoy usando es el que sigue más abajo.
                        Ni siquiera puedo activar la salida de onda cuadrada de 1hz.
                        Si alguien me puede dar una mano se lo agradezco.
                               Saludos.
                                        Jukinch
                       


Código: [Seleccionar]
/*

Nombre del Programa: reloj.c

Compilador: c18

Fecha:

Autor: Terodáctilo y Jukinch

Descripción: uso de rtc con placa entrenadora

------------------------------------------------------------
CONEXIONES:

lcd conectado en PUERTO D

bus de datos en el nible alto conector idc rb 4 a 7

DATA7    PUERTO D.7
DATA6    PUERTO D.6
DATA5    PUERTO D.5
DATA4    PUERTO D.4


bus de control en el nible bajo conector idc rb 0 a 3

E_PIN    PUERTO D.3
RS_PIN   PUERTO D.2
RW_PIN   PUERTO D.1

------------------------------------------------------------

MODULO I2C conector idc rb 0 a 3

en RB0 está el SDA SERIAL CLOCK
en RB1 está el SCL SERIAL DATA

------------------------------------------------------------
PULSADOR DE control RC0 en conector idc rC 0 a 3
LED DE CONTROL RC1 en conector idc rC 0 a 3


------------------------------------------------------------
*/



/*Includes*/
#include "p18F4550.h"
#include "xlcd.h"
#include "delays.h"
#include <stdlib.h> //Libreria para conversiones.
#include <i2c.h> //Libreria para bus i2c





/* Bits de configuración*/

#pragma config FOSC = XTPLL_XT,FCMEN = OFF,IESO = OFF,PLLDIV = 1, CPUDIV = OSC1_PLL2
#pragma config PWRT = ON,BOR = OFF,BORV = 0
#pragma config WDT = OFF,WDTPS = 32768
#pragma config MCLRE = ON,LPT1OSC = OFF,PBADEN = OFF,CCP2MX = OFF
#pragma config STVREN = OFF,LVP = OFF,XINST = OFF,DEBUG = OFF
#pragma config CP0 = OFF,CP1 = OFF,CP2 = OFF
#pragma config CPB = OFF,CPD = OFF
#pragma config WRT0 = OFF,WRT1 = OFF,WRT2 = OFF
#pragma config WRTB = OFF,WRTC = OFF,WRTD = OFF
#pragma config EBTR0 = OFF,EBTR1 = OFF,EBTR2 = OFF
#pragma config EBTRB = OFF




/*declaración de DEFINICIONES*/
#define CLOCK 4000000
#define TCY 1/CLOCK
#define BITRATE 100000

#define teclaDebugger PORTCbits.RC0 // tecla para avanzar en programa para controlar errores


/*declaración de variables*/
unsigned char hour=0;
unsigned char minutes=0;
unsigned char seconds=0;
unsigned char day=0;
unsigned char month=0;
unsigned char year=0;
unsigned char texto=0;



/*declaración de funciones*/

void DelayFor18TCY(void);
void DelayPORXLCD(void);
void DelayXLCD(void);
void EsperaBotonDebugger(void);


/*****Programa principal******/
/********************************************************************/
void main (void)
{


/*****configuro los puertos******/

TRISBbits.TRISB7=7; // B0=salida
TRISBbits.TRISB6=6; // B0=salida
TRISBbits.TRISB5=5; // B0=salida
TRISBbits.TRISB4=4; // B0=salida
TRISBbits.TRISB3=3; // B0=salida
TRISBbits.TRISB2=2; // B0=salida

TRISBbits.TRISB0=1; // B0=ENTRADA SDA SERIAL CLOCK
TRISBbits.TRISB1=1; // B1=ENTRADA SCL SERIAL DATA


TRISD=0b00000000;      // Puerto D7:0 como salidas
 LATD=0b00000000;      //todas las salidas abajo

TRISCbits.TRISC0=1; // C0=ENTRADA // botón para hacer control del programa
TRISCbits.TRISC1=0; // C1=salida // led para control del programa




/***** preparo lcd para escribir ******/
Delay10KTCYx(10000);    //Retardo para esperar que pase cualquier transitorio
OpenXLCD(FOUR_BIT&LINES_5X7);   //inicializamos LCD con varias lineas y caracteres 5x7
WriteCmdXLCD(0x01); // Borra pantalla y vuelve al origen.-
while(BusyXLCD()){}     //Preguntamos al RW si el display esta ocupado 
WriteCmdXLCD(0x80);     // Nos posicionamos en la la posicion x=0 Y=0
while(BusyXLCD()){}


putrsXLCD("PRUEBA RTC");

while(BusyXLCD()){}
WriteCmdXLCD(0xC0); //Nos posicionamos en la posición 8
while(BusyXLCD()){}

putrsXLCD("PULSE RC.0");


EsperaBotonDebugger();



Delay10KTCYx(100000);    //Retardo para esperar que pase cualquier transitorio
WriteCmdXLCD(0x01); // Borra pantalla y vuelve al origen.-
while(BusyXLCD()){}     //Preguntamos al RW si el display esta ocupado 
WriteCmdXLCD(0x80);     // Nos posicionamos en la la posicion x=0 Y=0
while(BusyXLCD()){}
putrsXLCD("PULSE para init");


EsperaBotonDebugger();






/***** rutina de inicialización de rtc ***************************************/

OpenI2C(MASTER,SLEW_OFF); // inicializo el i2c en modo maestro y 100khz

ADCON0 = 0X00;
ADCON1 = 0X0F;
CMCON = 0X07;



SSPADD =9; // ((CLOCK/BITRATE)/4)-1 = 9 for 100kHz @ 20MHz


IdleI2C();
StartI2C();
WriteI2C(0b11010000); // escribe la dirección del rtc (11010000= hex D0)
                      //  y le dice que se va a escribir con el bit0 en 0
IdleI2C();
 WriteI2C(0b00000000); // pone el puntero del rtc en dirección 00h
StartI2C();
WriteI2C(0b00000000); // GRABAMOS EN EL PRIMER REGISTRO 00 SEGUNDOS
                      // Y HABILITAMOS EL OSCILADOR con el octavo bit apagado
IdleI2C();
WriteI2C(0b00000010); // GRABAMOS EN EL SEGUNDO REGISTRO 23 MINUTOS
IdleI2C();
WriteI2C(0b00010000); // GRABAMOS EN EL TERCER REGISTRO configura reloj formato 24 hs
IdleI2C();
WriteI2C(0b00000110); // GRABAMOS EN EL CUARTO REGISTRO EL NOMBRE DE DIA DE LA SEMANA
IdleI2C();
WriteI2C(0b00011000); // GRABAMOS EN EL QUINTO REGISTRO EL NUMERO DE DIA DEL MES
IdleI2C();
WriteI2C(0b00000110); // GRABAMOS EN EL SEXTO REGISTRO EL MES
IdleI2C();
WriteI2C(0b00010000); // GRABAMOS EN EL SÉPTIMO REGISTRO EL AÑO
IdleI2C();
WriteI2C(0b00010000); // GRABAMOS EL OCTAVO Y ULTIMO REGISTRO
              // Configura la salida del oscilador de onda cuadrada en 1hz
IdleI2C();
StopI2C();




Delay10KTCYx(100000);    //Retardo para esperar que pase cualquier transitorio
WriteCmdXLCD(0x01); // Borra pantalla y vuelve al origen.-
while(BusyXLCD()){}     //Preguntamos al RW si el display esta ocupado 
WriteCmdXLCD(0x80);     // Nos posicionamos en la la posicion x=0 Y=0
while(BusyXLCD()){}
putrsXLCD("YA INICIALIZO");

EsperaBotonDebugger();

// ********************************** rutina de init rtc *********************
WriteCmdXLCD(0x01); // Borra pantalla y vuelve al origen.-
while(BusyXLCD()){}     //Preguntamos al RW si el display esta ocupado 
WriteCmdXLCD(0x80);     // Nos posicionamos en la la posicion x=0 Y=0
while(BusyXLCD()){}
putrsXLCD("i2c cargado");
WriteCmdXLCD(CURSOR_OFF & BLINK_OFF);

Delay10KTCYx(100000);    //Retardo para ver lo escrito en lcd

EsperaBotonDebugger();

while(1)
{


WriteCmdXLCD(0x01); // Borra pantalla y vuelve al origen.-
while(BusyXLCD()){}     //Preguntamos al RW si el display esta ocupado 
WriteCmdXLCD(0x80);     // Nos posicionamos en la la posicion x=0 Y=0
while(BusyXLCD()){}

putrsXLCD("Lectura i2c");
EsperaBotonDebugger();
IdleI2C();
StartI2C();
WriteI2C(0b11010001); // escribe dirección del rtc y le dice que se va a leer
WriteI2C(0x00); // pone el puntero del rtc en dirección 00h
seconds=ReadI2C();

      AckI2C();


minutes=ReadI2C();

        AckI2C();

hour=ReadI2C();

AckI2C();

minutes=ReadI2C();

AckI2C();

seconds=ReadI2C();

AckI2C();


day=ReadI2C();

AckI2C();

month=ReadI2C();

AckI2C();


year=ReadI2C();

NotAckI2C();

StopI2C();

WriteCmdXLCD(0x01); // Borra pantalla y vuelve al origen.-
while(BusyXLCD()){}     //Preguntamos al RW si el display esta ocupado 
WriteCmdXLCD(0x80);     // Nos posicionamos en la la posicion x=0 Y=0
while(BusyXLCD()){}
putrsXLCD("termino lectura");
WriteCmdXLCD(CURSOR_OFF & BLINK_OFF);
EsperaBotonDebugger();



WriteCmdXLCD(0x01); // Borra pantalla y vuelve al origen.-
while(BusyXLCD()){}     //Preguntamos al RW si el display esta ocupado 
WriteCmdXLCD(0x80);     // Nos posicionamos en la la posicion x=0 Y=0
while(BusyXLCD()){}
putrsXLCD("comienza display");
WriteCmdXLCD(CURSOR_OFF & BLINK_OFF);
EsperaBotonDebugger();



WriteCmdXLCD(0x01); // Borra pantalla y vuelve al origen.-
while(BusyXLCD()){}     //Preguntamos al RW si el display esta ocupado 
WriteCmdXLCD(0x80);     // Nos posicionamos en la la posicion x=0 Y=0

EsperaBotonDebugger();
// btoa(hour,texto); // convierto 8 bits a caracter ascii
while(BusyXLCD()){}
putsXLCD(texto);

while(BusyXLCD()){}
EsperaBotonDebugger();
putrsXLCD(":");

while(BusyXLCD()){}     //Preguntamos al RW si el display esta ocupado 

btoa(minutes,texto); // convierto 8 bits a caracter ascii
while(BusyXLCD()){}
putsXLCD(texto);
while(BusyXLCD()){}
EsperaBotonDebugger();
putrsXLCD(":");
while(BusyXLCD()){}     //Preguntamos al RW si el display esta ocupado 

btoa(seconds,texto); // convierto 8 bits a caracter ascii
while(BusyXLCD()){}
putsXLCD(texto);
while(BusyXLCD()){}


WriteCmdXLCD(CURSOR_OFF & BLINK_OFF);

Delay10KTCYx(500);    //Retardo para poder refrescar pantalla

WriteCmdXLCD(0x01); // Borra pantalla y vuelve al origen.-
while(BusyXLCD()){}     //Preguntamos al RW si el display esta ocupado 
WriteCmdXLCD(0x80);     // Nos posicionamos en la la posicion x=0 Y=0
while(BusyXLCD()){}
putrsXLCD("termino display");
WriteCmdXLCD(CURSOR_OFF & BLINK_OFF);
EsperaBotonDebugger();



}











}// final de main


/*Funciones*/

void DelayFor18TCY(void)
{
Delay1KTCYx(1); //Retardo de 1mSeg
}

void DelayPORXLCD(void)
{
Delay1KTCYx(180); //Delay 15 mSeg
}

void DelayXLCD(void)
{
Delay1KTCYx(60);
}


void EsperaBotonDebugger(void)
{
while (PORTCbits.RC0==0)
{
}
Delay10KTCYx(10000);    //Retardo para ver lo escrito en lcd
LATCbits.LATC1=1; // ENCIENDO LED C1
Delay10KTCYx(10000);    //Retardo para ver lo escrito en lcd
LATCbits.LATC1=0; // APAGO LED C1
Delay10KTCYx(10000);    //Retardo para ver lo escrito en lcd
LATCbits.LATC1=1; // ENCIENDO LED C1
Delay10KTCYx(10000);    //Retardo para ver lo escrito en lcd
LATCbits.LATC1=0; // APAGO LED C1
Delay10KTCYx(10000);    //Retardo para ver lo escrito en lcd
LATCbits.LATC1=1; // ENCIENDO LED C1
Delay10KTCYx(10000);    //Retardo para ver lo escrito en lcd
LATCbits.LATC1=0; // APAGO LED C1
Delay10KTCYx(10000);    //Retardo para ver lo escrito en lcd


}




"Divide las dificultades que examinas en tantas partes como sea posible para su mejor solución." -René Descartes

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Cursillo en C18 para PICS DESDE CERO
« Respuesta #261 en: 13 de Septiembre de 2010, 10:24:11 »
 :rolleyes:  Justo ayer estaba migrando la librería de RedPIC realizada para CCS. Solo la probé en proteus, la adjunto.

Para usarla se debe iniciar I2C a la velocidad de 100kHz. Por ejemplo para 40MHz:

Código: C
  1. #include "ds_1307.h"
  2.  
  3. UINT8 Dia,Fecha,Mes,Anio,Hora,Minuto,Segundo;
  4.  
  5. void main(){
  6.  
  7.         OpenI2C(MASTER,SLEW_OFF);
  8.         SSPADD=99;                                      // 100kHz. Max de DS1307
  9.        
  10.         vDS1307Init(DS1307_OUT_ENABLED | DS1307_OUT_1_HZ);
  11.         vDS1307_Set_Date_Time(10,8,10,1,19,42,1);
  12.        
  13.         vDS1307_Get_Date(&Fecha,&Mes,&Anio,&Dia);
  14.         vDS1307_Get_Time(&Hora,&Minuto,&Segundo);
  15.        
  16.        
  17.         while(1){}
  18. }


Para usarla, copiarlo los 3 archivos a la carpeta del proyecto e incluirlos en el proyecto.


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado jukinch

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 608
Re: Cursillo en C18 para PICS DESDE CERO
« Respuesta #262 en: 13 de Septiembre de 2010, 10:49:36 »
Gracias Suky por el gesto  ;-). a la noche los pruebo y te comento como me fue.
          Saludos.
             Jukinch
"Divide las dificultades que examinas en tantas partes como sea posible para su mejor solución." -René Descartes

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Cursillo en C18 para PICS DESDE CERO
« Respuesta #263 en: 13 de Septiembre de 2010, 12:58:55 »
En hardware, funciona!  :-/  :mrgreen:



Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado jukinch

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 608
Re: Cursillo en C18 para PICS DESDE CERO
« Respuesta #264 en: 13 de Septiembre de 2010, 13:21:41 »
Bien ahí Suky!  :-/
Sería bueno que se agregue al índice del tema la librería esta también.
         Saludos.
              Jukinch
"Divide las dificultades que examinas en tantas partes como sea posible para su mejor solución." -René Descartes

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Cursillo en C18 para PICS DESDE CERO
« Respuesta #265 en: 13 de Septiembre de 2010, 13:58:57 »
Sería bueno que se agregue al índice del tema la librería esta también.

Hecho! Espero a micro_cadaver no le moleste  :oops: Si hay alguna otra librería, avisan  ;-)


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado micro_cadaver

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2102
    • blog microembebidos
Re: Cursillo en C18 para PICS DESDE CERO
« Respuesta #266 en: 20 de Septiembre de 2010, 20:17:17 »
Sería bueno que se agregue al índice del tema la librería esta también.

Hecho! Espero a micro_cadaver no le moleste  :oops: Si hay alguna otra librería, avisan  ;-)


Saludos!

holas, me parece excelente que continuen contribuyendo, por mi lado no tengo ningun inconveniente, y ni motivo tendria para tenerlo. la idea es que todos aporten!!!!


a cosechar!!!... :P
pic32... ahi voy....
aguante el micro 16f84  !!!!

visita mi pagina: http://www.microembebidos.wordpress.com

Desconectado facuenta

  • PIC10
  • *
  • Mensajes: 6
Re: Cursillo en C18 para PICS DESDE CERO
« Respuesta #267 en: 18 de Diciembre de 2010, 04:42:16 »
Dónde consigo la biblioteca flex_lcd.c para C18? pero ojo que en la simulación se queda la biblioteca flex_lcd.c como si hubiera un lazo infinito cuando se simula en MPLAB SIN para calcular los tiempos en CCS. Toma al LCD como si estuviera apagado(el MPLAB SIM) pero se queda en esa biblioteca(flex_lcd.c) tiene un bug ahí. La que se consigue en C18 no tendrá el mismo error? nunca programé en C18.


Saludos,
Facundo
« Última modificación: 18 de Diciembre de 2010, 13:08:57 por facuenta »

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Cursillo en C18 para PICS DESDE CERO
« Respuesta #268 en: 18 de Diciembre de 2010, 10:00:20 »
Éste hilo es de C18, pregunta en un hilo adecuado.


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado Cryn

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4169
Re: Cursillo en C18. Flex_lcd y utilización de printf.-
« Respuesta #269 en: 20 de Diciembre de 2010, 18:22:42 »
Bueno, aquí les dejo una librería realizada a partir de flex_lcd utilizada en CCS en donde se puede definir cualquier pin para su utilización. Se tiene 2 archivos, flex_lcd_c18.h y flex_lcd_c18.c, ambos debemos colocarlos en la carpeta del proyecto y agregarlos al proyecto.

Hola gran suky he estado viendo la genial librería que pusiste por acá, va muy bien, como viento en popa :mrgreen:, lo estoy utilizando para un 18LF46J11 conectado a un LCD 16x2 compatible con HD44780 y tengo un pequeño problema y una duda:

-Mi problema es que tengo que colocar:

lcd_putrs("\f          Prueba LCD16x2");
Y solo así puedo ver el mensaje "Prueba LCD16x2" en la 1racolumna y 1ra fila del LCD, caso contrario si no coloco los 10espacios:

lcd_putrs("\fPrueba LCD16x2");
El mensaje se verá desde el décimo primer caracter, veo solo: "16x2"

Al parecer me sucede eso cuando uso '\f' al principio del mensaje, ya que si coloco el mensaje después de inicializar el LCD, sale tal como se desea.

He ahí mi dilema, que pasa con el '\f' que me come 10 columnas?

Con el \n va bien, pasa a la segunda línea y primera columna ;-)


-Mi duda es como incluir la librería. Según vi en la libreria flex_lcd_c18.c está incluído "flex_lcd_c18.h" y según mi intuición se debería colocar "flex_lcd_c18.c" en el main, pero tu tienes el .h incluído, y funciona muy bien, pero pues me hice bolas...

Ya que si coloco el .c incluido en el main, aparece un mensaje de error en la última función del .c
Además para q todo funcione bien se debe colocar en "header files" del proyecto en MPLAB el .h de la lib del LCD y en "source files" deben estar el main y el .c de la lib del LCD.

Saludos suky y muchas gracias por la excelente libreria flex! :-/
.


 

anything