Forum: Mikrocontroller und Digitale Elektronik rfm12b / 433 mhz funk, einfach


von julius (Gast)


Lesenswert?

moin,


ihr kennt vielleicht den RFM12 code der hier mal von "Benedikt" gepostet 
wurde, fragen beziehen sich auf die version 
"rfm12_rs232_rxtx_check5.zip".


für zeilen nummern hab ich den code hier hochgeladen:
http://paste.pound-python.org/show/UHMMjdytdh0XNTwzuQRL/


anschluss:
in der rf12.c können die pins geändert werden:
#define RF_PORT PORTB
#define RF_DDR  DDRB
#define RF_PIN  PINB

#define SDI     3
#define SCK     5
#define CS      2
#define SDO     4


Benedikt schreibt das er nur 4 pins benötigt, jemand hat einen etwas 
anderen anschlussplan gepostet:
 http://www.mikrocontroller.net/attachment/25205/rfm12schaltplan.png


kann man trotzdem SDI/SCK/CS/SDO wie im plan verschalten und den rest 
ignorieren?
also noch VCC/GND sowie 10kOhm zwischen +5V und FSK/DATA/NFFS pin?
siehe:
http://jeelabs.org/2009/05/06/rfm12-vs-rfm12b-revisited/


dann weiter im code:
http://paste.pound-python.org/show/UHMMjdytdh0XNTwzuQRL/

zeile: 80
1
ifdef USE_SOFTCONFIG
2
    PORTD=255; 
3
    DDRD=230;
4
    DDRC=255;
5
#else
warum alle pins an PORTD auf high?
und dann aber nicht alle pins auf ausgang setzen mit DDRD=230, müsste 
das nicht DDRD=255 sein damit es mit der ersten zeile sinn ergibt?
auf DDRC alles auf ausgang?
es sollen ja nur 4 pings benötigt werden.


zeile 150 (ohne debug code):
1
       for (;;)
2
    {   if (rf12_data())                            // Daten im RF12 RX Puffer ?
3
        {   rx_packet();
4
        }
5
        if (!(flags&WAITFORACK))                    // Puffer nur dann f�llen, wenn die alten Daten aus dem Puffer wirklich angekommen sind
6
        {   if (uart_data())                        // Daten im UART RX Puffer ?
7
            {   if (!tx_cnt)
8
                    delaycnt=TX_TIMEOUT/2;          // Nach dem ersten Byte: timeout starten
9
                txbuf[tx_cnt++]=uart_getchar();
10
            }
11
            if ((tx_cnt>=MAX_BUF)||((tx_cnt)&&(delaycnt==0))) // Puffer voll, oder timeout seit erstem Byte im Puffer vorbei ?  -> senden
12
            {   tx_status=0;                        // zu sendender Status
13
                tx_packet(0);                       // erstmaliger Transfer
14
            }
15
        }
16
        else if (delaycnt==0)                       // Timeout: Daten nochmal senden
17
        {   LED_RETRANS=1;
18
            if (retrans_cnt)
19
            {   retrans_cnt--;
20
                tx_packet(1);                       // retransmit
21
            }
22
            else                                    // Versuche abgelaufen
23
            {   LED_ERR=1;                          // -> Fehler LED an
24
                tx_cnt=0;                           // -> Daten verwerfen
25
                tx_id++;
26
                flags&=~WAITFORACK;                 // Daten als OK markieren
27
28
            }
29
        }
30
    }

ziemlich am anfang steht:
1
delaycnt=TX_TIMEOUT/2;

ist das ein timeout der feststellt ob nichts mehr vom uart kommt?
dann wäre tx_cnt die position des zu sendenden zeichens das vom uart 
kommt?

tx_cnt findet sich in der datei main.c wieder, es wird an zwei stellen 
auf 0 gesetzt. einmal im oberen code nach einem timout
und einmal hier in der funktion rx_packet - das ist doch bestimmt die 
funktion "receive/empfangen" für die daten?
warum wird da tx = 0 mit // -> Daten als gesendet markieren 
kommentiert?
1
void rx_packet(void)
2
{   static unsigned char rx_lastid=255;
3
    unsigned char rx_cnt,i, rx_id, status;
4
    rx_cnt=rf12_rxdata(rxbuf, &status, &rx_id);     // komplettes Paket empfangen
5
    if (rx_cnt<=MAX_BUF)                            // Daten gültig (d.h. kein CRC Fehler) ?
6
    {   if (status&RECEIVED_OK)                     // Empfangsbestätigung ?
7
        {   flags&=~WAITFORACK;                     // -> "Warten auf Bestätigung"-Flag löschen
8
            tx_cnt=0;                               // -> Daten als gesendet markieren
9
            tx_id++;
10
            LED_RETRANS=0;
11
            LED_ERR=0;
12
        }
13
        if (rx_cnt)                                 // Daten empfangen
14
        {   tx_status=RECEIVED_OK;                  // zu sendender Status
15
            tx_packet(0);                           // Empfangsbestätigung senden
16
            retrans_cnt=RETRY;                      // Retry Counter neu starten
17
            if (rx_id!=rx_lastid)                   // Handelt es sich um neue Daten ?
18
            {
19
                rx_lastid=rx_id;                    // Aktuelle ID speichern
20
            }
21
        }
22
    }

von Wolfgang (Gast)


Lesenswert?

julius schrieb:
> mit DDRD=230, müsste das nicht DDRD=255 sein damit ...

Wie kommt man eigentlich auf die Idee, Bitmuster als Dezimalzahl zu 
schreiben?

Schreibe sie ordenlich als Binärzahl oder, wenn du in Hex denken kannst, 
als Hexadezimalzahl. Dann sieht man das mit einem Blick.

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.