Forum: Mikrocontroller und Digitale Elektronik RFM12 Empfangsroutine per Interrupt


von C. B. (catwiesl1000)


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.
von Ziegenpeter (Gast)


Lesenswert?

Empfänger vergessen einzuschalten (0x82C8)?
von Gerry L. (Gast)


Lesenswert?

Suche nach RFM12 nIRQ

Beitrag "Re: RFM12 Wakeup nIRQ"


Gerry
von Michael U. (amiga)


Lesenswert?

Hallo,

kannst ja mal hier reinschauen:
Beitrag "RFM12 Empfang von Sensordaten im IRQ"

läuft bei mir inzwischen seit mehreren Jahren zuverlässig.

Gruß aus Berlin
Michael
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.