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

Komunikacja mikrokontrolerów (ATMEGA8 + BASCOM + SPI)

greg_matrix 14 Kwi 2007 10:18 2832 4
REKLAMA
  • #1 3786037
    greg_matrix
    Poziom 17  
    Posty: 163
    Pomógł: 28
    Ocena: 3
    Witam kolegów,
    Postawiłem sobie pewne zadanie do wykonania i wygląda na to, że będę potrzebował jakiejś rady kogoś kto lepiej zna problem. Chodzi o komunikację mokrokontrolerów ATMEGA przez interfejs SPI. Programuję w BASCOM, gdzie są już gotowe instrukcje do tego. Cały problem wygląda tak:

    - Mamy 2 procesory ATMEGA8
    - Mam tablicę 10 elementową X (elementy typu Word) w pierwszym procesorze, to jest MASTER
    - Mam tablicę 10 elementową Y (elementy typu Word) w drugim procesorze, to jest SLAVE
    - Procesory będą pracowały na osobnych płytkach, połączenie odpowiednią liczbą kabelków, może być kilka linii więcej niż "gołe" SPI

    Potrzebuję się nauczyc jak wykonać następujące działania:
    1. Procesor MASTER wysyła swoją tablicę X do SLAVE-a, który zapisuje otrzymane dane do Y a potem jeszcze w pamięci EEPROM
    2. Procesor MASTER odczytuje ze SLAVE-a tablicę Y

    Generalnie BASCOM ma gotowe instrukcje dla strony MASTER do odczytu z konkretnej zmiennej ze SLAVE-a i do zapisu, co pewnie bardzo ułatwia zadanie. Problem sprawia mi głównie zorganizowanie pracy po stronie SLAVE. Wiem jak wysłać dane z X do Y, ale zastanawia mnie jak to zrobić, żeby SLAVE wiedział kiedy ma zapisywać dane do EEPROM.

    Mój wstępny pomysł: może użyć jakiejś dodatkowej linii (pinu) na krórej ustawię "ręcznie" informację, że można już zapisać do EEPROM?

    Z góry dziękuję za sugestie.
  • REKLAMA
  • #2 3786121
    pubus
    Poziom 30  
    Posty: 1289
    Pomógł: 138
    Ocena: 31
    Trzeba pamiętać o paru rzeczach...
    SPI nie lubi długich przewodów...
    SPI to po prostu zapętlone rejestry przesuwne...
    SPI tylko master inicjuje transmisję i slave tylko wtedy może przesłać jakieś dane do master...
    Domyślam się, że slave coś robi z tą tablicą zanim ją odeśle...
    Generalnie tak jak mówisz najprościej dać linię której stan będzie sprawdzany przy transmisji i jeżeli np linia ma stan niski to slave uznaje przesyłane dane za istotne i zapisuje je do swojej tablicy...
    Jeżeli stan linii jest wysoki to olewa dane przychodzące a do rejestru ładuje dane ze swojej tablicy...
    Oznacza to, że aby odebrać dane ze slave'a musisz wysłać do niego wielkość tablicy + 1...
    Albo tylko wielkość tablicy jeżeli w rejestrze SPI jest na bieżąco uaktualniany pierwszy element do wysłania...
  • REKLAMA
  • #3 3786474
    johny_w
    Poziom 24  
    Posty: 671
    Pomógł: 80
    Ocena: 63
    A nie lepiej zastosować jakieś rozkazy po SPI?

    Np. 01bbxx - zapisz bajt 'bb' w tablicy na pozycji 'xx'
    02xx - odeślij bajt z tablicy z pozycji 'xx'
    03xx - zapisz wartość z tablicy z pozycji 'xx' w EEPROM
    04 - zapisz całą tablicę w EEPROM

    Wymyślenie jakiegoś prostego protokołu transmisji usprawni komunikację i zwiększy jej możliwości. Bo zakładam że wykonujesz to na sztywno, czyli slave po włączeniu odbiera pierwsze 10 znaków i zapisuje je do tablicy. I co dalej? Co z zakłóceniami?

    Tworząc obsługę poleceń SPI w każdej chwili możesz rozkazać SLAVE'owi odesłać tablicę, usunąć ją, zapisać w EE, itd. Możliwości jest mnóstwo.

    pozdrawiam, JnS
  • REKLAMA
  • #4 3787212
    pubus
    Poziom 30  
    Posty: 1289
    Pomógł: 138
    Ocena: 31
    Jeżeli tablica stanowi jedyne dane które będą przesyłane to nie ma sensu cudować...
    Jak by miało być coś więcej, jakieś komendy plus dane itd... to tak...
  • #5 3798144
    greg_matrix
    Poziom 17  
    Posty: 163
    Pomógł: 28
    Ocena: 3
    Dzieki za udział w dyskusji!

    To ma być coś w rodzaju programatora i urządzenia wykonawczego, które beda spiete tylko na czas przesyłania danych. Poza tym maja działać odzielnie.

    Wymyśliłem chyba jak sobie poradzić z oprogramowaniem po stronie SLAVE. Rzecz w tym, że kiedy programator będzie odpiety, to urządzenie wykonawcze (SLAVE) ma coś tam robić. Przypięcie SLAVE do MASTER bedzie nastepowało w taki sposób, że SLAVE dostanie dopiero w tym momencie zasilanie i ma sie od razu zorientować, że teraz ma robić co innego niz normalnie. Zakładam, że MASTER może być już zasilany w momencie podłączania SLAVE.

    Moja koncepcja:
    Na złączu którym będą połączone układy postanowiłem dołożyć 1 pin oprócz SPI i do tego 2 na zasilanie. Po stronie SLAVE pin na którym ma się pojawić zasilanie idzie do ADC, natomiast zasilanie procesora przez diodę Shottky (mały spadek napięcia). Chodzi o to, żeby do tego ADC przyszedł "+" tylko kiedy SLAVE będzie zasilany przez złącze programatora, kiedy będzie zasilany normalnie to na ADC będzie "0". W ten sposób bardzo łatwo SLAVE dostanie informację, że programator jest przypięty i od razu wskoczy do odpowiedniego podprogramu. Dodatkowy pin wykorzystam do generowania MASTER-em impulsu, co będzie oznaczało, że wszystkie dane już przesłano i SLAVE ma zapisać stan swojej tablicy danych do EEPROM.

    W tej aplikacji bardzo ważna jest niezawodność połączenia. Nie może być mowy, że przesłane dane się nie zgadzają. I tutaj mam pytanie- czy SPI sprawdza jakoś poprawność przesłanych danych? Jeśli nie, to łatwo dorobię taka funkcję, ale chciałbym wiedzieć jak to wygląda.
REKLAMA