logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

TX433n i RX433n straszne zakłócenia

cezar89 26 Gru 2009 22:16 2748 6
REKLAMA
  • #1 7439590
    cezar89
    Poziom 11  
    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:
    #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
  • REKLAMA
  • #2 7766016
    maziu
    Poziom 18  
    //USART_vSendByte(SYNC);//send synchro byte  


    czemu wyłączyłeś kawałek kodu odpowiedzialny za nadawanie sygnału synchronizacji ??

    Osobiście testowałem ten kod z pozytywnym skutkiem . Więc polecam skopiować go bez błędów z tej :strony i dobrze po podłączać diody itd. Jak nadal nie będzie działać to zewrzeć TX i RX (wykluczysz w ten sposób usterkę modułów RX433n i TX433n )
  • REKLAMA
  • #3 7766381
    cezar89
    Poziom 11  
    Kopiowałem ten kod z tej strony... ale w oryginalnej wersji niestety nie działał zgodnie z oczekiwaniami. Ten komentarz wynika po prostu z tego, że testowałem, jak będzie się zachowywał układ bez tego fragmentu kodu.
  • REKLAMA
  • #4 7767085
    maziu
    Poziom 18  
    No niestety nie będzie działał bo cały kod składa się z kilku 8 bitowych słów i jak pozbędziesz się jednego to już się nie dogada .

    Napisz mi tu co dokładnie chcesz osiągnąć (gdzie przycisk , gdzie led , i co ma led robić ) a w wolnej chwili dam działający kod z dogłębnym opisem . Chyba że już rozwiązałeś problem ?
  • REKLAMA
  • #5 7767554
    cezar89
    Poziom 11  
    Chodzi mi o uzyskanie takiego efektu: naciskam przycisk w nadajniku -> LED w odbiorniku się zapala i świeci się aż do momentu zwolnienia przycisku.
    Przyporządkowanie elementów do pinów jest nieistotne bo na razie układ spoczywa na płytce stykowej.
    Dzięki za zainteresowanie.
  • #6 7780165
    maziu
    Poziom 18  
    Sorka że tak długo to trwa ale musiałem najpierw doprowadzić do ładu swoj program . Aparatura proporcjonalna 2-kanałowa, TG9, Atmega8 [c], HMR-868, HMT-868 . Jak na pierwszy poważny projekt na atmegach działa to znośnie choć sam program na pewno bije po oczach bardziej obeznanych . Mam nadzieje, że się komuś przyda :D

    cezar89Jutro postaram się umieścić skroconą wersje z diodą .

    
    //********************************************************************************
    //	NADAJNIK
    //	UART
    //********************************************************************************
    
    #include <avr/io.h>							// wejścia wyjścia 
    #include <util/delay.h>
    
    #ifndef F_CPU
    #define F_CPU 8000000						// częstotliwość zegara w Hz
    #endif
    
    #define BAUDRATE 1200						// prędkość transmisji
    #define UBRRVAL ((F_CPU/(BAUDRATE*16UL))-1)
    
    #define SYNC 0xAA							// sygnał synchronizacji 8bitów
    							
    //********************************************************************************
    //	INICJOWANIE UsART
    //********************************************************************************
    
    void USART(void)
    {
    	UBRRL = (uint8_t)UBRRVAL;	// ustawienie  prędkości transmisji 
    	UBRRH = (UBRRVAL>>8);					
    
    	UCSRC = (1<<URSEL)|
    			(0<<UMSEL)|
    			(0<<UPM1) |
    			(0<<UPM0) |			// ustawienie formatu ramki 
    			(0<<USBS) |			// 8bitów danych, 1bit stopu, brak synchronizacji
    			(0<<UCSZ2)|
    			(1<<UCSZ1)|
    			(1<<UCSZ0);		
    
    	UCSRB = (1<<TXEN);			// włączenie nadajnika i odbiornika
    }
    //********************************************************************************
    void USART_vSendByte(uint8_t u8Data)
    {
        while((UCSRA&(1<<UDRE)) == 0);
        UDR = u8Data;  
    }
    
    
    void Send_Packet(uint8_t addr, uint8_t cmd)
    {
    	USART_vSendByte(SYNC);				// synchronizacja 8bit	
    	USART_vSendByte(addr);				// adres 8bit
    	USART_vSendByte(cmd);				// dane 8bit
    	USART_vSendByte((addr+cmd));		// suma adresu i danych 8bit
    }
    
    
    void delayms(uint8_t t)					//delay in ms
    {
    uint8_t i;
    for(i=0;i<t;i++)
    	_delay_ms(1);
    }
    
    //********************************************************************************
    //	INICJOWANIE PRZETWORNIKA AC
    //********************************************************************************
    unsigned int pomiar1;		// Zmienna do przechowywania wyniku pomiaru
    unsigned int pomiar2;		// Zmienna do przechowywania wyniku pomiaru
    
    void PRZETWORNIK(void)
    {
    	DDRC=0x00;				// Port jako wejścia
    	PORTC=0x00;				// Wejścia bez podciągania
    
    
    	ADMUX = (1<<REFS0) | 	// Wybór źródła napięcia odniesienia.
    			(0<<REFS1) |	// zewnętrznne
    			(1<<ADLAR) ;	// Bit wyboru sposobu zapisu wyniku w rejestrach ADCL i ADCH
    		/*	(0<<MUX3)  |	// Bity wyboru wejścia analogowego. Wejście wybrane kombinacją  
    			(0<<MUX2)  |	// tych bitów jest dołączone do przetwornika.
    			(0<<MUX1)  |	// MUX 3 2 1 0			MUX 3 2 1 0	
    			(1<<MUX0)  ;	//     0 0 0 0 ADC0	        0 0 0 1 ADC1			*/
    
    	ADCSRA= (1<<ADEN)  |	// Ustawienie go zezwala na pracę przetwornika	
    			(1<<ADPS0) |	// Wybranie częstotliwości dla taktowania przetwornika
    			(0<<ADPS1) |	// 1/32
    			(1<<ADPS2) ;
    }
    //********************************************************************************
    //  Program główny
    //********************************************************************************
    int main(void)
    {	
    int RADDR;
    
    USART();
    PRZETWORNIK();
    while(1)
    	{
    
    	RADDR=0x35;							// sygnał adresu adres serva OC1B 8bitów
    
    	ADMUX |= _BV(0)	;					// Wybór odpowiedniego wejścia ADC0
     	ADCSRA |= _BV(ADSC);       		  	// Rozpoczęcie przetwarzania
    
    	while(bit_is_set(ADCSRA,ADSC))		// Oczekiwanie na zakończenie przetwarzania
        {};	
    	pomiar2=ADCH;			     		// Zapisanie starszych 8 bitów wyniku konwersji
    
    
    	Send_Packet(RADDR, ~pomiar1); 		// Wyslanie wyniku !!!!!!!!!!!!!!!!!!!!!!!
    
    		_delay_ms(1);
    
    
    
    
    	RADDR=0x8E;							// sygnał adresu adres serva OC1B 8bitów
    
    	ADMUX &= ~_BV(0);					// Wybór odpowiedniego wejścia ADC1
    	ADCSRA |= _BV(ADSC);        		// Rozpoczęcie przetwarzania
    
    	while(bit_is_set(ADCSRA,ADSC))		// Oczekiwanie na zakończenie przetwarzania
        	{};	
    	pomiar1=ADCH;						// Zapisanie starszych 8 bitów wyniku konwersji 	  
    
    	Send_Packet(RADDR, ~pomiar2); 		// Wyslanie wyniku !!!!!!!!!!!!!!!!!!!!!!!
    
    	_delay_ms(1);
    	}
    	return 0;
    }
    
    


    
    //********************************************************************************
    //	NADAJNIK
    //	UART
    //********************************************************************************
    
    #include <avr/io.h>							// wejścia wyjścia 
    #include <util/delay.h>
    
    #ifndef F_CPU
    #define F_CPU 8000000						// częstotliwość zegara w Hz
    #endif
    
    #define BAUDRATE 1200						// prędkość transmisji
    #define UBRRVAL ((F_CPU/(BAUDRATE*16UL))-1)
    
    #define SYNC 0xAA							// sygnał synchronizacji 8bitów
    							
    //********************************************************************************
    //	INICJOWANIE UsART
    //********************************************************************************
    
    void USART(void)
    {
    	UBRRL = (uint8_t)UBRRVAL;	// ustawienie  prędkości transmisji 
    	UBRRH = (UBRRVAL>>8);					
    
    	UCSRC = (1<<URSEL)|
    			(0<<UMSEL)|
    			(0<<UPM1) |
    			(0<<UPM0) |			// ustawienie formatu ramki 
    			(0<<USBS) |			// 8bitów danych, 1bit stopu, brak synchronizacji
    			(0<<UCSZ2)|
    			(1<<UCSZ1)|
    			(1<<UCSZ0);		
    
    	UCSRB = (1<<TXEN);			// włączenie nadajnika i odbiornika
    }
    //********************************************************************************
    void USART_vSendByte(uint8_t u8Data)
    {
        while((UCSRA&(1<<UDRE)) == 0);
        UDR = u8Data;  
    }
    
    
    void Send_Packet(uint8_t addr, uint8_t cmd)
    {
    	USART_vSendByte(SYNC);				// synchronizacja 8bit	
    	USART_vSendByte(addr);				// adres 8bit
    	USART_vSendByte(cmd);				// dane 8bit
    	USART_vSendByte((addr+cmd));		// suma adresu i danych 8bit
    }
    
    
    void delayms(uint8_t t)					//delay in ms
    {
    uint8_t i;
    for(i=0;i<t;i++)
    	_delay_ms(1);
    }
    
    //********************************************************************************
    //	INICJOWANIE PRZETWORNIKA AC
    //********************************************************************************
    unsigned int pomiar1;		// Zmienna do przechowywania wyniku pomiaru
    unsigned int pomiar2;		// Zmienna do przechowywania wyniku pomiaru
    
    void PRZETWORNIK(void)
    {
    	DDRC=0x00;				// Port jako wejścia
    	PORTC=0x00;				// Wejścia bez podciągania
    
    
    	ADMUX = (1<<REFS0) | 	// Wybór źródła napięcia odniesienia.
    			(0<<REFS1) |	// zewnętrznne
    			(1<<ADLAR) ;	// Bit wyboru sposobu zapisu wyniku w rejestrach ADCL i ADCH
    		/*	(0<<MUX3)  |	// Bity wyboru wejścia analogowego. Wejście wybrane kombinacją  
    			(0<<MUX2)  |	// tych bitów jest dołączone do przetwornika.
    			(0<<MUX1)  |	// MUX 3 2 1 0			MUX 3 2 1 0	
    			(1<<MUX0)  ;	//     0 0 0 0 ADC0	        0 0 0 1 ADC1			*/
    
    	ADCSRA= (1<<ADEN)  |	// Ustawienie go zezwala na pracę przetwornika	
    			(1<<ADPS0) |	// Wybranie częstotliwości dla taktowania przetwornika
    			(0<<ADPS1) |	// 1/32
    			(1<<ADPS2) ;
    }
    //********************************************************************************
    //  Program główny
    //********************************************************************************
    int main(void)
    {	
    int RADDR;
    
    USART();
    PRZETWORNIK();
    while(1)
    	{
    
    	RADDR=0x35;							// sygnał adresu adres serva OC1B 8bitów
    
    	ADMUX |= _BV(0)	;					// Wybór odpowiedniego wejścia ADC0
     	ADCSRA |= _BV(ADSC);       		  	// Rozpoczęcie przetwarzania
    
    	while(bit_is_set(ADCSRA,ADSC))		// Oczekiwanie na zakończenie przetwarzania
        {};	
    	pomiar2=ADCH;			     		// Zapisanie starszych 8 bitów wyniku konwersji
    
    
    	Send_Packet(RADDR, ~pomiar1); 		// Wyslanie wyniku !!!!!!!!!!!!!!!!!!!!!!!
    
    		_delay_ms(1);
    
    
    
    
    	RADDR=0x8E;							// sygnał adresu adres serva OC1B 8bitów
    
    	ADMUX &= ~_BV(0);					// Wybór odpowiedniego wejścia ADC1
    	ADCSRA |= _BV(ADSC);        		// Rozpoczęcie przetwarzania
    
    	while(bit_is_set(ADCSRA,ADSC))		// Oczekiwanie na zakończenie przetwarzania
        	{};	
    	pomiar1=ADCH;						// Zapisanie starszych 8 bitów wyniku konwersji 	  
    
    	Send_Packet(RADDR, ~pomiar2); 		// Wyslanie wyniku !!!!!!!!!!!!!!!!!!!!!!!
    
    	_delay_ms(1);
    	}
    	return 0;
    }
    
    






  • #7 8004274
    sirk78
    Poziom 1  
    Witam
    Maziu czy mozesz wrzucić ten program z diodą dla nadajnika i odbiornika, gdyz mam podobny problem jak cezar89.
REKLAMA