Forum: Mikrocontroller und Digitale Elektronik RFM70 - Ich erbitte Starthilfe


von Christian (Gast)


Lesenswert?

Hallo Zusammen,
ich versuche gerade eine Kommunikation zwischen zwei RFM70-Modulen 
aufzubauen.
Zu allem Übel bin ich gerade von Bascom auf C umgestiegen, was die Sache 
nicht nennenswert leichter macht.

Ich habe den Beispielcode und die Library von 
http://projects.web4clans.com/?p=90 genommen. Dieser Code ist für den 
Atmega32 konzipiert. Ich arbeite mit einem Atmega168.

Mein erstes Problem ist folgendes:
Im Beispielcode steht
1
    #include <inttypes.h>
2
    #include <avr/io.h>
3
    #include <avr/interrupt.h>
4
    #include <util/delay.h>
5
     
6
    #include "uart.h"
7
    #include "rfm70.h"
8
     
9
    #define UART_BAUD_RATE 9600
10
     
11
    int main()
12
    {
13
    uint8_t buffer[32];
14
     
15
    sei();
16
    uart_init( UART_BAUD_SELECT(UART_BAUD_RATE,F_CPU) );
17
     
18
    DDRA |= (1<<PA4);
19
    _delay_ms(1000);
20
    uart_puts("System Ready\n");
21
    Begin();
22
     
23
    setMode(1);
24
    setChannel(8);
25
     
26
    while (1)
27
    {
28
    if (receivePayload(buffer))
29
    {
30
    uart_puts((char*)buffer);
31
    uart_puts("\n");
32
    }
33
    }
34
    }

Mit dieser Zeile
1
    DDRA |= (1<<PA4);
habe ich ein Problem, der Atmega168 hat ja keinen PortA und ich kann die 
Aufgabe hier noch nicht ganz nachvollziehen. Welchen Port müsste ich 
hier für den Atmega168 wählen? In der Library rfm70.c taucht dieser Port 
auch auf. Es ist jedoch keine Funktion dafür näher beschrieben.

Freundliche Grüße, Christian

von Sascha W. (sascha-w)


Lesenswert?

Hallo,

was ist denn in der Originalschaltung an PA4 angeschlossen, und wo ist 
es bei Dir angeschlossen!?

Sascha

von Christian (Gast)


Lesenswert?

Hallo Sascha,
leider ist auf der Projektseite kein Schaltplan hinterlegt. Ich habe 
auch schon geguckt, ob der Atmega32 an diesem Pin eine besondere 
Funktion hat. Dies ist nicht der Fall.

Hier ein Ausschnitt aus der rfm70.c dort ist PA4 an zwei stellen 
verwendet. Vielleicht kann sich darauf ja jemand einen Reim bilden.
1
uint8_t sendPayload(uint8_t * payload, uint8_t len, uint8_t toAck)  // choose 0=nAck, 1=AckRequest
2
{
3
  
4
    // check TX_FIFO
5
    uint8_t status;
6
    status = readRegVal(RFM70_REG_FIFO_STATUS); 
7
    if (status & RFM70_FIFO_STATUS_TX_FULL) 
8
  {
9
      debug(RFM70_DEBUG_FIFO_FULL);
10
      return 0;
11
    }
12
13
    // send payload
14
  PORT_SPI &=~ (1<<CSN);
15
    _delay_ms(RFM70_CS_DELAY);
16
    if(toAck == -1)
17
      transmitSPI(RFM70_CMD_W_ACK_PAYLOAD);
18
    else if (toAck == 0)
19
      transmitSPI(RFM70_CMD_W_TX_PAYLOAD_NOACK);
20
    else
21
      transmitSPI(RFM70_CMD_WR_TX_PLOAD);
22
    while(len--) 
23
  {
24
      transmitSPI(*(payload++));
25
    uart_putc(*payload);
26
    uart_puts(", ");
27
    }
28
  PORT_SPI |= (1<<CSN);
29
    _delay_ms(RFM70_CS_DELAY);
30
  uart_puts("\n");
31
  PORTA ^= (1<<PA4);
32
    return 1;
33
}
34
35
uint8_t receivePayload(uint8_t *payload)
36
{
37
    uint8_t len;
38
    // check RX_FIFO
39
    uint8_t status;
40
    status = readRegVal(RFM70_REG_STATUS);
41
    if (status & RFM70_IRQ_STATUS_RX_DR) { // RX_DR
42
          PORTA ^= (1<<PA4);
43
      //while(1) {
44
        uint8_t fifo_sta;
45
        len = readRegVal(RFM70_CMD_RX_PL_WID); // Payload width
46
        readRegBuf(RFM70_CMD_RD_RX_PLOAD, payload, len);
47
        fifo_sta = readRegVal(RFM70_REG_FIFO_STATUS);
48
        //if (fifo_sta & RFM70_FIFO_STATUS_RX_EMPTY) break; // read until RX_FIFO empty
49
      //}
50
    
51
        if (fifo_sta & RFM70_FIFO_STATUS_RX_EMPTY) {
52
          status|= 0x40 & 0xCF; // clear status bit rx_dr
53
        writeRegVal(RFM70_CMD_WRITE_REG | RFM70_REG_STATUS, status); 
54
        }
55
      return len;
56
    }
57
    else
58
  {
59
    
60
      return 0;
61
  }
62
}

von g457 (Gast)


Lesenswert?

> Hier ein Ausschnitt aus der rfm70.c dort ist PA4 an zwei stellen
> verwendet. Vielleicht kann sich darauf ja jemand einen Reim bilden.

Sieht sich mir nach einer Debug^WHello-World-LED aus :-)

von Sascha W. (sascha-w)


Lesenswert?

g457 schrieb:
> Sieht sich mir nach einer Debug^WHello-World-LED aus :-)
genau - wird an diversen Stellen einfach getoggelt

@Christian
nimm einfach einen anderen freien Pin den du hast und klemme eine LED 
dran, oder auch nicht, dann kommentierst du Zeilen im Program einfach 
aus.

Sascha

von Christian (Gast)


Lesenswert?

Ich danke euch.
Habe jetzt einen anderen Pin genommen und das im Programm enstprechend 
angepasst.

Nur so richtig senden und empfangen will das Ding noch nicht. Na mal 
schauen, wie das weitergeht :-)

von Michael (c0d3z3r0)


Angehängte Dateien:

Lesenswert?

Hallo,

ich habe eine kleine Frage zu den Registerinitialisierungen des RFM70.

Im HopeRF-Beispielcode (und auch in der oben genannten Library) ist die 
Bitreihenfolge bei der Initialisierung der Registerbank 1 teilweise 
genau umgekehrt:

Im Datenblatt steht z.B. "00 / 31:0  0  W / Must write with 
0x404B01E2" - initialisiert wird mit "{ (0x20|0x00), 0x40, 0x4B, 0x01, 
0xE2 }".
ABER Datenblatt: "0C / 31:0  0  Please initialize with 0x00731200" - 
und initialisiert wird mit "{ (0x20|0x0C), 0x00, 0x12, 0x73, 0x00 }".

Ist das wirklich richtig so?


Danke schonmal!

Viele Grüße,
Michael

von Michael (c0d3z3r0)


Lesenswert?

Hat denn niemand ne Idee? :(

von Funker (Gast)


Lesenswert?

siehe hier:

Beitrag "Hat jemand Erfahrung mit dem 2,4GHz-Transceiver RFM70?"


da ist das alles genau erklärt.

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.