• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Jak zrobić aby dwa urządzenia komunikowały się miedzy sobą???

+1 głos
724 wizyt
pytanie zadane 6 lipca 2015 w C i C++ przez Sztrefan Użytkownik (590 p.)

Witam :D Kolejne pytanie na temat mikrokontrolerów :)

Dziś mnie męczy pewne pytanie.

Jak zrobić aby mikrokotrolery komunikowały się między sobą bez ingerencji użytkownika??? Czyli raz mikro_1 wysyla do mikro_2 a raz mikro_2 do mikro_1. Tutaj przykład o co mi chodzi:

mikro_1 - mikrokontroler odpowiedzialny za mierzenie poboru energi

mikro_2 - mikrokontroler odpowiedzialny za wyświetlanie ilości poboru energi

mikro_2 wysyła do mikro_1 aby zmierzyło pobór prądu z np. gniazdka elektrycznego ==> mikro_1 mierzy pobór energii które wynosi 1.5A ===> następnie wysyła te dane do mikro_2 który zapisuje sobie tę wartość ===> odsyła ją z powrotem do mikro_1 które mierząc ponownie potwierdza tą wartość ===> wartość ponownie trafia do mikro_2 który jest już pewien że ta wartość jest poprawna i może ją wyświetlić na ekranie

A teraz w drugą strone:

mikro_1 wykrył pobór energi ===> wysyła informacje o wykryciu do mikro_2 ===> mikro_2 wysya prośbę do mikro_1 o zmierzenie poboru prądu ===> mikro_1 mierzy pobór enrgii i odsyła je do mikro_2 itd...

Jeśli się tak da to czy to można wykonać na pinach RX/TX???

Z góry dziękuje za wszelkie dopowiedzi :) 

5 odpowiedzi

0 głosów
odpowiedź 6 lipca 2015 przez hit02 Nałogowiec (33,970 p.)

Na początku napiszę, że nigdy nie programowałem mikrokontrolera, więc w mojej odpowiedzi mogą być spore błędy. smiley

Na pewno twój mikro ma jakiś sposób wysyłania i pobierania wartości z pinów. Na przykład na procesorach x86 są to instrukcje in i out.

Na pewno da radę zrobić komunikację między dwoma mikro za pomocą takich instrukcji podłączając je ze sobą pinami komunikacyjnymi. Zgaduję, że są to te same piny, do których podłączasz na przykład RTC. Ja jednak użył bym 3 mikrokontrolerów, używając jednego jako nadrządcy, który jako jedyny by miał możliwość komunikowania się z innymi mikrokontrolerami.

Trochę to by przypominowało komunikację sieciową za pomocą własnego protokołu. 

komentarz 6 lipca 2015 przez Sztrefan Użytkownik (590 p.)
Właśnie RTC (jako modół :) ) komunikuje się przez piny RX/TX. W mikrokontrolerach AVR masz np. ustawienie pinu na IN lub OUT. Niżej kod do aby to ustawić:

OUTPUT:                pinMode(13, OUTPUT);

INPUT :                  pinMode(13, INPUT);

IMPUT_PULLUP:    pinMode(13, INPUT_PULLUP);
komentarz 6 lipca 2015 przez hit02 Nałogowiec (33,970 p.)

Myślę, że wystarczy połączyć te piny w dwóch mikro i w jednym oczekiwać danych wejściowych, a w drugim wysyłać komunikaty, ale to tylko moje przemyślenia, więc możliwe, że w ten sposób spalisz sobie cały układ. cheeky

komentarz 6 lipca 2015 przez Sztrefan Użytkownik (590 p.)
Raczej sie tak nie da spalić :D A jeżeli sie spali - pech, uczy sie w końcu na błędach co nie??? :D
0 głosów
odpowiedź 6 lipca 2015 przez MrWeb Stary wyjadacz (10,200 p.)
Pewnie, że możesz ;)

Najprościej będzie użyć UART/USART do komunikacji czyli właśnie linii TX/RX

Możesz też użyć protokołu 1Wire, I2C, ewentualnie przerwania, lub po prostu wystawianie stanu wysokiego/niskiego na nóżkach mikrokontrolera.

 

Powiedzmy, że użyjesz UART'a, jak to zrobić?

