rfm70 voti code omzetten voor pic 16f690

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • huub8
  • Registratie: Maart 2009
  • Laatst online: 28-06-2021
Ik ben al een tijdje bezig met behulp van circuitsonline om de code te vinden op de voti website om te zetten naar code in mikroc voor een tweetal 16f690 pics, die met behulp van twee 70rfm modules moeten communiceren.

Ik loop echter tegen een paar fouten aan, en hoopte dat één van jullie hiermee kan helpen, op circuitsonline wordt namelijk niet meer gereageerd.

De fouten zijn als volgt:

509 382 Illegal pointer conversion to double rfm70.c

Door dit stukje code:

code:
1
2
3
4
5
6
for( i = 0; i <= 8; i++ ){ //reverse!
      for( j = 0; j < 4; j++ ){
         WriteArr[ j ]=( Bank1_Reg0_13[ i ]>>(8*(j) ) )&0xff;
      }  
      rfm70_buffer_write( i,WriteArr, 4 );
   }


En dan komt het door het WriteArr argument in rfm70_buffer_write( i,WriteArr, 4 );

De volgende dingen heb ik al geprobeerd:


rfm70_buffer_write( i,&WriteArr[0], 4 );

Geeft hij de foutmelding:

510 384 Illegal pointer conversion rfm70.c

Net als wanneer ik dit doe:

rfm70_buffer_write( i,WriteArr, 4 );


Alleen als ik dit doe geeft hij geen foutmelding:

rfm70_buffer_write( i,*WriteArr, 4 );

Maar wel weer een warning, namelijk deze:

510 1508 Implicit conversion of int to ptr rfm70.c


Daarnaast heb ik nog een fout:

Ik krijg nu ook deze foutmelding:
0 359 Unresolved extern 'PORTC_SHADOW' rfm.c
door deze aanroep
rfm70_init();

en dan denk ik dat het in deze code echt zit:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
extern unsigned char PORTA_SHADOW;
   extern unsigned char PORTB_SHADOW;
   extern unsigned char PORTC_SHADOW;
   extern unsigned char PORTD_SHADOW;
   extern unsigned char PORTE_SHADOW;
 
   #define PORTA_FLUSH { PORTA = PORTA_SHADOW; }
   #define PORTB_FLUSH { PORTB = PORTB_SHADOW; }
   #define PORTC_FLUSH { PORTC = PORTC_SHADOW; }
   #define PORTD_FLUSH { PORTD = PORTD_SHADOW; }
   #define PORTE_FLUSH { PORTE = PORTE_SHADOW; }
 
   #define PIN_SET( port, b ) do { \
      port##_SHADOW |= ( 1 << (b) ); \
      port = port##_SHADOW; \
   } while(0)
 
   #define PIN_CLEAR( port, b ) do { \
      port##_SHADOW &= ( 0xFF ^ ( 1 << (b) )); \
      port = port##_SHADOW; \
   } while(0)
 
   #define PIN_COPY( port, b, v ) do { \
      if( v ){  \
         PIN_SET( port, (b) ); \
      } else { \
        PIN_CLEAR( port, (b) ); } \
   } while(0)
 
   #define PORT_SET( port, v ) do { \
      port##_SHADOW = ( (v) ); \
      port = port##_SHADOW; \
   } while(0)


Alle bestanden zijn hier te vinden:
http://www.uploadarchief.net/files/download/rfm70.zip

En zijn gebaseerd op de voti code, hier te vinden:
http://www.voti.nl/rfm70/

Acties:
  • 0 Henk 'm!

  • huub8
  • Registratie: Maart 2009
  • Laatst online: 28-06-2021
Niemand?

Acties:
  • 0 Henk 'm!

  • Sprite_tm
  • Registratie: September 2002
  • Laatst online: 11-10 13:39

Sprite_tm

Semi-Chinees

Wat is je WriteArr precies? Hoe ziet je declaratie van rfm70_buffer_write eruit? Enig idee waar PORTC_SHADOW vandaan zou moeten komen?

Relaxen und watchen das blinkenlichten. | Laatste project: Ikea Frekvens oog


