Forum: Mikrocontroller und Digitale Elektronik RFM12 Recieve Programm


von Gunar E. (avr-crack)


Lesenswert?

Guten Morgen,

Ich arbeite an einem kleinem Projekt mit RFM12 Modulen. Das 
Transmitt-programm funktioniert bereits, da ich mit dem Spektrumanalyser 
sehen kann, dass es was sendet.

Ich arbeite mit einem Atmega16, die Anschlüsse sind richtig definiert. 
Hier folgt nun der C-Code, ich hoffe ihr könnt mir dabei helfen, den 
Fehler zu finden, der mich zum Wahnsinn treibt.

/    RFM12
//    SCK  11 ----------- PB7
//    SDO 10 ----------- PB6
//    SDI  2 ----------- PB5
//    nSEL 3 ----------- PB4
//    DATA 9 ----------- PB3
//      nIRQ 5 ----------- PD5
//
//    PD6: LED green
//    PD7: LED red

#include <avr/io.h>
#include <AVR/interrupt.h>
#include <AVR/signal.h>


#define  DDR_IN    0
#define  DDR_OUT  1

#define  PORT_SEL  PORTB
#define  PIN_SEL  PINB
#define  DDR_SEL  DDRB

#define  PORT_SDI  PORTB
#define  PIN_SDI  PINB
#define   DDR_SDI  DDRB

#define  PORT_SCK  PORTB
#define  PIN_SCK  PINB
#define   DDR_SCK  DDRB

#define  PORT_SDO  PORTB
#define  PIN_SDO  PINB
#define  DDR_SDO  DDRB

#define  PORT_IRQ  PORTD
#define  PIN_IRQ  PIND
#define  DDR_IRQ  DDRD

//#define  PORT_DATA PIND
//#define  PIN_DATA  PIND
//#define  DDR_DATA  DDRD

#define  PORT_DATA  PORTB
#define  PIN_DATA  PINB
#define  DDR_DATA  DDRB

/*#define  PB7    7//--\
#define   PB6    6//    |
#define   RFXX_SCK  5//   |
#define  RFXX_SDO  4//   |RF_PORT
#define  RFXX_SDI   3//   |
#define  RFXX_SEL  2//   |
#define  NC      1//   |
#define  PB0    0//--/ */

#define  RFXX_SCK  7//--
#define   RFXX_SDO  6//    |
#define   RFXX_SDI   5//   |
#define  RFXX_SEL  4//   |RF_PORT
#define   RF12_DATA  3//   |
#define  PB2    2//   |
#define  NC      1//   |
#define  PB0    0//--

#define  SEL_OUTPUT()    DDR_SEL  |= (1<<RFXX_SEL)
#define  HI_SEL()      PORT_SEL |= (1<<RFXX_SEL)
#define  LOW_SEL()      PORT_SEL &=~(1<<RFXX_SEL)

#define  SDI_OUTPUT()    DDR_SDI  |= (1<<RFXX_SDI)
#define  HI_SDI()      PORT_SDI |= (1<<RFXX_SDI)
#define  LOW_SDI()      PORT_SDI &=~(1<<RFXX_SDI)

#define  SDO_INPUT()    DDR_SDO&= ~(1<<RFXX_SDO)
//#define  LOW_SDO()      PORT_SDO&= (1<<RFXX_SDO) Low_sdo wird nicht 
verwendent??!!
#define  SDO_HI()      PORT_SDO |= (1<<RFXX_SDO)

#define  SCK_OUTPUT()    DDR_SCK |= (1<<RFXX_SCK)
#define  HI_SCK()      PORT_SCK |= (1<<RFXX_SCK)
#define  LOW_SCK()      PORT_SCK &=~(1<<RFXX_SCK)

#define  RF12_IRQ      PD5  //von 2 auf 5 geändert, da IRQ bei
#define  IRQ_IN()      DDR_IRQ &=~ (1<<RF12_IRQ)
#define   WAIT_IRQ_LOW()    while (PIND&(1<<RF12_IRQ)) // WELCHER PIN???

//#define  RF12_DATA      PB3//PD4 auf PB3geändert
#define  DATA_OUT()      DDR_DATA |=(1<<RF12_DATA)
#define   HI_DATA()      PORT_DATA |= (1<<RF12_DATA)

//EinserKomplemente herausgenommen, sodass nur die benötigten Leds 
leuchten
//#define  LEDG_OUTPUT()    DDRC |=~ (1<<6)
//#define  LEDR_OUTPUT()    DDRC |=~ (1<<7)
//#define  LEDG_ON()      PORTC&=(1<<6) //Led 6 auf Megacard
//#define  LEDG_OFF()      PORTC|=(1<<6)
//#define  LEDR_ON()      PORTC&=(1<<7) //Led 7 (links) auf Megacard
//#define  LEDR_OFF()      PORTC|=(1<<7)

//Leds 6 und 7 definieren
#define LED6_OUTPUT()  DDRC |=(1<<6)
#define LED7_OUTPUT()   DDRC |=(1<<7)
#define LED5_OUTPUT()  DDRC |=(1<<5)

#define LED5_TestON()  PORTC |=(1<<5)
#define LED6_ON()    PORTC |=(1<<6)
#define LED7_ON()    PORTC |=(1<<7)

#define LED5_TestOFF()  PORTC &=~(1<<6)
#define LED6_OFF()    PORTC &=~(1<<6)
#define LED7_OFF()    PORTC &=~(1<<7)


