Autor Tema: USB + I2C con 18f2550  (Leído 4254 veces)

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

Desconectado QIQE

  • PIC18
  • ****
  • Mensajes: 335
USB + I2C con 18f2550
« en: 29 de Septiembre de 2008, 19:22:32 »
Hola buenas estoy intentando usar un pic18f2550 para hacer un datalogger por el momento estoy atascado con el I2C, estoy usando un RTC ds2323 que tiene los mismo registros que el ds1307, pero cuando entra en la rutina I2c se bloque todo, es como si el rtc no contestase, el hardware lo he repasado 1000 veces yo diria que esta bien, el programa es el siguiente, me podeis echar una mano??

Código: [Seleccionar]
#include <18F2550.h>
#device adc=10

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES WDT128                   //Watch Dog Timer uses 1:128 Postscale
#FUSES HSPLL                    //Crystal/Resonator with PLL enabled
#FUSES NOPROTECT                //Code not protected from reading
#FUSES NOBROWNOUT               //No brownout reset
#FUSES BORV20                   //Brownout reset at 2.0V
#FUSES NOPUT                    //No Power Up Timer
#FUSES NOCPD                    //No EE protection
#FUSES STVREN                   //Stack full/underflow will cause reset
#FUSES NODEBUG                  //No Debug mode for ICD
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOWRT                    //Program memory not write protected
#FUSES NOWRTD                   //Data EEPROM not write protected
#FUSES IESO                     //Internal External Switch Over mode enabled
#FUSES FCMEN                    //Fail-safe clock monitor enabled
#FUSES NOPBADEN                 //PORTB pins are configured as digital I/O on RESET
#FUSES NOWRTC                   //configuration not registers write protected
#FUSES NOWRTB                   //Boot block not write protected
#FUSES NOEBTR                   //Memory not protected from table reads
#FUSES NOEBTRB                  //Boot block not protected from table reads
#FUSES NOCPB                    //No Boot Block code protection
#FUSES NOMCLR                   //Master Clear pin used for I/O
#FUSES LPT1OSC                  //Timer1 configured for low-power operation
#FUSES NOXINST                  //Extended set extension and Indexed Addressing mode disabled (Legacy mode)
#FUSES PLL5                     //Divide By 5(20MHz oscillator input)
#FUSES CPUDIV1                  //No System Clock Postscaler
#FUSES USBDIV                   //USB clock source comes from PLL divide by 2
#FUSES VREGEN                   //USB voltage regulator enabled

#use delay(clock=48000000)
#USE I2C (Master, Force_HW, Slow, SDA = Pin_B0, SCL = Pin_B1)


#include <ctype.h>
#include <string.h>
#include ".\include\usb_cdc.h"

//----------------------Configuración de puertos-------------------------------

#use fast_io(c)

#rom int 0xf00000={1,2,3,4}

//------------------------ Definiciones de variables RTC ---------------------

#define rtc_escribir 0b11010000
#define rtc_leer 0b11010001

#define rtc_segundos 0x00
#define rtc_minutos 0x01
#define rtc_horas 0x02
#define rtc_dia 0x03
#define rtc_fecha 0x04
#define rtc_mes 0x05
#define rtc_anyo 0x06
#define rtc_temp1 0x11
#define rtc_temp2 0x12
#define rtc_eprom1 0x15    //MSB de la dirección
#define rtc_eprom2 0x16    //LSB de la dirección
#define rtc_bancoEEP 0x17  //Seleccion del banco
#define errOFFun 0x18        //error de ofsset del termometro(Unidades)
#define errOFFdec 0x19        //error de ofsset del termometro(Decenas)
#define errpropun 0x20       //error de proporsionalidad del termometro(Unidades)
#define errpropdec 0x21       //error de proporsionalidad del termometro(Decenas)

//----------------------------Variables puerto RS232--------------------------
int const longitud=33;
char rcvchar=0x00;
int xbuff=0x00;
char cbuff[longitud];


//----------------------------Variables globales------------------------------


int segundos=1,minutos=1,minutosaux=0,horas=1,dia=1,fecha=1,mes=1, anyo=1,i;//Las variables
//del RTC las declaro globales para asi poder consultarlas en cualquier momento

//##############################################################################
//##                                                                          ##
//##                            Funciones                                     ##
//##                                                                          ##
//##############################################################################


byte leer_segundos();

byte leer_minutos();

byte leer_horas();

byte leer_dia();

byte leer_fecha();

byte leer_mes();

byte leer_anyo();

byte conver_0 (byte);

byte conver_1 (byte);



void main()
{

   setup_adc_ports(AN0_TO_AN10|VSS_VDD);
   setup_adc(ADC_CLOCK_INTERNAL);
   setup_spi(SPI_SS_DISABLED);
   setup_wdt(WDT_OFF);
   setup_timer_0(RTCC_INTERNAL);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_timer_3(T3_DISABLED|T3_DIV_BY_1);
   setup_ccp1(CCP_OFF);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);
