Autor Tema: Ayuda eeprom externa e interrupciones en 18f4554  (Leído 2464 veces)

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

Desconectado mauro2555

  • PIC10
  • *
  • Mensajes: 18
Ayuda eeprom externa e interrupciones en 18f4554
« en: 02 de Abril de 2011, 16:51:12 »
Buenas a todos, este es mi primer post, espero me puedan ayudar. Estoy tratando de capturar las interrupciones q me genera un encoder de un motor dc y almacenar el numero de interrupciones en una eeprom externa de 512. Estoy utilizando un 18f4550 programado en CCS y capturo las interrupciones por el RB0 y el RB1 sin ningun problema. La duda es q segun san "google" la eeprom debo conectarla tambien a traves del RB0 y el RB1 los cuales estoy utilizando para el encoder. Tambien me he informado q es posible utilizar de RB4 a RB7 para captura de interrupciones por cambio de estado, y de ahi me surgen las siguientes preguntas:

1) RB4 a RB7 como captura de estado, trabajan con la misma eficiencia de RB0 y RB1?? es decir puedo capturar con un mismo periodo de muestreo? (Lo digo por q el encoder del motor genera un alto cada 400mlseg).

2) Me dijeron q es posible manejar la eeprom por pines diferentes al RB0 y RB1, con el fin de dejar dichos pines para el encoder. Si es posible, por cuales pines podria conectar y manejar mi eeprom??

Si alguien tiene ejemplos q me puedan ayudar le agradeceria q los compartiera. Gracias a todos por su colaboración, exitos...

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Ayuda eeprom externa e interrupciones en 18f4554
« Respuesta #1 en: 02 de Abril de 2011, 17:32:07 »
  No sé mucho de PIC18xxxx. RB0 en la familia 16 genera una interrupción por flanco de bajada o de subida según como esté configurado (me imagino que será lo mismo en la gama 18 y que RB1 tendrá la misma prestación) en cambio RB4-RB7 generan interrupción tanto en el flanco de subida como en el flanco de bajada (siempre generan en ambos casos).

  Si la EEPROM es con protocolo I2C la podés manejar con los pines que soporten dicho protocolo por hardware o manejarla con cualquier pin pero implementando el protocolo I2C por software.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado mauro2555

  • PIC10
  • *
  • Mensajes: 18
Re: Ayuda eeprom externa e interrupciones en 18f4554
« Respuesta #2 en: 04 de Abril de 2011, 23:32:42 »
AngelGris gracias por tu respuesta, te cuento q he decidido dejar las señales del enconder por RB0 y RB1. En cuanto a la eeprom la he conectado por RD0 y RD1 y he modificado la clase "25512.h" que es la clase q define la eeprom de 512 en CCS, solo modifique los pines SDA y SCL asignados en la clase, y me ha funcionado bien.

Ahora tengo otro inconveniente, y es q tengo q almacenar una variable String en la eeprom, y no se q funcion en CCS me da la posibilidad de hacerlo, si alguien sabe le agradeceria q me orientara un poco.

Exitos..

Desconectado Lobo_Azul

  • PIC10
  • *
  • Mensajes: 29
Re: Ayuda eeprom externa e interrupciones en 18f4554
« Respuesta #3 en: 19 de Mayo de 2011, 00:40:26 »
Saludos mauro2555, quisera ver si pudieras pasar tu codigo de las interrupciones o poner un ejemplo de estas, ya que yo quiero implementar interrupciones en mi codigo, pero nunca las he usado, y como sabes que en especifico ese micro usa esos pines de interrupcion o se acaso se puede usar cualquier pin para interrupcion? gracias agradecere tu respuesta.

Desconectado mauro2555

  • PIC10
  • *
  • Mensajes: 18
Re: Ayuda eeprom externa e interrupciones en 18f4554
« Respuesta #4 en: 31 de Marzo de 2012, 23:23:13 »
Hola perdon por no responder antes, pense q nadie habia solucionado el problema. Despues de hacer muchos arreglos hice funcionar mi codigo el cual posteo acá. Esta configuracion me permite manejar el adc y tambien las interrupciones RB0 y RB1, ademas tambien me almacena las interrupciones en un espacio en memoria eeprom externa y funciona a la perfeccion la comunicacion USB, para quien tenga algun problema similar puede utilizar esta configuracion, ya he probado con el 18f4550 y actualmente esta en funcionamiento en un dispositivo q diseñe e instale, espero sirva de ayuda a alguien. Exitos!!