void RFXX_PORT_INIT(void)
{
  //LED5_TestON();
  HI_SEL();
  HI_SDI();
  LOW_SCK();
  // SET nFFS pin HI when using FIFO
  HI_DATA();
  SEL_OUTPUT();
  SDI_OUTPUT();
  SDO_INPUT();
  SCK_OUTPUT();
  IRQ_IN();
  DATA_OUT();
}

unsigned int RFXX_WRT_CMD(unsigned int aCmd)
{
  //LED5_TestON();
  unsigned char i;
  unsigned int temp;
  temp = 0;
  LOW_SCK();
  LOW_SEL();
  for (i = 0;i<16;i++)
  {
    if(aCmd&0x8000)
    {
      //LED5_TestON();
      HI_SDI();
    }
    else
    {
      //LED5_TestON();
      LOW_SDI();
    }
    HI_SCK();
    temp<<=1;
    if (SDO_HI())
    {
      //LED5_TestON();  keine reaktion
      temp|=0x0001;
    }
    //LED5_TestON();
    LOW_SCK();

    aCmd<<=1;
  }
  //LED5_TestON();
  HI_SEL();
  return temp;
}

void RF12_INIT(void)
{
  //LED5_TestON();
  RFXX_WRT_CMD(0x80E8);//ef ein; b1 ein; x3 ein; 12,5pF; 868MHz
  RFXX_WRT_CMD(0x82D9);//er ein; ebb ein; es ein; ex ein;

  RFXX_WRT_CMD(0xA640);//f10 ein; f9 ein, f7 ein;
  RFXX_WRT_CMD(0xC647);//4.8kbps
  RFXX_WRT_CMD(0x94A0);//VDI,FAST,134kHz,0dbm,-103dBm
  RFXX_WRT_CMD(0xC2AC);//al ein, 1 ein, 1 ein; f2 ein;
  RFXX_WRT_CMD(0xCA81);//FIF08,SYNC,!ff,DR
  RFXX_WRT_CMD(0xCED4);//SYNC=2DD4
  RFXX_WRT_CMD(0xC4F7); //@PWR, NO RSTRIC, !st, !fi, OE, EN
  RFXX_WRT_CMD(0x9850);//!mp, 9810=30kHz,MAX OUT
  RFXX_WRT_CMD(0xCC77);//OB1,OB0,! 1px,! ddy, DDIT, BW0
  RFXX_WRT_CMD(0xE000);//NOT USE
  RFXX_WRT_CMD(0xC800);//NOT USE
  RFXX_WRT_CMD(0xC040);//1,66MHz, 2,2V
}

unsigned char RF12_RECV(void)
{

  unsigned int FIF0_data;
  WAIT_IRQ_LOW();
  RFXX_WRT_CMD(0x0000);
  FIF0_data=RFXX_WRT_CMD(0xB000);
  return(FIF0_data&0x00FF);
}

void Delay_ms(unsigned char amS)
{
  unsigned char i;
  unsigned int j;
  for(i=0;i<amS;i++)for(j=0;j<914;j++);
}

int main(void)
{

  LED5_TestOFF();
  LED5_OUTPUT();
  //LED5_TestON();
  unsigned char i;
  unsigned char ChkSum;

  //Power on indication: both LEDR and LEDG blink 3 times

  LED6_OFF();
  LED7_OFF();
  LED6_OUTPUT();
  LED7_OUTPUT();

  for(i=0;i<3;i++)
  {
    Delay_ms(200);
    LED6_ON();
    LED7_ON();
    //LED5_TestON();
    Delay_ms(200);
    LED6_OFF();
    LED7_OFF();
  }

  LED6_OFF();
  LED7_OFF();

  //Initialize command Port
  RFXX_PORT_INIT();

  //Initialize RF12 chip
  RF12_INIT();

  //Init FIF0,
  RFXX_WRT_CMD(0xCA81);      //FIFO Reset Mode: f3/FIFO IT level bit 3; 
dr/disable high sens. reset

    while(1)
    {
        //Enable FIF0
    RFXX_WRT_CMD(0xCA83);    //FIFO Reset Mode: f3/FIFO IT level bit 3; 
ff/FIFO fill; dr/disable high sens. reset
    ChkSum=0;
    //LED5_TestON();
    //Recive payload data
    for(i=0;i<16;i++)
    {
      ChkSum+=RF12_RECV();
      //LED5_TestON();
    }

    //Recive Check sum
    i=RF12_RECV();

    //Disable FIF0
    RFXX_WRT_CMD(0xCA81);     //FIFO Reset Mode: ff/FIFO fill wird 
ausgeschalten

    //Package check
    if(ChkSum==i)
    {
      //LED5_TestON();
      //Delay_ms(500);
      //LED5_TestOFF();
      LED6_ON();
      Delay_ms(500);
      LED6_OFF();
    }
    }
}

mit freundlichen Grüßen

von Krapao (Gast)


Lesenswert?

Das offensichtliche zuerst... Das ist nix:
1
void Delay_ms(unsigned char amS)
2
{
3
  unsigned char i;
4
  unsigned int j;
5
  for(i=0;i<amS;i++)for(j=0;j<914;j++);
6
}

Schau dir _delay_ms() aus der avr-libc an. Ist auch im AVR-GCC-Tutorial 
beschrieben.

Wenn es danach immer noch hakt, wieder melden (und länglichen Code bitte 
in den Anhang stecken, weil das bequemer zu lesen ist)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.