//Setup_Oscillator parameter not selected from Intr Oscillotar Config tab
   //set_tris_b(0xff);
   
   
   delay_ms(300);                //Esperamos a que todo se estabilice
   
   while(true)
      {
      if(input(PIN_C6))
         {
         usb_cdc_init();               //Inicializamos el USB en modo CDC
         usb_init();                   //Arrancamos el usb cs es por que no siempre va a estar conectado al USB
   
         while(!usb_cdc_connected())   {}       //esperamos a que se conecte
           
            usb_task();
            if (usb_enumerated())
               {     
               while (true)
                  {
                  while (usb_cdc_kbhit())             //Hay cosas en el BUFFER!!!
                     {
                     cbuff[xbuff]=usb_cdc_getc();
                     xbuff++;
                     }
                  if (cbuff[0]=='a'&& cbuff[1]=='0')
                     {
                     printf(usb_cdc_putc,"segundos? \r\n");
                     
                     segundos = leer_dia();
                 
                     printf(usb_cdc_putc,"%u  \r\n",segundos);
                     xbuff=0;
                     }
               
           
                                   
                  printf(usb_cdc_putc, "Esperando \r\n");
                  delay_ms(1000);
                 

 
                 
                  }
               }        // /enumerated 
                     
         }              // esta conectado el usb?
           
   }     //Final de While true                                                   
}        //Final del MAIN
 

//##############################################################################
//##                                                                          ##
//##                       Funciones del RTC                                  ##
//##############################################################################

byte leer_segundos()
   {
   int seg;

   i2c_start();
   i2c_write(rtc_escribir);
   i2c_write(rtc_segundos);
   i2c_start();
   i2c_write(rtc_leer);
   seg=i2c_read(0);
   i2c_stop();

   return (conver_0(seg));
   }


byte leer_minutos()
   {
   int min;

   i2c_start();
   i2c_write(rtc_escribir);
   i2c_write(rtc_minutos);
   i2c_start();
   i2c_write(rtc_leer);
   min=i2c_read(0);
   i2c_stop();
   return (min);
   }


byte leer_horas()
   {
   int horas;

   i2c_start();
   i2c_write(rtc_escribir);
   i2c_write(rtc_horas);
   i2c_start();
   i2c_write(rtc_leer);
   horas=i2c_read(0);
   i2c_stop();
   return (conver_0(horas));
   }


byte leer_dia()
   {
   int dia;

   i2c_start();
   i2c_write(rtc_escribir);
   i2c_write(rtc_dia);
   i2c_start();
   i2c_write(rtc_leer);
   dia=i2c_read(0);
   i2c_stop();
   return (dia);
   }


byte leer_fecha()
   {
   int fecha;

   i2c_start();
   i2c_write(rtc_escribir);
   i2c_write(rtc_fecha);
   i2c_start();
   i2c_write(rtc_leer);
   fecha=i2c_read(0);
   i2c_stop();
   return (conver_0(fecha));
   }


byte leer_mes()

   {
   int mes;

   i2c_start();
   i2c_write(rtc_escribir);
   i2c_write(rtc_mes);
   i2c_start();
   i2c_write(rtc_leer);
   mes=i2c_read(0);
   i2c_stop();
   return (conver_0(mes));
   }


byte leer_anyo()
   {
   int seg,seg_uni,seg_dec;

   i2c_start();
   i2c_write(rtc_escribir);
   i2c_write(rtc_anyo);
   i2c_start();
   i2c_write(rtc_leer);
   seg=i2c_read(0);
   i2c_stop();
   seg_uni=seg & 0b00001111;
   seg_dec=seg & 0b11110000;
   seg_dec=seg_dec>>4;
   seg=((seg_dec*10)+seg_uni);
   delay_ms(20);
   return (seg);
   }





No encuentro el fallo, en otras ocasiones utilice este RTC y no me dio problemas muchas gracias un saludo
Muchas gracias por vuestro tiempo.

Saludos desde valencia!!!

Desconectado omix

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 244
Re: USB + I2C con 18f2550
« Respuesta #1 en: 30 de Septiembre de 2008, 16:50:33 »
Hola QIQE,
revisa los documentos de errata para el 18F2550 porque algunas revisiones de dicho micro tienen un fallo en el modulo de I2C. De hecho ya tuve problemas con eso en su momento y al final tuve que implementar mis propias rutinas de I2C, porque con las de CCS me pasaba exactamente eso que se quedaba bloqueado.

Un saludo.

Desconectado QIQE

  • PIC18
  • ****
  • Mensajes: 335
Re: USB + I2C con 18f2550
« Respuesta #2 en: 30 de Septiembre de 2008, 18:14:36 »
Hola gracias por la respuesta.
Debia de tener fantasmas en mi placa de repente decidí empezar de cero en ccs seleccionando micro velocidad etc etc y reescribiendo el programa y así de repenete empezó a funcionar sin mas ni mas, con el mismo micro y la misma versión de ccs.
Muchas gracias a todos.
Muchas gracias por vuestro tiempo.

Saludos desde valencia!!!

Desconectado omix

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 244
Re: USB + I2C con 18f2550
« Respuesta #3 en: 30 de Septiembre de 2008, 18:53:00 »
Me alegro que al final lo hayas solucionado.

Un saludo.