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

Bascom AVR - Jak uniknąć blokady na instrukcji Shiftin?

plp 22 Mar 2006 21:57 2929 5
REKLAMA
  • #1 2445893
    plp
    Poziom 15  
    Posty: 216
    Pomógł: 3
    Ocena: 12
    Witam !

    Uruchomiłem przesyłanie danych pomiędzy dwoma procesorami AVR z wykorzystanie poleceń shiftout i shift in.

    Problem w tym, że procesor odbierający zatrzymuje się na instrukcji Shiftin i czeka aż dostanie dane. Jak to rozwiązać, aby program mógł iśc dalej jak nic nie nadejdzie ? Innymi słowy jak ustalić że jest coś nadawane i trzeba to odebrać ?

    Z góry dodam, że przerwanie typu INT0 nie wchodzi w grę, ponieważ jeden procek ma się komunikować z wieloma innymi.

    Pozdrawiam !

    PL
  • REKLAMA
  • #2 2445970
    hunterhouse
    Poziom 26  
    Posty: 893
    Pomógł: 84
    Ocena: 3
    wydaje mi sie że inaczej jak na przerwaniu tego nie zrobisz.
    shiftin to jest taka instrukcje bascoma które działa tak jak działa i nic tutaj nie poradzisz.
    moze dać najwyżej jakiś trick z linią danych. masz 2 linie danych czy jedna ??? i czy komunikacja jest jedno czy 2 stronna ???

    np
    w stanie spoczynku linia danych i zegarowych jest w stanie niskim.
    teraz jeśli procesor chce coś wysłać to ustawia linie danych w stan wysoki i czeka jakiś czas aż odbiorca sie przygotuje (czas zależny od tego jak często odbiornik sprawdza linie danych)
    potem normalnie wysyła cały pakiet danych. i ustawia linie danych w stan niski (co by oznaczało że narazie niema ochoty nic nadawać)

    odbironik musiał by sprawdzać jaki jest stan lini danych. jeśli jest niski to pracuje noralnie jeśli wysoki to prubuje odczytać dane instrukcją shiftin

    to jest tylko teoria i nigdy takiego czegoś nie robiłem ale wydaje mi sie ze jest to mozłiwe do zrobienia.


    istaniał by też możliwość zrobienia funkcji shiftin po swojemu ale to wymagał bo trochę więcej wysiłku i najlepiej zrobić to jako wstawka w asm bo jak sie to kiepsko napisze w bascomie to nic z tego nie wyjdze.

    pozdrawiam
  • REKLAMA
  • #3 2445997
    plp
    Poziom 15  
    Posty: 216
    Pomógł: 3
    Ocena: 12
    O czymś takim ,jak wcześniejsze sygnalizowanie chęci nadawania myślełem. Tyle, że jak już zacznę odbierać, a to jednak nie nadejdzie, to program wisi. Tylko Watchdog by wtedy pomógł.

    Chyba faktycznie nie pozostaje nic innego jak napisać to po swojemu. ASM odpada, bo go nie znam, ale Bascom powinien wystarczyć. Prędkości wielkich nie wymagam.

    Dzięki !

    PL
  • REKLAMA
  • #4 2446022
    hunterhouse
    Poziom 26  
    Posty: 893
    Pomógł: 84
    Ocena: 3
    jeśli będziesz to pisał w bascomie to używaj tylko najprostrzych instrukcji, staraj sie to zrobić bez użycia mnozęnia i dzialenia.
    w sumie to wystarczy ci przesuwanie bitów, i doczyt pojedynczych bitów. odczekanie na kolejny regaz musi być w pętli co określony czas i najlepiej jak będzie to pętla for która wykona sie ileś razy i potem przeskoczy dalej a to poto żeby program ci nie stawał w miejscu jak niedostanie danych.
  • REKLAMA
  • #5 2446104
    plp
    Poziom 15  
    Posty: 216
    Pomógł: 3
    Ocena: 12
    Myślę tak:

    Procek zarządzający transmisją wystawia 0 na linii do któregoś innego, czeka chwilę i zmienia końcówkę w wejście.
    Czeka aż pojawi się 0. Wtedy uznaje że będzie coś nadawane. Odbiera powiedzmy 8 bitów po kolei co stały odstęp w czasie, odmierzany np. za pomocą timera i kontroli stanu jego licznika.
    Oczywiście jak coś nie wyjdzie z nadawaniem, to po prostu odbierze bzdury. To też trzeba będzie zweryfikować.
    A jak chęć nadawania się nie pojawi zajmie się innym prockiem.

    Powinno być ok.

    PL
  • #6 2451120
    plp
    Poziom 15  
    Posty: 216
    Pomógł: 3
    Ocena: 12
    Zrobiłem jak powyżej. Jest OK.

    Zamykam temat.

    PL
REKLAMA