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

Brak informacji zwrotnej w SPI AVR przy użyciu impulsatora - jak rozwiązać?

pawgo2606 18 Kwi 2012 19:52 2564 12
  • #1 10809103
    pawgo2606
    Poziom 10  
    Witam:) mam pewien problem z obsługą SPI. Chcę zrobić sterowanie pomiędzy dwoma AVR przy czym master wysyła na slave daną wartość. Dodatkowo slave a raczej ta zmienna jest także zmieniana za pomocą impulsatora i uzyskana dana jest odsyłana do mastera i wyświetlana na LCD. Problem polega na tym ze nie mam informacji zwrotnej przy obsłudze slave za pomocą impulsatora. Poniżej zawarłem przykładowy kod obsługi mastera i slave za pomocą zmiany danych w pętli
    master
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    slave
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    jeżeli mam w przerwaniu
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    to bez problemu uzyskuję info na masterze na diodach

    w oryginalnym programie w pętli głównej mam komendę check_code(); gdzie zmieniam wartość danej typu char i chcę tę wartość wysłać po SPI jednak mam z tym problem...
  • #2 10809571
    sulfur
    Poziom 24  
    Jak robisz SPI_RESET_SS to układ slave przechodzi w stan wysokiej impedancji, bo będzie myślał, że komunikacja nie jest do niego. Jesteś też trochę nieprecyzyjny, ponieważ piszesz, że masz w przerwaniu (i tu kod, a z jego opisu wynika że kod przerwania jest z układu slave) po czym stwierdzasz, że (wtedy) "bez problemu uzyskujesz info na masterze na diodach". Zdecyduj się więc, i napisz precyzyjnie, co jak działa. Będzie łatwiej. Wszystkim.
  • #3 10809761
    pawgo2606
    Poziom 10  
    chodziło mi o to że jeżeli mam w przerwaniu SPDR=bajt; to układ slave wysyła dane do mastera. próbowałem wpisywać tu daną z innego miejsca jednak slave nic nie wysyłał (funkcja if(i==1) itd). ogólnie chodzi mi o to żeby wysyłać informację do mastera o wartości ustawionej przez impulsator
  • #4 10809806
    sulfur
    Poziom 24  
    No tak. Co do tej "funkcji" if(i==1) to sobie poczytaj co to jest volatile i w jakim celu się to stosuje.
    Np tu http://mirekk36.blogspot.com/2011/08/test.html
    Pewnie dondu popełnił też jakieś opracowanie na ten temat na swoim blogu. No ale w razie W to sobie już sam poszukaj.
  • #5 10811904
    pawgo2606
    Poziom 10  
    Dalej stoję w miejscu z tym programem i nie wiem jak ruszyć..
    ogólnie chcę zrobić coś takiego
    master --> wysłanie danych do slave i odczyt ze slave wartości ustawionej impulsatorem
    slave --> odczyt z mastera, slave obsługiwany za pomocą mastera i za pomocą impulsatora, odwzorowanie ustawień za pomocą impulsatora wysyłane na master i odwzorowywane na wyświetlaczu
    na chwilę obecną działa mi od master do slave natomiast w drugą stronę nic nie mam..
  • #6 10811921
    sulfur
    Poziom 24  
    Slave Ci na pewno nic nie odsyła, ponieważ Twoja "funkcja" if (i==1) jest zawsze fałszywa właśnie ze względu na brak volatile.
  • #7 10811938
    pawgo2606
    Poziom 10  
    to w jaki sposób to rozwiązać??

    Dodano po 7 [minuty]:

    mam taki program
    master
    Kod: text
    Zaloguj się, aby zobaczyć kod


    slave

    Kod: text
    Zaloguj się, aby zobaczyć kod


    i działa tylko w stronę master->slave

    Dodano po 29 [minuty]:

    jak zamienię int a; na volatile int a to też nie idzie

    Dodano po 9 [minuty]:

    dla
    Kod: text
    Zaloguj się, aby zobaczyć kod

    wszystko działa ok.. a jeżeli mam w pętli głównej inkrementację zmiennej to nie działa
  • #8 10812107
    sulfur
    Poziom 24  
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
    Przecież to jest pętla nieskończona. Zamiast chaotycznie testować, zacznij myśleć.
  • #9 10812200
    pawgo2606
    Poziom 10  
    mam zmienione na while i dalej jest problem... a w kodzie mastera jest wszystko ok??
  • #10 10812261
    piotrva
    VIP Zasłużony dla elektroda
    Kolego, pomyśl co oznacza taki zapis:
    
    while(1);
    instrukcja_1();
    

    średnik informuje kompilator, że to już koniec instrukcji, w związku z tym wchodzisz w pętlę nieskończoną, która nie ma wewnątrz siebie żadnych instrukcji - innymi słowy instrukcja_1 NIGDY SIĘ NIE WYKONA.
    Powinno być to zapisane z utworzeniem odpowiedniego bloku za pomocą nawiasów klamrowych:
    
    while(1){
         instrukcja_2();
    }
    

    w tym wypadku instrukcja_2 wykonywać się będzie w pętli nieskończonej - tak jak zamierzasz.
  • #11 10812270
    pawgo2606
    Poziom 10  
    mam tak i nie działa prawidłowo
  • #13 10812583
    pawgo2606
    Poziom 10  
    na chwilę obecną mam na wyświetlaczu odesłanie info. Pojawił się nowy problem. W jaki sposób oddzielić informację wysłaną od odebranej?? bo do odbierania i wysyłania mam tę samą funkcję
    Kod: text
    Zaloguj się, aby zobaczyć kod


    pętla główna programu wynosi
    Kod: text
    Zaloguj się, aby zobaczyć kod

    w sterowanie() mam obsługę klawiatury i wysyłanie danych do slave i to mi działa
    poniżej fragment funkcji
    reszta funkcji ma za zadanie odbierać dane ze slave które ustawiam na nim impulsatorem jednak nie działa to prawidłowo
    Kod: text
    Zaloguj się, aby zobaczyć kod

    ta funkcja wysyła mi wartość wypełnienia do slave i mam ją wyświetlaną na wyświetlaczu
    ale mam problem z danymi wysyłanymi ze slave do mastera gdyż po odebranu master wysyła mi to co było wcześniej czyli jak miałem wysłaną wartość 10 i na slave impulsatorem zmieniam np na 12 to mi tego nie wyświetla na wyświetlaczu natomiast master wysyła mi 10 czyli tak jak wspomniałem muszę rozdzielić to co otrzymałem od tego co wysyłam bo następuje nadpisanie. Próbowałem z drugą zmienną jednak wtedy wysyła mi na slave wartość tę drugą a następnie to co miałem na slave wczesniej ustawione np 10

    Dodano po 16 [minuty]:

    ciężko mi to dokładnie wytłumaczyć więc może opiszę projekt trochę a więc slave realizuje obsługę silnika bezszczotkowego BLDC do slave podpięty jest impulsator który zadaje wypełnienie impulsu. Wypełnienie impulsu również chcę zrealizować za pomocą SPI czyli master wysyła po wprowadzeniu danych z klawiatury wartość tego wypełnienia i ma go wyświetlić na LCD. Wartość zmieniana za pomocą impulsatora ma też być wyświetlana. Problem w tym że to co ustawiam impulsatorem jest nadpisywane z mastera.. czyli to co ustawiłem za pomocą klawiatury nie zmienię impulsatorem chyba że w while pozostanie tylko funkcja sterowanie() to wówczas wprowadzam daną z klawiatury i pracuję bez problemu impulsatorem przy braku informacji zwrotnej ze slave
REKLAMA