سلام
میشه بگین این برنامه من چه ایرادی داره؟؟
تا اونجا که فهمیدم در گیرنده nIRQ اصلا LOW نمیشه..ممنوم میشم کمکم کنین
فرستنده:
#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(0x8093); //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.2); // wait until nIRQ is low
writeCmd(0xB800 + data); // write the next data to B800 register
delay_ms(5);
}
//----------------------------------------------
// 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(1000);
};
}
گیرنده:
#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(0x8053); //EL,EF,434band,12.0pF
writeCmd(0x8299); //er,!ebb,ET,ES,EX,!eb,!ew,D
writeCmd(0xA641); //frequency select
writeCmd(0xC647); //4.8kbps
writeCmd(0x94C0); //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.2==1); // wait until nIRQ is low
HI_LED();
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();
FIFOReset();
while (1)
{
for (i=0; i<16; i++)
{
//HI_LED();
data = rfRecv(); // copy received data to variable
sprintf(lcd,"%d",i);
lcd_gotoxy(0,0);
lcd_puts(lcd);
//PORTA=~status; // PORTA is used to check the data
}
FIFOReset(); // reset the FIFO for next data package
//LOW_LED();
delay_ms(1000);
}
}