Witam
Mam problem z transmisją radiową, korzystam z modułów RX433n i TX433n.
Dokładniej mówiąc to prawie nic nie mogę przesłać.
Nadajnik i odbiornik są podłączone pod atmegi8, wszystko jest zmontowane na jednej płytce stykowej więc jest bardzo blisko siebie
kod nadajnika:
kod odbiornika:
Zgodnie z oczekiwaniem po wciśnięciu mikroswitcha przy nadajniku powinna się zapalić dioda na odbiorniku, po zwolnieniu powinna zgasnąć.
Ale jeszcze ani razu tak to nie zadziałało, raz się włączy raz nie, a po zwolnieniu to chyba jeszcze ani razu mi nie zgasła.
Co może być powodem takiego zachowania?
Pozdrawiam
Mam problem z transmisją radiową, korzystam z modułów RX433n i TX433n.
Dokładniej mówiąc to prawie nic nie mogę przesłać.
Nadajnik i odbiornik są podłączone pod atmegi8, wszystko jest zmontowane na jednej płytce stykowej więc jest bardzo blisko siebie
kod nadajnika:
#include <avr/io.h>
#include <util/delay.h>
//#ifndef F_CPU
//define cpu clock speed if not defined
//#define F_CPU 1000000
//#endif
//set desired baud rate
#define BAUDRATE 1200
//calculate UBRR value
#define UBRRVAL ((F_CPU/(BAUDRATE*16UL))-1)
//define receive parameters
#define SYNC 0XAA// synchro signal
#define RADDR 0x44
#define LEDON 0x11//switch led on command
#define LEDOFF 0x22//switch led off command
void USART_Init(void)
{
//Set baud rate
UBRRL=(uint8_t)UBRRVAL; //low byte
UBRRH=(UBRRVAL>>8); //high byte
//Set data frame format: asynchronous mode,no parity, 1 stop bit, 8 bit size
UCSRC=(1<<URSEL)|(0<<UMSEL)|(0<<UPM1)|(0<<UPM0)|
(0<<USBS)|(0<<UCSZ2)|(1<<UCSZ1)|(1<<UCSZ0);
//Enable Transmitter and Receiver and Interrupt on receive complete
UCSRB=(1<<TXEN);
}
void USART_vSendByte(uint8_t u8Data)
{
// Wait if a byte is being transmitted
while((UCSRA&(1<<UDRE)) == 0);
// Transmit data
UDR = u8Data;
}
void Send_Packet(uint8_t addr, uint8_t cmd)
{
//USART_vSendByte(SYNC);//send synchro byte
USART_vSendByte(addr);//send receiver address
USART_vSendByte(cmd);//send increment command
USART_vSendByte((addr+cmd));//send checksum
}
int main(void)
{
USART_Init();
DDRB=0b00000001;
while(1)
{//endless transmission
//send command to switch led ON
if(bit_is_set(PINC, 5))
{Send_Packet(RADDR, LEDON);
while(bit_is_set(PINC, 5))
PORTB=0b00000000;
Send_Packet(RADDR, LEDOFF);}
PORTB=0b00000001;
_delay_ms(100);
//send command to switch led ON
//Send_Packet(RADDR, LEDOFF);
PORTB=0b00000000;
_delay_ms(100);
}
return 0;
}kod odbiornika:
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
//#ifndef F_CPU
//define cpu clock speed if not defined
//#define F_CPU 4000000
//#endif
//set desired baud rate
#define BAUDRATE 1200
//calculate UBRR value
#define UBRRVAL ((F_CPU/(BAUDRATE*16UL))-1)
//define receive parameters
#define SYNC 0XAA// synchro signal
#define RADDR 0x44
#define LEDON 0x11//LED on command
#define LEDOFF 0x22//LED off command
void USART_Init(void)
{
//Set baud rate
UBRRL=(uint8_t)UBRRVAL; //low byte
UBRRH=(UBRRVAL>>8); //high byte
//Set data frame format: asynchronous mode,no parity, 1 stop bit, 8 bit size
UCSRC=(1<<URSEL)|(0<<UMSEL)|(0<<UPM1)|(0<<UPM0)|
(0<<USBS)|(0<<UCSZ2)|(1<<UCSZ1)|(1<<UCSZ0);
//Enable Transmitter and Receiver and Interrupt on receive complete
UCSRB=(1<<RXEN)|(1<<RXCIE);//|(1<<TXEN);
//enable global interrupts
}
uint8_t USART_vReceiveByte(void)
{
// Wait until a byte has been received
while((UCSRA&(1<<RXC)) == 0);
// Return received data
return UDR;
}
ISR(USART_RXC_vect)
{
//define variables
uint8_t raddress, data, chk;//transmitter address
//receive destination address
raddress=USART_vReceiveByte();
//receive data
data=USART_vReceiveByte();
//receive checksum
chk=USART_vReceiveByte();
//compare received checksum with calculated
if(chk==(raddress+data))//if match perform operations
{
//if transmitter address match
if(raddress==RADDR)
{
if(data==LEDON)
{
PORTC=(0<<0);//LED ON
}
else if(data==LEDOFF)
{
PORTC=(1<<0);//LED OFF
}
//else
//{
//blink led as error
//PORTC=(1<<0);//LED OFF
//_delay_ms(10);
//PORTC=(0<<0);//LED ON
//}
}
}/*
else
{
PORTC|=(1<<0);//LED OFF
_delay_ms(100);
PORTC&=~(1<<0);//LED ON
}*/
}
void Main_Init(void)
{
DDRC=0b00000001;//define port C pin 0 as output;
PORTC|=(1<<0);//LED OFF
//_delay_ms(500);
//enable global interrupts
sei();
}
int main(void)
{
Main_Init();
USART_Init();
while(1)
{
}
//nothing here interrupts are working
return 0;
}Zgodnie z oczekiwaniem po wciśnięciu mikroswitcha przy nadajniku powinna się zapalić dioda na odbiorniku, po zwolnieniu powinna zgasnąć.
Ale jeszcze ani razu tak to nie zadziałało, raz się włączy raz nie, a po zwolnieniu to chyba jeszcze ani razu mi nie zgasła.
Co może być powodem takiego zachowania?
Pozdrawiam