código de transferencia de P18F45K22 a 18f2550 problema

0

Estoy tratando de usar el nRF24L01 con un pic18f2550 usando el compilador microc. Comencé a partir de un código de ejemplo proporcionado por Nordic para 18F45K22 (que se puede encontrar aquí código de ejemplo ).

He cambiado las definiciones de pines en consecuencia, pero no entiendo qué significa "ANSELA = 0".

Aquí está mi código por ahora:

char InData[25]; // incoming data from RF
char testRcv;
char PayLoadBuff[25];
char Code_[32];

//sbit Irq_pin   at PORTB.B0; sfr;
sbit Irq_pin   at PORTB.B2; sfr;//use interrupt 2
sbit Mosi_pin  at LATC.B7;  sfr;//same
sbit Ce_pin    at LATA.B4;  sfr;//same
//sbit Sclk_pin  at LATA.B3;  sfr;
sbit Sclk_pin  at LATB.B1;  sfr;
//sbit Csn_pin   at LATA.B2;  sfr;
sbit Csn_pin   at LATA.B5;  sfr;
//sbit Miso_pin  at PORTC.B6; sfr;
sbit Miso_pin  at PORTB.B0; sfr;

//sbit Irq_tris  at TRISB.B0; sfr;
sbit Irq_tris  at TRISB.B2; sfr;//use interrupt 2
sbit Mosi_tris at TRISC.B7; sfr;//same
sbit Ce_tris   at TRISA.B4; sfr;//same
//sbit Sclk_tris at TRISA.B3; sfr;
sbit Sclk_tris at TRISB.B1; sfr;
//sbit Csn_tris  at TRISA.B2; sfr;
sbit Csn_tris  at TRISA.B5; sfr;
//sbit Miso_tris at TRISC.B6; sfr;
sbit Miso_tris at TRISB.B0; sfr;

void interrupt(){
  // in case you use interrupts, here is the moment when Rx has got the data from Tx
  //**************** Rx interrupt ***************
  //if (INTCON.INT0IF == 1){
  if (INTCON.INT2IF == 1){

      //INTCON.INT2IF = 0; // clear interrupt flag on RB0 (IRQ pin)
      INTCON.INT2IF = 0; // clear interrupt flag on RB2 (IRQ pin)
  }
  //*************************************************
}

void PreparePayload(){
char i;
  // prepare payload to be sent together with the ACK (see datasheet for NRF24L01+)
  for (i = 0; i < 20; i++)
    PayLoadBuff[i] = i;
  NRF24L01P_Write_Ack_Payload(PayLoadBuff, 0); // store payload to transmit buffer
}

void Init(){
  ANSELA = 0;           // all pins digital
  ANSELB = 0;
  ANSELC = 0;
  ANSELD = 0;

  //LATD   = 1;
  //TRISD  = 0;           // we will use PORTD for indicators
  TRISB.B3 = 0;           //B3 will be used as indicator
  LATB.B3  = 1;
  TRISB.B4 = 0;           //B4 will be used as indicator
  LATB.B4  = 1;

  INTCON = 0;           // no interrupts

  //INTCON.INT0IE   = 1;   // allow interrupt on INTO (IRQ_PIN)
  INTCON.INT2IE   = 1;   // allow interrupt on INT2 (IRQ_PIN)
  //INTCON2.INTEDG0 = 0;  // falling edge on INT0 causes the interrupt
  INTCON2.INTEDG2 = 0;  // falling edge on INT causes the interrupt

  RBPU_bit = 0;         // enable weak pull up on PORTB

  memset(&InData, 0, 21);// clear the array

  // address code, must be the same on Rx and Tx side
  Code_[10] = 0xAA;
  Code_[11] = 0xAA;
  Code_[12] = 0xAA;
  Code_[13] = 0xAA;
  Code_[14] = 0xAA;

  INTCON.GIE = 1;      // enable all interrupts, if you want them
}

char DetectTx(){
char passcnt;
char result;

  passcnt = 0;
  result  = 0;
  NRF24L01P_PowerUp();                  // start the NRF chip
  NRF24L01P_Rf_Channel = 20;           // set the radio channel, from 0..124
  NRF24L01P_init(5);                    // initialize RF module with the highest power
  NRF24L01P_Setup_Receiver(Code_);      // configure receiver
  memset(&InData, 0, 21);
  testRcv = NRF24L01P_Receive(InData); // procitaj ako je ista je stiglo na RF- brisi buffer
  PreparePayload();
  NRF24L01P_ClearIRQ();

  while (1){
      passcnt = 0;                     // try 50 times before giving up
      while (passcnt < 50){
          if (NRF24L01P_Has_Data()){ // is there any data received?
              testRcv = NRF24L01P_Receive(InData); // read the data and clear Rx buffer
              PreparePayload();         // prepare payload for the next session
              passcnt = 0;
              LATB.B4 = ~PORTB.B4;                // show activity when data arrives
              result = 1;
          }
        passcnt++;
        Delay_100ms();
      }

      NRF24L01P_PowerDown();            // shut down NRF24L01+
      Delay_100ms();
      NRF24L01P_Rf_Channel = 20;       // working channel
      NRF24L01P_Init(5);                // Initialize RF module
      NRF24L01P_Setup_Receiver(Code_);  // Reinitialize receiver
      memset(&InData, 0, 21);           // Clear inoming buffer
      LATB.B3 = PORTB.B3 ^ 1;
      PreparePayload();                 // prepare payload for the next session
      if (testRcv){
          // the data has been received
          result = 1;
      }
  }
}

void main(){
  Init();

  while (1){
      if (DetectTx()){
          // Tx is here, the data is received, it is stored in InData
          memset(&InData, 0, 21); // clear indata
      }
  }
}

Además, si observa otro error, apreciaré su consejo

Editar:

Okey, después de un poco de investigación, he encontrado que los registros ANSELx son para el control de entrada analógica, definiendo si la entrada debe considerarse como analógica si el bit está establecido en el registro ANSELx correspondiente, pero aún no sé el equivalente en 18f2550 que no tiene los registros ANSELx

Aquí hay un diagrama que muestra la operación del puerto IO en P18F45K22

    
pregunta Ernest Dujo

1 respuesta

1

ANSELA se utiliza para cambiar un puerto / pin a analógico si desea utilizar el ADC. Tenga en cuenta que no todos los puertos tienen ADC y que no serán los mismos de un PIC a otro. Las capacidades de cada pin para PORTA para ejemplos se enumeran en la tabla en la página 112 de la hoja de datos. Solo encontrará ANSELx en los pines / puertos que los tienen disponibles.

Probablemente sería mejor volver a escribir el código para evitar errores y problemas.

    
respondido por el Bilal

Lea otras preguntas en las etiquetas