#include <18F4550.h>
#device adc=10
#include <24512.c> //libreria eeprom 24LC512
#include <external_eeprom.c>
#include <stdlib.h>

#fuses HSPLL,NOWDT,PROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN,NOBROWNOUT,NOPBADEN
#use delay(clock=48000000)

#use fast_io(B)
#use fast_io(D)
#byte ADCON2=0xFC0
#byte PortB = 0xF81            // Dirección del puerto B para la familia 18Fxx5x
#byte PortD = 0xF83            // Dirección del puerto D para la familia 18Fxx5x

#define USB_HID_DEVICE FALSE // deshabilitamos el uso de las directivas HID
#define USB_EP1_TX_ENABLE USB_ENABLE_BULK // turn on EP1(EndPoint1) for IN bulk/interrupt transfers
#define USB_EP1_RX_ENABLE USB_ENABLE_BULK // turn on EP1(EndPoint1) for OUT bulk/interrupt transfers
#define USB_EP1_TX_SIZE 32 // size to allocate for the tx endpoint 1 buffer
#define USB_EP1_RX_SIZE 32 // size to allocate for the rx endpoint 1 buffer

#include <pic18_usb.h> // Microchip PIC18Fxx5x Hardware layer for CCS's PIC USB driver
#include "header.h" // Configuración del USB y los descriptores para este dispositivo
#include <usb.c> // handles usb setup tokens and get descriptor reports

int16 x = 0, y=0, limS=0, limI=0;
int16 adc0;
char  voltage[10];
char  Conexion[] = "o.k";
const int8 Lenbuf = 32;
int8  recbuf[Lenbuf];       

#INT_EXT                        // Interrupción Externa por RB0: Decodificación de Encoder.
Void IntRB0()
{
   // CCS se encarga de desactiva automáticamente cualquier interrupción.
   // No hace falta guardar contextos de registros.

   If (!Bit_Test(PortB, 0))      // Si RB0 se ha puesto a 1 (flanco de subida),
   {
       Ext_Int_Edge(L_TO_H);    // entonces activar la siguiente interrupción por flanco de bajada.
       If (!Bit_Test(PortB, 1))  // Si RB1 está a 1,
       {
           x--;                 // entonces incrementar una unidad el valor de X.
       }
   }
   Else                         // Si RB0 se ha puesto a 0 (flanco de bajada),
   {
       Ext_Int_Edge(H_TO_L);    // entonces activar la siguiente interrupción por flanco de subida.
       If (!Bit_Test(PortB, 1))  // Si RB1 está 1,
       {
           x++;                 // entonces decrementar una unidad el valor de X.
       }
   }
   // Al finalizar la interrupción CCS se encarga de volver a poner automáticamente
   // la badera INTF = 0 ---> borra la interrupción para poder permitir la siguiente;
   // no hemos de hacer nada por nuestra parte.
   y=1;
}

///////////////////////////////////////////////////////////////////////////////////////////////////
//
//                            M A I N
//
///////////////////////////////////////////////////////////////////////////////////////////////////
void main()
{
  Port_B_Pullups(FALSE);       // Configuración para el PIC 18F4550.
  set_tris_a(0x03); //Entrada an0 y an1
  setup_adc_ports(AN0_TO_AN1|VSS_VDD);//para escoger el canal cero y el vss y vdd
  setup_adc(ADC_CLOCK_INTERNAL);//la frecuencia de muestreo es 2-6us
  ADCON2= ADCON2 | 0b00111000;
  set_adc_channel(1);
  Setup_vref(FALSE);
  clear_interrupt(INT_EXT);
  delay_ms(333);
  //////////////////INICIO Y HABILITACION DE LO QUE NECESITO/////////////////////////////////////////
  init_ext_eeprom();
  Enable_Interrupts(int_ext);  // Activar Interrupción Externa a través de RB0.
  Ext_Int_Edge(H_TO_L);        // Inicialmente detectar interrupción por flanco de bajada.
  enable_interrupts(global);   // Activo interruciones globales
  bit_clear(PortB,0);
  Set_Tris_B(0b11111111);
  usb_init();
  usb_task();
  delay_ms(333);

while (TRUE)
  {
  }