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:
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.