Autor Tema: Ayuda con interruciones en RB0 y RB1  (Leído 6497 veces)

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

Desconectado mauro2555

  • PIC10
  • *
  • Mensajes: 18
Re: Ayuda con interruciones en RB0 y RB1
« Respuesta #15 en: 14 de Abril de 2011, 19:23:40 »
Suky tienes razon la funcion atoi me sirve, pero aun asi no pasa nada. Resulta q para enviar los datos de java al PIC por USB lo q hago es convertir ese "43500" a un byte[] y en vio los bytes asi: byte[0],byte[1],byte[2],byte[3]. Es decir cuando llegan al PIC llegan bytes y es ahi donde necesito convertir de nuevo todos los bytes a Int16 para almacenarlos en la eeprom.

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Ayuda con interruciones en RB0 y RB1
« Respuesta #16 en: 14 de Abril de 2011, 23:13:09 »
Suky tienes razon la funcion atoi me sirve, pero aun asi no pasa nada. Resulta q para enviar los datos de java al PIC por USB lo q hago es convertir ese "43500" a un byte[] y en vio los bytes asi: byte[0],byte[1],byte[2],byte[3]. Es decir cuando llegan al PIC llegan bytes y es ahi donde necesito convertir de nuevo todos los bytes a Int16 para almacenarlos en la eeprom.

Guárdalos en un buffer para formar la cadena de caracteres ascii y luego usas atoi.


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

Desconectado COARITES

  • PIC10
  • *
  • Mensajes: 13
Re: Ayuda con interruciones en RB0 y RB1
« Respuesta #17 en: 07 de Febrero de 2012, 18:24:26 »
Hola compañeros yo igual estoy chocando con el mismo problema que pasaste, no se si ya le diste solucion; mi codigo compila y run en proteus, pero no registra nada en la memoria eeprom.

Mi codigo es el siguiente haber si pueden echarme una ayudita.
_____________
#include <18f4550.h>
#include <24256.c>
#include <external_eeprom.c>
#fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN
#use delay(clock=48000000)
#use i2c(Master,sda=PIN_B0,scl=PIN_B1)       
void main(void)
{
   byte i;
   for(i=0;i<=12;i++)
   write_int16_ext_eeprom(i,i);
}
_______________________
Compilado en ccs v4.128 y proteus 7.8

Desconectado mauro2555

  • PIC10
  • *
  • Mensajes: 18
Re: Ayuda con interruciones en RB0 y RB1
« Respuesta #18 en: 31 de Marzo de 2012, 23:20:07 »
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)
  {
  }