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

[ATmega32][c/AVR] Moduły HM-R868S i HM-T868S

mgiro 29 Gru 2009 17:02 7739 13
  • #1 7453318
    mgiro
    Poziom 22  
    Witam,

    Chcę wykorzystać ATmege16(kwac 16MHz) i HM-R868S jako nadajnik który będzie przesyłać wartość temperatury(np z LM35 lub DS18b20) do HM-T868S jako odbiornika i ATmegi32(kwac 16MHz).

    Wiem, że nadajniki muszą pracować z mikroprocesorami z wykorzystaniem modułu UART znajdujących się w mikroprocesorach.

    Programowaniem zajmuję się bardzo krótko dlatego myślałem o wykorzystaniu biblioteki którą napisał Peter Fleury http://homepage.hispeed.ch/peterfleury/group__pfleury__uart.html

    Szukając informacji widziałem, że popularne są moduły RF, których niestety nie posiadam.

    Dlatego zwracam się o pomoc do osób które posiadają informacje jak użyć modułów HM.
    Na co trzeba zwrócić szczególną uwagę i od czego należy zacząć??
  • #2 7453839
    PiotrEtenM500
    Poziom 19  
    Jedyne na co zwroc uwagę to bliskość modulu i procka
    Reszta jest tak prosta ze nie mam oczym
    ten uklad potrzebuje tylko 3 Pinow do dzialania

    RX - GND - 5V
    TX - GND - 5V

    zasieg bedzie marny

    do tego co chcesz zrobic jest inna para mniejsza i lepszy zasieg

    RX433N i TX433N
  • #4 7454098
    PiotrEtenM500
    Poziom 19  
    Cały programdo tego nadajnika

    $regfile = "m16def.dat"
    $crystal = 16000000
    $baud = 4800
    
    
    Do
    Print "HALLO TO JA"
    Wait 10
    LOOP
    End


    UPS niedopatrzyłem się miało być w C ;)

    ani LM35, ani HM-R868S nie wymaga zewnętrznego taktowania
  • #5 7455147
    mgiro
    Poziom 22  
    Dzięki za kod, ale nie znam niestety Bascoma. Stabilna częstotliwość z kwarcu nie zaszkodzi.
  • #6 7455196
    PiotrEtenM500
    Poziom 19  
    i w niczym nie pomoże;)
  • #7 7458263
    mgiro
    Poziom 22  
    Wykorzystałem program(który troszkę zmodyfikowałem) Radosława Koppela z części 7 kursu C:

    
    /////////////////////////////////////////////////////////////////////////////////////////////
    // main.c - plik główny programu demenstracyjnego dla operacji na strumianiach
    //		Przeznaczenie: część 7 kursu C. Płytka AVT3505
    //
    // Autor: Radosław Koppel		Kompilator: WinAVR 20050214
    /////////////////////////////////////////////////////////////////////////////////////////////
    #include <avr\io.h>
    #include <stdio.h>
    #include <inttypes.h>
    
    
    #include "rs.h"
    #include "harddef.h"
    
    
    int main(void)
    {
    	uint8_t i = 0;
    	///////////////////////////////////////////////
    	// Inicjacja portu szeregowego
    	RS_SET_BAUD(DEF_BAUD); //BAUD = 4800
    	UCSRC = 1<<URSEL | 1<<UCSZ1 | 1<<UCSZ0; 
    	UCSRB = 1<<RXEN | 1<<TXEN; 
    	UCSRA = 0;
    	// Koniec inicjacji
    	///////////////////////////////////////////////
    	
    	
    	for(i=0;i<5;i++)
    	{
    		rs_put('T');
    		rs_put('O');
    		rs_put('M');
    	}
    }
    
    


    
    int rs_put(char znak)
    {
    	
    	// Oczekiwanie aż bufor nadajnika jest pusty
    	while(!(1<<UDRE & UCSRA)) {}
    	UDR = znak; 
    	return 0;
    }
    


    Program po prostu wyświetla na terminalu(Putty) pięć razy litery 'T' 'O' 'M'

    To teraz aby wysłać to przez nadajnik, to wystarczy podpiąć nożke(DATA) nadajnika do PD1 (TXD) i zostanie to wysłane, czy trzeba jeszcze coś zrobić??
  • #8 7458377
    elektronik12z
    Poziom 13  
    Witam

    Ja wykorzystałem te moduły nie podpinając do UARTA, ponieważ odbiornik odbiera mnóstwo szumów, moja własna obsługa transmisji podobna jest do kodu RC5, z tym, że w moim wykonaniu zrezygnowałem z kodowania Manchester i wprowadziłem własne gdzie:

    1 to impuls 1ms + 0,5ms przerwy
    0 to imuls 0,5ms + 1ms przerwy

    ramka składa się z 8bitów, 2 pierwsze to 11, 5 to dane, 1 bit stopu.

    w nadajniku korzystam z timera i wyjścia OCR1A - piszę z pamięci (tinny13).

    Odbiornik podłączony jest w atmedze 8 do int0 (gdzie timerem 0 sprawdzam szerokość impulsów).

    Takie połączenie działa bardzo dobrze i jak na razie bez błędów.

    Mam już zajęty UART, więc zaimplemetowałem coś takiego.
  • #9 7458513
    mgiro
    Poziom 22  
    a mógłbyś wstawić tutaj lub wysłać mi kod tomek321(_at_)interia.pl?? Może też bym coś takiego zrobił, bo UART bym wykorzystał do czego innego.
  • #10 7510116
    mgiro
    Poziom 22  
    Podłączyłem nadajnik do ATmegi32 kabelkami

    kod:
    
    #include <avr\io.h>
    #include <stdio.h>
    #include <inttypes.h>
    #include <util/delay.h>
    
    
    #include "rs.h"
    #include "harddef.h"
    
    
    int main(void)
    {
    	
    	///////////////////////////////////////////////
    	// Inicjacja portu szeregowego
    	RS_SET_BAUD(DEF_BAUD); 
    	UCSRC = 1<<URSEL | 1<<UCSZ1 | 1<<UCSZ0; 
    	UCSRB = 1<<RXEN | 1<<TXEN; 
    	UCSRA = 0;
    	// Koniec inicjacji
    	///////////////////////////////////////////////
    	
    
    	while(1)
    	{
    		rs_put('B');
    	}
    	
    }
    
    


    Odbiornik podłączyłem kabelkami do ATmegi16

    
    #include <avr\io.h>
    #include <stdio.h>
    #include <inttypes.h>
    
    
    
    #include "rs.h"
    #include "harddef.h"
    
    
    int main(void)
    {
    	DDRA = 0xff;
    
           ///////////////////////////////////////////////
    	// Inicjacja portu szeregowego
    	RS_SET_BAUD(DEF_BAUD); 
    	UCSRC = 1<<URSEL | 1<<UCSZ1 | 1<<UCSZ0; 
    	UCSRB = 1<<RXEN | 1<<TXEN; 
    	UCSRA = 0;
    	// Koniec inicjacji
    	///////////////////////////////////////////////
    	
    	while(1)
    	{
    		if(rs_get() == 'B')
    		{
    			PORTA = 0x02;
    		}
    	}
    		
    	
    }
    


    Funkcje put i get:
    
    int rs_put(char znak)
    {
    	
    	// Oczekiwanie aż bufor nadajnika jest pusty
    	while(!(1<<UDRE & UCSRA)) {}
    	UDR = znak; 
    	return 0;
    }
    
    int rs_get(void)
    {
    	char znak; 
    	// Oczekiwanie na pojawienie się danej
    	while(!(1<<RXC & UCSRA)) {}
    	znak = UDR; 
    	return znak;
    }
    


    Gdy podłączyłem bezpośrednio procesory, dioda się zapaliła. Gdy użyłem modułów, dioda nie chciała się zapalić!!

    Co może być tego powodem??
  • #11 7516970
    mowca
    Poziom 2  
    Witam,

    Może poniższe informacje pomogą:
    [url=http://winavr.scienceprog.com/example-avr-projects/running-tx433-and-rx433-rf-modules-with-avr-microcontrollers.html

    Ze swojej strony również jestem zainteresowany wykorzystaniem modułów RX433 i TX433.
    Chciałbym transmitować aktualną temperaturę pieca CO z piwnicy na dwie kondygnacje powyżej,czyli pewny zasięg 15 metrów zadowoliłby mnie całkowicie.

    Pozdrawiam!
  • #12 7520515
    mgiro
    Poziom 22  
    próbowałem wykorzystać informacje zawartą w linku który zamieścił mowca, ale niestety nie pomogły mi(nawet łącząc kablem dioda się nie zapala). Nie udało mi się dalej uruchomić tych modułów.
  • #13 7526901
    mgiro
    Poziom 22  
    elektronik12z a mógłby być przebieg np prostokątny ??

    A jeżeli nie transmitujesz wiadomości, to co podajesz na DATE w nadajniku??
  • #14 12237850
    prokopcio
    Poziom 29  
    Jaka jest maksymalna możliwa prędkość transmisji w tym zestawie zakładając bardzo małą odległość modułu nadawczego i odbiorczego? W dokumentacji jest napisane max 9600bps, a pod tabelką: Data rate can be customize from 300bps to 100kbps...

    Potrzebuję przesłać w jedną stronę 4 bajty danych (rzadko) na odległość max 10m w 1/100s plus jakaś kontrola danych, więc te 9600 to tak na styk. Wolałbym wysłać to samo "pod rząd" chociaż dwa razy, żeby w razie błędu jeszcze raz odebrać dane.

    Dodano po 51 [sekundy]:

    PS. Czy można jakoś ukierunkować antenki?
REKLAMA