Moin,
ich habe angefangen mit diesen RFM Modulen zu spielen. Wollte es erstmal
mit einem kleinen Testprogramm mit dem RFM02 versuchen. Allerdings
funktioniert es nicht und ich habe keinen Plan warum.
Hier erstmal der Code von meinem Testprogramm:
1 | #include <avr/io.h>
|
2 | #include <avr/interrupt.h>
|
3 | #include <avr/pgmspace.h>
|
4 | #include <avr/eeprom.h>
|
5 | #include <stdlib.h>
|
6 | #include <util/delay.h>
|
7 | #include "global.h"
|
8 | #include "rf02.h"
|
9 |
|
10 | #define Taster_PORT PORTB
|
11 | #define Taster_DDR DDRB
|
12 | #define Taster_PIN PINB
|
13 | #define Taster 1
|
14 |
|
15 | #define LED_PORT PORTD
|
16 | #define LED_DDR DDRD
|
17 | #define LED_PIN PIND
|
18 | #define LED 5
|
19 |
|
20 |
|
21 | unsigned char test[2]="01";
|
22 |
|
23 | int main(void)
|
24 | {
|
25 | Taster_DDR &= ~(1<<Taster);
|
26 | LED_DDR |= (1<<LED);
|
27 |
|
28 | rf02_init(); // ein paar Register setzen (z.B. CLK auf 10MHz)
|
29 | rf02_setfreq(RF02FREQ(433.92)); // Sende/Empfangsfrequenz auf 433,92MHz einstellen
|
30 | rf02_setpower(0); // -0dBm Ausgangangsleistung
|
31 | rf02_setmodfreq(3); // 120kHz Frequenzshift
|
32 | rf02_setbaud(19200); // 19200 Baud
|
33 |
|
34 |
|
35 | while(1)
|
36 | {
|
37 | if (Taster_PIN & (1<<Taster))
|
38 | {
|
39 | rf02_txdata(test,2);
|
40 | LED_PORT |= (1<<LED);
|
41 | _delay_ms(1000);
|
42 | LED_PORT &= ~(1<<LED);
|
43 | }
|
44 | }
|
45 | }
|
Ich konnte das Problem immerhin einigermaßen eingrenzen. Es liegt auf
jeden Fall an der Funktion rf02_txdata. In dieser bleibt das Programm
immer hängen. Wenn ich sie auskommentiere läuft das Programm problemlos
und wenn ich sie nach dem Ausschalten der LED einfüge, kann man die LED
einmal aufleuchten lassen und danach hängt das Programm wieder.
Hier der Code der rf02_txdata:
1 | void rf02_txdata(unsigned char *data, unsigned char number)
|
2 | { unsigned char i,wert;
|
3 | wert=0xC6;
|
4 | cbi(CS_PORT, CS);
|
5 | for (i=0; i<8; i++)
|
6 | {
|
7 | if (wert&128)
|
8 | {
|
9 | sbi(SDI_PORT, SDI);
|
10 | }
|
11 | else
|
12 | {
|
13 | cbi(SDI_PORT, SDI);
|
14 | sbi(SCK_PORT, SCK);
|
15 | wert<<=1;
|
16 | _delay_us(0.2);
|
17 | cbi(SCK_PORT, SCK);
|
18 | }
|
19 | }
|
20 | rf02_shiftout(0xAA);
|
21 | rf02_shiftout(0xAA);
|
22 | rf02_shiftout(0xAA);
|
23 | rf02_shiftout(0x2D);
|
24 | rf02_shiftout(0xD4);
|
25 | for (i=0; i<number; i++)
|
26 | {
|
27 | rf02_shiftout(*data++);
|
28 | }
|
29 | sbi(CS_PORT, CS);
|
30 | while(IRQ_PIN&(1<<IRQ)); // wait until transfer done
|
31 | rf02_trans(0xC464); // TX off after 10us
|
32 | }
|
Den Code der gesammten RF02-Library habe ich mal in den Anhang gepackt.
Vielen Dank schonmal für jede Hilfe!