Beste mede-CO-ers (co-CO-ers?),
Ik ben bezig met een RFM70 module aan een Attiny2313 te hangen. Ik gebruik 2 AVRDB2313 bordjes en daar zit de module op aangesloten. AVR en module draaien op 3.3V.
Doel is om als test een led te togglen, aangesloten op de ene AVRDB2313, als een schakelaar, aangesloten op de andere, wordt ingedrukt. Als test. Daarna wil ik er data over gaan sturen.
Maar het werkt niet, de led toggled niet, en ik heb packetloss hoewel de tranceivers nog geen 10cm uit elkaar op m'n bureau liggen.
Ik gebruik de RFM70 C lib van voti:
http://www.voti.nl/rfm70/
Mijn rfm70-config.h
// Er zou hier een template voor zijn, maar ik heb het nog niet kunnen vinden. Dan maar uit de losse pols
// definiëren van de gevraagde delayroutines:
#include <util/delay.h>
#define RFM70_WAIT_US _delay_us // delayrotine voor 1 us
#define RFM70_WAIT_MS _delay_ms // delayroutine voor 1 ms
// ja, dat is lomp, maar #define is search and replace dus dit moet goed gaan.
//definiëren van de pinnen. Ik zou eigenlijk liever de bestaande file aanpassen om de USI te gebruiken
// (Hardware SPI), maar goed.
#define RFM70_PIN_DIRECTION DDRB|=0b11011000 //portb.7=sck, portb.6=mosi, portb.5=miso, portb.4=CSN, protb.3=CE. De rest is "vrij te gebruiken"
//uitgangen:
#define RFM70_CE(A) {if((A)==0) \
PORTB&=~(1<<3); \
else \
PORTB|=(1<<3);}
#define RFM70_CSN(B) {if((B)==0) \
PORTB&=~(1<<4); \
else \
PORTB|=(1<<4);}
#define RFM70_MOSI(C) {if((C)==0) \
PORTB&=~(1<<6); \
else \
PORTB|=(1<<6);}
#define RFM70_SCK(D) {if((D)==0) \
PORTB&=~(1<<7); \
else \
PORTB|=(1<<7);}
//Ingang:
#define RFM70_MISO ((PINB&(1<<5))>>5) // pak bit 5 maar schuif het naar bit 1, anders gaat er wat fout in de software SPI.
Let wel: dit is voor het eerst dat ik zo'n config file maak. Maar SPI communicatie met de RFM70 werkt wel.
En m'n code:
#define F_CPU 4000000
#include <avr/io.h>
#include "rfm70-c/rfm70.h"
#include "rfm70-c/rfm70.c"
const unsigned char p1_address[]={ 0xDE, 0xAF, 0xD0, 0x0D, 0x01 } ; // deaf dude 1
const unsigned char p0_address[]={ 0xC0, 0xFF, 0xEE, 0xBA, 0xBE } ; // coffee babe
int main(){
uint8_t i, length, pipe;
rfm70_buffer rxbuf, txbuf;
DDRD|=0x0F;// pd.0: indicatieled aanwezigheid rfm70. pd.1: indicatieled ontvangst (toggle), pd2 indicatieled retransmit count
// pd3 indicatieled packetloss.
PORTB=0xFF; // pull-ups op portb (voor geval bordje met switches niet is aangesloten)
rfm70_init();
rfm70_retransmit_delay_attempts(0,15); //korste retransmit delay (250 ms?), 15 pogingen. (init zou 'm op traagste zetten)
rfm70_receive_address_p1(p1_address); // init zet P0 en P1 op gelijk adres, mag dat?
rfm70_receive_address_p0(p0_address); //
rfm70_transmit_address(p0_address); // P0 en transmit moeten gelijk adress hebben anders werkt ack niet.
i = rfm70_is_present();
if(i==0) PORTD|=(1<<0); else PORTD&=~(1<<0); //indicatieledje is active low en brand als rfm70 aanwezig is.
while(1){
if((PINB&(1<<0))==0) {
txbuf[0]=1;
rfm70_mode_transmit();
rfm70_transmit_message(txbuf,RFM70_MAX_PACKET_LEN);
// niet direct omschakelen naar receive mode: ding moet kans krijgen te zenden
do{
_delay_ms(500);
}while((PINB&(1<<0))==0);
rfm70_mode_receive();
}
i=rfm70_receive(&pipe,rxbuf,&length); // ontvangen van rfm70.
if(i==0){ // kan in 1 if, maar zo uitgeschreven om in debugger te kunnen zien wat er gebeurt.
// i is niet leesbaar in wathcwindow, maar zo kan ik het toch zien.
// PORTD^=(1<<2) ; // toggle rode led (even uitgecomment want gebruik die led nu voor wat anders)
}else if(rxbuf[0]==1){ // bij gelukte ontvangst van een 1:
PORTD^=(1<<1); // toggle LED
_delay_ms(500); // ter vertraging zodat LED ook zichbaar aan/uit gaat.
}
i=rfm70_retransmit_count();
if(i>10){
PORTD&=~(1<<2); // retransmit count over 10 LED, active LOW.
_delay_ms(500);
}else{
PORTD|=(1<<2);
}
i=rfm70_lost_packets_count();
if(i!=0){
PORTD&=~(1<<3); // lost packets LED, active LOW.
_delay_ms(500);
rfm70_lost_packets_reset();
}else{
PORTD|=(1<<3);
}
}
}
/* Note: ontvangen lukt niet, i blijft 0 bij i=rfm70_receive(&pipe,rxbuf,&length);
Retransmit count gaat >10 en er zijn lost packets al liggen de tranceivers naast elkaar
Intermiterend werkt het WEL (PD1 op ene bordje toggled dan na laag maken PB0 op andere bordje)
*/
Het stomme is dus dat het héél af en toe wél werkt (met dezelfde code), maar nooit lang.
Zou een van jullie hier met een frisse blik naar willen kijken?
Ik zit me blind te staren en zie de fout niet.