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

Jak połączyć dwa ATMega8 bez SPI, UART i I2C?

PiotrLotnik 09 Maj 2005 18:49 2362 15
REKLAMA
  • #1 1476819
    PiotrLotnik
    Poziom 15  
    Posty: 207
    Pomógł: 2
    Ocena: 2
    Witam!
    Męcze sie nad projektem w którym wykożysuje dwa uK Mega8.
    Co to za projekt to długo by pisać a nie jest to istotne.

    Moje zapytanie odnośnie komunikacji dwóch uK wynika z tego, że oba mają już zajęte SPI, UART i I2C i to w taki sposób, że nie da się tu nic podłączyć. (tak mi sie wydaje).

    Jak ma wyglądać ta komunikacja.
    Max 3 linie.
    Jeden układ robi za Master a drugi za Slave.
    Przesłane będzie ok 26 byte danych typu Word, Single.
    Jeden pracuje na wewnętrznym oscylatorze 8MHz
    drugi na kwarcu 16MHz

    Co robią układy i czemu są dwa a nie jeden "mocniejszy".
    Pieswszy układ wykonuje mase obiczeń wartości odczytanych z przetworników i GPSa
    Drógi układ wyświetla dane na LCD, Dokonuje kolejnych obliczeń, odczytuje z klawiatury 4x4, wysyła dane na PC, odczytuje dane z przetworników.

    Jeden Mega8 sobie nie poradzi (za mało wyprowadzeń, i pamięci).
    Pozatym jak pierwszy układ zajęty jest wyświetlaniem danych i obsługą klawiatury to drugi w tym czasie wykonuje niezbędnych obliczeń bez zakłuceń i opóźnień.
    Program pisze w Bascom.

    Pozostały mi linie INT0, INT1 i T0

    Pozdrawiam i dzięki za sugestje.
    Piotr
    PS Bez złośliwości prosze.
  • REKLAMA
  • #2 1476847
    Elektrooonik
    Poziom 29  
    Posty: 1212
    Pomógł: 127
    Ocena: 83
    Można by zrealizować transmisję na drodze programowej - programowy UART, I2C itp :) w Bascomie są do tego gotowe komendy
  • Pomocny post
    #3 1476863
    McRancor
    VIP Zasłużony dla elektroda
    Posty: 5326
    Pomógł: 479
    Ocena: 124
    Proponuje coś na zasadzie prostego SPI, z wykorzystaniem przerwania sprzętowego, niech linia z przerwaniem sprzętowym będzie linią zegara, dowolna linią danych, jeśli zmieni się stan na lini przerwania sprzętowego niech to przerwanie w programie odczytuje bit z lini danych i niech wraca do programu, a jeśli licznik bitów osiągnie odpowiedni stan, czyli dane już są, niech przerwanie ustawia odpowiednią flagę, którą główny program odczyta i zinterpretuje że dane są gotowe.

    Zalety:
    Nie obchodzi nas prędkość transmisji, można ją popędzić do kosmicznych wartości :)

    Wady:
    Przerwanie sprzętowe o najwyższym priorytecie INT0 może w skrajnych przypadkach przyblokować na chwilę inne. Ale odpowiednie skrócenie przerwania sprawi że nie będzie to problem.

    Transmisje można zrobić też w drugą stronę, stosując drugą linię zegarową i wykorzystując tę samą linie danych, lub odwrotnie. To już sam sobie na pewno dopracujesz.

    Polecałbym napisanie wstawek w asemblerze, będą szybsze i bardziej niezawodne, poza tym względnie proste, w bascomie (czy C) też można to zrobić.
  • REKLAMA
  • #4 1476880
    hunterhouse
    Poziom 26  
    Posty: 893
    Pomógł: 84
    Ocena: 3
    jeśli masz 3 piny to idealnie albo korzystacz z programowych transmisji szeregowej UART lub piszesz własną transmisję jeden pin to zegar drugi tx a trzeci rx.
    morzna by to napisać w asemblerze i wkleić do bascoma żeby szybko dzialało
  • REKLAMA
  • #5 1476931
    Dexter77
    Poziom 28  
    Posty: 889
    Pomógł: 134
    Ocena: 19
    USART w ATmegach ma sympatyczna ceche jak komunikacje wieloprocesorowa. Mozna rozwazyc jej wykorzystanie.
    Pozdro
    Dexter
  • #6 1476940
    PiotrLotnik
    Poziom 15  
    Posty: 207
    Pomógł: 2
    Ocena: 2
    Znalazłem w Bascom Help instrukcje
    SHIFTIN i SHIFTOUT ale nigdy tego nie testowałem.
    Może ktoś miał już doświatczenia z tymi instrukcjami.

    Pozdrawiam
  • #7 1477085
    LordBlick
    VIP Zasłużony dla elektroda
    Posty: 5438
    Pomógł: 549
    Ocena: 69
    McRancor napisał:
    Przerwanie sprzętowe o najwyższym priorytecie INT0 może w skrajnych przypadkach przyblokować na chwilę inne.
    Tak się zastanawiam, czy ja czegoś nie doczytałem o priorytetach przerwań w AVR-ach ? Mogę prosić o źródło tych informacji ?
    Co do tematu, ile pinów jest dostępnych, może by pokombinować z jednoczesnym wysyłaniem kilku bitów ?
  • #8 1477232
    McRancor
    VIP Zasłużony dla elektroda
    Posty: 5326
    Pomógł: 479
    Ocena: 124
    Pewnie nie doczytałeś, im wyżej na liście przerwań jest dane przerwanie, tym wyższy jest jego priorytet, pierwszy jest wskaźnik reset, drugi wskaźnik INT0, tym samym INT0 ma najwyższy priorytet (zaraz po RESET ofkoz)

    To że priorytety przerwań w AVR można zmieniać to bajka.

    Źródło informacji: pdf dowolnego AVRa sekcja "Reset and Interrupt Handling"
  • #9 1477251
    Nawigator
    Poziom 33  
    Posty: 1923
    Pomógł: 167
    Ocena: 160
    Cyt:
    Przesłane będzie ok 26 byte danych
    wystarczy napisać coś w stylu rs232 na własny użytek, np. 1 bit startowy i następnie wysłać 26 bajtów hurtem, przy znanych częstotliwościach kwarców transmisja nie wypadnie z synchronizacji, na koniec daj dłuższy czas - przerwę synchronizacyjną. Wybierz przerwanie INT0 i w nim szybko wpisz w obsłudze przerwania cały telegram do ramu, potem można bawić się z dekodowaniem danych. Potrzebna tylko jedna linia, nawet do dwustronnej komunikacji.
    Lub przeskocz na większy procesor z podwójnym uartem - ostatnio potaniały.
    Pozdr. N.
  • #10 1477253
    Dexter77
    Poziom 28  
    Posty: 889
    Pomógł: 134
    Ocena: 19
    W pewnym sensie mozna zmieniac priorytety. Wystarczy ze w obsludze przerwania o wyzszym priotytecie wykonamy instrukcje "sei" Wtedy zezwolimy na wykonywanie przerwan nawet o nizszym priorytecie.
    Pozdro
    Dexter
  • #11 1478085
    PiotrLotnik
    Poziom 15  
    Posty: 207
    Pomógł: 2
    Ocena: 2
    a jak to jest z transmisją 1Wire
  • REKLAMA
  • Pomocny post
    #12 1478108
    McRancor
    VIP Zasłużony dla elektroda
    Posty: 5326
    Pomógł: 479
    Ocena: 124
    Ostre reżimy czasowe, może się nie nadać, zależy jak z czasem.

    Proste ISP jest niezależne czasowo, RS232 itp. musi się trzymać czasu, 1-Wire tak samo, a nawet bardziej :)
  • #13 1479478
    BoskiDialer
    Poziom 34  
    Posty: 1530
    Pomógł: 353
    Ocena: 42
    jeśli oba procesory są taktowane różnymi częstotliwościami, ale mają duży wspólny dzielnik (w tym wypadku 8MHz jest duże) to można zastosować komunikacje asymetryczną.
    Na szybko przychodzi mi taki pomysł:
    połączenia 1:1. master chcąc wysłać dane więc wysyła sygnał na int0 do układu slave w ten sposób go wybudzając (lub przerywając aktualny program).
    w takiej sytuacji slave zmienia stan swojego wyjścia na przemian na 1 i 0 (co np 16 cykli), master synchronizuje sie z tym sygnałem i wystawia stan wysoki na swoim wyjściu (np podczas gdy slave wystawia stan 0.. po stanie 1 układ ten przestaje wystawiać tą sekwencje)
    potem następuje wymiana danych drogą asynchroniczną w oba kierunki. można zastosować wymiane buforów (oba układy mają jeden bufor danych do wysłania, wysylają po 1 bajcie w tym samym czasie odbierają po 1 bajcie.. potem dane w buforze zostają nadpisane..) lub można zastosować oddzielne bufowy: jeden do danych wysyłanych a drugi do odbieranych.. wtedy oba układy co jakiś czas synchronizują zawartość buforu odbiorczego.
  • #14 1479688
    cyberdar
    Poziom 31  
    Posty: 1465
    Pomógł: 161
    Ocena: 73
    Witam

    1. A czy nie dałoby rady tego zrobić na jednej magistrali RS485 ?
    2. To, że urządzenia mają różne kwarce ma akurat małe znaczenie. Trzaba jedynie ustalić sobie jednakową prędkość we wszystkich urządzeniach, żeby się dogadały no i protokół.

    --
    pozdrawiam
  • Pomocny post
    #15 1479935
    McRancor
    VIP Zasłużony dla elektroda
    Posty: 5326
    Pomógł: 479
    Ocena: 124
    cyberdar<<
    1) RS485 to jedynie specyfikacja elektryczna komunikacji, a nie protokół, wymaga specjalnych konwerterów, a sama komunikacja i tak pozostaje do zrobienia, to zupełnie inna bajka.

    2)To akurat racja :)

    Myśle że nie ma sensu komplikować tutaj całości wprowadzając transmisję asynchroniczną, ponieważ będzie ona całkowicie programowa, wymaga znacznej modyfikacji programu, żeby utrzymać konieczne reżimy czasowe. Z drugiej strony w bascomie łatwiej ją zaimplementować

    Panie tematodawco!

    Czy ta transmisja ma być jednokierunkowa, czy dwu, może da się zrobić jednokierunkową, wtedy cała sprawa się znacznie upraszcza!
  • #16 1480552
    PiotrLotnik
    Poziom 15  
    Posty: 207
    Pomógł: 2
    Ocena: 2
    Witam i dziękuje za zainteresowanie moim tematem :)

    Co sie tyczy rodzaju transmisji to jeszcze nie zdecydowałem .

    Transmisja ma być dwukierunkowa (układ Master ma wysyłać na Slave roskazy i otrzymywać dane).

    Pozdrawiam
    Piotr