Bierzesz gotową bibliotekę do tego protokołu (http://homepage.hispeed.ch/peterfleury/doxygen/avr-gcc-libraries/group__pfleury__uart.html http://homepage.hispeed.ch/peterfleury/avr-software.html#libs)

Piszesz program

Wgrywasz i łączysz wszystko! (pamiętając o krzyżowaniu lini RX/TX)

 

Jeśli chodzi o implementację, to użyłbym zmiennej w której odpowiednio ustawiałbym bity które mają symbolizować odpowiednią komendę do wykonania (wyświetl, pobierz temperaturę itd)
komentarz 6 lipca 2015 przez Sztrefan Użytkownik (590 p.)
Akurat o krzyżowaniu lini RX/TX nie możn zapomnieć :D

P.S. Nie wiem jak ustawić te bity :P (niestety :( )
komentarz 6 lipca 2015 przez MrWeb Stary wyjadacz (10,200 p.)
edycja 6 lipca 2015 przez MrWeb

To może zanim będziesz się bawił z bitami, rozpiszesz sobie co tak naprawdę mają robić te mikrokontrolery ;)

Powiedzmy, że uC z ekranem to master a ten z czujnikiem to slave.

W kodzie mastera powinno być coś takiego:

// pseudokod dla master
inicjalizuj wszystko co potrzebne

int bufor = 0;
bool połączono = false;
int odebrano = 0;

while 1
{
    if połączono
        if odebrano
            wyświetl
        else
            poproś o odczyt
    else
        połącz
}

// przerwanie systemowe
odebrano_dane()
{
  bufor = rejestr_z_danymi;
}

void polącz()
{
    wyślij komendę ECHO
    czekaj sekundę
    jeśli w buforze jest wartość ECHO
        wyczyść bufor
        połączono = true;
    else
        połączono = false;
}

void poproś o odczyt()
{
    wyślij komendę VOLTAGE
    czekaj sekundę
    if w buforze jest oczekiwana wartość
        odebrano = bufor
        wyczyść bufor
    else
        odebrano = 0
        połączono = 0
}

wyświetl()
{
  print odebrano
}
komentarz 6 lipca 2015 przez MrWeb Stary wyjadacz (10,200 p.)
// pseudokod dla slave
inicjalizuj wszystko co potrzebne
 
int bufor = 0;
 
while 1
{
    jeśli w buforze jest:
    ECHO: wyślij ECHO, wyczyść bufor
    VOLTAGE: zrób pomiar wyślij pomiar
}
 
// przerwanie systemowe
odebrano_dane()
{
    bufor = rejestr_z_danymi;
}

 

0 głosów
odpowiedź 6 lipca 2015 przez CJay99 Nowicjusz (180 p.)
UART to najlepsza opcja. Linki, które zapostował MrWeb to biblioteki do procesorów AVR, którym jest na przykład ATMega8 - według mnie świetna na początek. Tania (kosztuje około 8zł), dostępna (praktycznie w każdym sklepie elektronicznym) i zawsze możesz wypalić na niej bootloader Arduino (jeżeli nie wiesz co to jest, zachęcam do odwiedzenia arduino.cc).
komentarz 6 lipca 2015 przez Sztrefan Użytkownik (590 p.)
wiem co to Arduino :)

Akurat ja mam Arduino UNO w którym jest ATMega 328P :D
komentarz 6 lipca 2015 przez MrWeb Stary wyjadacz (10,200 p.)
Dodam tylko, że ATMega8 jest przestarzała, lepszym wyborem będzie droższa o kilka złotych ATMega88 ;) Ma po prostu więcej do zaoferowania
komentarz 6 lipca 2015 przez Sztrefan Użytkownik (590 p.)
Ja tam nie patrze sie czy przestarzałe / nowesze itd. :) Jak zaprogramuje i zadziała to jest ok :DD
0 głosów
odpowiedź 6 lipca 2015 przez Sztrefan Użytkownik (590 p.)
I taki apropos xD Wie może ktoś, jak nazywa się scalak który potrfi zmierzyć pobór energii (ampery) ???

Bo szukam, szukam i znależć nie mogę :) Byłbym bardzo wdzięczny
komentarz 6 lipca 2015 przez Sztrefan Użytkownik (590 p.)

dobra, już nie trzeba :) W końcu znalazłem :D

Dla ciekawskich link do DataSheet tego scalaka ( AD7750 ).

Podobne pytania

0 głosów
2 odpowiedzi 321 wizyt
0 głosów
1 odpowiedź 333 wizyt
pytanie zadane 6 lipca 2018 w JavaScript przez Dzony66 Początkujący (310 p.)

89,132 zapytań

137,737 odpowiedzi

307,744 komentarzy

59,181 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Sklep oferujący ćwiczenia JavaScript, PHP, rozmowy rekrutacyjne dla programistów i inne materiały

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...