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

SPi programowe wysyła tylko nieparzyste dane? /bascom/

redes 16 Lut 2012 14:40 1924 7
REKLAMA
  • #1 10553998
    redes
    Poziom 13  
    Witam. mam taki oto problem: wykorzystuje SPI programowe w Atmega8 do przesłania 1 bajtu danych na 74hc164 który załącza diody led. Wszystko działa ok jak zmienna którą chce wysłać jest liczbą nieparzystą, schody sie pojawiają gdy wysyłam liczbę parzystą wtedy 74hc164 zachowuje się jakby dostał 8 zer. nie wiem w czym problem tutaj czesc kodu:
    Kod: text
    Zaloguj się, aby zobaczyć kod

    a oto schemat podlaczenia
    SPi programowe wysyła tylko nieparzyste dane? /bascom/
  • REKLAMA
  • #2 10554114
    Press
    Poziom 24  
    Na rejestry 164 to ja kiedyś się bawiłem w wysyłanie za pomocą instrukcji SHIFTOUT.
    Poczytaj o niej, może rozwiąże Twój problem.
  • REKLAMA
  • #3 10554219
    redes
    Poziom 13  
    Żeby było śmiesznie to sprawdziłem funkcje shiftout i jest to samo dlatego zastanawiam się czy przypadkiem problemem nie jest 74hc164?
    Jestem zielony :cry: .Teraz wykorzystując funkcje shiftout działa tylko ma problemy z przesłaniem wartości 4;8;16;32;64;128 ? (binarnie 100;1000;1000 itd...) O co tutaj chodzi?
  • REKLAMA
  • #4 10555452
    Press
    Poziom 24  
    a co zostaje wczytane do rejestru gdy wysyłasz te wartości?
    Może faza sygnału zegarowego jest odwrotna i nie wczytuje pierwszego bitu?
  • REKLAMA
  • #5 10556966
    redes
    Poziom 13  
    Zrobiłem tak że na wyświetlaczu widzę jaka jest wartość zmiennej wczytywanej na konkretny pin i stąd wiem że coś jest nie tak. Jeżeli jest tak jak mówisz to błąd wystepowałby na każdej wartości zmiennej.
  • #6 10559399
    Konto nie istnieje
    Konto nie istnieje  
  • #7 10560732
    redes
    Poziom 13  
    Hmm. Jakie ma znaczenie funkcja wait na końcu programu, bo ja nie używałem opóźnienia w swoim programie po procedurze spiout.
    Jeżeli chodzi o pomysł z odwróceniem diod to odpada bo to sa diody 2 w 1 czerwona i zielona razem ze wspólnym wyjsciem. :(
    W układzie zastosowałem funkcję shiftout a oto jej opis:
    SHIFTOUT Przeznaczenie:

    Wysuwa ciąg bitów pochodzący z określonej zmiennej.

    Składnia:

    SHIFTOUT pin_danych , pin_zegarowy , zmienna , opcje [, il_bitów , opóźnienie ]

    gdzie:

    pin_danych nazwa końcówki portu będącą linią wyjściową strumienia bitów, np. PORTB.0
    pin_zegarowy nazwa końcówki portu będąca linią zegarową, np. PORTB.1
    zmienna zmienna z której wysuwane będą bity,
    opcje opcje,
    il_bitów ilość wysuwanych bitów,
    opóźnienie opóźnienie w mikrosekundach między kolejnymi bitami.
    Opis:

    Instrukcja ta podobnie jak SHIFTIN, może być używana do szybkiej transmisji szeregowej pomiędzy dwoma procesorami.

    Pin_danych powinien być połączony z końcówką wejściową drugiego procesora, który jest odbiornikiem strumienia bitów. Pin_zegarowy w trybie MASTER generuje sygnał zegarowy synchronizujący transmisję. W trybie SLAVE jest on wejściem sygnału zegarowego pochodzącego z drugiego procesora.

    Uwaga! Jeśli pin_zegarowy ma być wyjściem należy użyć PORTx.y, jeśli zaś będzie wejściem należy użyć PINx.y

    Podana jako parametr zmienna może być dowolną – oprócz zmiennych bitowych! - zmienną języka BASCOM BASIC. Bity nadawane będą wysuwane właśnie z tej zmiennej.

    Można podać ilość wysyłanych bitów, maksymalnie 255. Jeśli ten parametr nie występuje lub jest określony jako NULL, liczba bitów jest automatycznie określana na podstawie ilości bitów składających się na zmienną. Dla typu Byte będzie to 8 bitów a dla typu Word – 16.

    Znaczenie liczby podanej jako parametr opcje, jest następująca:


    0 najpierw bit MSB jest podawany przy niskim poziomie logicznym na końcówce zegarowej
    1 najpierw bit MSB jest podawany przy wysokim poziomie logicznym na końcówce zegarowej
    2 najpierw bit LSB jest podawany przy niskim poziomie logicznym na końcówce zegarowej
    3 najpierw bit LSB jest podawany przy wysokim poziomie logicznym na końcówce zegarowej
    Gdy liczba określająca opcję zostanie powiększona o 4, wtedy sygnał zegarowy nie będzie generowany i lina zegarowa będzie pełnić rolę wejścia zewnętrznego sygnału zegarowego (tryb SLAVE).:


    4 najpierw bit MSB jest podawany przy niskim poziomie logicznym na końcówce zegarowej
    5 najpierw bit MSB jest podawany przy wysokim poziomie logicznym na końcówce zegarowej
    6 najpierw bit LSB jest podawany przy niskim poziomie logicznym na końcówce zegarowej
    7 najpierw bit LSB jest podawany przy wysokim poziomie logicznym na końcówce zegarowej
    Jako opóźnienie normalnie używane są dwie instrukcje maszynowe NOP. Gdy częstotliwość zegara jest zbyt duża, można podać czas opóźnienia w mikrosekundach. Jednak w tym przypadku konieczne jest określenie ilości transmitowanych bitów.



    ale i tak występują błedy, nie wszystkie liczby są poprawnie wysłane. Te które są źle wysyłane po prostu nie używam. W moim przypadku użyłem opóźnienia choć graniczna częstotliwość dla 74hc164 to 50MHz. Moje 4MHz nie powinno zrobić wrażenia na tamtej kości. Problem rozwiązany połowicznie.
  • #8 10561853
    Konto nie istnieje
    Konto nie istnieje  
REKLAMA