RFM12 Recieve Programm

OP #2518004
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
Gast #2519158
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)

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.