Acties:
  • 0 Henk 'm!

  • huub8
  • Registratie: Maart 2009
  • Laatst online: 28-06-2021
Dit is de code waarin writearr word gemaakt:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
   // initialize bank1 like in the example code.
   // don't ask why, just do it
void rfm70_init_bank1( void ){
   unsigned char i, j;
   unsigned char WriteArr[ 12 ];
        
   rfm70_bank( 1 );
   
   for( i = 0; i <= 8; i++ ){ //reverse!
      for( j = 0; j < 4; j++ ){
         WriteArr[ j ]=( Bank1_Reg0_13[ i ]>>(8*(j) ) )&0xff;
      }  
      rfm70_buffer_write( i,*WriteArr, 4 );
   }

   for( i = 9; i <= 13; i++ ){
      for( j = 0; j < 4; j++ ){
         WriteArr[ j ]=( Bank1_Reg0_13[ i ]>>(8*(3-j) ) )&0xff;
      }
      rfm70_buffer_write( i, *WriteArr, 4 );
   }

   rfm70_buffer_write( 14, Bank1_Reg14, 11 );

   //toggle REG4<25,26>
   for(j=0;j<4;j++){
      WriteArr[ j ]=( Bank1_Reg0_13[ 4 ]>>(8*(j) ) )&0xff;
   } 

   WriteArr[ 0 ] = WriteArr[ 0 ] | 0x06;
   rfm70_buffer_write( 4, *WriteArr, 4);

   WriteArr[ 0 ] = WriteArr[ 0 ] & 0xf9;
   rfm70_buffer_write( 4, *WriteArr,4);

   rfm70_bank( 0 );
}


een andere aanroep ergens anders in het programma van de functie ziet er zo uit en werkt wel:
code:
1
2
3
void rfm70_receive_address_p0( const unsigned char address[ 5 ] ){
   rfm70_buffer_write( RFM70_REG_RX_ADDR_P0, address, 5 );  
}



De functie zelf ziet er zo uit:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void rfm70_buffer_write( 
   char reg, 
   const unsigned char *pBuf, 
   unsigned char length 
){
   unsigned char i;
   if( reg < RFM70_CMD_WRITE_REG ){
      reg |= RFM70_CMD_WRITE_REG;      
   }  
   RFM70_CSN( 0 );                     // Set CSN low, init SPI tranaction
   rfm70_SPI_RW( reg );         // Select register to write tio write
   for( i = 0; i < length; i++ ){      // write all bytes in buffer(*pBuf)
      rfm70_SPI_RW( *pBuf++ );  // write one byte
   }   
   RFM70_CSN( 1 );                     // Set CSN high again
}


Ik heb net toch de tweede fout nog zelf op kunnen lossen, er bleek een include te missen

Acties:
  • 0 Henk 'm!

  • Lone Gunman
  • Registratie: Juni 1999
  • Niet online
Opzich lijkt me de originele code correct, maar misschien heeft de mikroc compiler afwijkend gedrag m.b.t. const?
Het zou kunnen zijn dat de compiler een const unsigned char* interpreteert als een pointer naar rom en geen non-const naar const conversie doet waardoor een unsigned char* naar ram niet geaccepteerd wordt? Het valt me namelijk op dat in de c string library van mikroc nergens const wordt gebruikt waar je dat wel zou verwachten, b.v. bij strlen, strcmp etc.

Lijkt me iig wel de moeite om te kijken wat er gebeurd als je het argument van de functie rfm70_buffer_write aanpast van const unsigned char *pBuf naar unsigned char *pBuf. Niet zo netjes, maar in dit geval misschien wel nodig.

Experience has taught me that interest begets expectation, and expectation begets disappointment, so the key to avoiding disappointment is to avoid interest.


Acties:
  • 0 Henk 'm!

  • huub8
  • Registratie: Maart 2009
  • Laatst online: 28-06-2021
Als ik dat doe krijg ik dezelfde error maar dan voor alle andere aanroepen (zoals die die hierboven staat)

[ Voor 17% gewijzigd door huub8 op 15-03-2012 18:58 ]

Pagina: 1