سلام به همه.... یه کمک میخوام در مورد کار با ماجول RFM12B ... حالا مشکل چیه....
من با استفاده از ماجول های رادیویی ار اف ام 12 بی و دو تا میکروی مگا 16 تصمیم دارم تبادل اطلاعات کنم....
اول یه سری کد بود برداشتم قسمت های به گمان زادش رو حذف کردم.... حالا یه مشکلی هست این که من از ست فرستنده تعریف کردم آقای میکروکنترلر بنده اگر فلان پایه رو صفر کردم شما فلان کد رو بفرست اگر صفر نکردم اون یکی کد رو بفرست.... حالا سمت گیرنده هم ست کردم که آقای گینده اگر فلان کد اومد این ال ای دی رو روشن کن اگر اون یکی کد اومد اون یکی ال ای دی رو روشن کن....
همه اینارو گفتیم و مدار رو بستیم و پروگرم کردیم...اما مساله اینجا بود که آقای فرستنده یه چیزایی میفرستاد و آقای گیرنده میگیرفت و در هر حال کی از ال ای دی ها بدون تغییر روشن میموند... اول فکر کردم کلا کار نمیکنه برای همین خواستم تست کنم ببینم قضیه از کجاس کلا توهم هست یا یه چیزی میاد بعد توهم میگیره.... بنابر این فرستنده رو قطع کردم کل مدار رو ریست کردم دیدم گیرنده ال ای دی رو روشن نکرد....به محض اینکه فرستنده رو دوباره روشن کردم گیرنده همون توهم رو زد...حالا کمک میخوام ببینم کجای کار لنگ میزند....
مرسی
این هم کد ها
فرستنده :
#define F_CPU 12000000L /* evaluation board runs on 4MHz */
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>
#include <avr/wdt.h>
#include <util/delay.h>
/* RFM12B INTERFACE */
#define SCK 7 // SPI clock
#define SDO 5 // SPI Data output (RFM12B side)
#define SDI 6 // SPI Data input (RFM12B side)
#define CS 4 // SPI SS (chip select)
#define NIRQ 2 // (PORTD)
/* IO CONTROL */
#define HI(x) PORTB |= (1<<(x))
#define LO(x) PORTB &= ~(1<<(x))
#define WAIT_NIRQ_LOW() while(PIND&(1<<NIRQ))
/* LED */
#define LED 6
#define LED_OFF() PORTD &= ~(1<<LED)
#define LED_ON() PORTD |= (1<<LED)
void
delay_ms(uint16_t ms)
{
while ( ms )
{
_delay_ms(1);
ms--;
}
}
void portInit() {
HI(CS);
HI(SDI);
LO(SCK);
DDRB = (1<<CS) | (1<<SDI) | (1<<SCK);
DDRD = (1<<LED);
}
unsigned int writeCmd(unsigned int cmd) {
unsigned char i;
unsigned int recv;
recv = 0;
LO(SCK);
LO(CS);
for(i=0; i<16; i++) {
if(cmd&0x8000) HI(SDI); else LO(SDI);
HI(SCK);
recv<<=1;
if( PINB&(1<<SDO) ) {
recv|=0x0001;
}
LO(SCK);
cmd<<=1;
}
HI(CS);
return recv;
}
void rfInit() {
writeCmd(0x80E7); //EL,EF,868band,12.0pF
writeCmd(0x8239); //!er,!ebb,ET,ES,EX,!eb,!ew,DC
writeCmd(0xA640); //frequency select
writeCmd(0xC647); //4.8kbps
writeCmd(0x94A0); //VDI,FAST,134kHz,0dBm,-103dBm
writeCmd(0xC2AC); //AL,!ml,DIG,DQD4
writeCmd(0xCA81); //FIFO8,SYNC,!ff,DR
writeCmd(0xCED4); //SYNC=2DD4 , AG
writeCmd(0xC483); //@PWR,NO RSTRIC,!st,!fi,OE,EN
writeCmd(0x9850); //!mp,90kHz,MAX OUT
writeCmd(0xCC17); //OB1 , ACOB0, LPX,Iddy,CDDIT,CBW0
writeCmd(0xE000); //NOT USED
writeCmd(0xC800); //NOT USED
writeCmd(0xC040); //1.66MHz,2.2V
}
void rfSend(unsigned char data)
{
WAIT_NIRQ_LOW();
writeCmd(0xB800 + data);
}
int main() {
unsigned char KEY;
volatile unsigned int i,j;
asm("cli"
;
for(i=0;i<1000;i++)for(j=0;j<123;j++);
portInit();
rfInit();
while(1){
LED_ON();
writeCmd(0x0000);
rfSend(0xAA); // PREAMBLE
rfSend(0xAA);
rfSend(0xAA);
rfSend(0x2D); // SYNC
rfSend(0xD4);
for(i=0; i<16; i++) {
rfSend(0x30+i);
}
KEY= PINA & (1<<5);
if (KEY==0x20)
rfSend(0x01);
else
rfSend(0x03);
delay_ms(2000);
LED_OFF();
for(i=0; i<10000; i++) // some not very
for(j=0; j<123; j++); // sophisticated delay
}
}
این هم کد گیرنده :
#define F_CPU 8000000L /* evaluation board runs on 4MHz */
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>
#include <avr/wdt.h>
#include <util/delay.h>
/* RFM12B INTERFACE */
#define SCK 7 // SPI clock
#define SDO 5 // SPI Data output (RFM12B side)
#define SDI 6 // SPI Data input (RFM12B side)
#define CS 4 // SPI SS (chip select)
#define NIRQ 2 // (PORTD)
/* IO CONTROL */
#define HI(x) PORTB |= (1<<(x))
#define LO(x) PORTB &= ~(1<<(x))
#define WAIT_NIRQ_LOW() while(PIND&(1<<NIRQ))
/* LED */
#define LED 6
#define LED_OFF() PORTD &= ~(1<<LED)
#define LED_ON() PORTD |= (1<<LED)
#define BAUDRATE 25 // 19200 at 8MHz
void
delay_ms(uint16_t ms)
{
while ( ms )
{
_delay_ms(1);
ms--;
}
}
void portInit() {
HI(CS);
HI(SDI);
LO(SCK);
DDRB = (1<<CS) | (1<<SDI) | (1<<SCK);
DDRD = (1<<LED);
}
unsigned int writeCmd(unsigned int cmd) {
unsigned char i;
unsigned int recv;
recv = 0;
LO(SCK);
LO(CS);
for(i=0; i<16; i++) {
if(cmd&0x8000) HI(SDI); else LO(SDI);
HI(SCK);
recv<<=1;
if( PINB&(1<<SDO) ) {
recv|=0x0001;
}
LO(SCK);
cmd<<=1;
}
HI(CS);
return recv;
}
void rfInit() {
writeCmd(0x80E7); //EL,EF,868band,12.0pF
writeCmd(0x8299); //er,!ebb,ET,ES,EX,!eb,!ew,DC (bug was here)
writeCmd(0xA640); //freq select
writeCmd(0xC647); //4.8kbps
writeCmd(0x94A0); //VDI,FAST,134kHz,0dBm,-103dBm
writeCmd(0xC2AC); //AL,!ml,DIG,DQD4
writeCmd(0xCA81); //FIFO8,SYNC,!ff,DR (FIFO level = 8)
writeCmd(0xCED4); //SYNC=2DD4;
writeCmd(0xC483); //@PWR,NO RSTRIC,!st,!fi,OE,EN
writeCmd(0x9850); //!mp,90kHz,MAX OUT
writeCmd(0xCC17); //!OB1,!OB0, LPX,!ddy,DDIT,BW0
writeCmd(0xE000); //NOT USE
writeCmd(0xC800); //NOT USE
writeCmd(0xC040); //1.66MHz,2.2V
}
unsigned char rfRecv() {
unsigned int data;
while(1) {
data = writeCmd(0x0000);
if ( (data&0x8000) ) {
data = writeCmd(0xB000);
return (data&0x00FF);
}
}
}
void FIFOReset() {
writeCmd(0xCA81);
writeCmd(0xCA83);
}
int main(void) {
unsigned char data, i;
LED_OFF();
portInit();
rfInit();
FIFOReset();
while(1) {
//waitForData();
for (i=0; i<16; i++) {
data = rfRecv();
if (data==0x01)
PORTD&=~(1<<5);
else
PORTD|=(1<<5);
if (data==0x03)
PORTD&=~(1<<4);
else
PORTD|=(1<<4);
delay_ms(2000);
}
FIFOReset();
}
return 0;
}
من با استفاده از ماجول های رادیویی ار اف ام 12 بی و دو تا میکروی مگا 16 تصمیم دارم تبادل اطلاعات کنم....
اول یه سری کد بود برداشتم قسمت های به گمان زادش رو حذف کردم.... حالا یه مشکلی هست این که من از ست فرستنده تعریف کردم آقای میکروکنترلر بنده اگر فلان پایه رو صفر کردم شما فلان کد رو بفرست اگر صفر نکردم اون یکی کد رو بفرست.... حالا سمت گیرنده هم ست کردم که آقای گینده اگر فلان کد اومد این ال ای دی رو روشن کن اگر اون یکی کد اومد اون یکی ال ای دی رو روشن کن....
همه اینارو گفتیم و مدار رو بستیم و پروگرم کردیم...اما مساله اینجا بود که آقای فرستنده یه چیزایی میفرستاد و آقای گیرنده میگیرفت و در هر حال کی از ال ای دی ها بدون تغییر روشن میموند... اول فکر کردم کلا کار نمیکنه برای همین خواستم تست کنم ببینم قضیه از کجاس کلا توهم هست یا یه چیزی میاد بعد توهم میگیره.... بنابر این فرستنده رو قطع کردم کل مدار رو ریست کردم دیدم گیرنده ال ای دی رو روشن نکرد....به محض اینکه فرستنده رو دوباره روشن کردم گیرنده همون توهم رو زد...حالا کمک میخوام ببینم کجای کار لنگ میزند....
مرسی
این هم کد ها
فرستنده :
#define F_CPU 12000000L /* evaluation board runs on 4MHz */
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>
#include <avr/wdt.h>
#include <util/delay.h>
/* RFM12B INTERFACE */
#define SCK 7 // SPI clock
#define SDO 5 // SPI Data output (RFM12B side)
#define SDI 6 // SPI Data input (RFM12B side)
#define CS 4 // SPI SS (chip select)
#define NIRQ 2 // (PORTD)
/* IO CONTROL */
#define HI(x) PORTB |= (1<<(x))
#define LO(x) PORTB &= ~(1<<(x))
#define WAIT_NIRQ_LOW() while(PIND&(1<<NIRQ))
/* LED */
#define LED 6
#define LED_OFF() PORTD &= ~(1<<LED)
#define LED_ON() PORTD |= (1<<LED)
void
delay_ms(uint16_t ms)
{
while ( ms )
{
_delay_ms(1);
ms--;
}
}
void portInit() {
HI(CS);
HI(SDI);
LO(SCK);
DDRB = (1<<CS) | (1<<SDI) | (1<<SCK);
DDRD = (1<<LED);
}
unsigned int writeCmd(unsigned int cmd) {
unsigned char i;
unsigned int recv;
recv = 0;
LO(SCK);
LO(CS);
for(i=0; i<16; i++) {
if(cmd&0x8000) HI(SDI); else LO(SDI);
HI(SCK);
recv<<=1;
if( PINB&(1<<SDO) ) {
recv|=0x0001;
}
LO(SCK);
cmd<<=1;
}
HI(CS);
return recv;
}
void rfInit() {
writeCmd(0x80E7); //EL,EF,868band,12.0pF
writeCmd(0x8239); //!er,!ebb,ET,ES,EX,!eb,!ew,DC
writeCmd(0xA640); //frequency select
writeCmd(0xC647); //4.8kbps
writeCmd(0x94A0); //VDI,FAST,134kHz,0dBm,-103dBm
writeCmd(0xC2AC); //AL,!ml,DIG,DQD4
writeCmd(0xCA81); //FIFO8,SYNC,!ff,DR
writeCmd(0xCED4); //SYNC=2DD4 , AG
writeCmd(0xC483); //@PWR,NO RSTRIC,!st,!fi,OE,EN
writeCmd(0x9850); //!mp,90kHz,MAX OUT
writeCmd(0xCC17); //OB1 , ACOB0, LPX,Iddy,CDDIT,CBW0
writeCmd(0xE000); //NOT USED
writeCmd(0xC800); //NOT USED
writeCmd(0xC040); //1.66MHz,2.2V
}
void rfSend(unsigned char data)
{
WAIT_NIRQ_LOW();
writeCmd(0xB800 + data);
}
int main() {
unsigned char KEY;
volatile unsigned int i,j;
asm("cli"

for(i=0;i<1000;i++)for(j=0;j<123;j++);
portInit();
rfInit();
while(1){
LED_ON();
writeCmd(0x0000);
rfSend(0xAA); // PREAMBLE
rfSend(0xAA);
rfSend(0xAA);
rfSend(0x2D); // SYNC
rfSend(0xD4);
for(i=0; i<16; i++) {
rfSend(0x30+i);
}
KEY= PINA & (1<<5);
if (KEY==0x20)
rfSend(0x01);
else
rfSend(0x03);
delay_ms(2000);
LED_OFF();
for(i=0; i<10000; i++) // some not very
for(j=0; j<123; j++); // sophisticated delay
}
}
این هم کد گیرنده :
#define F_CPU 8000000L /* evaluation board runs on 4MHz */
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>
#include <avr/wdt.h>
#include <util/delay.h>
/* RFM12B INTERFACE */
#define SCK 7 // SPI clock
#define SDO 5 // SPI Data output (RFM12B side)
#define SDI 6 // SPI Data input (RFM12B side)
#define CS 4 // SPI SS (chip select)
#define NIRQ 2 // (PORTD)
/* IO CONTROL */
#define HI(x) PORTB |= (1<<(x))
#define LO(x) PORTB &= ~(1<<(x))
#define WAIT_NIRQ_LOW() while(PIND&(1<<NIRQ))
/* LED */
#define LED 6
#define LED_OFF() PORTD &= ~(1<<LED)
#define LED_ON() PORTD |= (1<<LED)
#define BAUDRATE 25 // 19200 at 8MHz
void
delay_ms(uint16_t ms)
{
while ( ms )
{
_delay_ms(1);
ms--;
}
}
void portInit() {
HI(CS);
HI(SDI);
LO(SCK);
DDRB = (1<<CS) | (1<<SDI) | (1<<SCK);
DDRD = (1<<LED);
}
unsigned int writeCmd(unsigned int cmd) {
unsigned char i;
unsigned int recv;
recv = 0;
LO(SCK);
LO(CS);
for(i=0; i<16; i++) {
if(cmd&0x8000) HI(SDI); else LO(SDI);
HI(SCK);
recv<<=1;
if( PINB&(1<<SDO) ) {
recv|=0x0001;
}
LO(SCK);
cmd<<=1;
}
HI(CS);
return recv;
}
void rfInit() {
writeCmd(0x80E7); //EL,EF,868band,12.0pF
writeCmd(0x8299); //er,!ebb,ET,ES,EX,!eb,!ew,DC (bug was here)
writeCmd(0xA640); //freq select
writeCmd(0xC647); //4.8kbps
writeCmd(0x94A0); //VDI,FAST,134kHz,0dBm,-103dBm
writeCmd(0xC2AC); //AL,!ml,DIG,DQD4
writeCmd(0xCA81); //FIFO8,SYNC,!ff,DR (FIFO level = 8)
writeCmd(0xCED4); //SYNC=2DD4;
writeCmd(0xC483); //@PWR,NO RSTRIC,!st,!fi,OE,EN
writeCmd(0x9850); //!mp,90kHz,MAX OUT
writeCmd(0xCC17); //!OB1,!OB0, LPX,!ddy,DDIT,BW0
writeCmd(0xE000); //NOT USE
writeCmd(0xC800); //NOT USE
writeCmd(0xC040); //1.66MHz,2.2V
}
unsigned char rfRecv() {
unsigned int data;
while(1) {
data = writeCmd(0x0000);
if ( (data&0x8000) ) {
data = writeCmd(0xB000);
return (data&0x00FF);
}
}
}
void FIFOReset() {
writeCmd(0xCA81);
writeCmd(0xCA83);
}
int main(void) {
unsigned char data, i;
LED_OFF();
portInit();
rfInit();
FIFOReset();
while(1) {
//waitForData();
for (i=0; i<16; i++) {
data = rfRecv();
if (data==0x01)
PORTD&=~(1<<5);
else
PORTD|=(1<<5);
if (data==0x03)
PORTD&=~(1<<4);
else
PORTD|=(1<<4);
delay_ms(2000);
}
FIFOReset();
}
return 0;
}
دیدگاه