Podsumowanie tematu

✨ Dyskusja dotyczy sposobów komunikacji między dwoma mikrokontrolerami ATMega8 bez użycia sprzętowych interfejsów SPI, UART i I2C, które są już zajęte. Proponowane rozwiązania obejmują implementację programowej transmisji szeregowej (programowy UART, I2C) z wykorzystaniem dostępnych linii sygnałowych, maksymalnie trzech. Sugerowane jest wykorzystanie przerwań sprzętowych, zwłaszcza INT0 jako linii zegara, do synchronizacji transmisji bitów oraz implementacja prostego protokołu przypominającego SPI, z obsługą przerwań i flag sygnalizujących gotowość danych. Wskazano, że przerwania w AVR mają ustalone priorytety, gdzie INT0 ma wysoki priorytet, co należy uwzględnić w implementacji. Alternatywnie rozważono transmisję asynchroniczną RS232 na własny użytek, z jednym bitem startowym i przerwą synchronizacyjną, co jest możliwe mimo różnych częstotliwości taktowania (8 MHz i 16 MHz). Poruszono także pomysł komunikacji dwukierunkowej z buforami danych oraz wykorzystanie magistrali RS485 jako warstwy fizycznej, choć wymaga to dodatkowych konwerterów i protokołu. Autor planuje dwukierunkową transmisję, gdzie master wysyła rozkazy, a slave odpowiada danymi. Wskazano, że implementacja programowa wymaga precyzyjnego zarządzania czasem i może być wspomagana asemblerem dla zwiększenia szybkości działania. W Bascomie dostępne są instrukcje SHIFTIN i SHIFTOUT, które mogą ułatwić realizację transmisji bitowej. Podsumowując, komunikacja między dwoma ATMega8 bez sprzętowych interfejsów jest możliwa poprzez programową implementację protokołu szeregowego z wykorzystaniem przerwań i synchronizacji sygnałów na maksymalnie trzech liniach.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA