RFM12 Empfangsroutine per Interrupt

OP #2488188
Lesenswert?

Hallo,

ich versuche eine Interrupt-gesteuerte Empfangsroutine für das RFM12 
Funkmodul und einen ATMEGA8 in C zu schreiben.

Bisher verwende ich ein Programm, dass per Polling arbeitet. Den Code 
hierfür und die Beschaltung habe ich aus folgendem Link (ab Seite 12): 
http://www.octamex.de/shop/datasheet/65eb60c317f2276781a6b6007a20d268.pdf

Auf das Wesentliche gekürzt, lautet der Code:
1
unsigned char RF12_RECV(void){ 
2
  unsigned int FIFO_data; 
3
  WAIT_IRQ_LOW(); 
4
  RFXX_WRT_CMD(0x0000);  
5
  FIFO_data=RFXX_WRT_CMD(0xB000);  
6
  return(FIFO_data&0x00FF); 
7
} 
8

9
void main(void) 
10
{    
11
  //Init RFM12
12
  ...
13

14
  //Init FIFO   
15
  RFXX_WRT_CMD(0xCA81);  
16

17
  while(1){  
18
    //Enable FIFO 
19
    RFXX_WRT_CMD(0xCA83);    
20
     ChkSum=0;     
21
           
22
     //Receive payload data 
23
     for(i=0;i<16;i++){  
24
       ChkSum+=RF12_RECV(); 
25
     }     
26
      
27
     //Receive Check sum 
28
     i=RF12_RECV();  
29

30
     //Disable FIFO 
31
     RFXX_WRT_CMD(0xCA81);
32

33
     //Package check 
34
   ...
35
     }      
36
  } 
37
}

Ich habe vergeblich versucht den Code so umzuschreiben, dass beim 
Empfang von Daten eine Interrupt-Routine mittels nIRQ-Leitung ausgelöst 
wird und diese Routine die Daten dann vom Funkmodul abholt. Der IRQ-Pin 
blieb bei meinen Versuchen konstant auf Low.

Für mein Verständnis müssten folgende Funktionen in die 
Interruptroutine:
Zum Abholen der Daten:
1
RFXX_WRT_CMD(0x0000)  
2
FIFO_data=RFXX_WRT_CMD(0xB000);
Um die FIFO erneut zum Befüllen freizugeben:
1
RFXX_WRT_CMD(0xCA83);

Sind die beschriebenen Funktionen für mein Vorhaben richtig und 
ausreichend?
Kann mir jemand sagen, wie eine einfache Interrupt-basierte 
Empfangsroutine aussieht?


Der Vollständigkeit halber noch die Empfänger-Einstellungen (s. Link):
1
void RF12_INIT(void){                                                      
2
  RFXX_WRT_CMD(0x80D8);//EL,EF,433band,12.5pF 
3
  RFXX_WRT_CMD(0x82D9);//!er,!ebb,ET,ES,EX,!eb,!ew,DC 
4
  RFXX_WRT_CMD(0xA640);//434MHz 
5
  RFXX_WRT_CMD(0xC647);//4.8kbps 
6
  RFXX_WRT_CMD(0x94A0);//VDI,FAST,134kHz,0dBm,-103dBm 
7
  RFXX_WRT_CMD(0xC2AC);//AL,!ml,DIG,DQD4 
8
  RFXX_WRT_CMD(0xCA81);//FIFO8,SYNC,!ff,DR 
9
  RFXX_WRT_CMD(0xC483);//@PWR,NO RSTRIC,!st,!fi,OE,EN 
10
  RFXX_WRT_CMD(0x9850);//!mp,9810=30kHz,MAX OUT 
11
  RFXX_WRT_CMD(0xE000);//NOT USE 
12
  RFXX_WRT_CMD(0xC800);//NOT USE 
13
  RFXX_WRT_CMD(0xC400);//1.66MHz,2.2V 
14
}

Danke für eure Ratschläge.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren