سلام به دوستان عزیز من یه مشکل کوچولو یا بهتر بگم یه مشکل خیلی بزرگ دارم که مطمئنم دوستان می تونند کمک کنند به ما مشکل اینه که من یه برنامه که با rfm12 توش دیتا ارسال شده دارم در زمانی که rfm12 تو حالت دریافت قرار میگیره تا بافرش پر نشه از اون حالت بیرون نمیاد این برنامه rfm رو از سایت خودش برداشتم و با کمی تغییر تو codevision استفاده کردم و خیلی هم خوب کار میکنه اتفاقا 2 سال پیش تو همین سایت گذاشتم تا دوستان استفاده کنند میخواستم سوال کنم که آیا دوستان کسی برای RFM12 خودش کامل با codevision برنامه ای نوشته که از جایی بر نداشته باشه تا بتونیم دقیقا بفهمیم چیه ماجرا مشکل کار من اینجاست که وقتی توی برنامه watchdog رو فعال میکنم اگه همیشه دریافت بشه مشکلی پیش نمیاد اما اگه بیشتر از 2 پانیه دریافت نشه میکرو ریست میشه و منو کلافه کرده و این خیلی مشکل بزرگیه از طرفی یا باید واچداگو حذف کنیم یا باید راهی پیدا کنیم که قبل از 2 ثانیه اگه دریافت نکرد از وقفه بیرون بیاد کسی میتونه کمک کنه ؟ لطفا دوستان یه لطفی بکنند
اطلاعیه
Collapse
No announcement yet.
مشکل با rfm12
Collapse
X
-
مشکل با rfm12
سه کس را شنیدم که غیبت رواست وز این درگذشتی چهارم خطاست
یکی پادشاهی ملامت پسند کز او بر دل خلق بینی گزند
حلال است از او نقل کردن خبر مگر خلق باشند از او بر حذر
دوم پرده بر بی حیائی متن که خود میآدرد پرده بر خویشتن
ز حوضش مدار ای برادر نگاه که او میآدرافتد به گردن به چاه
سوم کژ ترازوی ناراست خوی ز فعل بدش هرچه دانی بگوی -
پاسخ : مشکل با rfm12
سلام
دوست من
اشکال این برنامه رو میتونی بگی؟؟ داره اذیتم میکنه...ممنون
reciver
//--------------------------------------
#include <mega16.h>
#include <delay.h>
#include <stdio.h>
#asm
.equ __lcd_port=0x1B
#endasm
#include <lcd.h>
//-------------------------------------------------------
#define RF_PORT PORTB
#define RF_DDR DDRB
#define RF_PIN PINB
#define DDR_IN 0
#define DDR_OUT 1
#define PORT_SEL PORTB
#define PIN_SEL PINB
#define DDR_SEL DDRB
#define PORT_SDI PORTB
#define PIN_SDI PINB
#define DDR_SDI DDRB
#define PORT_SCK PORTB
#define PIN_SCK PINB
#define DDR_SCK DDRB
#define PORT_SDO PORTB
#define PIN_SDO PINB
#define DDR_SDO DDRB
#define PORT_INT PORTD
#define PIN_INT PIND
#define DDR_INT DDRD
#define PORT_LED PORTB
#define PIN_LED PINB
#define DDR_LED DDRB
#define SCK 7
#define SDO 6
#define SDI 5
#define SEL 4
#define INT 2
#define LED 1
#define LED_OUTPUT() DDR_LED |= (1<<LED)
#define HI_LED() PORT_LED |= (1<<LED)
#define LOW_LED() PORT_LED &=~(1<<LED)
#define SEL_OUTPUT() DDR_SEL |= (1<<SEL)
#define HI_SEL() PORT_SEL |= (1<<SEL)
#define LOW_SEL() PORT_SEL &=~(1<<SEL)
#define SDI_OUTPUT() DDR_SDI |= (1<<SDI)
#define HI_SDI() PORT_SDI |= (1<<SDI)
#define LOW_SDI() PORT_SDI &=~(1<<SDI)
#define SDO_INPUT() DDR_SDO &=~(1<<SDO)
#define SDO_HI() PIN_SDO&(1<<SDO)
#define INT_INPUT() DDR_INT &=~(1<<INT)
#define INT_HI() PIN_INT&(1<<INT)
#define SCK_OUTPUT() DDR_SCK |=(1<<SCK)
#define HI_SCK() PORT_SCK |=(1<<SCK)
#define LOW_SCK() PORT_SCK &=~(1<<SCK)
#define BAUD 38400 // F_CPU is 8000000 Hz
#define UBRR_VALUE ( ((F_CPU) + 8UL*(BAUD)) / (16UL*(BAUD)) - 1UL )
unsigned int status;
void portInit() {
HI_SEL();
HI_SDI();
LOW_SCK();
INT_INPUT();
SEL_OUTPUT();
SDI_OUTPUT();
SCK_OUTPUT();
LED_OUTPUT();
}
unsigned int writeCmd(unsigned int cmd) {
unsigned char i;
unsigned int recv;
recv = 0;
LOW_SCK();
LOW_SEL();
for(i=0; i<16; i++) {
if(cmd&0x8000)
HI_SDI();
else LOW_SDI();
HI_SCK();
recv<<=1;
if( PINB&(1<<SDO) ) {
recv|=0x0001;
}
LOW_SCK();
cmd<<=1;
}
HI_SEL();
return recv;
}
void rfInit() {
writeCmd(0x80D7); //EL,EF,434band,12.0pF
writeCmd(0x8299); //er,!ebb,ET,ES,EX,!eb,!ew,D
writeCmd(0xA640); //frequency select
writeCmd(0xC647); //4.8kbps
writeCmd(0x94D0); //VDI,FAST,67kHz,0dBm,-103dBm
writeCmd(0xC2AC); //AL,!ml,DIG,DQD4
writeCmd(0xCA81); //FIFO8,SYNC,!ff,DR
writeCmd(0xC483); //@PWR,NO RSTRIC,!st,!fi,OE,EN
writeCmd(0x9820); //!mp,45kHz,MAX OUT
writeCmd(0xE000); //NOT USED
writeCmd(0xC800); //NOT USED
writeCmd(0xC040); //1.66MHz,2.2V
}
void FIFOReset()
{
writeCmd(0xCA81);
writeCmd(0xCA83);
}
unsigned char rfRecv()
{
unsigned int data=0;
while(PIND&(1<<INT)); // wait until nIRQ is low
status = writeCmd(0x0000); // read the status register
//if ( (status&0x8000) ) { // if the status has the right register value
data = writeCmd(0xB000); // copy data from FIFO register into data variable
//}
return (data&0x00FF);
}
// Declare your global variables here
void main(void)
{
unsigned char data=1, i;
unsigned char lcd[6];
delay_ms(50);
PORTA=0x00;
DDRA=0x00;
PORTB=0x00;
DDRB=0x00;
PORTC=0x00;
DDRC=0x00;
PORTD=0x00;
DDRD=0x00;
TCCR0=0x00;
TCNT0=0x00;
OCR0=0x00;
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;
MCUCR=0x00;
MCUCSR=0x00;
TIMSK=0x00;
ACSR=0x80;
SFIOR=0x00;
portInit();
lcd_init(16);
lcd_clear();
lcd_gotoxy(0,0);
lcd_putsf("-hi-"
rfInit();
delay_ms(50);
FIFOReset();
delay_ms(500);
lcd_clear();
while (1)
{
for (i=0; i<16; i++)
{
HI_LED();
data = rfRecv(); // copy received data to variable
LOW_LED();
sprintf(lcd,"%d",data);
//
lcd_gotoxy(0,0);
lcd_puts(lcd);
//PORTA=~status; // PORTA is used to check the data
}
FIFOReset(); // reset the FIFO for next data package
}
}
//--------------------------------------------------------------------------------
transmitter
#include <mega16.h>
#include <delay.h>
//----------------------------------------------
#define RF_PORT PORTB
#define RF_DDR DDRB
#define RF_PIN PINB
#define DDR_IN 0
#define DDR_OUT 1
#define PORT_SEL PORTB
#define PIN_SEL PINB
#define DDR_SEL DDRB
#define PORT_SDI PORTB
#define PIN_SDI PINB
#define DDR_SDI DDRB
#define PORT_SCK PORTB
#define PIN_SCK PINB
#define DDR_SCK DDRB
#define PORT_SDO PORTB
#define PIN_SDO PINB
#define DDR_SDO DDRB
#define PORT_INT PORTD
#define PIN_INT PIND
#define DDR_INT DDRD
#define PORT_LED PORTB
#define PIN_LED PINB
#define DDR_LED DDRB
#define SCK 7
#define SDO 6
#define SDI 5
#define SEL 4
#define INT 2
#define LED 1
#define LED_OUTPUT() DDR_LED |= (1<<LED)
#define HI_LED() PORT_LED |= (1<<LED)
#define LOW_LED() PORT_LED &=~(1<<LED)
#define SEL_OUTPUT() DDR_SEL |= (1<<SEL)
#define HI_SEL() PORT_SEL |= (1<<SEL)
#define LOW_SEL() PORT_SEL &=~(1<<SEL)
#define SDI_OUTPUT() DDR_SDI |= (1<<SDI)
#define HI_SDI() PORT_SDI |= (1<<SDI)
#define LOW_SDI() PORT_SDI &=~(1<<SDI)
#define SDO_INPUT() DDR_SDO &=~(1<<SDO)
#define SDO_HI() PIN_SDO&(1<<SDO)
#define INT_INPUT() DDR_INT &=~(1<<INT)
#define INT_HI() PIN_INT&(1<<INT)
#define SCK_OUTPUT() DDR_SCK |=(1<<SCK)
#define HI_SCK() PORT_SCK |=(1<<SCK)
#define LOW_SCK() PORT_SCK &=~(1<<SCK)
//----------------------------------------------
void portInit()
{
HI_SEL();
HI_SDI();
LOW_SCK();
INT_INPUT();
SEL_OUTPUT();
SDI_OUTPUT();
SCK_OUTPUT();
LED_OUTPUT();
}
unsigned int writeCmd(unsigned int cmd)
{ //works perfect
unsigned char i;
unsigned int recv;
recv = 0;
LOW_SCK();
LOW_SEL();
// delay_us(5);
for(i=0; i<16; i++)
{
if(cmd&0x8000)
HI_SDI();
else
LOW_SDI();
// delay_us(5);
HI_SCK();
recv<<=1;
if( PINB&(1<<SDO) )
{
recv|=0x0001;
}
LOW_SCK();
cmd<<=1;
}
HI_SEL();
return recv;
}
void rfInit()
{
writeCmd(0x80D7); //EL,EF,434band,12.0pF
writeCmd(0x8239); //!er,!ebb,ET,ES,EX,!eb,!ew,DC
writeCmd(0xA640); //frequency select
writeCmd(0xC647); //4.8kbps
writeCmd(0x94D0); //VDI,FAST,67kHz,0dBm,-103dBm
writeCmd(0xC2AC); //AL,!ml,DIG,DQD4
writeCmd(0xCA81); //FIFO8,SYNC,!ff,DR
writeCmd(0xC483); //@PWR,NO RSTRIC,!st,!fi,OE,EN
writeCmd(0x9820); //!mp,45kHz,MAX OUT
writeCmd(0xE000); //NOT USED
writeCmd(0xC800); //NOT USED
writeCmd(0xC040); //1.66MHz,2.2V
}
void rfSend(unsigned char data)
{
while(PIND&(1<<INT)); // wait until nIRQ is low
writeCmd(0xB800 + data); // write the next data to B800 register
}
//----------------------------------------------
// Declare your global variables here
void main(void)
{
// VARIABLES//*************************
volatile unsigned int i;
//*************************************
PORTA=0x00;
DDRA=0x00;
PORTB=0x00;
DDRB=0x00;
PORTC=0x00;
DDRC=0x00;
PORTD=0x00;
DDRD=0x00;
TCCR0=0x00;
TCNT0=0x00;
OCR0=0x00;
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;
MCUCR=0x00;
MCUCSR=0x00;
TIMSK=0x00;
ACSR=0x80;
SFIOR=0x00;
portInit();
HI_LED();
delay_ms(100); // iniating
rfInit();
LOW_LED();
delay_ms(100);
while (1)
{
HI_LED();
writeCmd(0x0000);
rfSend(0xAA); // PREAMBLE
rfSend(0xAA);
rfSend(0xAA);
rfSend(0x2D); // SYNC
rfSend(0xD4); // SYNC
for(i=0; i<16; i++) {
rfSend(i); // send the data
}
rfSend(0xAA); // DUMMY BYTES
rfSend(0xAA);
rfSend(0xAA);
//delay_ms(100);
LOW_LED();
//delay_ms(100);
};
}
//-------------------------------------------------------------------- :angry:
دیدگاه