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